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

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

I2c с примером — подключение

Andrey_s 1

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

я сейчас пытаюсь подключить устройство (TDS метр для измерения качества воды) по i2c,
В web включить i2c generic, подключил по пинам, устройство видит все ок,
i2cdetect -y 5 видит адрес устройства 0B
dmesg | grep -i i2c
19.062784] i2c-gpio mod1_i2c: using lines 276 (SDA) and 277 (SCL)
не понимаю как с конфигурировать его в WB что бы данные с устройств появились в mqtt
список адресов с данными у меня есть(в библиотеке артудино написаны)
пожалуйста, может есть пример конфига устройства i2c и где он должен быть расположен, еще что то, просто даже не знаю с чего начать, все что прочитал к сожалению мне не дало понимания как добавить устройство

Спасибо

BrainRoot 3

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

Andrey_s:

19.062784] i2c-gpio mod1_i2c: using lines 276 (SDA) and 277 (SCL)

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

Andrey_s:

не понимаю как с конфигурировать его в WB что бы данные с устройств появились в mqtt
список адресов с данными у меня есть(в библиотеке артудино написаны)

Можно пойти двумя путями: Сделать описание дайвером ядра, так же как (на контроллере) в /usr/share/wb-hwconf-manager/modules/wbio16.dtsi где строкой

compatible = "microchip,mcp23017"; указывается что именно за устройство на шине и адресе а ниже — куда данные из него раскладывать в /dev/
Таким образом работу с устройством берт на себя ядро, отображая читаемые данные в файловую систему (и наоборот).
Второй вариант — это написание своего “драйвера”. Точнее — сервиса, который общается по i2c с устройством и выклюадывает данные с него в MQTT. Пример (питон) можно глянуть тут: How to Use I2C Devices with Raspberry Pi | Microcontroller Tutorials

Но я для своих проектов использую *ну и советую) банальную Ардуино с RS-485 трансмиттером делая Modbus RTU slave. Это проще и универсальнее. Подключается — вот так: Дружим WirenBoard с Arduino (slave) по ModBus
Ну и есть у меня более годный шаблон с регистрами.

Andrey_s 4

Добрый день, спасибо за развернутый ответ, действительно лучше использовать RS485
если возможно что бы закрыть тему, прикрепите пожалуйста шаблон с регистрами
Спасибо

BrainRoot 5

Andrey_s:

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

Не совсем понятно, шаблон чего? А, понял!
WB_v_0. ino (20.5 КБ)

1 Like

Andrey_s

January 23, 2023, 10:57am 6

вы написали “Ну и есть у меня более годный шаблон с регистрами”
или я что то не так понял )?

system Closed 7

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

Шина I2C: принципы функционирования или зачем ещё тут нужны какие-то резисторы?

Добрый день, уважаемый читатель! Некоторое время назад я начал сочинительствовать на тему работы с шиной I2C с использованием фреймворка ESP-IDF. И она таки будет, но немного позже. Но вовремя сообразил, что придется отталкиваться от принципов функционирования данной шины, про которые я ещё не рассказывал. Поэтому решил отложить статью ESP-IDF + I2C в несколько более долгий ящик, а написать другую статью, на которую буду ссылаться впоследствии.

Принципы работы шины IIC (она же имеет более устоявшееся имя как I2C) не зависят от программной реализации, поэтому данная статья может быть полезна как программистам ESP-IDF, так и фанатам Arduino. Да и вообще всем, кто хочет понять как функционирует шина, зачем нужны какие-то резисторы, и как и в каком порядке улетают байты и биты по проводкам.

Статей на данную тему можно найти предостаточно, но я все-таки рискну написать ещё одну, авось вам понравится.


 

Немного теории

Интерфейс I2C (или по другому IIC) — это широко распространённый двухпроводный сетевой последовательный интерфейс, придуманный фирмой Philips более 30 лет назад и завоевавший популярность относительно высокой скоростью передачи данных (обычно до 100 кбит/с, в современных микросхемах до 400 кбит/с), дешевизной и простотой реализации.

Любое устройство на шине I2C может быть одного из двух типов: master (ведущий) или slave (ведомый). Как правило на шине только один master и одно или несколько slave-устройств, хотя это не строго обязательно – вполне можно иметь несколько мастеровых одновременно. Обмен данными происходит сеансами, которыми полностью управляет master: “начинает разговор”, “вызывает” нужного slave по его адресу и затем “дает ему слово”, если это требуется. Все ведомые устройства имеют уникальный номер – адрес, даже если такое устройство на всю сеть одно. Мастер номера не имеет. Ведомые молчат, слушают, что говорит ведущий и откликаются только тогда, когда ведущий их об этом напрямую просит, называя их по адресу, поэтому в сети всегда царит образцовый порядок (ну почти).

