8-900-374-94-44
[email protected]
Slide Image
Меню

Arduino несколько устройств i2c: Arduino i2c несколько устройств двухсторонняя связь между контроллерами

инструменты и методы технического волшебства

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

Рис. 8.1. Схема подключения устройств I2C

8.2.1. Взаимодействие и идентификация устройств

Протокол I2C позволяет нескольким ведомым устройствам соединяться по одной шине с одним ведущим устройством. Далее роль ведущего устройства (мастера) будет играть плата Arduino. Мастер шины отвечает за инициирование обмена. Ведомые устройства не могут инициировать обмен данных, они способны только отвечать на запросы, которые посылает ведущее устройство.

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

Все команды и запросы, отправленные от мастера, принимаются всеми устройствами на шине. Каждое ведомое устройство имеет уникальный 7-битовый адрес (идентификационный номер, ID устройства). Когда ведущее устройство инициирует связь, оно передает идентификатор ведомого. Ведомые устройства реагируют на данные, передающиеся по шине, только тогда, когда они направлены в их адрес.

Адрес каждого устройства на шине I2C должен быть уникальным. Некоторые устройства I2C имеют настраиваемые адреса, а другие — фиксированный адрес, заданный производителем. При подключении к одной шине нескольких I2C-устройств, необходимо чтобы у них были различные идентификаторы.

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

— 172 —

рим датчик температуры ТС74. Из рис. 8.2 видно, что этот датчик может иметь несколько разных адресов. В примерах данной главы у датчика TC74A0-5.0VAT (исполнение ТО-220) I2C-адрес задан как 1001000.

Рис. 8.2. Фрагмент технического описания датчика ТС74. расшифровка обозначения и варианты адресов I2C

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

В датчиках другого типа, например, AD7414 и AD7415 есть контакт (AS), который позволяет настроить адрес устройства I

2C. Взгляните на данные датчика AD7414 из документации (рис. 8.3).

Датчик AD7414 выпускается в четырех вариантах исполнения, с контактом AS и без него. Адрес устройства, снабженного контактом AS, зависит от состояния этого контакта: отключен, подключен к питанию или земле.

Table 4. 1 1 С Address Selection

Рис. 8.3. Фрагмент технического описания датчика AD7414. цоколевка и варианты адресов I2C

— 173 —

8.2.2. Требования к оборудованию и подтягивающие резисторы

Из рис. 8.1 ясно, что типовая конфигурация шины I2C требует наличия подтягивающих резисторов на линиях синхронизации и передачи данных. Номинал резисторов зависит от ведомых устройств, данные можно посмотреть в документации на эти устройства. Мы рекомендуем взять резисторы номиналом 4,7 кОм, — это стандартное значение, которое указано во многих справочниках.

Подключение I2C дисплея к ардуино. Русификация текста.

Сегодня вы узнаете про подключение I2C дисплея к Ардуино, а точнее как сделать из простого LCD1602 i2c дисплей используя модуль I2C. А ещё как изменять адрес на шине I2C, как выводить русский(кириллицу) шрифт и многое другое.

Это история о том, как был у меня дисплей LCD 2004 и подключался он напрямую, то есть аж 8 проводами и надоело мне это сильно. И решил я упростить себе и надеюсь и вам тоже работу и купил в Китае

модуль-адаптер I2C .
I2C адаптер  — это преобразователь интерфейсов обеспечивающий обмен между параллельной шиной LCD и шиной I2C. И вместо 8 контактов на Ардуино вам понадобится всего 2, а к самой шине I2C можно подключить огромное число различных устройств.
Разницу можно видеть невооружённым взглядом.

Так что же такое I2C.

I2C  — это последовательный протокол обмена данными. Для передачи данных используются 2 линии связи. 
SDA (Serial Data)  — шина последовательных данных и
SCL (Serial Clock). — шина тактирования. 

