Всем привет! Для одного проекта взял 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). Как их заставить работать вместе? Или это вообще невозможно?
Уже отвечал, поэтому повторятся не буду - 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. Да удобное подключение, но ограничивает выбор, можно было бы сбоку вывести данные пины.
Как уже было сказано, я уже притянул на L3G4200D пин SDO к единице (+3.3). Адрес поменялся с 0x68 на 0x69. однако на пару с гироскопом часы не видны на шине I2C (у часов адрес 0x68). Не понимаю почему так происходит, без гироскопа часы работают.
Пропустил, извините за не внимательность. Попробуйте так На рисунке R1 и R2 10K в зависимости от сопротивления меняется скорость, можно взять 4,7K. Чуть позже гляну библиотеку Wire.
Насколько я знаю, у меня на меге2560 SDA и SCL уже подтянуты к +5 резисторами на 10к. По крайней мере на даташите меги так нарисованою
Нет, вот схема - https://www.arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf. К сожалению только вечером, смогу добраться до библиотеки и проверить.
Все это выглядит немного странно, я не очень хорошо разбираюсь в электронике, но немного разбираюсь в 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, у меня нет, вечером обязательно попробую на других платах. К примеру связку Ваших часов, с другими платами.
Снял со станочка официальную 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); То чип работать не будет, придется ставить резисторы Спойлер: Фото У меня без проблем подключилось 3 датчика I2C, без всяких резисторов Спойлер: Фото Список датчиков - DS1307 (68), AT24C256 (50), MPU9150 (последний я перевел на 69 адрес, по умолчанию 68). Спойлер: Фото I2C Scaner Очень внимательно проверьте свое подключение. Попробуйте подключить часы и IMU, без Multiservo. Кстати у Multiservo нет подтяжек - http://files.amperka.ru/schematics/multiservo-sch.pdf (если не просмотрел как в прошлый раз). Чудес не бывает, что-то у Вас не так. Буду благодарен, если кто-то пояснит значение подтягивающих резисторов на на пинах SDA, SLC, схема - https://www.arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf.
что-то мне подсказывает что у вас просто не согласование уровней! измерите напряжение высокого уровня!
Специально использовал подтягивающие резисторы на 10к для SDA и SCL к +5 Ардуины. Это вообще ни на что не влияет. Часы так и не видны, когда стоят на шине с гироскопом. Может я что то припаял неправильно в IMU-модуле. Вот схема, ничего не выпаивал, просто провод припаял, после этого адрес гироскопа изменился на 0x69. Спойлер
Да это понятно, мое предположение, что это может помочь, было опровергнуто. Но подтягивающих резисторов на 20, 21 пинах нет, которые мы видим на схеме, иначе бы мне не пришлось бы использовать резисторы или внутреннюю подтяжку для голых чипов. Ищите проблему в другом, Ваши модули должны работать без проблем. Причина увы мне не известна, еще не сталкивался ни с чем подобным. По подключению, плохо разбираюсь в электронике (обычно прощу друга, он помогает в электронике, я ему в программировании), но тут все описано - http://files.amperka.ru/datasheets/L3G4200D-hyroscope.pdf, стр. 22. Коротко, если пин SDO подключен на питание (2.4-3.6V, о питании стр. 11) , адрес 1101001b (69), если подключен землю адрес 1101000b (68).
Так, заработало. Поменял местами подключения IMU и часов. Часы поставил на выводы i2c стандартные (20,21), а мультисерво и IMU на выводы SCL и SDA, те что поверх AREF пина на меге R3 и всё заработало. Если часы с IMU поставить на стандартные пины 20,21, то тоже работает. А я думал, что разницы нет куда ставить.
Отлично, что удалось запустить и хорошо, что пишите как разобрались. Но все это выглядит очень странно, эти пины объедены.