Как узнать адрес дисплея i2c на ардуино

Обновлено: 07.07.2024

Мы уже говорили о том, что к контроллеру можно подключать различные модули, и более того, уже даже подключали зуммер и модули-моторы. Модули могут либо просто подключаться к выводам контроллера, как было в случае с зуммером, так и соединяться одной шиной, как, например, модули моторов.

Все модули, которые управляются по шине I2C, на самом деле соединены одним шлейфом. Это позволяет, используя всего два вывода контроллера, подключить к нему более сотни устройств! (Поясним: мотор подключен шиной из 4-х проводов: два из них — питание: + и -, и еще два — именно провода шины I2C, поэтому, можно сказать, что для управления модулем требуется всего два провода).

Для того, чтобы контроллер мог управлять каждым модулем по отдельности, существуют адреса. Контроллер посылает команды: что необходимо сделать устройству и по какому адресу.

Если адреса устройств разные, то всё работает, как задумано: нужное устройство по нужному адресу выполняет предназначенные для него команды. Однако, если адреса устройств совпадают, то контроллер не сможет отличить модули друг от друга. Для того, чтобы всё работало, как задумано, каждый модуль в пределах одной шины должен иметь свой уникальный адрес.


Изменение I2C-адресов модулей

Изначально все наши модули имеют адрес 0х09, но, как мы уже знаем, все модули должны иметь разные адреса. Давайте сразу поменяем адреса всех модулей, с которыми будем работать. Для того, чтобы его изменить, воспользуйтесь скетчем ниже.

Важно! При изменении адреса к контроллеру должен быть подключен только один модуль.

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

Для этого потребуется открутить 4 винта и снять модуль питания, после чего достать контроллер.

*Шлейфы на картинке не показаны, их можно не отключать


После этого подключаем к контроллеру модуль правый мотор, как показано на рисунке (модуль с платы снимать не нужно):


Выводы модуляВыводы контроллера
GNDGND
5V5V
SDAA4
SCLA5

Все модули имеют одинаковые названия выводов и подключаются к контроллеру аналогично.

После того, как Вы подключили правый мотор к контроллеру, загрузите следующий скетч. После загрузки адрес модуля будет изменён на тот, который Вы указали в начале скетча (3 строка).

Адреса для модулей:

МодульАдрес
Правый мотор0х0А
Левый мотор0х0В
Бампер-датчик линии0х0С
Матрица 8х80х0D

Больше устройств I2C на машинке не предвидится. Остальные модули работают не по шине I2C (они просто подключаются к выводам контроллера).

Во время загрузки Вы можете открыть монитор порта и увидеть информацию о том, что адрес был изменён.

Измените таким же образом адреса всех модулей на указанные в таблице.

Теперь можно снова собрать машинку и двигаться дальше. Наши модули готовы к работе.

Проверка моторов

Для проверки того, правильно ли мы установили адреса, давайте загрузим следующий скетч и посмотрим результат его работы в мониторе порта. Если всё сделано верно, Вы увидите соответствующие надписи.


В этом уроке мы научимся определять адреса устройств на шине I2C, аппаратно устанавливая состояния Start/Stop на шине I2C и передавая байт данных с адресом устройства и битом RW.

Нам понадобится:

    х 1шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт. х 1шт. х 1шт. х 1шт. х 2шт.
  • Устройства и модули с шиной I2C, адреса которых Вы хотите узнать, до 126 шт.

Для реализации проекта нам необходимо установить одну библиотеку:

  • Библиотека LiquidCrystal_I2C_V112 (для работы с дисплеем LCD1602 по шине I2C)

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki - Работа с символьными ЖК дисплеями.

Видео:

Схема подключения:

  • Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
  • Кнопка подключается к цифровому выводу 2.

Определение адресов устройств на шине I2C

Алгоритм работы:

  • При однократном нажатии на кнопку - выводится очередной адрес.
  • При удержании кнопки - производится чтение адресов, всех подключенных к шине I2C устройств.

Код программы:

Алгоритм работы программы:

Код в функции loop() начинает выполняться только при условии, если нажата кнопка. Если таковое событие произошло, то начинает исполняться цикл while() выход из которого осуществляется при отпускании кнопки. В самом цикле происходит подсчёт времени удержания кнопки.

