Tag Archives: Raspberry Pi

Zkuste to bez drátů, pane Marconi!

(Prvotně publikováno 7.3.2014 na raspi.cz.)

Kterak k Raspberry Pi připojit bezdrátový senzor něčeho, třeba teploty.

Pro plánované zařízení jsem potřeboval, aby dva mikrokontroléry byly schopny si mezi sebou na vzdálenost pár metrů vyměňovat data bezdrátově. Po chvíli hledání jsem našel zajímavý komunikační čip od Nordic Semiconductors – nFR24L01+.

nFR24L01+ není jen tak obyčejné ASK-OOK pípátko, přes které se dá prodloužit sériový port. Tenhle čip funguje až na vrstvě 4 modelu ISO/OSI, tedy udělá za vás spoustu práce.  Vysílá na frekvenci 2.4 GHz (volné pásmo ISM – industrial, science, magic). Umí zpracovávat pakety o délce až 32 byte, které chrání pomocí šestnáctibitového CRC. Každý čip má nastavenou svou adresu (pětibajtovou) a je schopen přijímat data až od dalších pěti čipů. A automaticky obsluhuje potvrzení příjmu od protistrany. Tedy funguje to tak, že dáte čipu data a řeknete „odešli na stanici s adresou 1-2-3-4-5“. Čip autonomně odešle data a počká na potvrzení od protistrany. Když potvrzení nedojde, opakuje vysílání ještě několikrát. A na závěr vám řekne, zda se podařilo či nepodařilo data dodat na druhou stranu. Komunikace je přes SPI. No a to nejlepší na závěr: [tady] ho mají zabalený v hezkém hotovém modulu za 1.72 USD včetně dopravy do ČR! Tedy za tuhle cenu je jeden, potřebujete dva. Ale necelé 4 USD = 80 Kč za bezdrátový spolehlivý link mi přijde jako dobrá cena.

DSC_4913

Aby se mi neznámé zařízení lépe ladilo, rozhodl jsem se, že odesílat budu z mikrokontroléru, ale přijímat budu do Raspberry Pi, protože by se to mohlo časem taky hodit. Jako mikrokontrolér pro podobné hračky používám čipy Picaxe. Konkrétně v tomhle případě Picaxe 20M2. Stejně jako u populárních Atmelů (Arduino) je to kompletní mikrokontrolér, který má na čipu vše potřebné – analogové i digitální vstupy i výstupy, podporu I2C, sériového portu a spousty dalších věcí. Programuje se to v „basicu“ – syntaxí je to basic, ale sémantikou spíše assembler (pracujete přímo s registry/pamětí). Vývojové prostředí je zdarma. Největší rozdíly proti Atmelu/Arduinu jsou tyto:

  1. Pro programování nepotřebujete programátor ani jiné specifické USB hračky. K obvodu stačí dát dva rezistory a je možné ho připojit k běžnému sériovému portu, přes který se programuje a přes který umí posílat debugovací hlášení. Podpora pro sériový port může být i v hotovém zařízení. Je možné ho tedy přeprogramovávat kdykoli.
  2. Podporuje napájení 5 V i 3.3 V.
  3. Přímo na úrovni jazyka obsahuje spoustu knihoven, které pokrývají většinu úkolů. Potřebujete změřit délku impulzu? Načíst teplotu z 1-wire teploměru? Poslat data přes I2C? Na všechno jsou tam jednořádkové příkazy, které to umí samy.

Zapojení – vysílač – Picaxe

Na straně vysílače je to jednoduché. Všechny datové nohy bezdrátového modulu připojíme napřímo na nohy mikrokontroléru.

  • C.0  -> Nordic CE
  • C.1  -> Nordic CSN
  • C.2  -> Nordic SCK
  • C.3  -> Nordic MOSI
  • C.4  -> Nordic MISO
  • C.5  -> Nordic IRQ

Na další piny připojíme 1-wire teploměr DS18B20 (do standardního zapojení popsaného na webu Picaxe) a dvě LED diody pro signalizaci (komunikace OK, chyba). Zbývá už jen napojit napájení bezdrátového modulu. A tady pozor! I když jsou datové nohy modulu tolerantní k 5 V, napájení musí být 3.3 V! A ještě jedno upozornění: k napájení modulu je nutné připojit kondenzátor 10 uF. Dokud tam nebyl, chovalo se to divně.

DSC_4919

Schema zapojení:

DSC_4920

Zapojení – přijímač – Raspberry Pi

Tady P.T. čtenáře přesměruji [na tento článek]. Tam je to všechno step-by-step popsáno, včetně zapnutí SPI na straně Raspberry Pi.

DSC_4915

Zapojení je extrémně jednoduché – jen se propojí odpovídající piny RPi s odpovídajícími piny modulu.

