Имеется плата - аналог Arduino Uno с подключенным к ней по I2C барометром (все по интсрукции - A4 как SDA, A5 как SCL). На ней скетч: Код (C++): #include <Wire.h> #include <troyka-imu.h> Barometer barometer; void setup(){ Serial.begin(9600); barometer.begin(); } void loop(){ Serial.print("Altitude: "); Serial.println(barometer.pressureToAltitudeMeters(barometer.readPressureMillibars())); Serial.print("Pressure: "); Serial.println(barometer.readPressureMillibars()); Serial.print("Temperature: "); Serial.println(barometer.readTemperatureC()); delay(300); } Когда выполнение программы доходит до первой же строки с чтением данных, контроллер виснет. Скажите, пожалуйста, что я делаю не так? Уточняю: плата тождественна Arduino Uno, расположение пинов совпадает; уже залезал вглубь библиотек troyka-imu и LPS331, пробовал менять адрес барометра.
Похожая ситуация, поэтому напишу здесь. Барометр подключил через Arduino Uno, библиотека и пример отсюда (https://github.com/amperka/Troyka-IMU). После обнадеживающих "Init completed", тишина: никаких данных не выводится (хотя 12 дней назад внесли исправления в пример). Подключал чрез Troyka Shield, "прилепленную" на Iskra Neo - постоянно меняются порты (то COM10, то COM12...) - неудобно. Да, в порту тишина... Надеюсь, представители Амперки не проигнорируют и прокомментируют.
А такой код заработает??? Код (Text): // библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулями IMU #include <troyka-imu.h> // создаём объект для работы с барометром Barometer barometer; void setup() { // открываем последовательный порт Serial.begin(9600); // выводим сообщение о начале инициализации Serial.println("Begin init..."); // инициализация барометра barometer.begin(); // выводим сообщение об удачной инициализации Serial.println("Init completed"); } void loop() { // создаём переменную и присваиваем ей значения абсолютного давления float pressure = barometer.readPressureMillibars(); // создаём переменную и присваиваем ей значения высоты над уровнем море float altitude = barometer.pressureToAltitudeMeters(pressure); // создаём переменную и присваиваем ей температуру окружающей среды float temperature = barometer.readTemperatureC(); // Вывод данных в Serial порт Serial.print("p: "); Serial.print(pressure); Serial.print(" mbar \t"); Serial.print("h: "); Serial.print(altitude); Serial.print(" m \t"); Serial.print("t: "); Serial.print(temperature); Serial.println(" C"); delay(300); }
Была тут похожая тема .... http://forum.amperka.ru/threads/Не-могу-запустить-акселерометр-troyka-модуль.6131
Продолжив изыскания и изучив осциллограмму сигналов I2C, обнаружил, что бароетр не выдает ACK. Подключил другой барометр (Bosch BMP180) - все работает.
Если шилд работает по i2c, тогда сканер должен показать адрес устройства. Запустите данный код: Код (Text): // -------------------------------------- // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0...127 to 1...119, // according to the i2c scanner by Nick Gammon // http://www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan } Должен выдать что-то типа 0x**
Соответственно в мониторе порта скорость 9600 и правильный порт выбран? Смею предположить , что модуль не рабочий (((
С другим-то барометром все нормально. Тем более, повторюсь, на осциллограмме видно, что не сигнала ACK с барометра. При чем тут UART? Насчет нерабочего модуля: по дурости своей купил сразу 2 барометра. Либо я настолько везучий, что оба оказались одинаково нерабочими, либо все-таки есть какая-то загвоздка. Да, кстати: другой, Bosch-евский барометр тоже работает по I2C.
Максим В, egordorichev спасибо. BurSer, может всё-таки ответят там: http://forum.amperka.ru/threads/Нерабочие-барометры-troyka.6450/