Не видно барометр (Troyka) по I2C

Тема в разделе "Arduino & Shields", создана пользователем BurSer, 31 окт 2015.

  1. BurSer

    BurSer Нуб

    Имеется плата - аналог 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, пробовал менять адрес барометра.
     
  2. SSSSS

    SSSSS Нуб

    Похожая ситуация, поэтому напишу здесь.
    Барометр подключил через Arduino Uno, библиотека и пример отсюда (https://github.com/amperka/Troyka-IMU). После обнадеживающих "Init completed", тишина: никаких данных не выводится (хотя 12 дней назад внесли исправления в пример).
    Подключал чрез Troyka Shield, "прилепленную" на Iskra Neo - постоянно меняются порты (то COM10, то COM12...) - неудобно. Да, в порту тишина...
    Надеюсь, представители Амперки не проигнорируют и прокомментируют.
     
  3. Максим B

    Максим B Гуру

    Может скорость не совпадает в мониторе порта - например установлена 56400, а надо 9600.
     
  4. Максим B

    Максим B Гуру

    А такой код заработает???

    Код (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);
    }

     
     
  5. egordorichev

    egordorichev Гик

  6. BurSer

    BurSer Нуб

    Продолжив изыскания и изучив осциллограмму сигналов I2C, обнаружил, что бароетр не выдает ACK. Подключил другой барометр (Bosch BMP180) - все работает.
     
  7. BurSer

    BurSer Нуб

  8. Максим B

    Максим B Гуру

    Если шилд работает по 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**
     
  9. BurSer

    BurSer Нуб

    Не выдал.
     
  10. Максим B

    Максим B Гуру

    Соответственно в мониторе порта скорость 9600 и правильный порт выбран? Смею предположить , что модуль не рабочий (((
     
  11. BurSer

    BurSer Нуб

    С другим-то барометром все нормально. Тем более, повторюсь, на осциллограмме видно, что не сигнала ACK с барометра. При чем тут UART?
    Насчет нерабочего модуля: по дурости своей купил сразу 2 барометра. Либо я настолько везучий, что оба оказались одинаково нерабочими, либо все-таки есть какая-то загвоздка.
    Да, кстати: другой, Bosch-евский барометр тоже работает по I2C.
     
  12. SSSSS

    SSSSS Нуб