RPi GPIO9 /MISO    (Pin 21)    – modul  pin 7 ( MISO )
RPi GPIO10/MOSI   (Pin 19)   – modul  pin 6 ( MOSI )
RPi GPIO11/CLK   (Pin 23)    – modul  pin 5 ( SCK )
RPi GPIO8/CE0     (Pin 24)    – modul pin 4 ( CSN )
RPi GPIO25  (Pin 22)    – modul pin 3  ( CE ) – tohle je jediná věc mimo standardní SPI zapojení, tímhle pinem se ovládá, kdy je modul rádiově aktivní
RPI 3.3V        (Pin 1)    – modul  pin 2 ( VCC/3.3V )
RPi Gnd         (Pin 6)    – modul  pin 1 (GND)

Software

Vhodný startovní kód pro Picaxe jsem [našel zde].

Kód pro Raspberry Pi je na již dříve [zmíněném odkazu].

Samozřejmě, že si spolu navzájem nerozuměly. Musel jsem postupně procházet datasheet obvodu a pochopit, co je potřeba změnit:

  • Obě strany samozřejmě musí mít stejně nastavenu linkovou vrstvu – frekvenci, rychlost, režim potvrzování.
  • Na straně přijímače musí být nastavená stejná délka paketu, jakou vysílač opravdu pošle.
  • Vysílající strana si nastaví odesílací i přijímací adresu na stejnou adresu, jakou má přijímač (!!!).
  • Odesilatel by si neměl vymaskovat stavové informace o odeslání paketu, přijímač by neměl nechat maskovat stavové informace o příjmu paketu.
  • No a pak nastane magie a začne to fungovat.

Finální kód pro obě strany najdete [zde].

Raspberry Pi tedy dostává každou chvíli paket o délce 1 byte, který obsahuje teplotu naměřenou na straně vysílače, přímo ve stupních celsia.

Finální řešení bude mít i na straně přijímače také mikrokontrolér Picaxe. Ale až někdy budete potřebovat něco měřit bezdrátově, vzpomeňte si na moduly nFR24L01+, možná budou váš problém řešit.

Jo a ještě zbývá doplnit dosah: na volném prostranství jsem měl data cca 25 metrů od vysílače. Přes dvě tlusté zdi to funguje na cca 8 metrů bez problémů.

Reklamy

Napsat komentář

Filed under Mikrokontroléry - Arduino, ESP8266, Picaxe, ..., Počítače, vývoj HW a SW

Levný LCD displej připojený přes I2C

Prvotně publikováno na raspi.cz 27.5.2013.

Pro účely zobrazení provozních dat jsem potřeboval připojit nějaký levný LCD displej. Vzhledem k tomu, že se mi nechce obsazovat hejno I/O pinů běžným displejem s paralelním rozhraním, hledal jsem něco s I2C … a našel jsem: podsvícený displej 2×16 znaků s I2C sběrnicí za USD 8.69 (poštovné do ČR zdarma).

Technicky je to standardní paralelní displej 2×16 s nejběžnějším řadičem HD44780. Ten je připojen na I2C osmibitový I/O port expandér PCF8574 sedící na adrese 0×20 (adresa se dá změnit propojkami na desce). Tento expandér je výrazně jednodušší než mnou dříve použitý MCP23009 – není potřeba jej nijak nastavovat. Data zaslaná na I2C adresu expandéru se rovnou pošlou na výstupy.

Vzhledem k tomu, že displej je na 5 V, připojil jsem k němu I2C bus přes převodník úrovníza USD 2.60 (poštovné zdarma). Zapojení je jednoduché: na 5V straně jsem připojil +5V a zem; na 3.3V straně jsem napájení nezapojoval. A pak jsem na dva z pinů na 3.3V straně přivedl SDA a SCL z RasPi a na druhé straně tyto piny zapojil do displeje.

Mapování skutečných nožiček displeje na porty expandéru je toto:

bit 7 = backlight, 0=rozsviceno
bit 6 = RS; 0=command, 1=data
bit 5 = RW; 0=write, 1=read — takže vždy 0
bit 4 = E; 0=klid, 1=strobe
bit 3 = D7
bit 2 = D6
bit 1 = D5
bit 0 = D4

Řízení těchto displejů je poměrně jednoduché. Teorie je hezky popsána na tomto odkazu, ale pro praxi je možná jednodušší vyjít z pythoního samplu tady (pozor, předpokládá jiné zapojení nožiček).

Takže za další hodinku jsem napsal ovládací program v Javě… a zcela překvapivě to fungovalo.

Poslední, co je potřeba otestovat, je znaková sada displeje.  Každý z těchto kontrolérů má jinou sadu znaků podle toho, pro jakého zákazníka byl stavěn. Já našel tohle:

Výsledek je uspokojivý.

Ukázkovou aplikaci najdete ke stažení zde. Vyžaduje nainstalovanou knihovnu pi4j.

NA ZÁVĚR ODKAZY

1) Teorie LCD řadičů HD44780 – http://joshuagalloway.com/lcd.html

2) Praktický sampl v Pythonu: http://www.raspberrypi-spy.co.uk/2012/07/16×2-lcd-module-control-using-python/

3) Stránky zdejšího diskutujícího MiKa, který řešil podobný problém. Připojoval displeje s paralelním připojením: http://www.astromik.org/raspi/16.htm a posléze i přes I2C, kde si ale expandér zapojil sám: http://www.astromik.org/raspi/32.htm

