Приветствую всех жителей Хабра!


Хочу рассказать о новом и неожиданном способе подключения нескольких датчиков HTU21 по шине I2C без использования дополнительных микросхем.


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


Совсем недавно меня, как и многих пользователей, озадачило отсутствие возможности изменить адрес у данного датчика. Гугл, конечно же, выдал кучу статей о всяких мультиплексорах для шины I2C от «купить в известном всем китайском интернет-магазине» до «сделать схему своими руками». Нигде не было вариантов без паяльника и дополнительных расходов. Это не могло не расстроить так как нужно было решить проблему здесь и сейчас (заказчики такие заказчики). Хочу рассказать о более легком и непринужденном, очень простом выходе из данной ситуации. Заинтриговала? Тогда рассказываю.


Исходные данные: Arduino mega и 4 датчика HTU21.


Задача: необходимо подключить все датчики htu по шине I2C и считывать значения. Причем данные сенсоры — не единственные ведомые устройства на данной шине (в планах еще ЖК экран и другие датчики).


Что мы знаем? У датчика HTU21 фиксированный адрес на шине — 0x40 1. Как, имея микроконтроллер и 4 датчика с одинаковыми адресами на шине, обращаться к конкретному устройству без лишних микросхем?


Все оказывается довольно просто:


  1. подключаем землю, scl и sda как обычно (не забываем про подтягивающие резисторы для линии данных и синхронизации);
  2. подключаем провод питания каждого датчика к цифровому входу на Arduino (вы уже наверняка поняли куда я веду)
  3. поочередно подаем HIGH на каждый цифровой вход, питающий отдельный датчик и, после задержки, считываем значение с запитанного сенсора.
  4. подаем сигнал 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)


  1. Serge78rus
    06.10.2018 14:25

    Зачем задержка после считывания значения перед отключением питания?


  1. Tsvetik
    06.10.2018 15:24
    +2

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


    1. Dima_Sharihin
      06.10.2018 16:06

      Для этого есть специальные мультиплексоры I2C шин, зачем что-то изобретать.
      http://www.ti.com/product/tca9544a как пример


      1. Tsvetik
        06.10.2018 16:43

        Есть, но их надо заказывать, ждать доставки и стоят они в 10 раз дороже чем стандартная логика 74 или 40 серии
        И TCS9544 слишком умная, чтобы обойтись просто дерганьем ножек. Ей самой надо по I2C управлять.


        1. Dima_Sharihin
          06.10.2018 17:01
          +1

          Так это не недостаток, а достоинство. Не нужно тянуть отдельные GPIO для коммутации абонентов, все делается по одному I2C.
          И касаемо TI — если это нужно на один раз, микросхема заказывается образцами (и идет
          чуть больше недели из штатов в РФ), если нужно серийное устройство, то проще как раз взять готовую микросхему, чем потом разгребать возможные неочевидности.


          1. Misaka10032
            08.10.2018 09:18

            и идет чуть больше недели из штатов в РФ

            У них сейчас всё сильно лучше. Заказывал недавно несколько отладок — от Штатов до Самары 4-5 дней.


  1. AEP
    06.10.2018 16:05

    Раз есть свободные входы/выходы, почему бы не сделать просто несколько I2C-шин?


    1. Serge78rus
      06.10.2018 17:31
      +5

      Потому, что для реализации I2C программным «ногодрыгом» нежно забыть про digitalWrite(), так полюбившуюся ардуинщикам, перестать писать «скетчи» и начать программировать.


      1. dernuss
        06.10.2018 22:27

        soft i2c писать 2 часа максимум)


        1. dlinyj
          07.10.2018 17:03

          Или 10 минут погуглить


          1. dernuss
            07.10.2018 22:29

            ну это чит))


          1. Misaka10032
            08.10.2018 09:28

            Или взять MSP432E4, у которого десяток аппаратных I2C)


            1. Dima_Sharihin
              08.10.2018 09:50

              Сестра-близнец тивы TM4C1294 — это дикий монстр, который для 90% задач — оверкилл. Зато Ethernet с физикой на борту, это круто, да. Грубо говоря мультиплексор стоит 0.73USD*1ku, а этот монстрик ~14USD за штучку.


              Для каждой задачи — свой инструмент


              1. Misaka10032
                08.10.2018 09:58

                Так это же сарказм был))
                И E401 в TQFP-128 стоит 8.66USD*1ku.


                1. Dima_Sharihin
                  08.10.2018 10:01

                  О, или я что-то напутал, или они реально подешевели. Впрочем TM4C1294NCPDTI3 все равно стоит 8.07*1ku :P


                  1. Misaka10032
                    08.10.2018 10:06

                    Кстати, я техасовскими MCU интересоваться начал недавно, поэтому никак не могу понять, вдруг вы объясните — что у них творится за чертовщина с названиями семейств? И какое в итоге актуальное, а какое выбросили на свалку истории?


                    1. 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 и иже с ними "микроконтроллерами" назвать язык не поворачивается, поэтому упоминать их не буду.


                      1. Misaka10032
                        08.10.2018 10:25

                        Окей, спасибо большое. Меня, собственно, позиционирование MSP432 как раз и интересовало. Видимо, 432 заменил Tiva, но Tiva продавать они не прекращают.


                      1. olartamonov
                        08.10.2018 14:50

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


                        1. Dima_Sharihin
                          08.10.2018 15:16

                          Ну, это если микросхема выбралась из состояния "preview", а то получается 66AK2G01. Но да, TI — пример очень долгой поддержки своих мелкосхем.


            1. olartamonov
              08.10.2018 14:48

              Если надо решить проблему строго без внешних чипов — есть контроллеры со свободной коммутацией GPIO, например, nRF52 или TI CC13xx/C26xx, там I2C можно перекидывать на произвольные ножки чипа (равно как и все прочие сигналы, кроме входов АЦП).

              Контроллер с десятью I2C нужен, только если эти десять I2C должны фигачить одновременно.


      1. agarus
        07.10.2018 11:33

        нежно :)


  1. avf1906
    06.10.2018 20:43
    +1

    а точно проверяли? потому что на входах scl sda предполагается защитный диод на vdd, который будет садить линии данных на землю, ведь на входе +Vdd лог. 0. А если 0 не подавать, а переводиться в высокоимпедансное состояние, то микросхема будет запитываться через тот же диод. Судя по требованию к напряжениям на входах scl sda <Vdd+0.3V это не истинный открытый сток и диод там должен быть.


  1. olartamonov
    06.10.2018 21:34
    +3

    Ну почему, почему как ардуина — так обязательно какой-то детский сад, а не советы?

    Типичная схема цифрового входа включает в себя защитный диод с входа на + питания. Не у всех, но у многих. Если у HTU21D они есть, притянув его питание к земле, вы просто притянете к земле через диод всю свою шину I2C.

    А если вы такие эксперименты начнёте на любой шине с push-pull драйвером, то это вообще немного печально закончится.


    1. dlinyj
      07.10.2018 17:04

      Да, данный пост полное днище и деградация. Тут я полностью солидарен.


      1. SadAngel
        07.10.2018 17:34

        Эффект Даннинга — Крюгера на практике :)


  1. proton17
    06.10.2018 21:46
    +4

    Отличный способ выстрелить себе в ногу. По даташиту максимальное входное напряжение на цифровых входах = VDD. Если отключить питание, то VDD=0, значит и на вход можно подовать не больше 0. У вас там утяжка шины висит, т.е. через защитный диод на входе датчика все время в выключенном состоянии будет течь ток VDD/Rpullup, скорее всего это будет около 3-5ма. Может диод и не сгорит, сразу, но греться может.


  1. FGV
    07.10.2018 09:02
    +2

    одна нога МК — общий SDA (для всех);
    N ног МК — N отдельных SCL.
    экономия — одна нога МК и не надо с питанием мучаться.


    1. olartamonov
      07.10.2018 10:16

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

      Три дополнительные ноги, 8 дополнительных каналов. Подтяжку SCL к питанию не забыть поставить после мультиплексора, а не до.


      1. FGV
        07.10.2018 16:28

        Ну да, с мультиплексором еще больше экономия ног МК. Тока тут в названии было "… без лишних микросхем...".


  1. dlinyj
    07.10.2018 17:02

    Так делать нельзя.

    Происходит деградация порта и в конце концов котроллер выходить из строя, при чём вы даже не поймёте, как в какой-то момент порт перестанет работать. Смотрите. Микросхема потребляет 500 мА, согласно даташиту:



    А ATmega2560, стоящая в Arduino Mega выдаёт всего 100-200 мА на порт.



    Оно работать будет, но не долго и очень плохо.


    1. Serge78rus
      07.10.2018 17:19

      Микросхема потребляет 500 мА, согласно даташиту
      Не 500 мА, а 500 мкА


      1. dlinyj
        07.10.2018 18:21

        Да, невнимателен'c… Ну тогда вполне себе вариант


        1. Serge78rus
          08.10.2018 09:50

          Нет, все равно не вариант, и выше уже три человека написали почему: 1 2 3


    1. SadAngel
      07.10.2018 17:30

      У вас ошибка, там 500 микроА, а не 500mA (0.5)


  1. SadAngel
    07.10.2018 17:27

    Ничего удивительного, просто результат низкого порога вхождения который всё ардуинщики любят :)


    1. r00tGER
      08.10.2018 09:39
      +1

      Существенная проблема, ещё и в том, что после детального объяснения, например как выше в комментариях — не будет сделано никаких выводов. И, только единицы пойдут разбираться, что это там за диод такой…


      1. SadAngel
        08.10.2018 11:22
        +1

        Даже когда отключено напряжение питания HTU21, на микросхеме будет напряжение достаточное для работы (5V — Vd), тоесть примерно 5 — 0.6 = 4.4V
        image


        1. Mike_soft
          08.10.2018 13:16

          а в случае, когда Vcc HTU притянуто к нулю ногой МК — имеем такую же цепь, только вместо Vcc — GND, диоды получаются встречно-параллельно, и через резистор и диоды постоянно течет ток. а вход получается практически прижат к земле…


        1. olartamonov
          08.10.2018 15:03

          HTU21 не работает от 5 В, у него 3,6 В absolute maximum. У автора скорее всего готовая ардуино-плата с транслятором уровней.

          Но это не суть важно, потому что достаточного для работы напряжения не будет.

          Во-первых, R1 = 10...50 кОм, в зависимости от микроконтроллера, HTU21 при измерении потребляет 0,54 мА, итого падение на R1 будет 5,4 В, т.е. даже в идеальных условиях попытка чипа уйти в измерение обрушит питание ниже допустимого предела.

          Во-вторых, SCL и SDA при передаче данных будут регулярно падать в ноль, чип при этом будет пытаться как-то жить на висящем у него на VCC конденсаторе…

          Короче, лучше не думать, чем и как он там будет в линию мусорить, если его так насиловать.


      1. olartamonov
        08.10.2018 14:54

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

        А должен быть сделан вывод «книжки читать надо».

        Причём тема-то элементарная, это вам не радиочастотка или там mixed signal какой-нибудь, в которых, если ударение во фразе не там поставить, можно Сатану случайно вызвать.