В свете получения очередных девайсов с i2c-шиной подумалось, что неплохо было бы иметь готовый сканер адресов, а не городить очередной раз что-то на базе Arduino или ESP. На глаза попался проект на базе attiny85 (да, в последнее время полюбилось мне на них делать что-нибудь), решил повторить.
Проект сделан под PlatformIO, поэтому некоторые переменные описываются не в коде, а в файле проекта и применяются только в момент сборки. Из того, что нужно добавить в код для сборки, например, в Arduino IDE:
#define DISPLAY_SW_I2C PB4,PB3
// scl,sda
#define TACT_PIN 1
//#define USE_U8X8
Флаг USE_U8X8 немного меняет внешний вид экрана, но, судя по тексту, не все версии библиотек могут влезть в память контроллера. У меня влезло, но вид мне больше понравился с квадратиками. TACT_PIN — 6-я нога контроллера — может быть притянут к земле кнопкой, тогда постоянное переключение экрана между режимами отображения останавливается — хотя экран обновляется и если на горячую подключить девайс — его адрес будет виден.
Распиновка — простейшая, схему не привожу, достаточно текстового описания:
- Питание — штатно, + на 8, — на 4. Соответственно, шарим питание на подключаемое устройство и на дисплей.
- 7 и 5 ноги контроллера — для сканируемого устройства, 7 — SCK, 5 — SDA.
- 6 нога — для кнопки на общий. Стоит сделать подтяжку ноги на плюс — на макетке у меня работало и так, но после сборки в более законченном варианте кнопка перестала работать, пришлось допаивать резистор.
- 2 и 3 ноги — software i2c для дисплея: 2 pin — SDA; 3 pin — SCL.
Для сканируемого устройства в итоге сделал 4 пина для возможности вставить в макетную плату или подключить коннекторы Dupont. Была мысль сделать пару-тройку разъемов под разные варианты комбинаций выводов, но из тех устройств, что оказались под рукой, комбинации были везде разные, а неудачно воткнув сканируемое устройство «не в тот» разъем, можно было его спалить.
Добавил USB-разъем для возможности запитки от внешнего источника — тут выяснилось, что я поторопился размещать компоненты на плате: сделав сдвиг контроллера чуть в сторону, можно было разместить распаянный micro USB-разъем (или любой другой вариант с терминалом под пайку). В итоге остановился на обычном разъеме type A, выпаянном откуда-то из старой техники.
По ходу сборки выяснилась интересная подробность. Нашел в сети этот тред, у человека была проблема с сканированием сенсорных модулей на TTP229, аналогичных тем, что заказал я. Резюме треда:
The I2C Scanner uses a ‘write’ command to test for an acknowledge from a I2C device. The TTP229 simply ignores that, but it does acknowledge a ‘read’ command, because that is the only thing it knows.
В треде есть пример кода, работающего с read, однако у меня пока нет идей, можно ли добавить такую функциональность в сканер на tiny85. Буду просто держать этот момент в голове.
Итог того, что получилось:


