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

Выглядеть примерно должно так:

Чуть позже будет обновление, где посмотрим, как строить графики по текущим логам.

1-wire датчик температуры