После отпускания кнопки, программа выполняет одно из двух действий:

  • Если кнопка удерживалась меньше 1 секунды, то происходит увеличение порядкового номера выводимого адреса.
  • Если кнопка удерживалась дольше 1 секунды, то происходит чтение всех доступных адресов на шине I2C.

Чтение адресов на шине I2C происходит в цикле for() от 1 до 127, где индекс цикла соответствует проверяемому адресу. Проверка на существование адреса осуществляется следующим образом:

  • Вызывается функция func_START, которая устанавливает состояние СТАРТ на шине I2C и возвращает результат установки данного состояния.
  • Если состояние СТАРТ установлено, то вызывается функция func_SEND, которая передает свой аргумент как байт адреса с битом RW=0 и если на шине зафиксирован ответ ACK, то возвращает результат true, иначе false.
  • Если на шине зафиксирован результат ACK, то переданный адрес сохраняется в массив найденных адресов, за исключением адреса 0x27 который является адресом LCD дисплея.
  • Вызывается функция func_STOP, которая устанавливает состояние СТОП на шине I2C.

И последнее действие программы - вывод данных на дисплей, не зависимо от того, как долго удерживалась кнопка.

Так как передача данных осуществляется только после отпускания кнопки, то допускается «горячее» подключение проверяемых устройств к шине I2C, если кнопка не нажата.

ris-scan-I2C.jpg

Сборочный рисунок

После сборки включив кнопку питания и соответственно подав напряжение питания на ардуино и дисплей, надо покрутить подстроечный резистор на 10 килоОм до получения на экране текста. После этого прибор готов к эксплуатации.


На видео старый поисковик 2016 года. На фотографиях далее по тексту уже новый поисковик собранный для проверки на макете с подправленным скетчем 2020 года.

Все описания крайне упрощены для лучшего понимания базовых основ. Знающих прошу воздержаться от комментирования в стиле описания зарезервированных адресов, десяти битной адресации, работы нескольких ведущих и прочих отвлекающих моментов. Остальным, добро пожаловать в мир подключения кучи (хоть штук сто) устройств к ардуино по трем проводам (SDA, SCL, GND).

Inter-Integrated Circuit сокращенно IIC. Еще бывают названия (ай-квадрат-си) и (ай.ту-си). Суть от этого не меняется — это последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов. В тексте буду писать I2C. Модулем буду называть устройство которое имеет интерфейс I2C для подключения к ардуино с питанием 5V.

Предупреждение. ВАЖНО! Для подключения к модулям с питанием 3,3V надо использовать преобразователь логических уровней, либо хотя бы токоограничивающие резисторы, а запитывать модуль на 3,3V соответственно можно только от напряжения 3,3V. На видео и фото, подключены модули с питанием 5V.

I2C использует две линии связи SDA и SCL на которые через резисторы в несколько килоОм подано положительное напряжение питания электронной схемы. Резисторы обычно уже установлены в модулях продаваемых китайцами на алиэкспресс. Работает шина относительно линии питания GND. Все SDA соединяют вместе и все SCL соединяют вместе, такое соединение и называют шиной. То что питание плюс и минус надо подавать на все устройства наверное и так должно быть понятно. При внешнем питании модулей, с поисковиком надо обязательно соединить и GND. Для одного модуля с малым потреблением, положительный вывод питания можно использовать от поисковика, чтобы не городить схему с внешним питанием модуля. Каждое устройство, подключённое к шине, может быть программно адресовано по уникальному адресу. Семь бит создают уникальный адрес до 127 устройств на шине. Несколько адресов зарезервировано под расширение функционала поэтому реально на шине можно подключить менее 127 устройств. Восьмой бит означает, устройство будет принимать или передавать данные на следующем байте. Все очень просто. Главное правильно записать адрес устройства в скетч и схема заработает, а куча модулей (хоть сто штук) будет занимать на ардуино всего два пина, без учета питания.

Одно время меня активно убеждали, что устройство должно быть как кастрюля с кнопкой. Простым и удобным в использовании. Поэтому кроме одной кнопки управления там ничего нет. Подключаете питание к шине с модулями адреса которых хотите проверить. Подключаете SDA, SCL и GND к поисковику. На дисплее написано, что делать. При загрузке сначала показывает служебную информацию и сразу переходит в ожидание запуска.