Napsat komentář

Filed under Počítače, vývoj HW a SW

I/O v Javě, rychlé I/O, PWM modulace a tak dále

Prvotně publikováno na raspi.cz 29.3.2013.

V nedávném článku „Propojujeme Raspberry Pi a Arduino“ si Buben postěžoval, že

  • RPi postrádá PWM
  • Nelze rozumně spolehlivě reagovat na změny na vstupních pinech, protože synchronní polling by bral moc času procesoru a byl by z důvodu multiprocesingu v linuxu nespolehlivý

… a že tedy je lepší předat obsluhu I/O Arduinu.

S výsledkem této úvahy souhlasím. Složitější I/O nemá obtěžovat CPU, mají ho dělat kanálové procesory – tak nás IBM učí už více než 50 let. A volba Arduina není špatná. Nicméně předpoklady, na základě kterých Buben toto tvrzení postavil, jsou nepravdivé.

Pro spoustu aplikací stačí počet I/O portů, které má RPi – a pro spoustu aplikací stačí ihardwarová podpora, kterou má RPi pro řešení obou výše uvedených problémů.

Hardwarové PWM výstupy

Přímo na expanzním portu snadno najdete pin GPIO1 (18), což je zároveň výstup hardwarového PWM, které má RPi v sobě. Ale uznávám, že jedno PWM je nanic. Každý smysluplný kus železa potřebuje alespoň tři serva = tři PWM kanály. Co s tím?

Samozřejmě je blbost aplikačně simulovat PWM tím, že budeme na GPIO pin sypat jedničky a nuly. To by skutečně stálo všechen procesorový výkon a navíc by to nebylo spolehlivé  – přepínání tasků v linuxu by způsobilo nahodilé a nepříjemné výpadky v modulaci.

Ale co kdyby ty jedničky a nuly na výstup za nás sypal někdo jiný? Někdo, kdo to umí bez zátěže procesoru?

Ano, to je správná cesta. V paměti připravíme „obraz“ jednoho PWM pulzu (tj. třeba 500 nul a pak 500 jedniček = máme pulz s plněním 50%) a pak stačí říct řadiči DMA, ať tento kus paměti fixním tempem neustále dokola posílá na daný pin. A ejhle, funguje to.

Hotovou implementaci pro základní PWM najdete zde: https://github.com/sarfata/pi-blaster/

Detailnější popis je na stránce autora.

Aplikaci stačí nainstalovat a spustit (nebo nechat spouštět automaticky při bootu). Ovládání je pak jednoduché: Příkazem

echo "1=0.3" > /dev/pi-blaster

nastavíme pin 1 na PWM plnění 30%,

echo "1=1" > /dev/pi-blaster

dá plnění 100% atd. Zatížení procesoru je nulové a signál je hezky pravidelný, bez výpadků. Takto může být obsluhováno více GPIO pinů, defaultně jich pi-blaster řídí 8.

Pokud nechcete pomocí PWM řídit úroveň jasu LEDky, ale chcete ovládat serva, nepotřebujete „standardní“ PWM, ale trochu jiné. U serv je to tak, že frekvence pulzů by měla být 100 Hz; impulz o délce 1 msec je 0% výkonu, impulz o délce 2 msec je 100% výkonu. Kratší pulzy jsou chyba, delší taky.  Chce se vám s tím ladit? Jistě ne. Takže potřebujeme hotové řešení.

Najdeme ho tady: https://github.com/richardghirst/PiBits/tree/master/ServoBlaster

Výše popsaný projekt pi-blaster vznikl jako rozšíření myšlenky ServoBlasteru. Pi-blaster má hezčí implementaci (ovládání přes soubor).

Hardwarová detekce změny stavu GPIO pinu – jak nepollovat I/O procesorem

Procesor, na kterém je RPi postaveno, samozřejmě umí na změnu stavu vstupního GPIO pinu navázat přerušení.

Tedy zbývá jen zjistit, zda je tato služba podporována v linuxu a dá se používat?

Ano, je tam a funguje.

Tedy ve své aplikaci můžete snadno říct „až se změní stav GPIO0, zavolej mojí funkci X()“.

Test jsem provedl v Javě, což je pro real-time programování výrazně nevhodný jazyk. Nicméně Javu mám jako svůj denní nástroj a přemýšlím v ní; navíc jsem už líný používat pointery a podobné věci, ze kterých se v céčku dá postavit operační systém, a rád se od nich nechám odstínit.

Pro integraci Javy s GPIO na RPi existuje hezká knihovna pi4j. Více o ní napíšu za chvíli, ale ten důležitý výsledek testu je: interrupt-driven obsluha GPIO na RPi funguje. Za klidového stavu (tj. když se nic neděje, na GPIO nejsou žádné změny) to nežere žádný strojový čas. A v té ošklivé pomalé Javě to zvládá obsloužit až zhruba 2000 změn stavu za sekundu. A když přijde osamocený milisekundový impulz, neztratí se, Java ho dostane.

