Конфликт I2C, подружить гироскоп и часы

Тема в разделе "Arduino & Shields", создана пользователем zealot01, 1 фев 2016.

  1. zealot01

    zealot01 Нерд

    Всем привет!
    Для одного проекта взял IMU - сенсор (Troyka - модуль), Часы реального времени (Troyka-модуль) и Multiservo Shield. Всё это работает на mega 2560. При подключении всего этого добра у меня не заработали часы (вместо времени по шине i2c приходила какая то абракадабра). Выяснилось, что имеет место быть конфликт адресов на шине I2C. Гироскоп на L3G4200D занимает 0x68 адрес и часы на DS1307 занимают тот же 0x68 адрес. Тогда я перевёл гироскоп на 0x69 I2C адрес путём припаивания проводка на одну ногу гироскопа, которая управляет последним битом адреса. После этого гироскоп успешно стал работать на 0x69 и выдавать данные. Однако после того, как я подключил часы вместе с гироскопом, данные по часам вообще не приходили и i2c сканер показал, что на 0x68 у меня вообще ничего нет (зато есть все IMU - сенсоры, включая 0x69 гироскопа, и Multiservo). При отключении IMU-тройка модуля часы успешно заработали и i2c сканер их показал (у меня на сканере отобразился 0x68 адрес часов и Multiservo). Как их заставить работать вместе? Или это вообще невозможно?
     
  2. vvr

    vvr Инженерище

    или менять компоненты или допиливать библиотеки
     
  3. zealot01

    zealot01 Нерд

    Я бы допилил, но как это сделать если часы на i2c вообще не видны.
     
  4. Alex19

    Alex19 Гуру

    Уже отвечал, поэтому повторятся не буду - http://forum.amperka.ru/threads/Два-модуля-с-одинаковыми-i2c-адресами.7162/#post-61243.

    Добавлю еще 1 пункт к своему ответу в теме выше.
    4. Поискать другие часы с другим адресом.

    Без дополнительных танцев с ножкой SDO, не получится.

    UPD. Добавлю еще 1 вариант, хоть и не самый простой.
    5. Программный I2C для одного из модулей.
    Один из вариантов в сети - https://www.insidegadgets.com/2012/02/12/avr-soft-i2c-master-with-example-for-i2c-eeproms/.

    Вообще мне не понятно почему Troyka модули, ограничили и не вывели все ножки чипа.

    Да для варианта где собраны все чипы, потребовалось бы 10-ток ног.
    А вот почему не вывели на отдельных датчиках SPI (там где он поддерживается) и выбор адреса I2C. Да удобное подключение, но ограничивает выбор, можно было бы сбоку вывести данные пины.
     
    Последнее редактирование: 1 фев 2016
  5. zealot01

    zealot01 Нерд

    Как уже было сказано, я уже притянул на L3G4200D пин SDO к единице (+3.3). Адрес поменялся с 0x68 на 0x69. однако на пару с гироскопом часы не видны на шине I2C (у часов адрес 0x68). Не понимаю почему так происходит, без гироскопа часы работают.
     
  6. Alex19

    Alex19 Гуру

    Пропустил, извините за не внимательность.

    Попробуйте так
    [​IMG]
    На рисунке R1 и R2 10K в зависимости от сопротивления меняется скорость, можно взять 4,7K. Чуть позже гляну библиотеку Wire.
     
  7. zealot01

    zealot01 Нерд

    Насколько я знаю, у меня на меге2560 SDA и SCL уже подтянуты к +5 резисторами на 10к. По крайней мере на даташите меги так нарисованою
     
  8. Alex19

    Alex19 Гуру

    Нет, вот схема - https://www.arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf.

    К сожалению только вечером, смогу добраться до библиотеки и проверить.
     
  9. zealot01

    zealot01 Нерд

    Alex19 нравится это.
  10. Alex19

    Alex19 Гуру

    А я смотрел PD1 - 20, PD0 - 21:).
     
  11. Alex19

    Alex19 Гуру

    Все это выглядит немного странно, я не очень хорошо разбираюсь в электронике, но немного разбираюсь в TWI (I2C).

    Если на линиях установлены 10K резисторы, потолок скорости I2C - 100Khz, более подробно об этом можно почитать тут - http://student-proger.ru/2014/08/vliyanie-nominala-podtyagivayushhih-rezistorov-na-signal-shiny-i2c/.

    А мне доводилось запускать и на 400Khz, в том числе и на Меге - http://forum.amperka.ru/threads/Биб...mpu9150-raw-pcf8574-pcf8575-ms5803-30ba.5973/.

    В библиотеки Wire.c всегда используется внутренняя подтяжка, не зависимо от платы.

    Файл Wire.cpp
    Код (C++):
    void TwoWire::begin(void)
    {
      rxBufferIndex = 0;
      rxBufferLength = 0;

      txBufferIndex = 0;
      txBufferLength = 0;

      twi_init();
    }
    В файле twi_init.с
    Код (C++):
    void twi_init(void)
    {
      // initialize state
      twi_state = TWI_READY;
      twi_sendStop = true;        // default value
      twi_inRepStart = false;

      // activate internal pullups for twi.
      digitalWrite(SDA, 1);
      digitalWrite(SCL, 1);

      // initialize twi prescaler and bit rate
      cbi(TWSR, TWPS0);
      cbi(TWSR, TWPS1);
      TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;

      /* twi bit rate formula from atmega128 manual pg 204
      SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
      note: TWBR should be 10 or higher for master mode
      It is 72 for a 16mhz Wiring board with 100kHz TWI */


      // enable twi module, acks, and twi interrupt
      TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
    }
    Ради интереса, если Вы закоментируете данные строки
    Код (C++):
    // activate internal pullups for twi.
    digitalWrite(SDA, 1);
    digitalWrite(SCL, 1);
    На линии, хоть 1 датчик запустится?
    Почему-то мне кажется, что ни один модуль не заработает.

    К сожалению свободной Mega, у меня нет, вечером обязательно попробую на других платах. К примеру связку Ваших часов, с другими платами.
     
  12. Alex19

    Alex19 Гуру

    Снял со станочка официальную Arduino Mega 2560 R3.

    И так по пунктам.
    Выходит, что нет.

    При подключении модуля/сенсора для Ардуины, в 99% процентов у Вас не будет проблем, причина кроется в том, что на самих модулях уже стоят подтягивающие резисторы.
    К примеру Ваш IMU - http://files.amperka.ru/schematics/module-m13-imu-b4.pdf.

    Плюс в библиотеки Wire используются встроенные резисторы.

    Поэтому Вы можете закоментировать эти строки в библиотеке.
    Код (C++):
    // activate internal pullups for twi.
    digitalWrite(SDA, 1);
    digitalWrite(SCL, 1);
    Ни чего не изменится, модуль будет работать.

    Но если Вы подключите простую микросхему, в моем случае подключил MS5803-30BA, и будете работать без библиотеки или закоментируете в библиотеке Wire.
    Код (C++):
    // activate internal pullups for twi.
    digitalWrite(SDA, 1);
    digitalWrite(SCL, 1);
    То чип работать не будет, придется ставить резисторы
    IMG_20160201_200046.jpg

    У меня без проблем подключилось 3 датчика I2C, без всяких резисторов
    IMG_20160201_195938.jpg

    Список датчиков - DS1307 (68), AT24C256 (50), MPU9150 (последний я перевел на 69 адрес, по умолчанию 68).
    I2C.jpg

    Очень внимательно проверьте свое подключение.
    Попробуйте подключить часы и IMU, без Multiservo.

    Кстати у Multiservo нет подтяжек - http://files.amperka.ru/schematics/multiservo-sch.pdf (если не просмотрел как в прошлый раз:)).
    Чудес не бывает, что-то у Вас не так.

    Буду благодарен, если кто-то пояснит значение подтягивающих резисторов на на пинах SDA, SLC, схема - https://www.arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf.
     
  13. lerik2703

    lerik2703 Гик

    что-то мне подсказывает что у вас просто не согласование уровней! измерите напряжение высокого уровня!
     
  14. zealot01

    zealot01 Нерд

    Специально использовал подтягивающие резисторы на 10к для SDA и SCL к +5 Ардуины. Это вообще ни на что не влияет. Часы так и не видны, когда стоят на шине с гироскопом.
    Может я что то припаял неправильно в IMU-модуле. Вот схема, ничего не выпаивал, просто провод припаял, после этого адрес гироскопа изменился на 0x69.
    Безымянный1.png
    imu-10-dof-schematic1.png
     
    Последнее редактирование: 2 фев 2016
  15. Alex19

    Alex19 Гуру

    Да это понятно, мое предположение, что это может помочь, было опровергнуто.
    Но подтягивающих резисторов на 20, 21 пинах нет, которые мы видим на схеме, иначе бы мне не пришлось бы использовать резисторы или внутреннюю подтяжку для голых чипов.

    Ищите проблему в другом, Ваши модули должны работать без проблем. Причина увы мне не известна, еще не сталкивался ни с чем подобным.

    По подключению, плохо разбираюсь в электронике (обычно прощу друга, он помогает в электронике, я ему в программировании), но тут все описано - http://files.amperka.ru/datasheets/L3G4200D-hyroscope.pdf, стр. 22.
    Коротко, если пин SDO подключен на питание (2.4-3.6V, о питании стр. 11) , адрес 1101001b (69), если подключен землю адрес 1101000b (68).
     
  16. lerik2703

    lerik2703 Гик

    да с перемычкой все нормально! ошибки подключения исключены?
     
  17. zealot01

    zealot01 Нерд

    Так, заработало. Поменял местами подключения IMU и часов. Часы поставил на выводы i2c стандартные (20,21), а мультисерво и IMU на выводы SCL и SDA, те что поверх AREF пина на меге R3 и всё заработало. Если часы с IMU поставить на стандартные пины 20,21, то тоже работает. А я думал, что разницы нет куда ставить.
     
    MaximJF нравится это.
  18. Alex19

    Alex19 Гуру

    Отлично, что удалось запустить и хорошо, что пишите как разобрались. Но все это выглядит очень странно, эти пины объедены.