Шины Управляются низким сигналом, поэтому они должны быть подтянуты к  шине питания через резисторы которые обычно уже припаяны к модулям I2C

. Но при использовании нескольких модулей могут быть проблемы если у каждого модуля есть подтягивающие резисторы то их надо выпаять и оставить всего по одному резистору.
Должно быть хотя бы одно ведущее устройство и до 127 ведомых. Обычно в качестве ведущего используют Ардуино.
У каждого ведомого должен быть свой уникальный адрес по которому к нему будет обращаться ведущий.

Адрес адаптера хранится в энергонезависимой памяти и он установлен производителем, но если вы захотите подключить несколько I2C устройств, а их можно подключить аж 127 штук, у вас могут попасться устройства с одинаковыми адресами. на этом модуле вы сможете изменить адрес. Как это сделать я  расскажу дальше в видео.

Теперь что мы имеем. У нас есть простой дисплей на 20 символов и 4 строчки с подпаянными 16 контактами. И есть модуль адаптер I2C так же с подпаянными 16 контактами.

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

Вот и всё устройство готово и может уже работать., Но я всё же пойду припаяю, так как это более надёжно и мне так больше нравится. Так что подождите, это не долго. Ну вот и всё.
Как видите, ничего сложного в замене штырьков на адаптер нет. Я просто выпаял их и вместо них запаял I2C адаптер. И теперь вместо сборки целой схемы и кучи проводов мне надо будет подключить всего 2 провода, а куда и как я покажу чуть позже.

Давайте посмотрим какой у вас адрес на шине I2C прошитый в память, и какие ещё есть адреса, на которые можно заменить стандартный.


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

Рассмотрим работу скетча Сканер I2C.

Сканер прослушивает все адреса и если будет найдено устройство подключённое к шине I2C то в монитор порта будет выведен адрес устройства который нужно запомнить и затем ввести в код для правильной работы с этим устройством.

У меня сейчас подключено только дисплей, поэтому сканер нашёл только его. Как можно видеть, дисплей определился по адресу 027 
Теперь давайте изменим адрес на другой. Для этого на модуле есть три пары контактных площадок которые нужно замкнуть и тогда у вас изменится адрес. Всего возможно сменить до 4 адресов.
Сначала замыкаем первую пару контактов и видим, что адрес изменился на 026. Если убрать перемычку, то адрес снова станет 027.

Я специально в скетче сделал задержку в 5 секунд, чтобы было проще видеть изменения.
Теперь замкнём вторую пару. Адрес изменился на 025. Отпускаем и он снова стал 027.
Ну и у нас осталась третья пара. Вы наверное думаете что по логике адрес должен быть 024. А вот и нет. Адрес стал 023. Почему так я не знаю. Кто знает напишите. А может просто так захотел производитель дисплея.
Теперь, что мы имеем.
Мы можем обратиться к нашему дисплею по адресам, 027, 026, 025, 023. Так что если у вас какое-то устройство будет на одном из этих адресов, вы сможете изменить его и у вас не будет конфликтов.
Продолжаем дальше.
Если вам что-то не понятно или вы захотите получить больше информации о прямом подключении или о подключении по шине I2C. Как протестировать дисплей на наличие или отсутствии русского шрифта. Узнать что такое таблица знакогенератора или хотите научиться создавать свои символы и выводить их на экран, то посмотрите это видео и вам всё сразу станет понятно.
LCD дисплей очень часто применяются для вывода информации, поэтому вам нужно лучше изучить их работу, а помогут вам в этом эти примеры. На канале есть и другие, это всего лишь часть из них, но даже этого вполне видно как можно применять дисплей.
А мы идём дальше.
Теперь давайте что-нибудь выведем на экран используя I2C, ведь для этого мы и проделали столько работы.

Для начала работы нужно установить библиотеку LiquidCrystal_I2C. Как добавлять библиотеки мы уже много раз рассматривали. Если вы не знаете, то посмотрите предыдущие видео, там я подробно рассказывал как это делать. Загрузим скетч из архива. 

