1-wire snímače na I2C, přesnější měření teploty

Prvotně publikováno na raspi.cz 21.11.2012.

V komentářích u článku o měření teploty přes čidla na I2C komentoval „DFZ“ nepoužití Dallasovských 1-wire čidel s tím, že připojit je přes GPIO4 a kernelový patch je snadné. Tak tedy zamyšlení a ukázka na téma 1-wire.


Něco málo teorie – co to je 1-wire?

„1-wire“ je patentní systém komunikace s čidly a obecně zdroji krátkých informací (teploměry, vlhkoměry, identifikační čipy, hodiny, malé paměti, …) od Dallas Semiconductors (nyní Maxim). Jedno z obchodních jmen této technologie je „iButton“ a rutinně se používá v docházkových systémech.

V jednodušší verzi stačí pro připojení zařízení dva vodiče – zem a obousměrný signálový drát. Jednotlivá koncová zařízení se v tomto případě napájejí parazitně ze signálového vodiče.

Pokud chcete mít maximální spolehlivost, můžete použít třívodičové zapojení – zem, napájení a signál.

Základním kouzlem 1-wire je rozumně navržený komunikační protokol a to, jak se obsluhuje sběrnice – a z obou těchto bodů vyplývající spolehlivost a maximální dosah. Na jednu sběrnici je možno připojit hodně čidel – až stovky zařízení. Dobře nastavený 1-wire bus s dobrým bus driverem (s aktivním napájením datového vodiče atd.) na kvalitním krouceném kabelu UTP-5 může fungovat až na vzdálenost v řádu 500 metrů a nenechá se rozhodit poměrně silným rušením. V amatérských podmínkách není problém připojovat zařízení vzdálená několik desítek metrů.

Jak připojit 1-wire zařízení k RPi?

Jsou v podstatě tři základní metody připojování 1-wire zařízení:

1) Použití hotového bus driveru na RS-232 nebo USB.

Existují moduly od Dallasu i od jiných výrobců (např. zde), které se připojí na USB nebo RS-232 a na druhém konci z nich kouká 1-wire. Jednoduché. Jeden problém je ale cena – mluvíme o řádově 30 USD. Druhý problém je, že to není elegantní – přece k RPi nebudeme připojovat ošklivý adaptér, který je stejně velký jako celá malina? A v neposlední řadě nemáme USB portů nazbyt, že?

2) Připojení čidel přímo na GPIO4 

Součástí distribuce Occidentalis je přímá podpora 1-wire čidel na GPIO4 pomocí bit-bangingu (tj. někdo v assembleru nakódoval správné sekvence nul a jedniček; pro časování se nepoužívá žádný hardware, je to čistě softwarové řešení). Stejná funkce se pomocí kernelového patchu „w1“ dá docpat i do běžného Raspbianu.

Jenže se mi to nelíbí.

Nelíbí se mi realizace. Distribuce Occidentalis mi nefungovala dobře. A řešení s kernelovým patchem znamená, že už nepoužíváte standardní kernel – a tedy při každém update systému musíte řešit, zda to bude fungovat i nadále. Kdyby se to dostalo do jádra Raspbianu, bylo by to něco jiného.

Nelíbí se mi ale ani samotná myšlenka, že se to bude řešit přímo na GPIO portu. Smysl to určitě má – pro jednotky čidel na drátu dlouhém max. desítky centimetrů. Ale představa, že by 1-wire bus byl delší a na jednom konci končil přímo procesorem RPi … brrr. Odolnost takového řešení proti indukci neočekávaných napětí je mizivá. Takže jednoho dne zjistíte, že vaše RPi shořelo.

Takže co nám zbývá?

3) Použití bus driveru pro I2C

Ano, to je správná cesta. Na I2C si připojíme bus driver – čip, který má na jedné straně I2C a na druhé jeden či více 1-wire busů. Když se něco semele, vyměníme jen spálený bus driver – a ten je navíc výrazně odolnější než procesor RPi. Takže tohle je určitě správná cesta.

Připojení 1-wire čidla teploty přes bus driver DS2482

DS2482-100 (25 Kč u TME) je to, co hledáme. (Maximalisté mohou použít DS2482-800 – to je stejný čip, ale má 8 1-wire busů.)

Datasheet.

