Всем доброго дня! Прошу помощи! Пытаюсь настроить модуль GY-271. Подключаю к Меге 2560. Проблема: не меняет показания при изменении положения датчика, монитор порта показывает следующее: Starting the I2C interface. Constructing new HMC5883L Setting scale to +/- 1.3 Ga Setting measurement mode to continous. Raw: 512 972 0 Scaled: 471.04 894.24 0.00 Heading: 1.13 Radians 64.84 Degrees Raw: 570 972 12 Scaled: 524.40 894.24 11.04 Heading: 1.09 Radians 62.23 Degrees Raw: 570 972 12 Scaled: 524.40 894.24 11.04 Heading: 1.09 Radians 62.23 Degrees Raw: 570 972 12 Scaled: 524.40 894.24 11.04 Heading: 1.09 Radians 62.23 Degrees Raw: 570 972 12 Scaled: 524.40 894.24 11.04 Heading: 1.09 Radians 62.23 Degrees Скетч из примера HMC5883L Датчик подключался двумя способами: 1. VCC - 3,3V arduino GND - GND arduino SDA- A4 arduino SCL - A4 arduino При таком подключении, сканер проверки I2C выдаёт следующее: I2C scanner. Scanning ... Done. Found 0 device(s). 2. VCC - 3,3V arduino GND - GND arduino SDA- SDA 20 arduino SCL - SCL 21 arduino При таком подключении, сканер проверки I2C выдаёт следующее: I2C scanner. Scanning ... Found address: 30 (0x1E) Done. Found 1 device(s). При обоих типах подключения пример выдаёт тот же (вышеприведённый) результат и датчик ни как не реагирует на изменение положения. Код сканера: Код (C++): // I2C scanner by Nick Gammon. Thanks Nick. #include <Wire.h> void setup() { Serial.begin (115200); // Leonardo: wait for serial port to connect while (!Serial) { } Serial.println (); Serial.println ("I2C scanner. Scanning ..."); byte count = 0; Wire.begin(); for (byte i = 1; i < 120; i++) { Wire.beginTransmission (i); if (Wire.endTransmission () == 0) { Serial.print ("Found address: "); Serial.print (i, DEC); Serial.print (" (0x"); Serial.print (i, HEX); Serial.println (")"); count++; delay (1); // maybe unneeded? } // end of good response } // end of for loop Serial.println ("Done."); Serial.print ("Found "); Serial.print (count, DEC); Serial.println (" device(s)."); } // end of setup void loop() {} Даташит на датчик во вложении. Огромное спасибо всем, кто поможет!
Люди, прошу помощи! За последние дни выяснил следующую информацию и провёл эксперименты, может кому-то поможет. Скетч из примера библиотеки HMC5883L.h так и не работает (пробовал с тремя GY-271). Сериал порт показывает одни и те же значения, они не меняются при изменении положения датчика. Этот скетч ниже: Код (C++): /* HMC5883L_Example.pde - Example sketch for integration with an HMC5883L triple axis magnetomerwe. Copyright (C) 2011 Love Electronics (loveelectronics.co.uk) This program is free software: you can redistribute it and/or modify it under the terms of the version 3 GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ // Reference the I2C Library #include <Wire.h> // Reference the HMC5883L Compass Library #include <HMC5883L.h> // Store our compass as a variable. HMC5883L compass; // Record any errors that may occur in the compass. int error = 0; // Out setup routine, here we will configure the microcontroller and compass. void setup() { // Initialize the serial port. Serial.begin(9600); Serial.println("Starting the I2C interface."); Wire.begin(); // Start the I2C interface. Serial.println("Constructing new HMC5883L"); compass = HMC5883L(); // Construct a new HMC5883 compass. Serial.println("Setting scale to +/- 1.3 Ga"); error = compass.SetScale(1.3); // Set the scale of the compass. if(error != 0) // If there is an error, print it out. Serial.println(compass.GetErrorText(error)); Serial.println("Setting measurement mode to continous."); error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous if(error != 0) // If there is an error, print it out. Serial.println(compass.GetErrorText(error)); } // Our main program loop. void loop() { // Retrive the raw values from the compass (not scaled). MagnetometerRaw raw = compass.ReadRawAxis(); // Retrived the scaled values from the compass (scaled to the configured scale). MagnetometerScaled scaled = compass.ReadScaledAxis(); // Values are accessed like so: int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis) // Calculate heading when the magnetometer is level, then correct for signs of axis. float heading = atan2(scaled.YAxis, scaled.XAxis); // Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location. // Find yours here: http://www.magnetic-declination.com/ // Mine is: 2� 37' W, which is 2.617 Degrees, or (which we need) 0.0456752665 radians, I will use 0.0457 // If you cannot find your Declination, comment out these two lines, your compass will be slightly off. float declinationAngle = 0.0457; heading += declinationAngle; // Correct for when signs are reversed. if(heading < 0) heading += 2*PI; // Check for wrap due to addition of declination. if(heading > 2*PI) heading -= 2*PI; // Convert radians to degrees for readability. float headingDegrees = heading * 180/M_PI; // Output the data via the serial port. Output(raw, scaled, heading, headingDegrees); // Normally we would delay the application by 66ms to allow the loop // to run at 15Hz (default bandwidth for the HMC5883L). // However since we have a long serial out (104ms at 9600) we will let // it run at its natural speed. // delay(66); } // Output the data down the serial port. void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees) { Serial.print("Raw:\t"); Serial.print(raw.XAxis); Serial.print(" "); Serial.print(raw.YAxis); Serial.print(" "); Serial.print(raw.ZAxis); Serial.print(" \tScaled:\t"); Serial.print(scaled.XAxis); Serial.print(" "); Serial.print(scaled.YAxis); Serial.print(" "); Serial.print(scaled.ZAxis); Serial.print(" \tHeading:\t"); Serial.print(heading); Serial.print(" Radians \t"); Serial.print(headingDegrees); Serial.println(" Degrees \t"); } Буду признателен, если кто-то объяснит - почему? При этом нашёл скетч, который отлично работает, но без участия библиотеки HMC5883L.h. Показания чётко меняются с изменением положения датчика. Этот скетч ниже: Код (C++): #include <Wire.h> #include <LiquidCrystal_I2C.h> #define address 0x1E LiquidCrystal_I2C lcd(0x27,20,4); void setup(){ lcd.init(); lcd.backlight(); Serial.begin(9600); Wire.begin(); Wire.beginTransmission(address); Wire.write(0x02); Wire.write(0x00); Wire.endTransmission(); } void loop(){ int x,y,z; //triple axis data Wire.beginTransmission(address); Wire.write(0x03); //select register 3, X MSB register Wire.endTransmission(); Wire.requestFrom(address, 6); if(6<=Wire.available()){ x = Wire.read()<<8; x |= Wire.read(); z = Wire.read()<<8; z |= Wire.read(); y = Wire.read()<<8; y |= Wire.read(); } Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.print(y); Serial.print(" z: "); Serial.println(z); lcd.clear(); lcd.setCursor(0,0); lcd.print("x:"); lcd.print(x); lcd.setCursor(6,0); lcd.print(" y:"); lcd.print(y); lcd.setCursor(0,1); lcd.print("z:"); lcd.print(z); lcd.setCursor(7,1); lcd.print("44"); delay(500); lcd.setCursor(0,1); delay(500); } Почему основная библиотека, предназначенная для hcn5883l не работает?