Здесь указываем адрес устройства которое определил сканер. И какой у вас дисплей. 16 или 20 знаков.
Здесь мы инициализируем дисплей.
Включаем на нём подсветку. 
Устанавливаем курсор на то  знакоместо экрана с которого хотим начать печатать текст. Устанавливаем нужную строку. Отсчёт ведётся с 0.
Выводим текст. Перемещаем курсор на 2 строку.
Выводим другую надпись. И так далее.
Прошиваем контроллер и смотрим результат. Мы видим, что обе надписи вывелись на экран и именно там где мы и хотели.  

Теперь усложним задачу. Выведем текст кириллицей. И не важно поддерживает ваш дисплей кириллицу или нет, вам поможет вот эта библиотека LCD 16 02 RUS ALL
По моему мнению – это самая лучшая библиотека для вывода кириллицы на экран. Она работает с разными дисплеями с 16 и 20 символами и с подключением по I2C и прямым подключением.

Выводить будем алфавит. Мне писали, что не все символы в библиотеке показываются правильно. Вот сейчас и проверим. Я буду выводить по 10 букв в строку, сначала заглавными буквами, а потом прописными. Для лучшего восприятия, я сделал паузы в 5 секунд между выводом строк. 
Как я уже неоднократно говорил, вы не можете одновременно вывести больше 8 своих символов, а каждая буква, отличающаяся по начертанию от латинской — это свой символ. Избежать этого можно очисткой экрана. Главное, чтобы одновременно на экране не было больше 8 не стандартных букв.
Ну вот вроде всё что хотел рассказал. Если вам понравилось это видео и вы хотите и дальше смотреть интересные видео, то пишите комментарии, ставьте лайки, размещайте и делитесь моими видео. Это очень мне поможет.
 

Обзор | Работа с несколькими устройствами I2C с одинаковым адресом

Обзор

Сохранить Подписаться

Пожалуйста, войдите, чтобы подписаться на это руководство.

После входа в систему вы будете перенаправлены обратно к этому руководству и сможете подписаться на него.

В предыдущем руководстве работа с устройствами I2C обсуждалась в общих чертах с учетом различных тем. Если вы новичок в I2C и вам нужен более широкий обзор, обязательно сначала прочитайте это руководство, вот ссылка:

Работа с устройствами I2C

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

Как упоминалось в приведенном выше руководстве, каждое устройство I2C на шине I2C должно иметь уникальный адрес. Если вы использовали только одно устройство I2C, возможно, вы даже не поняли этого. Большинство драйверов написаны таким образом, что они используют, без какого-либо дополнительного ввода со стороны пользователя, предопределенный адрес по умолчанию. Это также могло иметь место при использовании нескольких, но разных устройств I2C. В этом случае адрес по умолчанию для каждого устройства был разным, поэтому с точки зрения кодирования больше нечего было делать. Все было просто plug-and-play.

Однако все становится интереснее, когда начинают происходить конфликты адресов. Это практически неизбежно при попытке использовать несколько копий одного и того же устройства I2C . Как упоминалось в другом руководстве, есть три основных способа справиться с этим:

  • Использовать альтернативный адрес (если позволяет устройство)
  • Используйте мультиплексор каналов I2C, если альтернативный адрес (адреса) невозможен (рекомендуется)
  • Используйте альтернативные порты I2C (если отчаянно)

При любом из этих подходов предстоит проделать большую работу. Какой альтернативный адрес? Как вы на самом деле «установить» его? Как изменить код для размещения альтернативного адреса? Как вы используете мультиплексор каналов I2C? и т.д.

Это руководство призвано помочь ответить на эти вопросы.

Аппаратное обеспечение

В этом руководстве в качестве репрезентативного устройства I2C используется коммутационный порт Adafruit BME280. Однако в этом конкретном датчике нет ничего особенного. Так что это не совсем «необходимое оборудование». Информация здесь должна в целом относиться к любой прорыв I2C.