Podpora pro RPi GPIO v Javě – pi4j

Knihovna pi4j je přesně to, co potřebujete, pokud si chcete hrát s I/O na RPi ve vyšším jazyce.

Co umí?

  • Pro začátek samozřejmě obsluhu jednotlivých GPIO pinů. Nastavení směru, nastavení hodnoty.  A eventy o změnách stavu.
  • Taky je tam podpora pro I2C. Snadno můžete mluvit s I2C zařízeními.
  • Nezapomnělo se ani na sériové porty (UART).
  • SPI? No jasně.

Už tohle vše by bylo dobrým důvodem knihovnu používat, ale zde funkce teprve začínají. Autoři si totiž uvědomili, že když už mají dobře navržené abstraktní rozhraní pro GPIO, tak by s ním šlo obsluhovat víc věcí.

  • Máte na I2C připojený I/O expandér MCP23008 / MCP23009, o kterém jsem dříve psal? Tak si prostě místo standardního objektu „pin“ vyžádáte tento objekt od providera MCP23008GpioProvider. Toť vše. Veškerá další obsluha tohoto „drátu“ je stejná – je jedno, jestli pracujete s pinem přímo na expanzním portu, nebo s pinem za expandérem MCP23009. Wow!
  • Totéž samozřejmě platí i pro I2C I/O expandéry MCP23017 a PCF8574. A taky pro expandér MCP23S017 připojený přes SPI.
  • Koupili jste si expanzní desku PiFace? Kód je připraven.
  • Přímá podpora pro řízení krokových motorků. Stačí namapovat řídící vodiče a pak už jen můžete říkat „100 kroků plnou rychlostí doprava“.
  • Komunikace se senzorem Wii Motion Plus (modul s gyroskopem rozšiřující standardní ovladač pro Nintendo Wii, připojuje se přes I2C).
  • Obsluha LCD displejů.

Knihovna je hezky navržená a pro jednotlivé funkční bloky jsou tam hotové samply.

Jak rychle vlastně Java na RPi s I/O pracuje?

Udělal jsem takový jednoduchý test. Na jeden GPIO pin (výstupní) jsem připojil LED diodu, a zároveň jsem ho spojil na druhý pin – vstupní.

O změnách na vstupu jsem si nechal posílat eventy.

A pak jsem v jednoduché smyčce posílal na výstup jedničky a nuly.

Co jsem zjistil?

Maximální frekvence na výstupním drátu dosažitelná z mé aplikace byla zhruba 2 kHz. Nicméně kdybych si dal práci s nastavení JVM, mělo by to být výrazně lepší.

Pro délku jedničky/nuly 1 msec se už začaly některé eventy o změnách ztrácet. V průměru jsem dostal 986 eventů na 1000 změn. Vytížení CPU bylo tvrdých 100%. První eventy přišly až po cca 100 msec od zahájení vysílání – ale to je dáno přepínáním threadů v Javě; smyčka posílající 1/0 prostě nepustila procesor. Ale eventy se frontují, takže se povětšinou neztrácejí.  (U osamoceného milisekundového pulzu se eventa neztratila nikdy; ztrácení je skutečně funkcí objemu změn.)

Pro impulzy o délce 5 msec už vytížení procesoru spadlo na 50% a eventů dorazilo 998 z tisíce.

10 msec pulzy už vytěžovaly procesor jen na 30% a eventy se neztratily žádné.

Pro delší pulzy vytížení procesoru klesalo k neměřitelnosti.

A samozřejmě: když jsem takhle posílal na výstup třeba 100 Hz signál, na svitu LED byly jasně vidět nepravidelnosti . Linux prostě není real-time systém a občas vám procesor sebere na tak dlouhou dobu, že je to vidět jako zřetelné mrknutí LEDky.

Napsat komentář

Filed under Počítače, vývoj HW a SW

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

Napsat komentář

Filed under Počítače, vývoj HW a SW

I2C potřetí: rozsvěcíme LED diodu složitěji a dráže

Prvotně publikováno na raspi.cz 19.11.2012. 

 

Ve svém druhém příspěvku jsem ukazoval,  jak rozsvítit LED připojenou na GPIO. Je to snadné, že? Tak teď to bude znovu, ale složitěji.


Přímé připojení vstupů a výstupů na GPIO porty RPi je hezké (a na výuku/předvádění je to super), ale má to dva háčky:

  • Není zcela zjevné, kolik proudu je možno z jednotlivých GPIO krátkodobě a dlouhodobě odebírat – a když to přeženete, nedopadne to dobře.
  • Většina „bastlířského“ světa funguje na pětivoltové logice – a pokud přivedete 5 V na vstup, můžete RPi říct jen „pápá“.

Oba tyto problémy lze vyřešit například použitím I2C GPIO expandéru. Pod označením MCP23009-E/P najdete 8-bitový I2C port expander s otevřeným kolektorem – tj. čip, který má na straně RPi jeden I2C port a směrem ven nabízí 8 I/O portů. Každý z portů si můžete nastavit jako vstupní nebo výstupní.