Нужно для визуального контроля отсутствия косяков. Смотрите, на дисплее надпись есть, значит прибор работает. На модуле при наличии индикатора питания, индикатор горит, значит модуль подключен. Нажимаете кнопку. При переборе адресов, встретив устройство на шине, происходит остановка.

Можете записать найденный адрес.

И так будет останавливаться на каждом найденном устройстве, пока не будет проверено все пространство адресов. В конце напишет сколько устройств найдено

5.jpg

и будет с интервалом в пять секунд показывать номера модулей.

При показе последнего найденного, перейдет к первому и будет показывать с начала. И так пока не выключите. Этот режим нужен для проверки собранного устройства с множеством подключенных модулей.

В простейшем случае, просто втыкаете модуль прямо в поисковик с питанием от поисковика и выключаете после того как записали найденный адрес на первой остановке поиска.

Привет! Будучи любителем - энтузиастом электроники, я уверен, что всё что мы делаем – радиоэлектронные игрушки – самоделки, или большие проекты, все это от любопытства и лени. Любопытство стремится понять и постичь необъятное, не познанное, разобраться, как оно там работает, чего делает, как двигается. А лень изобретает, чтобы такого придумать, чтобы не вставать, не подходить, не поднимать, не запачкаться или еще чего ни будь важное.

Для тех, у кого тоже возникло подобное желание, - вот краткое руководство по подключению и проверке маленьких и не дорогих дисплеев OLED.
Далее речь пойдет об одной из широко доступных для радиолюбителей моделях OLED дисплеев, управляемых чипом SSD1306, с размером экрана 0,96-дюймов и разрешением 128*64 или 128*32 точки. Эти дисплеи идеально подходят для не больших радиолюбительских конструкций и самоделок.

Шаг 1: Основные понятия

  • OLED это Organic Light-Emitting Diode, т.е., полупроводниковый прибор из органических соединений, который начинает излучать свет при прохождении через него электрического тока.
  • ARDUINO - это платформа для обучения и построения систем автоматики и робототехники.
  • ArduinoIDE - среда разработки. Это бесплатная программа для программирования Arduino.
  • I2C – Inter-Integrated Circuits, межмикросхемная линия связи.
  • Скетч, он же, код, он же программа - терминология Arduino.

Шаг 2: Комплектующие

  • 1. Сам OLED дисплей 0,96” (можно купить на Aliexpress или Ebay, - долго, но дешево!).
  • 2. Arduino UNO / Nano (там же где дисплей).
  • 3. Соединительные провода (там же).
  • 4. Компьютер или ноутбук с установленной ArduinoIDE.

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

Шаг 3: Подключение дисплея


Управление дисплеем осуществляет чип SSD1306, который поддерживает пять протоколов связи и один из которых I2C. Данные по этому протоколу передаются всего по двум проводам, а чем меньше проводов в корпусе, тем лучше, так что нам он вполне подходит. Но! Встречаются модули с протоколом SPI и даже с переключением протоколов, так что будьте внимательны при покупке данного модуля.

Используемые выводы:
OLED дисплей - SCL/SCK (clock) и SDA (data), «Плюс» питания (VCC) и «Минус» питания (GND).
  • Vcc - 5V
  • GND - GND
  • SDA - A4
  • SCL - A5

Шаг 4: Сканер I2C

Каждое устройство на шине I2C имеет шестнадцатеричный адрес, поменять нельзя, он вшит намертво, каждый ответственный производитель должен где-то на корпусе или в инструкции указать его. Бывают модули с переключателями и перемычками, которыми можно изменить адрес, но… если устройства дешевые, до безобразия, то производитель может и не удосужиться заниматься такой мелочью, поэтому его придется определять самостоятельно.

Всего на шине может использоваться до 127 адресов - 119 для устройств и 8 адресов служебных. Общение ведется по этим адресам. Есть главный, он же Master, а есть ведомый, он же Slave, - Мастера запрашивают, ведомые отвечают, все просто.
Поскольку на нашем OLED-дисплей используется протокол связи I2C, а адрес может быть и не указан, мы сами попробуем узнать этот самый адрес.