Tenhle čip má jen jednu malinkou chybičku. Skoro přehlédnutelnou. Největší pouzdro, ve kterém se vyrábí, je SO-8. Tj. rozměry čipu jsou cca 4×6 mm a rozteč nožiček je poloviční proti běžným DIL pouzdrům – 1/20″ (pro evropany 1,27 mm). Do nepájivého kontaktního pole to nedostanete.

Takže nezbývá než vyndat pájku. SO-8 je asi nejmenší velikost pouzdra, co se ještě dá amatérsky pájet.

Pokud se vám, stejně jako mně, nechce si leptat vlastní plošný spoj, je možné ho koupit zde. Ideální není – tomu, kdo vymyslel vývody pod čipem bych utrhnul něco důležitého – ale použít se dá.

Zapojení je jednoduché:

  • 1 – napájení +3.3V
  • 2 – datový vodič pro 1-wire, je nutné připojit přes odpor 4k7 na +3.3V
  • 3 – GND
  • 4 – SCL
  • 5 – SDA
  • 6 – pomocí této nohy se řídí „aktivní napájení datového vodiče 1-wire“, což neřešíme = nezapojit
  • 7+8 – výběr adresy, spojíme na GND
Dsc_34751

Takto zapojený 1-wire bus je nejjednodušší možný – pro malé počty čidel a krátké přívody. Pokud bychom chtěli připojit hodně čidel a/nebo mít bus velmi dlouhý (desítky metrů), je potřeba tam přidat jeden MOSFET transistor pro aktivní pullup řízený nožičkou číslo 6. Jo a taky by se hodilo napájení sběrnice +5V. Viz datasheet.

Jako experimentální čidlo použijeme čidlo teploty DS18B20 (24 Kč u TME). Datasheet. DS18B20 umožňuje až 12-bitovou konverzi dat a v rozsahu -10 až +85 stupňů slibuje přesnost +-0.5 stupně. A je v pěkně použitelném třínožičkovém pouzdru.

Zapojení je jednoduché – prostřední nožičku na 1-wire data, levou na GND a pravou na +3.3V. Pokud bychom chtěli připojit více čidel, všechny se zapojí paralelně.

Ds2482-1_bb1

Software

Nejprve se koukneme, zda vidíme bus driver na I2C sběrnici.

pi@raspberrypi ~ $ i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — 18 — — — — — — —
20: 20 — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — 48 — — — — 4d — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

Je tam nové zařízení na adrese 18, takže je to v pořádku.

No a teď jak to vlastně použít – jak načíst hodnoty z čidel?

Kouzlo linuxu a open-source světa je, že hodně problémů už někdo promýšlel a vyřešil je lépe, než bych dokázal sám. Takže i pro 1-wire čidla existuje řešení – OWFS (one-wire file system). A existuje přímo v balíčku pro Raspbian!

Tak do toho:

sudo mkdir /mnt/1wire
sudo apt-get install owfs
sudo apt-get install owfs-doc
sudo apt-get install ow-shell

Nyní je potřeba editovat /etc/owfs.conf :