Port nakonfigurovaný jako vstup je tolerantní k pětivoltové logice, tj. korektně přežije spolupráci s TTL zařízením.

Port nakonfigurovaný jako výstup má tyto parametry:

  • Je tolerantní k 5 V signálům.
  • Má maximální proud 25 mA (a součet přes celý čip nesmí přesáhnout 200 mA).
  • Má otevřený kolektor – tj. když je na něm logická 0, je sepnutý na zem; když je na něm logická 1není připojený nikam. Tj. logickou jedničku dosáhnete tím, že výstup přes odpor připojíte k napájení. Kouzlo tohoto řešení je v tom, že při připojení odporu k 3.3V můžete komunikovat se zařízeními s třívoltovou logikou; při připojení odporu k 5 V můžete komunikovat s běžnými TTL (5 V) zařízeními.

Datasheet k obvodu.

Takže to zapojíme:

  • Napájení obvodu na +3.3V a na GND.
  • I2C SDA a SCL na odpovídající výstupy na expanzním konektoru.
  • Dále zde máme /RESET – aby se obvod nahodil, musí tam být logická 1 = přes odpor na +3.3V.
  • Kouzelný vstup ADDR určuje, jakou adresu na I2C sběrnici čip obsadí. Je analogový (!!!) a umožňuje tak jedním drátem určit jednu z osmi adres (=až osm těchto expandérů na jedné I2C sběrnici). Pro zjednodušení si s tím nebudeme hrát a připojíme ADDR na GND = základní adresa 0x20.
  • GP0 až GP7 jsou jednotlivé GPIO vstupy/výstupy.
  • Ostatní nožičky necháme volné.

Mezi +5 V a pin GP0 zapojíme odpor 330 ohm a LEDku. Tj. LED bude svítit, pokud na GP0 bude „0“ = připojeno na zem. Opačně by to nefungovalo – otevřený kolektor, viz výše.

Jako vedlejší efekt tohoto cvičení jsem si chtěl vyzkoušet nějaký nástroj na kreslení schémátek. Zde tedy je výstup z aplikace Fritzing. Vypadá jako vhodná na podobná malování – má hotové moduly i např. pro RPi, nepájivé kontaktní pole má logiku a automaticky propojuje součástky. Kreslí se v tom rychle a pohodlně.

Mcp230009-1_bb1

 

Zapojeno máme, co teď s tím?

Po bootu se RPi zeptáme, zda je tam něco nového 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: — — — — — — — — — — — — — — — —
20: 20 — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — 48 — — — — 4d — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

Na adrese 0x20 vidíme nové zařízení. 0x48 a 0x4d jsou teplotní čidla z minulého dílu.

Nastavíme registr IODIRA (0), který určuje, zda jsou piny vstupní nebo výstupní. 1 = vstup, 0 = výstup. Pro komunikac použijeme i2cset, kterému předáme parametry:

  • -y = neptej se na nic
  • 0 = sběrnice 0
  • 0x20 = adresa čipu na sběrnici
  • 0 = adresa registru v čipu
  • 0xfe = hodnota, co nastavujeme (1111 1110)
  • b = zapisujeme 1 byte

pi@raspberrypi ~ $ i2cset -y 0 0x20 0 0xfe b

LED se rozvítila! Defaultní hodnota výstupního pinu je totiž „0“.

No a teď můžeme blikat LEDkou. Piny se ovládají v registru OLATA (0x0a).

pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x01 b

(1 = zhasnuto)

pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x00 b

(0 = svítí)

pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x01 b

(1 = zhasnuto)

Kdybych chtěl číst stav vstupních pinů, je to k nalezení v registru GPIOA (0x09).

Takže děláme stejnou práci, jako na začátku. Blikáme LEDkou. Ale daleko sofistikovaněji než předtím.

Tipy a triky:

  • Od stejného výrobce se dá pořídit MCP23017, což je 16-bitová verze téhož. Více nožiček a více pinů, stejná logika ovládání.
  • Chci-li nastavit jen jeden bit nějakého I2C registru, příkaz i2cset na to má volbu „mask“ – maskou řeknete, které bity chcete nastavit; i2cset si hodnotu ostatních bitů načte z čipu a pak je doplní do zapisovaného bajtu.

Dsc_34731

1 = I2C čidla teploty z minulého článku
2 = MCP23009-E/P
3 = LEDka. Bliká na rozkaz.
4+5 = 1-wire bus adaptér a čidlo DS18B20 – bude v dalším článku, stay tuned

 

Napsat komentář

Filed under Počítače, vývoj HW a SW

Použití I2C podruhé: měření teploty … a taky webkamera

Prvotně publikováno na raspi.cz 16.11.2012.

 

Léto skončilo a je načase si zase po večerech hrát.

Takže v dnešním zápisku se koukneme, jak přes I2C odhadovat okolní teplotu a jak používat webkameru.

 

 

Intermezzo na začátek: upgrade OS a nastavení I2C