Когда речь идет о мультиплексоре I2C, TCA9548A в настоящее время является лучшим вариантом. Он доступен в нескольких различных комплектациях:

TCA9548A Мультиплексор I2C

Вы только что нашли идеальный датчик I2C и хотите подключить два, три или более из них к Arduino, когда понимаете: «О, этот чип фиксированный адрес I2C и от…

SparkFun STEMMA QT / Qwiic TCA9548A Mux Breakout — 8-канальный

У вас слишком много датчиков с одинаковым адресом I2C? на том же автобусе! The Qwiic Mux Breakout. ..

В данном руководстве используется переходник Adafruit TCA9548A. Тем не менее, SparkFun имеет то преимущество, что не требует пайки. Все можно подключить с помощью кабелей STEMMA QT.

Также на схемах подключения показан ItsyBitsy M4. Однако информация в этом руководстве должна относиться к любой плате Arduino или CircuitPython с портом I2C. Что почти большинство из них.

Одно устройство с настройками по умолчанию 

Это руководство было впервые опубликовано 04 мая 2022 г. Оно было последним обновлено 04 мая 2022 г.

Эта страница (обзор) последний раз обновлялась 27 апреля 2022 г.

Текстовый редактор на базе tinymce.

Сколько устройств можно подключить к шине I2C?

  1. Учебники
  2. org/ListItem»> Сколько устройств можно подключить к шине I2C?

Если вы когда-либо задавали этот вопрос на любом дискуссионном форуме для пользователей Arduino, энтузиастов электроники и коллег-инженеров, вы получите такие ответы:

·        «У вас 7-битный адрес. Это означает, что вы можете адресовать до 127 ведомых устройств.»

·        «Количество устройств, подключенных к шине, ограничено только общей допустимой емкостью шины 400 пФ.»

·        «Короткий ответ: это зависит!»

Что ж, спасибо Интернету! Я уже чувствую себя умнее! А если серьезно, сколько датчиков я могу подключить к своей Arduino с помощью шины I2C?

Последний ответ был, несмотря на то, что он был самым раздражающим, возможно, самым правильным, но только потому, что вопрос был таким расплывчатым! Итак, попробуем перефразировать этот вопрос. Когда вы говорите «датчик», вы имеете в виду датчик, установленный на коммутационной плате? Да? Теперь это имеет огромное значение! Итак, вопрос теперь становится: сколько коммутационных плат можно подключить к шине I2C?

Эту проблему решить намного проще, и, к сожалению, ответ намного меньше, чем 127.

Да, мы кратко рассмотрим основы шины I2C. Но нам не нужно копать слишком глубоко, чтобы ответить на наш вопрос.

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

Возможно, вы заметили, что контакты SDA и SCL подключены к земле через переключатель внутри устройства. Это, конечно, очень просто представление. Когда вы соединяете два устройства друг с другом с помощью шины I2C, вам просто нужно соединить вывод VCC одного устройства с выводом VCC другого устройства и выполнить то же самое с выводами SDA, SCL и GND. Ну вы только посмотрите на красивую картинку!

Одно из устройств возьмет на себя роль Мастера. Это означает, что он будет отвечать за генерацию тактового сигнала на линии SCL и использовать SDA. строка для отправки команд ведомому. Ведомый, с другой стороны, использует линию SDA для отправки данных обратно ведущему. В большинстве случаев Arduino будет ведущим устройством, в то время как любое другое устройство управляемый Arduino, как и датчик, будет действовать как Slave.

Но мы еще не закончили! Для работы шины I2C нам необходимо подключить один резистор между линией VCC и линией SDA, а также еще один резистор между Линия VCC и линия SCL. Они называются подтягивающими резисторами.

