" title="Написать письмо">Написать письмо
Донаты на карту ВТБ:
2200 4002 2461 6363

Статистика

Пользователи : 1
Статьи : 2348
Просмотры материалов : 8852255
 
Об интерфейсе I2C (20.12.2025). Печать E-mail
2025 - Декабрь
20.12.2025 12:09
Save & Share
Даже несмотря на то, что датчик пульса и кислорода MAX30100 уже прибыл, - с Arduino всегда одно и то же: даже простейшая передача одного сигнала - тянет за собой ворох проблем. Он оказался на интерфейсе I2C - что накладывает ряд ограничений, и тестировать датчик пока имеет мало смысла.



Теория заявляет, что какое-либо устройство можно подключить всего 4 универсальными пинами к Arduino (VCC, GND, SDA, SCL). При этом, прямо не сказано, что интерфейс цифровой, - и подключение, вдобавок, происходит к аналоговым пинам Arduino. Такие пины на разных версиях Arduino - разные (так как в интернете и ложная информация попадается - определить это на практике только можно: для Nano это SDA на A4, SCL на A5). Важно и правильное включение этих пинов при старте скетча: DDRC и PORTC - можно определить только экспериментально (у меня в логах написано для обоих 1 - а в недоделанном скетче почему-то стоят 0). Между тем, интерфейс цифровой - но вот с контрольными суммами у него всё плохо, т.к. их нет. Есть только механизм ACK/NACK, после посылки каждого байта циклически меняющий значение SCL (и если "что не так" - SCL станет постоянным высоким уровнем). Но как он понимает, что байт дошёл именно с таким числом, с каким должен был? Похоже, это просто регистрация получения байта приёмником и ожидания им следующего байта.

Действительно, это подтверждается опытами людей, использующими с I2C длинные провода: они тупо получали искажённую информацию на входе при длине проводов более 2м. Мало того, попытка экранировать провода - приводила к ещё большему искажению. Проблемы:
- создания механизма расчёта CRC для каждой посланной пачки байтов. И реализовывать её путём пересылки данных обратно (с целью грузить Arduino и не связываться с прошивкой внешнего устройства). Но в обратку можно получить точно такое же искажение - это ненадёжный способ перепроверки данных. Тема подробно разбирается на европейском форуме - но из-за роскомпозора он недоступен;
- повышение паразитной ёмкости у экранированного провода - патовая ситуация;
- решением удлинения является покупка двух модулей активного терминатора LTC4311 (по 1шт на мастер-модуль и слейв-модуль) - но стоит он по 1000руб/шт (и это на алиэкспрессе), а также требует расчёта обвеса для него в виде RC-фильтра или определённой ёмкости;
- оказывается, на SDA и SCL ещё и подтягивающие резисторы вешать надо - номинал которых, конечно же, во всех найденных в интернете схемах разный. Статья "Шина I2C: принципы функционирования или зачем ещё тут нужны какие-то резисторы?" - несколько приоткрывает методику их расчёта, но верить ли написанному? Статья, в т.ч. показывает особенности устранения помех при правильном подключении витой пары вместо обычного провода (разделять информационные провода по разным скруткам) и снижением частоты передачи интерфейса (и начинается при гуглеже: "STM32 это делается через HAL-библиотеку" - что за х).

Таким образом, I2C не годится для передачи абсолютно точных данных на большие расстояния: т.к. даже самоконтроля передаваемых данных нет - а полноценно реализовать его на стороне приёмника невозможно, т.к. невозможно в него перезалить скетч с необходимыми изменениями. Именно поэтому I2C успешно реализован в пульсоксиметрах: экранирование не нужно, малая длина 4 тонюсеньких проводков разноцветных между 2 зажимающими палец частями.

Получается, с отдельным датчиком MAX30100 решение удлинения провода есть - но надёжность при этом будет ниже. С другой стороны, задача датчика - ловить самые большие импульсы от сердца, и пофиг на остальные его менее амплитудные зубцы (сердце за 1 цикл порождает 3 импульса). С третьей стороны, если информация исказится в старшем байте - то вместо сильного импульса в виде высокого числа может прийти чрезмерно малое число.

Возня, возня, возня - с Arduino всегда одна возня.

К одним контактам шины I2C можно подсоединить до 128 устройств. Но тут же начинается проблема: каждое устройство должно иметь неповторяющийся номер. На примере ЖК-экрана (раз, два - какой же геморрой: у каждого устройства и свои заморочки есть - в т.ч., генерация помех). Адрес ЖК-экрана по умолчанию может быть 0x27 или 0x3f (и эти адреса только примеры в интернете помогли выцепить, т.к. устройства Arduino почти всегда поставляются OEM). И для каждого экрана это определяется экспериментально (даже не модели, а просто экрана: одну и ту же модель разные производители могут клепать - ещё и с разной распайкой).

Предположим, была перелопачена куча даташитов к ЖК-экранам - и были получены всего 2 возможных их адреса. А если надо подсоединить 2 экрана - надеяться на удачу, а если 3 - всё, конец? Часть устройств дают возможность программно поменять адрес, часть дают возможность перепайкой определённых контактов. Однако на примере датчика BME280: аппаратно предусмотрено всего 2 адреса - и если надо больше, в дело вступает I2C мультиплексор TCA9548A (благо, стоит 65руб на алиэкспрессе - и только возиться с ним надо).

Возня, возня, возня - с Arduino всегда одна возня.

На примере того же MAX30100: нужно ещё и правильную библиотеку выбрать: "А вот именно ЭТА библиотека, прибалтийская - она именно чётко детектирует пульс. У меня с недавних пор наблюдаются экстрасистолы (нарушения сердечного ритма), по словам врача, скорее всего связанные с остеохондрозом. И вот эти спорадические пропадания импульсов прибалтийская библа определяет ЧЁТКО: палец на датчике, чуть сердце "трепыхнулось" - наблюдаю на графике, как проезжает пустое место между импульсами. Пару раз присяду - битрейт моментально лезет вверх, потом восстанавливается... Т.е. то, что я вижу на компортовском графике - это именно МОЙ ПУЛЬС, а не какая-то левая наводка, как в вашей системе, с самодельным датчиком на ОУ... Только палец должен быть тёплым (у меня хронически холодные руки-ноги). Сейчас-то жара наступила, но недели две назад было прохладно, и были проблемы с детекцией пульса. Додумался подогревать палец под лампой накаливания - перед тем, как класть его на датчик. И все проблемы ушли. Вообще всё заработало как часы. Но только с компортом. А с ЖКИ - грей, не грей - никакого толку...".

Стоит добавить, что практический опыт скручивания в бараний рог 4 проводов 10см к ЖК-экрану по I2C (создание не просто помех, а паразитной индуктивности) - не приводит к искажению выдаваемых данных (цифры на рисунке - именно такими и должны быть, и все всплывающие цифры после - аналогичны раскрученному состоянию.


(добавлено 10.01.2026) Практические уточнения о номиналах подтягивающих резисторов, в т.ч. для I2C (раз - и её реализация для I2C два).
Обновлено ( 11.01.2026 11:13 )
 
 

Последние новости


©2008-2026. All Rights Reserved. Разработчик - " title="Сергей Белов">Сергей Белов. Материалы сайта предоставляются по принципу "как есть". Автор не несет никакой ответственности и не гарантирует отсутствие неправильных сведений и ошибок. Вся ответственность за использование материалов лежит полностью на читателях. Размещение материалов данного сайта на иных сайтах запрещено без указания активной ссылки на данный сайт-первоисточник (ГК РФ: ст.1259 п.1 + ст.1274 п.1-3).

Много статей не имеет срока устаревания. Есть смысл смотреть и 2011, и даже 2008 год. Политика сайта: написать статью, а потом обновлять ее много лет.
Рекламодателям! Перестаньте спамить мне на почту с предложениями о размещении рекламы на этом сайте. Я никогда спамером/рекламщиком не был и не буду!
Top.Mail.Ru