V mezičase od mých minulých zápisků se stala důležitá věc – jako hlavní platforma se objevil Raspbian Wheezy. Přináší hejno nových věcí, ale hlavně změnu architektury – využití hardwaru pro matematické výpočty. Vše je rychlejší. Pokud jste ještě neupgradovali, udělejte to. Vedlejším efektem je to, že podpora I2C je v systému od přírody a není potřeba jej patchovat.

Pro aktivaci I2C proveďte následující kroky:

1) v souboru /etc/modprobe.d/raspi-blacklist.conf zakomentujte (přidejte před ně znak #) řádky:

blacklist spi-bcm2708
blacklist i2c-bcm2708

2) do /etc/modules přidejte řádek

i2c-dev

3) rebootujte a koukněte, zda máte I2C:

pi@raspberrypi ~ $ ls -l /dev/i2c*
crw-rw—T 1 root i2c 89, 0 Nov 15 20:22 /dev/i2c-0
crw-rw—T 1 root i2c 89, 1 Nov 15 20:22 /dev/i2c-1

4) nainstalujte si podpůrné tooly pro I2C

sudo apt-get install i2c-tools

5) přidejte se (svého uživatele) do skupiny i2c – pak při dalších příkazech pracujících s i2c nebudete muset psát „sudo“

sudo usermod -aG i2c VašeUživatelskéJméno

6) po provedení bodu 5 je třeba se odhlásit a zase přihlásit, aby se změna projevila

Měření teploty

Jako ultimativní cestu pro měření teploty je samozřejmě možné použít nějaký opravdový modul pro meteostanice. Ale jednak se mi zrovna nechtělo čekat na dodávku z číny (teď před vánoci to bude trvat dlouho) a navíc jsem chtěl něco levného.

Lepší cesta by bylo použít Dallasovská čidla na 1-wire sběrnici (DS18B22). Jsou docela přesná a jsou levná. Jenže adaptér I2C/1-wire vhodný pro RPi se vyrábí jen v SO-8 pouzdru … a pokus o jeho ruční pájení nedopadl dobře. Další kolo bude následovat.

Tak jsem si na svém oblíbeném e-shopu našel základní čidlo teploty přímo pro I2C. Za 27 Kč se dá koupit TC74 v pohodlně pájitelném pouzdru. (Mimochodem: TME e-shop doporučuju. Nejkratší čas dodávky domů byl 1 den a 10 minut; nejdelší dva dny a dvě hodiny. Dokáže tohle váš dodavatel?).

TC74 (datasheet zde) měří teploty v rozsahu -65 až +130 stupňů, s udávanou přesností kolem +-2 stupně. Na meteostanici to není – ale já potřebuju měřit teplotu v boxu, ve kterém bude RPi, abych věděl, zda ho nepřehřívám, a na to to bohatě stačí. A navíc meteostanici už mám.

TC74 se vyrábí ve verzi pro 3.3V (v názvu je -3.3V) a pro 5V (-5.0V).   „Pětivoltovou“ verzi můžete také napájet 3.3V a připojit přímo k RPi – jen se sníží přesnost o cca 1-2 stupně.

Pokud chcete k jednomu RPi připojit snímačů více, musí mít různé I2C adresy, aby nekolidovaly. To zajistíte volbou jiného čísla za písmenem „A“.

Tak jsem si koupil:

  • TC74A0-3.3VAT – tedy adresa 0x48 a verze pro 3.3V
  • TC74A5-5.0VAT – adresa 0x4d a verze pro 5V, protože v TME neměli 3.3V-verzi s odlišnou adresou než A0

Zapojení je extra jednoduché – všechny snímače připojíte přímo na expanzní konektor (na 3.3V, GND, SDA a SCL). Toť vše. Nabootujeme RPi a můžeme zkoušet.

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

Obě čidla jsou tam vidět.

TC74 má kromě pohodlného zapojování též jednoduché použití. Není třeba nic nastavovat, nic složitě číst. Stačí se jen zeptat, jaká je teplota. V každém čipu je to v registru 0 a je to jeden bajt. A vrací přímo stupně celsia. Hurá do toho:

pi@raspberrypi ~ $ i2cget -y 0 0x48 0 b
0x14
pi@raspberrypi ~ $ i2cget -y 0 0x4d 0 b
0x18

Je vidět, že první čidlo (3.3V) vrátilo teplotu 14 (hexadecimálně) = 20 stupňů celsia(Kdo neví, jak se převádí z šestnáctkové na desítkovou soustavu, použije kalkulačku ve Windows ve „vědeckém“ režimu.)

Druhé čidlo (pětivoltové) vrátilo 18 (hexadecimálně) = 24 stupňů celsia.

Ve skutečnosti je tu asi 21 C, takže je vidět, že pětivoltové čidlo je při napájení z 3.3V skutečně méně přesné. Ale pro mé potřeby to stačí.

No a to je k rámcovému měření teploty vše, ne?

Webkamera

Jen rychle pár slov k webkameře. V rámci mého „projektu“ chci fotit. Tedy mít připojenou webkameru. Tak jsem vybral Canyon CNR-WCAM820 – za cca 550 Kč dvoumegapixelová kamerka.

V Raspbianu aktuální verze (2012-10-28) je přímo podporovaná.