Zakomentujte (přidejte před ní #) řádku:

server: FAKE = DS18S20,DS2405

a přidejte následující řádky:

device = /dev/i2c-0
mountpoint = /mnt/1wire
Celsius
allow_other
error_print = 0
error_level = 0

Dále editujte /etc/fuse.conf – odkomentujte řádku

user_allow_other

Teď by bylo dobré restartovat. Chvilku počkáme, než RPi naběhne… a pak zkusíme vypsat obsah owfs:

pi@raspberrypi ~ $ owdir
/28.9614C2030000
/bus.0
/uncached
/settings
/system
/statistics
/structure
/simultaneous
/alarm

Výpis „owdir“ ukazuje strukturu objektů v owfs. Objekt „/28.9614C2030000“ reprezentuje teplotní čidlo; kdyby bylo připojeno více čidel, měly by obdobná jména. Objekt „/bus.0“ je 1-wire sběrnice; kdyby bylo více sběrnic (např. při použití čipu DS2482-800), bylo by zde více záznamů „/bus.#“ .

Objekty jsou uloženy stromově – je možné se dívat i na další úrovně. Třeba na detaily čidla:

pi@raspberrypi ~ $ owdir /28.9614C2030000
/28.9614C2030000/address
/28.9614C2030000/alias
/28.9614C2030000/crc8
/28.9614C2030000/errata
/28.9614C2030000/family
/28.9614C2030000/fasttemp
/28.9614C2030000/id
/28.9614C2030000/locator
/28.9614C2030000/power
/28.9614C2030000/r_address
/28.9614C2030000/r_id
/28.9614C2030000/r_locator
/28.9614C2030000/temperature
/28.9614C2030000/temperature10
/28.9614C2030000/temperature11
/28.9614C2030000/temperature12
/28.9614C2030000/temperature9
/28.9614C2030000/temphigh
/28.9614C2030000/templow
/28.9614C2030000/type

Pro čtení dat z jednotlivých souborů je k dispozici příkaz owread. Můžeme se tedy zeptat třeba na typ připojeného čidla:

pi@raspberrypi ~ $ owread /28.9614C2030000/type
DS18B20

A jakou nám měří teplotu?

pi@raspberrypi ~ $ owread /28.9614C2030000/temperature
20.4375

(Jaké hodnoty jsou v dalších souborech a co s nimi? Nastudujte si za domácí úkol dokumentaci OWFS a datasheet čidla DS18B20.)

Stejným způsobem jako k čidlu se můžeme chovat i k ostatním položkám stromu OWFS. Třeba můžeme zjisti, jaký bus master je použit pro bus.0:

pi@raspberrypi ~ $ owread /bus.0/interface/settings/name
DS2482-100

Jak zde je vidět, OWFS řeší spoustu věcí, ne jen vlastní zjištění teploty. Pro většinu 1-wire zařízení OWFS umožňuje plnohodnotné použití. Například u teplotních čidel je tak možno zjišťovat maxima a minima nebo nastavovat limity pro automatické alerty. Vygenerované alerty pak najdete v cestě /alarm.
Dá se to ještě vylepšit? No jistě!

Copak asi značí to „FS“ v názvu OWFS? Filesystém.

Zkusíme ho spustit:

sudo owfs

No a teď zkusíme použít ne „owdir“, ale prostý výpis adresáře:

pi@raspberrypi ~ $ ls -l /mnt/1wire
total 0
drwxrwxrwx 1 root root 8 Nov 17 23:49 28.9614C2030000
drwxr-xr-x 1 root root 8 Nov 17 23:49 alarm
drwxr-xr-x 1 root root 8 Nov 17 23:49 bus.0
drwxr-xr-x 1 root root 8 Nov 17 23:49 settings
drwxrwxrwx 1 root root 8 Nov 17 23:49 simultaneous
drwxr-xr-x 1 root root 8 Nov 17 23:49 statistics
drwxr-xr-x 1 root root 32 Nov 17 23:49 structure
drwxr-xr-x 1 root root 8 Nov 17 23:49 system
drwxr-xr-x 1 root root 8 Nov 17 23:49 uncached

A hele? Je tu totéž, co vypisovalo owdir!
A data se z toho čtou jak? No jako z normálních souborů:

pi@raspberrypi ~ $ cat /mnt/1wire/28.9614C2030000/temperature
20.6875

Šlo by z toho dostat ještě víc?

Pomocí služby owhttpd je možné stejná data zpřístupnit jako webové stránky.

Aplikace owserver a owhttpd jsou systémové služby, takže se spouští při startu systému a je možno je ovládat pomocí

sudo service owserver start
sudo service owserver stop

resp.

sudo service owhttpd start
sudo service owhttpd stop

Další odkazy

A design guide for the layman: understanding, designing and building MicroLan™ (1-Wire) networks:
http://www.1wire.org/Files/Articles/1-Wire-Design%20Guide%20v1.0.pdf

Guidelines for Reliable Long Line 1-Wire® Networks:
http://www.maximintegrated.com/app-notes/index.mvp/id/148
Zde najdete informace, jak počítat délky 1-wire sítě a jaké jsou limity 

Quickstart quide pro ubuntu:
http://owfs.org/index.php?page=quickstart-guide

Kterak zajistit, aby se „owfs“ (ne owserver) spustilo samo po startu systému:
http://wiki.temperatur.nu/…

Jak připojit čidla teploty přes GPIO4 a kernelový patch (česky – zdejší diskutující MiK):
http://www.astromik.org/raspi/15.htm

Dsc_34731

1 – I2C teploměry
2+3 – I2C GPIO expandér a jím řízená LED
4 – budič 1-wire sběrnice DS2482-100
5 – teplotní čidlo DS18B20

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s