I2C позволяет подключать к одной шине до 127 slave-устройств одновременно, не используя дополнительного оборудования (если не считать двух подтягивающих резисторов), обращаясь к ним по 7-битному адресу (в некоторых реализациях адрес может быть и 10-битным, но это не наш случай). Но адреса slave-устройств на шине зачастую изменить нельзя, поэтому подключить к одной шине несколько однотипных устройств бывает сложно.

Картинка заимствована из статьи: https://3d-diy.ru/wiki/arduino-moduli/interfeys-peredachi-dannykh-i2c/. Не вижу смысла рисовать аналогичную, это лучшая иллюстрация в данном случае


 

Физическая реализация

Физически шина состоит из двух проводников (или линий):

  • SCL или CLOCK (Serial CLock или Signal CLock) – эта линия (провод) служит для тактирования, то есть для управления передачей данных и согласования всех устройств между собой.
  • SDA или DATA (S
    erial DAta или Signal DAta) – как и следует из названия, по этому проводу собственно и передаются данные.

Строго говоря, необходим как минимум ещё и третий провод — общий (или земля), но интерфейс принято называть двухпроводным по количеству сигнальных проводов. Да и питание на периферийные устройства зачастую подается с того же источника, что и на микроконтроллер, поэтому физически шина I2C может быть трехпроводной (без питания) или четырехпроводной (с питанием).

Все устройства I2C имеют сигнальные выводы с “открытым коллектором” или “открытом стоком” (в зависимости от реализации). Когда выходной транзистор закрыт — на соответствующей линии через внешний подтягивающий резистор устанавливается высокий уровень, когда выходной транзистор открыт — он притягивает соответствующую линию к земле и на ней устанавливается низкий уровень (смотрите рисунок). 

Поэтому наличие подтягивающих резисторов на линиях SDA и SCL строго обязательно, иначе высокий уровень в сигнальных линиях “сам собой” не появится.

Источник: https://radiohlam.ru/i2c/

Подтягивающие резисторы должны быть подключены к той линии питания, на напряжение которой рассчитаны GPIO используемого микроконтроллера и подключенных устройств. Обычно это +5В или +3,3В, в зависимости от используемого микроконтроллера. Например для ESP32 и ESP8266 нельзя подключать подтягивающие резисторы к шине питания +5В, так как их GPIO рассчитаны на напряжение не более чем 3,7В, и это может привести к физическому повреждению микроконтроллера. Подробнее об согласовании уровней поговорим чуть ниже.


Используемые выводы

На разных МК (микроконтроллерах, он же MCU), выводы шины I2C могут быть разными. В качестве ориентира можно использовать следующую таблицу (источник: enjoyneering):

ПлатаSDASCLПитание
Arduino Uno, Mini, Pro, ATmega168, ATmega328A4A5
Arduino Mega25602021
Arduino Due, SAM3X8E20213.3в
Arduino Leonardo, Micro, ATmega32U423
Digistump, Trinket, ATtiny85PB0PB2
Blue Pill, STM32F103xxxx boardsPB9/PB7 (1)PB8/PB6 (1)3.
3в / 5в
ESP8266 ESP-01GPIO0 (2)GPIO2 (2)3.3в / 5в
ESP8266 NodeMCU 1.0, ESP8266 WeMos D1 MiniGPIO4/D2GPIO5/D13.3в
ESP32 (Arduino framework)GPIO21/D21 (3)GPIO22/D22 (3)3.3в