Jak kameru v Raspbianu používat?

Zapojíme kameru do USB a koukneme se, zda je vůbec vidět:

pi@raspberrypi ~ $ ls -l /dev/video*
crw-rw—T 1 root video 81, 0 Jan 1 1970 /dev/video0

OK, takže kamera tam je.

Jak dostat z kamery statický obrázek? Jak udělat videostreaming?

Spousta toolů, které jsem zkoušel, mi nefungovala tak, jak by se mi líbilo. Ukazuje se, že zejména pro vyšší rozlišení je výkon procesoru a USB hardware RPi nedostatečný, pokud se nezvolí správná komprese atd. Některé aplikace tak místo grabování obrázků vypisovaly spousty timeoutů a chyb…

Po delším testování jsem našel dva balíky, které mi vyhovují.

fswebcam

fswebcam je jednoduchý tool, který umí brát z webkamery statické obrázky a uložit je do souboru. Je přímo podporován v balíčcích pro Raspbian. Instalace je tedy jednoduchá:

sudo apt-get install fswebcam

Použití je triviální:

fswebcam -r 1280×1024 -S 1 –jpeg 95 –shadow –title „titulek“ –subtitle „podtitulek“ –info „dalsi text“ –save img.jpg 

(pozn: všechny uvozovky mají být nahoře!) Tento příkaz vynechá jeden snímek (-S 1), aby byla jistota, a pak z kamery vezme snímek 1280×1024. Dolepí do něj titulky do informačního proužku dole a uloží ho jako JPG do home.jpg.

Pokud na konec příkazu přidáte

-q -l 60

tak zůstane běžet a každou minutu soubor img.jpg přepíše novou verzí.

S mojí kamerou rozlišení 1600×1200 občas selže. 1280×1024 projde vždy.

v4l4j

Pod kryptickým názvem se skrývá „video4linux for Java„.  Jedná se tedy o knihovny, které aplikacím v Javě umožňují přístup k zařízením video4linux, tedy i k webkamerám. Kromě vlastních knihoven je zde i sada ukázkových aplikací, které běhají velmi dobře – vypisují konfigurace zařízení a třeba dělají streaming obrázků z kamery. A v4l4j má přímou podporu RPi.

Instalace je na rozdíl od fswebcam netriviální. Musíte si vše zkompilovat podle popisu. Jsou tam některé špeky, např. chybějící konce řádků v popisu. Ale nakonec se vám to jistě podaří.

No a pokud nechcete programovat, můžete využít hotových aplikací. Příkaz

java -cp /usr/share/java/v4l4j.jar -Djava.library.path=/usr/lib/jni au.edu.jcu.v4l4j.examples.DumpInfo

vypíše konfiguraci videozařízení. Výstupem je pěkný textový popis, co vaše kamera vlastně umí. Příkaz

java -cp /usr/share/java/v4l4j.jar -Dtest.width=640 -Dtest.height=480 -Djava.library.path=/usr/lib/jni au.edu.jcu.v4l4j.examples.server.CamServer

spustí webserver streamující obrázky z kamery. Z okolních počítačů se na něj dostanete z browseru zadáním http://192.168.33.105:8080/stream (kde 192.168.33.105 je IP adresa RPi). Když jsem si nastavil rozlišení 1600×1200, dostával jsem na druhý počítač data s pěknou frekvencí 0.6 fps (tj. zhruba 3 snímky za 2 sec).

Dsc_34721


Napsat komentář

Filed under Počítače, vývoj HW a SW

Použití I2C sběrnice (detailní postup) + hodiny reálného času pro RPi

Prvotně publikováno na raspi.cz 7.7.2012. Článek již není zcela aktuální – dnešní distribuce Raspbian má již podporu I2C  zabudovanou, je to popsáno v dalším článku.

 

 

RPi nemá hodiny reálného času. Bez připojení na internet tedy neví, kolik je hodin. Pokud používáte Debian squeeze, po startu budete mít nastaveny hodiny na čas posledního shutdownu; ve Fedoře jsem viděl i 1.1.1970.

To je docela neštěstí, pokud chcete RPi použít jako datalogger, tj. zařízení, které někde bez připojení autonomně získává údaje a ty se pak dávkově předají například na výměnném médiu (nebo sice konektivitu má, ale jen občas).

Co s tím můžeme udělat? Připojit RTC – hodiny reálného času.

Hardware

Na svém oblíbeném e-shopu jsem našel tento levný modul RTC. Za méně než 6 USD, s dopravou zdarma, obsahuje standardní čip PCF8563, potřebnou bižuterii (krystal atd), držák na baterii a zálohovací baterku. A je kompatibilní s 3.3V rozhraním RPi.

Jeho připojení je jednoduché – má rozhraní I2C. Takže připojit na I2C data a hodiny (SDA, SCL), GND na zem a VCC na napájení 3.3V.

Dsc_2050-580x426

SPI, I2C – co to je?

Aha, teď jsem použil nějaká sprostá slova. Na expanzní konektor RPi jsou vyvedeny dvě sériové sběrnice – SPI a I2C.

