1-Wire в OpenWrt
Если так задуматься, то датчик - это, наверное, одно из самых распространенных устройств в нашей жизни. Датчики, как это бы страшно не звучало ))), они повсюду....Все задачи, которые ставятся перед тем или иным устройствам, в своей основе содержат показания датчиков. Если датчик такой-то изменил своё состояние на такое-то,значит вот та железка должна сделать то-то...)). Как это знакомо, наверное, для многих из вас.
Существует очень большое разнообразие типов датчиков: датчик температуры, влажности, дыма, газа, уровня жидкости, удара, вибрации, движения, тока, напряжения, частоты, мощности, света, и так можно перечислять очень долго. Несмотря на такое большое разнообразие типов, их общая структура примерно одна и та же. Это некий чувствительный сенсор, который на выходе выдает различные уровни напряжения. Получается, наша задача - всего лишь научиться измерять напряжение и тогда мы сможем сделать любой датчик.
Поэтому здесь я предлагаю научиться измерять напряжение, а заодно и значение температуры на основе one-wire датчика DS2438.
На этапе конфигурации OpenWrt нужно отметить следующие модули:
Kernel modules:
USB Support:
<M> kmod-usb-serial
<M> kmod-usb-serial-cp210x
Utilities:
Filesystem:
<M> owfs
<M> owshell
<M> digitemp
В OpenWrt работа c 1-wire возможна с помощью двух программ. Давайте сначала рассмотрим программу digitemp.
Устанавливаем пакеты:
root@OpenWrt:/# opkg install kmod-usb-serial-cp210x Installing kmod-usb-serial-cp210x (2.6.36.2-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/kmod-usb-serial-cp210x_2.6.36.2-1_brcm47xx.ipk. Installing kmod-usb-serial (2.6.36.2-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/kmod-usb-serial_2.6.36.2-1_brcm47xx.ipk. Configuring kmod-usb-serial. Configuring kmod-usb-serial-cp210x. root@OpenWrt:/# opkg install digitemp Installing digitemp (3.6.0-3) to root... Downloading ftp://ftp:ftp@192.168.0.9/digitemp_3.6.0-3_brcm47xx.ipk. Configuring digitemp. |
Структура сети one-wire состоит из адаптера и самих датчиков. Адаптер осуществляет преобразование протокола USB в 1-wire. А датчики могут подключатся последовательно один за другим в цепочку. Схему адаптера и самого датчика вы можете посмотреть в разделе «Скачать».
Подключаем адаптер к usb-порту роутера и смотрим вывод dmesg:
root@OpenWrt:/# dmesg usb 1-1.4: new full speed USB device using ohci_hcd and address 4 cp210x 1-1.4:1.0: cp210x converter detected usb 1-1.4: reset full speed USB device using ohci_hcd and address 4 usb 1-1.4: cp210x converter now attached to ttyUSB0 |
Адаптер распознается системой как ttyUSB0. Теперь в адаптер подключаем датчик. Использовать digitemp довольно-таки просто. Сначала нужно проинициализировать следующим образом:
root@OpenWrt:/# digitemp_DS9097 -i -s /dev/ttyUSB0 DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane GNU Public License v2.0 - http://www.digitemp.com Turning off all DS2409 Couplers . Searching the 1-Wire LAN 265576BA000000DF : DS2438 Temperature, A/D Battery Monitor ROM #0 : 265576BA000000DF Wrote .digitemprc |
Как видим, в этой операции digitemp запустил процедуру поиска устройств на шине 1-wire, в результате которого был обнаружен наш датчик — 265576BA000000DF : DS2438 Temperature, A/D Battery Monitor .
Теперь, чтобы прочитать значения температуры и напряжения с нашего датчика, нужно выполнить следующую операцию:
root@OpenWrt:/# digitemp_DS9097 -a -A -l /home/1wire_log DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane GNU Public License v2.0 - http://www.digitemp.com |
Откроем файл с логом и посмотрим, чему равна температура и напряжение на входе АЦП.
root@OpenWrt:/# cat /home/1wire_log Jan 01 00:01:44 Sensor 0 VDD: 5.06 AD: 4.98 CAD: -1018 C: 24.59 |
Как видим, температура равна 24.59C, а напряжение 4.98В. Точность измерения достаточно высокая. На этом описание работы digitemp можно закончить, стоит добавить, что набрав digitemp_DS9097 -h, можно увидеть список доступных опций.
Для рассмотрения программы owfs доустановим пакеты:
root@OpenWrt:/# opkg install owshell owfs Installing owshell (2.8p4-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/owshell_2.8p4-1_brcm47xx.ipk. Installing libow (2.8p4-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/libow_2.8p4-1_brcm47xx.ipk. Installing libusb (0.1.12-2) to root... Downloading ftp://ftp:ftp@192.168.0.9/libusb_0.1.12-2_brcm47xx.ipk. Installing libpthread (0.9.31-64) to root... Downloading ftp://ftp:ftp@192.168.0.9/libpthread_0.9.31-64_brcm47xx.ipk. Installing librt (0.9.31-64) to root... Downloading ftp://ftp:ftp@192.168.0.9/librt_0.9.31-64_brcm47xx.ipk. Installing owfs (2.8p4-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/owfs_2.8p4-1_brcm47xx.ipk. Installing libfuse (2.8.5-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/libfuse_2.8.5-1_brcm47xx.ipk. Installing kmod-fuse (2.6.36.2-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/kmod-fuse_2.6.36.2-1_brcm47xx.ipk. Installing fuse-utils (2.8.5-1) to root... Downloading ftp://ftp:ftp@192.168.0.9/fuse-utils_2.8.5-1_brcm47xx.ipk. Configuring librt. Configuring libpthread. Configuring libusb. Configuring libow. Configuring owshell. Configuring kmod-fuse. Configuring libfuse. Configuring fuse-utils. Configuring owfs. |
Owfs — 1-wire файловая система. Создает различные логи и мониторит всё! Owhttpd — та же самая система, но с использованием веб-сервера. Owfs - просто идеальный вариант для построения однопроводных сетей. Продумано всё до мелочей и куча возможностей. Приложение Owhttpd в текущей версии OpenWrt не копируется на файловую систему при установке пакета. Поэтому можно сделать это самому, перекопировав файл owhttpd вот отсюда: openwrt/build_dir/target-mipsel_uClibc-0.9.31/owfs-2.8p4/module/owhttpd/src/c/.libs
При запуске owfs нужно указать точку монтирования и тип адаптера (у меня это ds9097).
root@OpenWrt:/# owfs -d /dev/ttyUSB0 /home/1wire/ |
При запуске можно указать флаг --debug, чтобы запуститься в режиме отладки. После старта owfs в подмонтированной директории создается файловая система:
root@OpenWrt:/# ls -l /home/1wire/ drwxr-xr-x 1 root root 8 Jan 1 00:02 drwxrwxrwx 1 root root 8 Jan 1 00:02 26.5576BA000000 drwxr-xr-x 1 root root 8 Jan 1 00:02 settings drwxrwxrwx 1 root root 8 Jan 1 00:02 simultaneous drwxr-xr-x 1 root root 8 Jan 1 00:02 statistics drwxr-xr-x 1 root root 30 Jan 1 00:02 structure drwxr-xr-x 1 root root 8 Jan 1 00:02 system drwxr-xr-x 1 root root 8 Jan 1 00:02 uncached |
Чтобы узнать значение температуры, посмотрим содержимое директории датчика:
root@OpenWrt:/# ls -l /home/1wire/26.5576BA000000 -r--r--r-- 1 root root 16 2011-02-16 20:52 address -r--r--r-- 1 root root 256 2011-02-16 20:52 alias drwxrwxrwx 1 root root 8 2011-02-16 20:56 B1-R1-A -rw-rw-rw- 1 root root 1 2011-02-16 20:56 CA -r--r--r-- 1 root root 2 2011-02-16 20:52 crc8 -rw-rw-rw- 1 root root 24 2011-02-16 20:52 date drwxrwxrwx 1 root root 8 2011-02-16 20:56 disconnect -rw-rw-rw- 1 root root 1 2011-02-16 20:56 EE drwxrwxrwx 1 root root 8 2011-02-16 20:56 endcharge -r--r--r-- 1 root root 2 2011-02-16 20:52 family drwxrwxrwx 1 root root 8 2011-02-16 20:56 HIH3600 drwxrwxrwx 1 root root 8 2011-02-16 20:56 HIH4000 drwxrwxrwx 1 root root 8 2011-02-16 20:56 HTM1735 -r--r--r-- 1 root root 12 2011-02-16 20:52 humidity -rw-rw-rw- 1 root root 1 2011-02-16 20:56 IAD -r--r--r-- 1 root root 12 2011-02-16 20:52 id -r--r--r-- 1 root root 16 2011-02-16 20:52 locator drwxrwxrwx 1 root root 8 2011-02-16 20:56 MultiSensor -rw-rw-rw- 1 root root 12 2011-02-16 20:56 offset drwxrwxrwx 1 root root 8 2011-02-16 20:56 pages -r--r--r-- 1 root root 16 2011-02-16 20:52 r_address -r--r--r-- 1 root root 12 2011-02-16 20:52 r_id -r--r--r-- 1 root root 16 2011-02-16 20:52 r_locator drwxrwxrwx 1 root root 8 2011-02-16 20:56 S3-R1-A -r--r--r-- 1 root root 12 2011-02-16 20:52 temperature -r--r--r-- 1 root root 32 2011-02-16 20:52 type -rw-rw-rw- 1 root root 12 2011-02-16 20:56 udate -r--r--r-- 1 root root 12 2011-02-16 20:56 VAD -r--r--r-- 1 root root 12 2011-02-16 20:56 VDD -r--r--r-- 1 root root 12 2011-02-16 20:56 vis |
Если бы к входу ацп микросхемы ds2438 был подключен датчик влажности, то мы бы смогли посмотреть и влажность. А так смотрим значение температуры:
root@OpenWrt:/# cat ./temperature 22.3125 |
Теперь запустим веб-сервер и посмотрим его возможности:
root@OpenWrt:/# owhttpd -d /dev/ttyUSB0 -p 8080 |
Выглядеть примерно должно так:
Чуть позже будет обновление, где посмотрим, как строить графики по текущим логам.