Как это выглядит, если у нас есть более одного ведомого устройства, то есть более одного датчика, подключенного к Arduino? Ну, в этом случае у вас все равно был бы один резистор к линии SDA и еще один к линии SCL. Неважно, подключен ли к Arduino только один датчик или пятьдесят датчиков, вам нужен только один резистор на линии SCL и один резистор. по линии ПДД.

Но почему? Зачем вообще нужен резистор? И почему меня это должно волновать? Что ж, как вы уже могли догадаться, одна из основных проблем, вызванных подключение нескольких коммутационных плат на платах I2C вызвано подтягивающими резисторами.

Чтобы понять это, давайте посмотрим, как формируется цифровой сигнал, например, на линии SCL. Линия SDA работает так же, но для ясности я показываю здесь только линию SCL.

В этой схеме напряжение на линии VCC равно 5 В (или 3,3 В, в зависимости от вашего источника питания), напряжение на линии GND равно 0 В, а напряжение на SCL линия, фактически генерируемый сигнал зависит от положения переключателя.

Если переключатель разомкнут, потенциал 5 В с линии VCC также будет на линии SCL. В этом случае напряжение на линии SCL будет равно 5В, а сигнал будет интерпретироваться как логический ВЫСОКИЙ. Поскольку переключатель разомкнут, через устройство не будет протекать ток.

Если переключатель замкнут, 0 В с линии GND также будет на линии SCL, и сигнал будет интерпретироваться как логический НИЗКИЙ. Теперь у нас есть разница потенциал на резисторе, и ток будет течь через ключ.

Размыкание и замыкание переключателя генерирует хороший цифровой сигнал, варьирующийся от 0 В до 5 В.

Конечно, так выглядит идеальный цифровой сигнал, но давайте посмотрим, как выглядит реальный сигнал. Если вы подключаете один датчик, установленный на прорыве плату и подключите ее к Arduino с помощью шины I2C, у вас должно получиться что-то вроде этого:

Отлично, теперь возьмите осциллограф и измерьте сигнал на линии SCL. Что ты видишь?

Как видите, синяя линия, измеренный сигнал на линии SCL, сильно отличается от идеального цифрового сигнала. Максимальное значение немного ниже 5 В, минимальное значение немного выше 0 В, а переход напряжения с 0 В на 5 В занимает много времени. Несмотря на все это, именно так выглядит хороший сигнал!

Теперь давайте представим, что мы подключаем не одну коммутационную плату к Arduino, а несколько плат одновременно.

Как упоминалось ранее, подключение нескольких датчиков к шине I2C означает подключение контактов SCL всех плат друг к другу. Таким образом, сигнал SCL сгенерированный Arduino, используется всеми датчиками. То же самое относится к сигналу SDA, а также к источнику питания (VCC) и земле (GND). Итак, как выглядит сигнал SCL сейчас?

Новый сигнал SCL, показанный красным, больше похож на идеальный сигнал, чем раньше. Напряжение на логическом НИЗКОМ уровне теперь намного выше, чем раньше, но напряжение на логическом уровне HIGH выглядит так же, и теперь напряжение увеличивается намного быстрее от низкого уровня к высокому. Ну, это не так уж плохо, правда?

Очень неправильно! И единственной причиной является новое напряжение на логическом уровне НИЗКИЙ. Чтобы понять, насколько это плохо, вернемся к нашей первой диаграмме.

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

Включая и выключая транзистор, вы можете изменить сигнал SCL на логический НИЗКИЙ и логический ВЫСОКИЙ. Когда транзистор закрыт, сопротивление транзистора между выводами SCL и GND очень высокое, так что ток через транзистор и, следовательно, через резистор практически не течет. Напряжение на линии SCL будет очень близким до 5В, поэтому это будет интерпретироваться как ВЫСОКИЙ логический уровень.