SPI je relativně hloupá sběrnice. Má hodiny (RPi udává takt), data směrem ven, data směrem dovnitř. A pak pro každé připojené zařízení musíte mít jeden volný GPIO pin, kterým mu řeknete „teď si povídám s tebou“. Není stanoven přesný protokol, co po sběrnici běhá – je to vždy specifické podle zařízení. Více info: wikiroot.

I2C je výrazně chytřejší. Používá jen dva dráty: hodiny SCL (RPi udává takt) a obousměrná data SDA, na kterých se všechny připojené zařízení střídají. Ke sběrnici může být připojeno až 127 zařízení. Je přesně definovaný protokol, kterým RPi řekne např. „teď chci zapsat hodnotu 27 do registru 66 na zařízení 34“ nebo „zařízení 52, řekni mi stav svého registru 22“. Více info: wikiroot.

Kouzlo I2C je v tom, že jí linux zná. Tedy můžeme ušetřit spoustu času a nemusíme programovat posílání jedniček a nul přes jednotlivé dráty.

Software

Debian squeeze ve verzi 2012-04-19 nemá (ani po posledních updatech v červnu 2012) podporu pro I2C. Ale tenhle borec jí tam dodělal.

Postup pro rozchození I2C:

1) Nainstalujte si a spusťte rpi-update, abyste měli nejnovější firmware a kernel (u mne 3.2.18). Nastavte memory split na 192 MB.

2) Stáhněte si opatchované jádro (linux-image-3.2.18-rpi1+_5_armel.deb) z odkazu.

POZOR! Vždy kontrolujte verzi svého kernelu a na home stránce si najděte odpovídající patchovaný kernel! Pokud pomícháte kernel s nevhodnou verzí firmware, nebude to fungovat.

3) Stažený soubor rozbalte:

dpkg -i linux-image-3.2.18-rpi1+_5_armel.deb

což vytvoří /boot/vmlinuz-3.2.18-rpi1+

4) Překopírujte /boot/vmlinuz-3.2.18-rpi1+ do /boot/kernel.img a restartujte systém.

Po nabootování se nic špatného nestalo, je tedy načase začít zkoušet I2C:

5) Otevřeme si terminál a přepneme se pod roota, protože většina dalších akcí chce root privilegia:

sudo bash

6) Vyzkoušíme načíst ovladač pro I2C:

modprobe i2c-dev

Pokud je vše v pořádku, vzniknou dvě nová zařízení:   /dev/i2c-0  /dev/i2c-1 . Bus 0 je vyveden na expanzní konektor, bus 1 končí na konektoru pro kamery, tedy je pro nás zatím nedostupný.

7) Pro práci s I2C si nainstalujeme patřičné nástroje:

apt-get install i2c-tools

8) A vyzkoušíme, jestli se něco děje:

i2cdetect 0

WARNING! This program can confuse your I2C bus, cause data loss and worse!

I will probe file /dev/i2c-0.

I will probe address range 0x03-0x77.

Continue? [Y/n] 

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          — — — — — — — — — — — — —

10: — — — — — — — — — — — — — — — —

20: — — — — — — — — — — — — — — — —

30: — — — — — — — — — — — — — — — —

40: — — — — — — — — — — — — — — — —

50: — 51 — — — — — — — — — — — — — —

60: — — — — — — — — — — — — — — — —

70: — — — — — — — —

pi@raspberrypi:~$

Hele, je tam! Na adrese 51 si s námi něco povídá! Takže I2C sběrnice funguje.

Takže teď stačí vzít datasheet k PCF8563, naprogramovat komunikaci a nastavit podle něj hodiny, ne? Ehm … neudělal to už někdo? Kouknu do Googlu … a zjistím, že hotovo je dokonce víc, než jsem si myslel – linux má přímou podporu pro tento RTC čip na I2C busu.

9) Vysvětlíme kernelu, že máme na I2C busu 0 zařízení 51 a to zařízení je PCF8563:

echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

a to je všechno. Odteď je to standardní RTC zdroj, který linux umí!

10) Zkusíme z něj načíst uložený čas:

hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

Hotovo.

Dsc_2051-580x388

 

Test řešení

Někdy kolem 18:07 reálného času jsem zařízení zapnul.

pi@raspberrypi:~$ sudo bash

root@raspberrypi:/home/pi# date

Wed Jun  6 17:52:28 BST 2012

Čas není dobře – je to čas posledního shutdownu, předpokládám.

root@raspberrypi:/home/pi# modprobe i2c-dev

root@raspberrypi:/home/pi# echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

root@raspberrypi:/home/pi# hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

Čas v RTC je správně.

root@raspberrypi:/home/pi# date

Wed Jun  6 17:53:33 BST 2012

Ale čas systému je stále špatně. Tak mu řekneme, ať se nastaví podle RTC:

root@raspberrypi:/home/pi# hwclock -s

root@raspberrypi:/home/pi# date

Wed Jun  6 18:09:24 BST 2012

A vše je OK.

 

Napsat komentář

Filed under Počítače, vývoj HW a SW