Это можно сделать, загрузив коротенький скетч на свою плату Arduino с подключенным OLED. НО!
Не торопитесь сразу заливать скетч в Arduino! Давайте для начала загрузим «драйвера», т.е. подключим библиотеки, а для этого сразу перейдем к «Шагу №5», а затем вернемся и продолжим.

Шаг 4: Продолжение:

Шаг 5: Загрузка и подключение библиотек

  • 1. В ArduinoIDE идем в меню Скетч / Sketch.
  • 2. Выбираем «Включить библиотеки» / Include Libraries.
  • 3.Выбираем «Управление библиотеками» / Managed Libraries.
  • 4. Находим ADAFRUIT GFX и устанавливаем их.
  • 5. Находим ADAFRUIT SSD1306 и устанавливаем их.

Шаг 6: Тестирование дисплея


Чтобы проверить, работает ли все так, как ожидалось, запустите пример для проверки из ArduinoIDE.
Для этого:
Перейти ФАЙЛ> ПРИМЕРЫ> SSD 1306> Выбрать 128x64 i2c
Если вы получите «Ошибку», попробуйте выбрать SSD 1306> 128x32 i2c.
Если снова «Ошибка» попробуйте изменит адрес I2C в строке 61, демонстрационного кода, и замените его адресом вашего дисплея, который вы определили на шаге №4.
Если снова ошибка, можно попробовать отредактировать файл Adafruit_SSD1306.h, он находится в папке с библиотеками Arduino.

Откройте файл Adafruit_SSD1306.h в текстовом редакторе и найдите строки:

Должно получиться так:

Если снова ошибка – необходимо проверить правильность соединений.
После окончания загрузки вы увидите тестовую анимацию на экране, это означает, что вы успешно настроили свой OLED дисплей.

Когда вы вдоволь насладитесь сей анимацией, можете переходить к следующему шагу.

Затем пишем протокол сброса:

В VOID SETUP указываем шестнадцатеричный адрес нашего дисплея 0x3C, который мы узнали на «Шаге №4».
Затем, инициализируем дисплей и очищаем его:

В прошлой статье мы собрали схему подключения дисплея LCD 1602 в связке с потенциометром и фоторезистором и опробовали в режиме отладки, но взаимодействие программы с LCD не разобрали. В этой статье доделываем алгоритм до логического завершения и выведем переменные на дисплей.

Кто пропустил предыдущую статью, рекомендую сначала прочитать: mBlock и i2c - Выводим переменные на дисплей LCD 1602

Проверка готовности

Итак, программа составлена, но она не доделана.

Программа контроля изменений фоторезистора и потенциометра в mBlock Программа контроля изменений фоторезистора и потенциометра в mBlock

Схема подключена.

Компоненты в наличии:

  • Плата Arduino Uno
  • Дисплей LCD 1602
  • Потенциометр 10 кОм
  • Фоторезистор
  • Резистор 10 кОм
  • Макетная плата
  • Соединительные провода
Схема контроля изменений фоторезистора и потенциометра в mBlock Схема контроля изменений фоторезистора и потенциометра в mBlock

Если все собрано правильно, то на схеме должны отображаться переменные Foto и Rezistor которыми можно управлять.

Переменные для контроля изменений фоторезистора и потенциометра в программе mBlock Переменные для контроля изменений фоторезистора и потенциометра в программе mBlock

Как вы, наверное, уже заметили, на блоках управления LCD дисплеем есть выпадающее меню с I2C адресами. В большинстве случаев I2C адрес дисплея LCD 1602 является 27, но возможно именно в вашем случае произошло досадное исключение. Надо проверить .

Установить соответствующим вашему нужно на всех трёх блоках нашей программы.

Как проверить I2C?

К сожалению, расширение для сканирования адреса I2C в программе mBlock я не нашел, а может плохо искал? Если вы знаете такое расширение, то напишите в комментариях. Придется определять сторонними программами. Существует несколько способов проверить I2C адрес:

Первый способ . Из выпадающего списка блока методом подбора: выбирать по очереди каждый адрес, пока не окажется тот, при котором заработает дисплей. Адресов всего пять, так что процесс не затянется надолго.

Второй способ . Воспользоваться программой XOD IDE и моей статьёй, Сканируем i2c адрес в программе XOD IDE

Читайте также: