FreeBSD на armv7. Подключение датчиков dht11/dht22 и ds18b20
Идея подключить термометр к arm-платформе, да ещё и под управлением ОС FreeBSD появилась у меня в процессе автоматизации управления аквариумом. Не буду углубляться в причины выбора FreeBSD, тогда как выбор платформы мне видится очевидным большинству (невысокая стоимость, удобство разработки, привычное ПО, многообразие доступных датчиков, да и моду на SoC следует упомянуть). Собрав воедино Orange PI Zero, 4-хканальное реле на 250в и четыре розетки, написав ПО на python для управления ими по 7-дневному расписанию и визуализировав управляемые события с помощью веб-связки nginx + php-fpm я с удивлением осознал "... что это хорошо" (копирайт не указываю). Захотелось добавить рюшечек и цветочков. Отображение температуры воды в банке стало одной из таких рюшечек. Беда в том, что информация о том, как подключить разнообразные устройства к ПК под FreeBSD значительно глубже закопана и найти её сложнее, чем аналогичные примеры и даже уроки по подключению устройств к Linux Armbian и Raspbian.
Сложнее, но не невозможно. Итак...
Вам необходим следующий DHT-оверлей, назовём его, к примеру, sun8i-h3-w1-gpio.dtso:
Далее, скомпилируем из этого исходника блоб оверлея:
Положим его в папку с оверлеями /boot/dtb/overlays/ и добавим в его в загрузчик /boot/loader.conf (тип файла .dtbo можно не писать). Также добавим необходимые модули:
Здесь уместны несколько замечаний:
Осталось подключить сам термометр: чёрный - на пин GND, красный - на пин VCC (у меня на +5в), а жёлтый - на назначенный нами пин onewire. Не забываем про подтягивающий шину к питанию резистор 4.7кОм (у меня 10кОм). К одной шине параллельно можно подключить несколько устройств. Они опрашиваются системой по-умолчанию раз в 10сек и проверить их работу можно командой: sysctl dev.ow_temp.
Не составит никакого труда аналогичным образом подключить датчик температуры и влажности dht11/dht22. DHT-оверлей для этого случая sun8i-h3-dht11-gpio.dtso ещё короче:
Сборка бинарника:
Модуль ядра и оверлей в /boot/loader.conf:
Компилируем блоб, кладём на место, правим "loader.conf" и перегружаемся.
Подключаем тремя проводками, про подтягивающий резистор тоже не забываем, если только он уже не распаян, как в моём случае, с датчиком на плате.
Проверить работу датчика можно так: sysctl dev.gpioths.
Да, чтобы совсем уж было просто, вот ссылка на проект allwinner-fdt-overlays на gitlab.com. Здесь можно найти пару-другую оверлеев.
Вам необходим следующий DHT-оверлей, назовём его, к примеру, sun8i-h3-w1-gpio.dtso:
CODE:
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun8i-h3";
};
&pio {
w1_pins: w1_pins {
allwinner,pins = "PA13";
allwinner,function = "gpio_in";
# allwinner,drive = <0>;
# allwinner,pull = <1>; // on
};
};
&{/} {
onewire@0 {
compatible = "w1-gpio";
pinctrl-names = "default";
pinctrl-0 = <&w1_pins>;
gpios = <&pio 0 13 0>; // PA13
status = "okay";
};
};
Далее, скомпилируем из этого исходника блоб оверлея:
CODE:
/usr/bin/dtc -@ -I dts -O dtb -o ./sun8i-h3-w1-gpio.dtbo ./sun8i-h3-w1-gpio.dtso
Положим его в папку с оверлеями /boot/dtb/overlays/ и добавим в его в загрузчик /boot/loader.conf (тип файла .dtbo можно не писать). Также добавим необходимые модули:
CODE:
fdt_overlays="<ваши,другие,оверлеи,>sun8i-h3-w1-gpio"
ow_load="YES"
ow_temp_load="YES"
owc_load="YES"
Здесь уместны несколько замечаний:
- Если у Вас не h3, а h2-plus, файл назовём sun8i-h2-plus-w1-gpio.dtso, и заменим значение первой строки compatible на allwinner,sun8i-h2-plus. Это важно!
- Параметр gpios = <&pio 0 13 0> определяет пин, на который мы назначаем роль onewire шины, по следующим правилам: первое число (0) означает вторую букву (0=A, 1=B и т.д.) в названии пина, т.е. PAnn, а второе номер пина - выходит PA13. Таким образом, <&pio 3 14 0> означает PD14;
- Если у Вас на шине изменения, например, Вы подключили еще один градусник (для второй банки), то следует перезагрузить модуль контроллера owc для актуализации изменений: kldunload owc; kldload owc.
Осталось подключить сам термометр: чёрный - на пин GND, красный - на пин VCC (у меня на +5в), а жёлтый - на назначенный нами пин onewire. Не забываем про подтягивающий шину к питанию резистор 4.7кОм (у меня 10кОм). К одной шине параллельно можно подключить несколько устройств. Они опрашиваются системой по-умолчанию раз в 10сек и проверить их работу можно командой: sysctl dev.ow_temp.
Не составит никакого труда аналогичным образом подключить датчик температуры и влажности dht11/dht22. DHT-оверлей для этого случая sun8i-h3-dht11-gpio.dtso ещё короче:
CODE:
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun8i-h3";
};
&{/} {
dht0 {
compatible = "dht11";
gpios = <&pio 0 14 0>; // PA14
};
};
Сборка бинарника:
CODE:
/usr/bin/dtc -@ -I dts -O dtb -o ./sun8i-h3-dht11-gpio.dtbo ./sun8i-h3-dht11-gpio.dtso
Модуль ядра и оверлей в /boot/loader.conf:
CODE:
fdt_overlays="<ваши,другие,оверлеи,>sun8i-h3-dht11-gpio"
gpioths_load="YES"
Компилируем блоб, кладём на место, правим "loader.conf" и перегружаемся.
Подключаем тремя проводками, про подтягивающий резистор тоже не забываем, если только он уже не распаян, как в моём случае, с датчиком на плате.
Проверить работу датчика можно так: sysctl dev.gpioths.
Да, чтобы совсем уж было просто, вот ссылка на проект allwinner-fdt-overlays на gitlab.com. Здесь можно найти пару-другую оверлеев.
Комментарии
Показывать комментарии Как список | Древовидной структурой