Zkuste to bez drátů, pane Marconi!

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ů.

 

 

20 thoughts on “Zkuste to bez drátů, pane Marconi!

  1. Jen technická k rozdílu Picaxe 20M2 oproti Arduinu. Na Arduino není potřeba žádný programátor. Používá standardní USB a usb kabel, naopak dnes je seriové rozhraní na kompu často problém a je potřeba pořídit převodník

    • Špatně naformulováno. Ano, Arduino má USB. Ale pokud chceš použít jen ten mikrokontrolér (tj. ne celou development desku, ale skutečně jen „brouka“), tak potřebuješ i programátor. Zejména pokud chceš mít brouka do zařízení zapájeného (ne v soklu) a přesto chceš mít možnost měnit kód.

      • tak samotný brouk už není Arduino. Arduino je platforma zahrnující vývojovou desku a vývojové prostředí. Brouk z arduina není arduino. Takže nelze psát ATmega/arduino a přisuzovat tomu shodné vlastnosti, protože každé znamená něco jiného s různými vlastnostmi a to co je napsáno jako výtka platí pouze pro samotné ATmega ale ne pro Arduino. Takto napsáno je to v článku nepřesné a zavádějící.

    • no, nevim. pouzivam arduino mini pro (proto ze stoji min nez samotny atmel ktery vtom je (mj, proc?)) a zadne usb to nema. a ne ze by chybelo.

  2. to je krásné, ale bylo by zajímavé obousměrná komunikace, aby se daly vysílat z raspberry i příkazy do přijímače, nebo i tyto moduly to umí po změně skriptu ? zatím vše řeším přes 1wire(ds2482) po kabelu, ale ovládat třeba ds2450 bezdrátově bych uvítal

    • Ano, tyhle moduly jsou z principu obousměrné. Takže stačí poslat odpovídající sadu commandů (změnit adresy a v control registru přepnout vysílání/příjem) a je možné poslat data v druhém směru.

      (Datasheety výrobce popisují i scénáře pro MESH síť, tj. komunikaci s modulem, který už není rádiově viditelný, pomocí mezilehlého modulu/více mezilehlých modulů.)

      • Jinak tedy ještě doplňuju, že „ovládat ds2450 bezdrátově“ je overengineering, protože Picaxe má A/D v sobě taky. Takže Picaxe + bezdrátový modul a nic dalšího už pro vzdálenou stranu „bezdrátového A/D převodníku“ nepotřebuješ.

  3. Díky za tip, tohle stojí za vyzkoušení. Používám pro podobné účely moduly RFM12B, které sice mají asi větší dosah, ale taky o to vyšší cenu.

  4. Ahoj, s těmito moduly jsme taky už experimentovali, docela problémy byly při použití v domě na rozumné vzálenosti. Tady je ještě pár poznatků: Dosah se velmi zlepší při rychlosti 250kbps. Čím menší payload tím lepší přenos. Je dobré experimentovat s jinou anténou, na netu je hodně stránek k tomu určených.

  5. Ja doplnim, ze jsem si s tim hral 2 mesice (arduino) a objevil jsem nekolik poznatku, za prve, funkcni a spolehla je jen jedna knihovna (tusim od uzivatele tmrh, ci jak se pise), naopak jsem nikdy nemel problem s kondenzatorem, jen u Mega, nechapu proc, ale snad jen on nema stabilni napajeni. Mini a Nano jsem netestoval, testoval jsem Uno a Mega (originaly i ruzne ciny). A nakonec byl problem vzdy ve spatne dokumentaci (zapojeni pinu) a nasledne v cele knihovne.
    Cca tyden z tech 2 mesicu jsem vymyslel vlastni protokol, az jsem jednoho dne objevil mysensors.org. Ma ficury co nepotrebuji, ale da se s tim zit. Kdyz bych nekdy nasel silu a odvahu, tak bych z toho kodu vysel a vyhazel nektere veci, napr. mesh a dynamicke smerovani – nehodlam doma provozovat fail over cluster :), ps za strankama urcite stoji vyvojar knihovny; pouzivaji jeho knihovny. Nevyhodu vidim ve spatne ci nulove dokumentaci projektu nebo je proste zmatecna – co jsem hledal, jsem sice vzdy nasel, ale trvalo to.

  6. Ahoj,
    potřeboval bych poradit. Postupoval jsem podle návodu a jsem ve stádiu kdy mi to vypíše 3 řádky:

    7 STATUS……….[0x40]
    17 Received bytes.[0x01]
    97 Bytes………….[0x19]

    Jede to ve smyčce. Nevím jak dál. Jestli mám něco špatně… A jak z toho dostat teplotu…

      • Moc děkuji za velmi rychlou odpověď a za objasnění.
        Tohle jé mé „poprvé“ … Vytvoření něčeho podobného. Měl bych ještě (jednu) otázku.
        V návodu se píše, že čip dokáže komunikovat až s 5 dalšími. Takže když vytvořím další (vysílač), změním adresu a v raspberry spustím další „skript“ s tou jinou adresou tak to bude fungovat? Nebo se to řeší jinak?
        Zmíněná adresa má nějaké pravidla, nebo se může zadat cokoliv?

        • 1) Adresa je tuším pětibajtová a může to být libovolných pět bajtů.

          2) Komunikace s více protistranami vypadá trochu jinak.
          Nemůžeš na RasPi spustit další skript – se zařízením může efektivně komunikovat jen jedna aplikace najednou.
          Jsou vcelku dvě varianty:
          Můžeš upravit skript, že bude chvíli poslouchat zprávy od adresy 1 a chvíli od adresy 2 (ale když budeš poslouchat zprávy od 1 a zrovna dorazí zpráva od 2, tak jí neuvidíš, ztratí se).
          Nebo si přečteš datasheet a aplikaci výrazně upravíš. NFR24L01+ má pět „slotů“ pro příjem. V tomhle demu je použit jen první. Správný postup je, že otevřeš dva sloty, do jednoho nastavíš adresu 1 a do druhého 2 – a ať přijde zpráva od kterékoli protistrany, bude přijata.

Napsat komentář: David Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna.