© 2023 DiyTronic

Пишем драйвер ИК термодатчика MLX90614 для Zephyr RTOS

Итак в продолжение темы о драйверах для Zephyr переходим непосредственно к созданию конкретного драйвера устройства. В качестве подопытного я выбрал ИК термодатчик MLX90614.

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

Железо

В качестве тестового железа будет использована стандартная BLE400 с микроконтроллером nRF51822 на борту. Для программирования возьму пожалуй JLink. Ну и для отладки пригодится логический анализатор.

Возможности датчика

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

Итак существуют разные вариации этого датчика. Конкретный вариант задаётся маркировкой на корпусе. Типа MLX90614ESF-BAA-000-TU. Нас интересует первая буква после названия датчика — в данном случае E, а так-же две первые буквы трёхбуквенного кода в середине (BAA), т. к. они влияют на характеристики устройства (напряжение питания и количество термоэлементов). Видимо их придётся выносить в настройки. Но не факт — просто отложим это в памяти.

Мой экземпляр кстати какой-то вообще никакой — маркировка совсем непонятная B89736X16E. Единственную информацию по ней нашёл на китайском форуме, да и то это обсуждение типа «кто-нибудь знает, что за маркировка?». Пытался найти где я его купил, но тщетно — эта информация уже канула в лету. Но на нём есть буковка B из чего я могу сделать вывод, что это датчик с 3-х вольтовым питанием. Хотя судя по спецификации и 5 вольт для него не являются смертельными. В итоге это предположение оказалось верным.

Данные передаются либо через SMBus либо через PWM. Есть режим термо-реле, когда задаётся температурный диапазон, а датчик подаёт сигнал только когда температура выходит за заданные границы. Режим работы измерение/реле, а так-же режим передачи данных мы тоже вынесем в настройки драйвера.

Ага! Читаем спецификацию далее и видим, что устройство управляется записью данных в EEPROM с помощью SMbus. Нам доступно 32 2-х байтных слова. Но большинство из них не используются. Так-же есть RAM с доступом только на чтение 32 17-ти битных слова.

Ну что — будем разбираться. В общем SMBus у нас штука обязательная, а вот режим PWM — опциональный. Поддержка SMBus кстати урезанная — поддерживаются только 2 команды — записать слово и прочитать слово. Частота работы шины от 10 до 100 кГц.

Итак у нас вырисовываются следующие настройки:

  • Режим работы SMBUS/PWM/RELAY
  • Число сенсоров 1 или 2
  • Напряжение питания 5В или 3В (от этого зависят некоторые функции)

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

Каков дальнейший план?

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

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

Собираем стенд

В общем для экспериментов выбрал плату BLE400, к которой подключил брэдборд с датчиком, ну и к ним подцепил JLink и анализатор SaleaLogic (он у меня без корпуса ибо китайский корпус развалился в первый же день — какой стыд). Ну и для экономии на проводах (чтоб не тянуть к ноутбуку этот клубок проводов) всё это подключено через USB хаб специально купленными огрызками USB кабелей. Получилось как-то так:

Распиновка датчика — в спецификации схема указана не совсем однозначно, поэтому приведу здесь более понятное фото:

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

Итог

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

Источники

Комментарии