Приветствую всех жителей Хабра!
Хочу рассказать о новом и неожиданном способе подключения нескольких датчиков HTU21 по шине I2C без использования дополнительных микросхем.
Данный датчик все еще пользуется популярностью среди разного рода DIY-мастеров, причем заслуженно: он более точен, чем предшественник и мал размерами (что удобно для встраивания в устройства).
Совсем недавно меня, как и многих пользователей, озадачило отсутствие возможности изменить адрес у данного датчика. Гугл, конечно же, выдал кучу статей о всяких мультиплексорах для шины I2C от «купить в известном всем китайском интернет-магазине» до «сделать схему своими руками». Нигде не было вариантов без паяльника и дополнительных расходов. Это не могло не расстроить так как нужно было решить проблему здесь и сейчас (заказчики такие заказчики). Хочу рассказать о более легком и непринужденном, очень простом выходе из данной ситуации. Заинтриговала? Тогда рассказываю.
Исходные данные: Arduino mega и 4 датчика HTU21.
Задача: необходимо подключить все датчики htu по шине I2C и считывать значения. Причем данные сенсоры — не единственные ведомые устройства на данной шине (в планах еще ЖК экран и другие датчики).
Что мы знаем? У датчика HTU21 фиксированный адрес на шине — 0x40 1. Как, имея микроконтроллер и 4 датчика с одинаковыми адресами на шине, обращаться к конкретному устройству без лишних микросхем?
Все оказывается довольно просто:
- подключаем землю, scl и sda как обычно (не забываем про подтягивающие резисторы для линии данных и синхронизации);
- подключаем провод питания каждого датчика к цифровому входу на Arduino (вы уже наверняка поняли куда я веду)
- поочередно подаем HIGH на каждый цифровой вход, питающий отдельный датчик и, после задержки, считываем значение с запитанного сенсора.
- подаем сигнал LOW для этого датчика и повторяем цикл для других сенсоров.
Конечно же, в таком методе также есть недостатки, например, может просто отсутствовать необходимое количество свободных цифровых или аналоговых выходов. Но для использования в проектах этот принцип работает, и работает на достаточных расстояниях от микроконтроллера. Надеюсь, данная статья поможет Вам сберечь нервы, средства и время.
Не зря говорится, что все гениальное — просто!
Листинг прилагается:
/* функция, считывающая значение температуры
и влажности с датчиков HTU21 и датчика BME280 */
void greenhouseHT()
{
delay(30);
rooms[3].TempA = bme.readTemperature();
delay(30);
rooms[3].HumA = bme.readHumidity();
delay(30);
for (int i=0; i<3; i++)
{
digitalWrite(HTU21_pins[i], HIGH);
delay(30);
rooms[i].HumA = myGreenhouseHumidity.readHumidity();
rooms[i].TempA = myGreenhouseHumidity.readTemperature();
delay(30);
digitalWrite(HTU21_pins[i], LOW);
delay(30);
}
digitalWrite(pin_HTU21_1, HIGH);
}
Комментарии (41)
Tsvetik
06.10.2018 15:24+2На мой взгляд, не надо у датчиков выключать питание. Они после включения могут долго выходить на режим. Лучше транзистором SCL или SDA от датчика отцеплять, или дешифратор поставить
Dima_Sharihin
06.10.2018 16:06Для этого есть специальные мультиплексоры I2C шин, зачем что-то изобретать.
http://www.ti.com/product/tca9544a как примерTsvetik
06.10.2018 16:43Есть, но их надо заказывать, ждать доставки и стоят они в 10 раз дороже чем стандартная логика 74 или 40 серии
И TCS9544 слишком умная, чтобы обойтись просто дерганьем ножек. Ей самой надо по I2C управлять.Dima_Sharihin
06.10.2018 17:01+1Так это не недостаток, а достоинство. Не нужно тянуть отдельные GPIO для коммутации абонентов, все делается по одному I2C.
И касаемо TI — если это нужно на один раз, микросхема заказывается образцами (и идет
чуть больше недели из штатов в РФ), если нужно серийное устройство, то проще как раз взять готовую микросхему, чем потом разгребать возможные неочевидности.Misaka10032
08.10.2018 09:18и идет чуть больше недели из штатов в РФ
У них сейчас всё сильно лучше. Заказывал недавно несколько отладок — от Штатов до Самары 4-5 дней.
AEP
06.10.2018 16:05Раз есть свободные входы/выходы, почему бы не сделать просто несколько I2C-шин?
Serge78rus
06.10.2018 17:31+5Потому, что для реализации I2C программным «ногодрыгом» нежно забыть про digitalWrite(), так полюбившуюся ардуинщикам, перестать писать «скетчи» и начать программировать.
dernuss
06.10.2018 22:27soft i2c писать 2 часа максимум)
dlinyj
07.10.2018 17:03Или 10 минут погуглить
Misaka10032
08.10.2018 09:28Или взять MSP432E4, у которого десяток аппаратных I2C)
Dima_Sharihin
08.10.2018 09:50Сестра-близнец тивы TM4C1294 — это дикий монстр, который для 90% задач — оверкилл. Зато Ethernet с физикой на борту, это круто, да. Грубо говоря мультиплексор стоит 0.73USD*1ku, а этот монстрик ~14USD за штучку.
Для каждой задачи — свой инструмент
Misaka10032
08.10.2018 09:58Так это же сарказм был))
И E401 в TQFP-128 стоит 8.66USD*1ku.Dima_Sharihin
08.10.2018 10:01О, или я что-то напутал, или они реально подешевели. Впрочем TM4C1294NCPDTI3 все равно стоит 8.07*1ku :P
Misaka10032
08.10.2018 10:06Кстати, я техасовскими MCU интересоваться начал недавно, поэтому никак не могу понять, вдруг вы объясните — что у них творится за чертовщина с названиями семейств? И какое в итоге актуальное, а какое выбросили на свалку истории?
Dima_Sharihin
08.10.2018 10:21Ну, я так понял, что SimpleLink (CC13xx, CC26XX, MSP432) — это "стильно-модно-молодежно" и развивать будут именно его. Собственно это не столько микроконтроллеры, сколько техасовская софтовая поддержка всего этого безобразия: куча кода зашита прям в ROM микроконтроллера, из-за чего и весь сыр-бор с отдельными микроконтроллерами.
Пока не выбросили ничего, продают даже Concerto и TM4C123, и, зная TI, старые контроллеры они могут поддерживать очень долго, пока есть крупный клиент, готовый их покупать.
А по остальным семействам — так у них же разные сферы применения: MSP430 — бюджетные и сверхмалопотребляющие железки, C2000 — числодробильные контроллеры с крутейшей аналоговой периферией (14 компараторов с собственными ЦАП + 2 буфферированных ЦАП + ШИМ высокого разрешения + 3 S/H SAR ADC по 3MSPS каждая + вычисление синуса за четыре такта).
Keystone, Sitara, DRA и иже с ними "микроконтроллерами" назвать язык не поворачивается, поэтому упоминать их не буду.
Misaka10032
08.10.2018 10:25Окей, спасибо большое. Меня, собственно, позиционирование MSP432 как раз и интересовало. Видимо, 432 заменил Tiva, но Tiva продавать они не прекращают.
olartamonov
08.10.2018 14:50У TI же гарантированный 10-летний минимальный срок выпуска по любой позиции, без этого трудно считаться серьёзным производителем. Поэтому запуск новой серии, заменяющей старую, вообще никак не означает прекращение выпуска старой.
Dima_Sharihin
08.10.2018 15:16Ну, это если микросхема выбралась из состояния "preview", а то получается 66AK2G01. Но да, TI — пример очень долгой поддержки своих мелкосхем.
olartamonov
08.10.2018 14:48Если надо решить проблему строго без внешних чипов — есть контроллеры со свободной коммутацией GPIO, например, nRF52 или TI CC13xx/C26xx, там I2C можно перекидывать на произвольные ножки чипа (равно как и все прочие сигналы, кроме входов АЦП).
Контроллер с десятью I2C нужен, только если эти десять I2C должны фигачить одновременно.
avf1906
06.10.2018 20:43+1а точно проверяли? потому что на входах scl sda предполагается защитный диод на vdd, который будет садить линии данных на землю, ведь на входе +Vdd лог. 0. А если 0 не подавать, а переводиться в высокоимпедансное состояние, то микросхема будет запитываться через тот же диод. Судя по требованию к напряжениям на входах scl sda <Vdd+0.3V это не истинный открытый сток и диод там должен быть.
olartamonov
06.10.2018 21:34+3Ну почему, почему как ардуина — так обязательно какой-то детский сад, а не советы?
Типичная схема цифрового входа включает в себя защитный диод с входа на + питания. Не у всех, но у многих. Если у HTU21D они есть, притянув его питание к земле, вы просто притянете к земле через диод всю свою шину I2C.
А если вы такие эксперименты начнёте на любой шине с push-pull драйвером, то это вообще немного печально закончится.
proton17
06.10.2018 21:46+4Отличный способ выстрелить себе в ногу. По даташиту максимальное входное напряжение на цифровых входах = VDD. Если отключить питание, то VDD=0, значит и на вход можно подовать не больше 0. У вас там утяжка шины висит, т.е. через защитный диод на входе датчика все время в выключенном состоянии будет течь ток VDD/Rpullup, скорее всего это будет около 3-5ма. Может диод и не сгорит, сразу, но греться может.
FGV
07.10.2018 09:02+2одна нога МК — общий SDA (для всех);
N ног МК — N отдельных SCL.
экономия — одна нога МК и не надо с питанием мучаться.olartamonov
07.10.2018 10:16Да проще же. И ног меньше, и I2C аппаратный (мы же тут не про контроллеры, у которых SCL можно на любую ногу вывести?) — ставится аналоговый мультиплексор типа хоть доисторического CD4051, SDA напрямую на все чипы, SCL через мультиплексор.
Три дополнительные ноги, 8 дополнительных каналов. Подтяжку SCL к питанию не забыть поставить после мультиплексора, а не до.FGV
07.10.2018 16:28Ну да, с мультиплексором еще больше экономия ног МК. Тока тут в названии было "… без лишних микросхем...".
dlinyj
07.10.2018 17:02Так делать нельзя.
Происходит деградация порта и в конце концов котроллер выходить из строя, при чём вы даже не поймёте, как в какой-то момент порт перестанет работать. Смотрите. Микросхема потребляет 500 мА, согласно даташиту:
А ATmega2560, стоящая в Arduino Mega выдаёт всего 100-200 мА на порт.
Оно работать будет, но не долго и очень плохо.
Serge78rus
07.10.2018 17:19Микросхема потребляет 500 мА, согласно даташиту
Не 500 мА, а 500 мкА
SadAngel
07.10.2018 17:27Ничего удивительного, просто результат низкого порога вхождения который всё ардуинщики любят :)
r00tGER
08.10.2018 09:39+1Существенная проблема, ещё и в том, что после детального объяснения, например как выше в комментариях — не будет сделано никаких выводов. И, только единицы пойдут разбираться, что это там за диод такой…
SadAngel
08.10.2018 11:22+1Даже когда отключено напряжение питания HTU21, на микросхеме будет напряжение достаточное для работы (5V — Vd), тоесть примерно 5 — 0.6 = 4.4V
Mike_soft
08.10.2018 13:16а в случае, когда Vcc HTU притянуто к нулю ногой МК — имеем такую же цепь, только вместо Vcc — GND, диоды получаются встречно-параллельно, и через резистор и диоды постоянно течет ток. а вход получается практически прижат к земле…
olartamonov
08.10.2018 15:03HTU21 не работает от 5 В, у него 3,6 В absolute maximum. У автора скорее всего готовая ардуино-плата с транслятором уровней.
Но это не суть важно, потому что достаточного для работы напряжения не будет.
Во-первых, R1 = 10...50 кОм, в зависимости от микроконтроллера, HTU21 при измерении потребляет 0,54 мА, итого падение на R1 будет 5,4 В, т.е. даже в идеальных условиях попытка чипа уйти в измерение обрушит питание ниже допустимого предела.
Во-вторых, SCL и SDA при передаче данных будут регулярно падать в ноль, чип при этом будет пытаться как-то жить на висящем у него на VCC конденсаторе…
Короче, лучше не думать, чем и как он там будет в линию мусорить, если его так насиловать.
olartamonov
08.10.2018 14:54Ну, может будет сделан вывод «в интернете говорили, что так включать почему-то нельзя».
А должен быть сделан вывод «книжки читать надо».
Причём тема-то элементарная, это вам не радиочастотка или там mixed signal какой-нибудь, в которых, если ударение во фразе не там поставить, можно Сатану случайно вызвать.
Serge78rus
Зачем задержка после считывания значения перед отключением питания?