Примечания:

  1. Аппаратный I2C, сопоставленный с 1-Wire в stm32duino, см. https://github.com/stm32duino/wiki/wiki/API#i2c
  2. Большинство плат имеют подтягивающий резистор 10 кОм … 12 кОм на GPIO0/D3, GPIO2/D4/LED и подтягивающий резистор на GPIO15/D8 для прошивки и загрузки
  3. Только для Arduino. Для ESP-IDF выводы GPIO могут быть любыми, кроме того, можно использовать одновременно сразу две отдельные программные шины (#0 и #1).

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


 

Как выбрать номинал подтягивающего резистора

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

На многочисленных схемах в интернете можно найти рекомендации устанавливать резисторы 4,7кОм, 5,1кОм и даже 10кОм. Так какой же выбрать? Давайте посчитаем. Воспользуемся банальным законом Ома.

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

  • для 10 кОм – 5 / 10000 = 0,0005А или 0,5мА или 500мкА
  • для 4,7 кОм – 5 / 4700 = ~0,00106А или 1мА

Между тем, рекомендованный ток подтяжки, по некоторым данным и даташитам, составляет от 1-3 мA (standard and fast mode). То есть при резисторах 10кОм мы получаем ток подтяжки в 2 раза меньше рекомендованного, при 4,7кОм – рекомендованный.

Будет работать? Конечно будет!

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

Но при напряжении питания 3,3в, например для микроконтроллеров ESP8266 и ESP32, ток будет в ~1,5 раза ниже, то есть 

330мкА (для 10 кОм) и ~700мкА (для 4,7 кОм). 330 мкА уже заметно ниже нормы. Но будет ли работать? Конечно будет! Но при небольших помехах и коротких проводах.

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

Для тока частотой 100 кГц (стандартная частота работы шины) трех- или четырхпроводный кабель, по сути, является конденсатором. Не самым банальным и простым, но все же конденсатором:

Упрощенное представление соединения между устройствами

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

На самом деле здесь взята иллюстрация нормальной работы из какого-то datasheet-а. Но при больших потерях спады и фронты импульсов будут еще плавнее.

Что, конечно же, приведет к различным сбоям и помехам на шине.

Стандарт шины предусматривает общую паразитную емкость между линиями шины в стандартном режиме (100 кбит/с) не более 400 пикоФарад, а в более высокоскоростных режимах может быть и ещё меньше:

Источник: https://en.wikipedia.org/wiki/Two-wire_interface

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

Подведем итоги. Существуют обоснованные рекомендации по выбору резисторов подтяжки в зависимости от напряжения питания, паразитной емкости и скорости работы шины:

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

На практике в своих устройствах я ставлю резисторы подтяжки не более 5,1кОм, так как использую в основном трехвольтовые контроллеры от Espressif. С учетом, что на некоторых шилдах сенсоров уже стоят подтягивающие резисторы 10кОм, которые в таком случае будут включены параллельно “моим” (и общее сопротивление снизится) – в самый раз.


 

Борьба с помехами на шине I2C

Бывают случаи, особенно когда нужно “отодвинуть” какой-либо сенсор подальше от устройства, начинают наблюдаться различные помехи и сбои – ошибки CRC (контрольной суммы при передаче), “приходят” неверные данные, устройства “не слушаются”.

В этом случае в первую очередь стоит попробовать снизить номинал подтягивающих резисторов, например до 1 кОм при 3,3В (для 3В это вполне допустимый вариант). Увеличение тока до ~ 3 мА позволит выправить крутизну импульсов за счет более быстрой перезарядки паразитной емкости и наладить работу шины. Но сильно увлекаться этим не стоит – дабы не “спалить” микроконтроллер или периферийное устройство (например сенсор). Допустимый ток через вывод GPIO для ESP32 составляет аж 40 миллиампер, но я далеко не уверен, что подключенное slave-устройство выдержит такое издевательство.

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

Очень важное значение может иметь кабель и расположение жил в кабеле. Например 4-проводный плоский “телефонный” кабель плохо подходит для шины I2C – особенно при расположении SDA и SCL “рядом” (например желтый и зеленый на рисунке ниже), в этом случае помехи начинаются уже от ~1 м. Для лучшей стабильности следует располагать линии SCL и SDA по краям кабеля, а внутренние жилы использовать для питания и общего провода, это позволит существенно подавить перекрестные наводки.

Я использую так: желтый – SCL, черный – SDA, красный – питание, зеленый – общий

Как ни странно, обычная 8-проводная “витая пара” (так называемый UTP-кабель) на практике довольно хорошо подходит для подключения различных I2C устройств и сенсоров, но при этом следует учитывать расположение жил в кабеле для лучшей работыНе следует использовать одну и ту же перекрученную пару для SCL и SDA – в этом случае возникают сильные перекрестные помехи (перекрученная пара работает как трансформатор). Лучше использовать одну пару для SCL + “питание”, вторую как SDA + “земля”. Это сильно снизит перекрестные помехи и улучшит работу. Если у вас имеется кабель категории 6 (с сердечником внутри, разделяющим пары), то это даст ещё более лучшие результаты.

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


Удлинение шины

Если нужно существенно “удлинить” шину, придется применять спецсредства – например специализированные микросхемы типа PCA9615 или P82B715. Они позволяют существенно поднять напряжение и токи внутри “физической шины” и тем самым снизить потери и помехи. Но это дается за счет очень существенного дополнительного энергопотребления, разумеется. За счет этого можно “удлинить” шину до 20 метров.

Типовая схема включения. Ток в линиях связи может достигать ~10мА. Обратите внимание на разделение проводов по парам – как раз об этом я и писал выше. Но вот подтягивать локальные SDA и SCL к 5В при трехвольтовом контроллере я б не стал. Преобразователи уровней копейки стоят

Нужно расстояние больше? Используйте сенсоры или устройства на шине RS232 или RS485, но это отдельная тема для разговора.


 

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

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

Плата сенсора с уже установленными резисторами 10 кОм

В этом случае резисторы рядом с MCU можно и не устанавливать. Тем более, когда вы планируете подключить к одной шине 2-3 или более устройств – в этом случае иногда придется выпаять или сдуть феном часть лишних подтягивающих резисторов с плат сенсоров. Иногда резисторы подтяжки выполнены отключаемыми, как на примере ниже, что позволяет задействовать их только при необходимости:

Здесь резисторы подтяжки 4,7кОм можно подключить или отключить с помощью капельки припоя


Сенсоры с встроенными стабилизаторами и согласователями логических уровней

При заказе сенсоров следует обращать особое внимание на то, на какое напряжение рассчитан тот или иной модуль. Почти все чипы (микросхемы) рассчитаны на напряжение питания не выше 3,6В. Но популярные платы Arduino работают с напряжением питания 5В, поэтому подключать такие сенсоры напрямую к 5-вольтовой логике нельзя. Для решения этой проблемы китайцы наладили выпуск пятивольтовых модулей с встроенным стабилизатором и устройством согласования уровней, например таких:

Две версии модуля с BME280 – маленькая 5В и большая 3.3В

В этом случае на плату (шилд) дополнительно устанавливается стабилизатор, который понижает напряжение питания для сенсора до положенных 3,3В. Беда в том, что стабилизатор греется, и может вносить погрешность в данные температуры.

Но и это еще не всё! Стабилизатор понизит напряжение на выводе питания сенсора, но вот на выводах SCL и SDA по прежнему останется 5В (если ничего не предпринимать), что может привести к выводу сенсора из строя даже при корректном напряжении питания. Дабы решить эту проблему, на плату устанавливается преобразователь логических уровней на двух полевых транзисторах по следующей схеме:

Классическая схема сопряжения уровней. Источник: Яндекс Картинки

Более подробно об согласовании логических уровней советую почитать тут, очень подробно всё расписано.

Схема модуля сенсора AHT10

То есть такие сенсоры можно смело и безопасно подключать к платам Arduino, да и резисторы подтяжки на них уже имеются.

Вопрос: можно ли такой пятивольтовый шилд подключать к трехвольтовым контроллерам типа ESP8266 или ESP32?

Можно, конечно. Некоторые сенсоры, например AHTxx, только со стабилизатором и продаются. Стабилизатор, конечно, немного “просадит” напряжение питания, но это не страшно, так как большинство популярных чипов сенсоров способно работать при напряжении питания уже от 1,7В. Работать будет даже немного лучше, так как стабилизатор почти не будет греться.

Только не стоит подключать такой модуль к питанию 5В, если ваш MCU рассчитан на 3.3В! В этом случае через резисторы подтяжки ex (R3 и R4 на схеме выше) на выводы вашего контроллера поступит поданное на модуль напряжение до стабилизатора, то есть 5В, что явно не пойдет ему на пользу.


 

Протокол передачи данных

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

Каждый сеанс обмена начинается с подачи master-ом стартового сигнала S (иногда называемого стартовым битом или стартовым условием или командой). “Стартовый бит” — это изменение уровня на линии SDA с высокого на низкий, но только при наличии высокого уровня на линии SCL. И наоборот – изменение уровня на линии SDA с низкого на высокий при наличии высокого уровня на линии SCL является стоп-сигналом P, означающим конец сеанса связи. Все, что происходит между этими событиями, называется “сообщением”, то есть собственно и есть передача данных. Обратите внимание: переключение уровней на линии SDA во время передачи данных всегда должно происходить только при низком уровне на линии SCL.

Источник: https://3d-diy.ru/wiki/arduino-moduli/interfeys-peredachi-dannykh-i2c/

После подачи “старт-сигнала” первым делом master должен сказать, с кем он хочет пообщаться и указать, что именно он хочет — передавать данные в устройство или читать их из него. Для этого он выдаёт на шину 7-ми битный адрес slave-устройства, с которым хочет общаться, и один бит, указывающий направление передачи данных: 0 — если от master к slave или 1 — если от slave к master. Первый байт после подачи “старт-сигнала” всегда всеми воспринимается как адресация.

Структура пакета данных на шине I2C. Источник: https://3d-diy.ru/wiki/arduino-moduli/interfeys-peredachi-dannykh-i2c/

После этого все slave-устройства на шине сверяют запрошенный адрес со своим, и если адрес совпал, ответить отправкой одного единственного бита подтверждения ACK, который означает “я здесь, все хорошо”. Ответить должно только запрошенное устройство, все остальные тупо молчат. Если бит ACK не вернулся, master-устройство понимает, что запрашиваемое устройство отсутствует на шине или “ушло в глухую несознанку”.

Есть ещё бит отсутствия подтверждения NACK, который может сигнализировать об занятости устройства (например идет измерение), или о том, что получатель хочет закончить передачу или же о том, что команда, посланная master-ом, почему-то не была выполнена.

После получения подтверждения master-устройство начинает отправку порции данных в 8 бит (1 байт), называемых кадром или пакетом. Это если планировалась передача данных master -> slave. Если же master хочет получить данные, то сразу после отправки первого бита ASC он ждет первый кадр данных от slave без каких-либо задержек. В ответ принимающая сторона должна отправить бит ASC в качестве подтверждения передачи кадра. Затем идет передача следующего байта / кадра и так далее. В конце сеанса связи вместо ASC отправляется NACK.

Когда все данные успешно переданы master отправляет “стоп-бит” для завершения сеанса.

Пожалуй лучшая иллюстрация процесса, что я нашел по данной теме:

Источник: https://radiohlam. ru/i2c/

На схеме выше изображен “идеальный” вариант – только прием или только передача. На практике же чаще используется комбинированный вариант, когда мастер всегда начинает работу с режима передачи master->slave, и первым делом самолёты передаёт номер регистра, из которого он хотел бы получить данные, и затем сразу же переходит “на прием”. Ведомое же устройство, получив адрес запрашиваемого регистра, в свою очередь начинает передачу данных. Это может происходить в рамках одного сеанса связи:

  • start
  • address + write
  • send register
  • read data
  • stop

Но иногда необходимо время между запросом данных из регистра и их отправкой ведомым (например на время измерения). В этом случае информация передается за два сеанса:

  • start
  • address + write
  • send register
  • stop

пауза на время измерения

  • start
  • address + read
  • read data
  • stop

В разных источниках и даташитах эти самые регистры могут называться по разному – регистр, адрес, команда и т. д. Но по сути это одно и то же.

 

Вот собственно и всё, о чем я хотел вам поведать, прежде чем рассказывать о работе с шиной I2C из ESP-IDF. До встречи на сайте и на dzen-канале!

Как соединить несколько устройств с i2c-интерфейсом в один пин A4 (SDA) и A5 (SCL) на Arduino?

спросил

Изменено 1 год, 3 месяца назад

Просмотрено 176 тысяч раз

\$\начало группы\$

Я хочу добавить в свой небольшой проект модуль часов реального времени. Я хочу отображать время и дату на моем существующем ЖК-модуле i2c 2×16.

Как модуль часов реального времени с интерфейсом i2c, так и ЖК-модуль 2×16 используют одни и те же контакты A4 (SDA) и A5 (SCL) на Arduino Uno. После нескольких часов поиска в сети шина i2c действительно может работать со многими последовательными устройствами. Это возможно, потому что каждое устройство имеет свой уникальный адрес.

Мой вопрос: как физически подключить два устройства с интерфейсом i2c к одному A4 и A5? Спасибо.

  • ардуино
  • i2c

\$\конечная группа\$

1

\$\начало группы\$

Некоторым людям трудно представить, что вещи соединены вместе, поэтому вот картинка:

(предложение по обслуживанию)

смоделируйте эту схему — схема создана с помощью CircuitLab I 2 C является шиной, поэтому одноименные сигналы соединяются вместе. Схема адресации позволяет микроконтроллеру выбирать, с каким устройством он взаимодействует. На Arduino подтягивающие резисторы 10 кОм подключаются к V 9. 0041 DD (обычно +5 В или +3,3 В).

\$\конечная группа\$

5

\$\начало группы\$

Для I2C, если все ведомые устройства имеют разные адреса устройств, все контакты SDA должны быть соединены вместе, а все контакты SCL должны быть соединены вместе. Это так просто.

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

\$\конечная группа\$

5

\$\начало группы\$

Соедините два контакта A4-sda с A5-scl (на обеих платах uno-uno) и подключите резистор от 5v с каждой соответствующей линии sda-scl.

\$\конечная группа\$

0

\$\начало группы\$

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

\$\конечная группа\$

1

\$\начало группы\$

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

\$\конечная группа\$

Обзор | Работа с несколькими устройствами 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.

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

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