Когда транзистор открыт, сопротивление на транзисторе становится очень маленьким, однако оно не равно нулю. Теперь через резистор течет небольшой ток. и, главное, через транзистор. Напряжение на линии SCL равно падению напряжения на транзисторе. Поскольку это падение напряжения очень близко к 0 В, сигнал SCL будет интерпретируется как логический НИЗКИЙ.

Теперь возникает большой вопрос: что произойдет, если мы уменьшим сопротивление подтягивающего резистора? Ток через резистор, естественно, увеличивается. Но такой же ток течет и через транзистор!

Больший ток через транзистор приводит к большему рассеиванию тепла внутри устройства, а перегрев является основной причиной выхода из строя полупроводниковых приборов. устройства. Зная это, Спецификация шины I2C и Пользовательский Вручную устанавливает максимум 3 мА на транзисторе. Этот ток известен как стоковой ток.

Это означает, что устройства, предназначенные для использования шины I2C, должны работать с потребляемым током 3 мА, протекающим через транзистор. Это также означает, что схема проектировщики должны учитывать это ограничение при определении размеров подтягивающих резисторов.

И как мы узнаем, превышает ли потребляемый ток в нашей цепи предел 3 мА? Что ж, увеличение стокового тока означает, что падение напряжения на транзистор тоже увеличивается. Падение напряжения на транзисторе, также известное как выходное напряжение низкого уровня, представляет собой уровень напряжения, когда сигнал имеет логический НИЗКИЙ уровень.

Спецификация шины I2C и руководство пользователя также устанавливают максимальное значение 0,4 В для выходного напряжения низкого уровня, поскольку это указывает на то, что максимальный потребляемый ток составляет 3 мА. течет через транзистор. Следовательно, всякий раз, когда мы измеряем сигналы SDA или SCL, а напряжение на логическом НИЗКОМ уровне выше 0,4 В, мы знаем, что потребляемый ток слишком велик!

При максимальном токе стока 3 мА и максимальном низкоуровневом выходном напряжении 0,4 В мы можем рассчитать минимальное значение для подтягивающих резисторов. Все, что у нас есть нужно рассмотреть наихудшую ситуацию при работе в рамках спецификации. Минимальное значение для каждого подтягивающего резистора равно падению напряжения на резисторе, деленному на максимальное значение. потребляемый ток 3мА.

Для источника питания 5 В каждый подтягивающий резистор должен иметь сопротивление не менее 1,53 кОм, а для источника питания 3,3 В каждый резистор должен иметь сопротивление не менее 967 Ом.


Конечно, это не означает, что всякий раз, когда потребляемый ток превысит 3 мА, устройство немедленно перестанет работать. Но вы всегда должны быть осторожны при эксплуатации устройства за пределами его спецификации, поскольку это может привести к сбоям связи, сокращению срока его службы и даже к необратимому повреждению устройства.

Теперь вернемся к нашей проблеме: сколько коммутационных плат можно подключить к шине I2C? Не так много… Вы, наверное, уже заметили, у каждой пробивной доски есть своя пара подтягивающих резисторов. Значение этих резисторов варьируется от платы к плате, но большинство из них имеют номинал 10 кОм, 4,7 кОм или 2,2 кОм.

Когда мы соединяем несколько коммутационных плат вместе, мы фактически подключаем эти резисторы параллельно друг другу, уменьшая общее сопротивление. Даже соединение двух плат с подтягивающими резисторами 2,2 кОм уменьшит общее сопротивление до 1,1 кОм. Этого вполне достаточно для источника питания 3,3 В, но оно будет ниже минимального значения. 1,53 кОм для VCC 5 В.

В лучшем случае, используя платы с подтягивающими резисторами 10 кОм, вы можете соединить 10 плат вместе, в результате чего общее подтягивающее сопротивление составит 1 кОм. что было бы хорошо для VCC 3,3 В. Однако для VCC 5 В вы можете подключить 6 плат с подтягивающими резисторами по 10 кОм каждая, в результате чего общее сопротивление составит 1,67 кОм.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *