Pojďme programovat elektroniku | Programování | Arduino

Pojďme programovat elektroniku: Rádiový čip, který má skoro každá bezdrátová myš

  • Bezdrátové myši řídí čip od Nordic Semiconductors
  • Jeho rádiové vysílače si před lety oblíbila i komunita kutilů
  • Dnes si je vyzkoušíme v praxi

V mnoha bezdrátových myších a klávesnicích od Microsoftu nebo třeba Logitechu najdete malý čip, který navrhli inženýři v norském křemíkovém údolí. Dnes se na jeden z nich podíváme a proměníme jej v univerzální rádiový vysílač.

Před tisíci lety sloužil Trondheim jako hlavní město výbojných Vikingů, v osmdesátých letech se ale poněkud ospalá obec velikosti Plzně proměnila v norské Silicon Valley. Na břehu Trondheimsfjorden totiž vyrostlo inženýrské studio Nordic Semiconductors, které navrhuje křemíkové čipy.

Pokud o tomto podniku slyšíte poprvé, vězte, že jste se s jeho výrobky nevědomky už určitě setkali, Norové jsou totiž experti na armové mikrokontrolery a úsporné rádiové vysílače, které najdete v kdejaké bezdrátové myši nebo klávesnici. Čipy Nordic – nRF – se často starají o bezdrátový přenos dat jak v periferiích od Microsoftu, tak Logitechu a dalších výrobců.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
Laciná bezdrátová myš od Microsoftu a její rádiový mozek – čip z rodiny nRF od Nordic Semiconductors. Zde na obnaženém tištěném spoji přijímacího USB donglu.

Nordic Semiconductors nRF24L01+

Před lety je objevila také komunita domácích elektrokutilů a čínské fabriky brzy zahltily asijské e-shopy tunami drobných prototypovacích modulů s rádiovými čipy nRF24L01 a nRF24L01+ (PDF).

Dnes už jsou sice dávno překonané a samotní Norové už je nepodporují, svět bastlířů má ale svoji setrvačnost a co je nejdůležitější, kusová cena takové destičky začíná na Aliexpressu už zhruba na pětadvaceti korunách! Za cenu jednoho zákusku z laciné cukrárny tak získáte kombinovaný vysílač a přijímač, který ke komunikaci používá 2,4GHz pásmo, které dobře znáte ze světa Wi-Fi a Bluetooth.

Klepněte pro větší obrázek
Moduly s čipy nRF24L01/nRF24L01+ na asijských e-shopech

Pokud patříte mezi pravidelné čtenáře našeho seriálu o programování elektroniky, možná si teď kladete otázku, proč si proboha makeři oblíbili jakési norské čipy, když dnes za pár desetikorun koupíte prototypovací desky s populárním čipem ESP8266, který podporuje rovnou Wi-Fi a je natolik výkonný, že se vedle samotné rádiové komunikace postará jako procesor i o běh vašeho programu. O jeho nástupci ESP32, jehož cena také postupně klesá a podporuje i Bluetooth, ani nemluvě.

Stárnoucí vysílač s nízkou spotřebou a slušnou rychlostí

Odpověď je jednoduchá. Čipy z rodiny nRF24 byly ve světě Arduina nepsaným standardem rádiové komunikace právě v dobách, než se na scéně objevil asijský Espressif a jeho čipy ESPx. A vlastně přežívají dodnes, oproti Wi-Fi totiž mají jednu výhodu. Jejich komunikační protokol je mnohem jednodušší než  Wi-Fi, a tak se mohou pochlubit mnohem nižší spotřebou.

Klepněte pro větší obrázek
Nejtypičtější modul s vysílačem nRF24L01/nRF24L01+

Zatímco průměrný Wi-Fi čip si při aktivní komunikaci a během špiček řekne i o více než 100 mA elektrického proudu , primitivní čip nRF24L01 a jeho lehce vylepšená modifikace nRF24L01+ spálí při odesílání a příjmu dat za ideálních podmínek jen okolo 15 mA

Na rozdíl od mnoha dalších vysílačů pro internet věcí přitom poskytnou přenosovou rychlost až 2 Mb/s, a tak nemusí sloužit pouze k přenosu drobných stavových zpráviček třeba z meteorologických čidel a dalších zbastlených senzorů, ale mohou vysílat i proud dat počínaje už zmíněnými údaji o pohybu počítačové myši a konče zvukem z dětské chůvičky.

Zahlcené 2,4GHz pásmo

Na stranu druhou, nic není zadarmo, a tak si pojďme připomenout ještě několik podstatných ale. Tím prvním je pochopitelně použitá frekvence. Pokud se rádiové čipy od Nordic Semiconductors proslavily (mimo jiné) ve zmíněných bezdrátových klávesnicích a myších, nemají zpravidla za úkol přenášet data na stovky metrů nebo snad skrze několik železobetonových stěn panelového domu, ale spíše na desítky centimetrů až jednotky metrů.

Realita prototypovacích destiček s těmito čipy je někde uprostřed. Pokud narazíte na kvalitní modul s dodatečným čistícím a zesilovacím obvodem a závitem pro připojení externí antény – zpravidla se na e-shopech doplňují zkratkami PA/LNA (Power Amplifier/Low Noise Amplifier), můžete se na volném prostranství a při přímé viditelnosti na ty zmíněné stovky metrů skutečně dostat.

Klepněte pro větší obrázek
Varianty modulů s vysílačem nRF24L01+ a zesilovacím obvodem. Zmiňovaný dosah až 1 100 metrů ale berte s rezervou, jedná se o tradiční báje a pověsti čínských prodejců.

Základní verze s tištěnou anténou přímo na destičce takových parametrů ale rozhodně nedosahuje a poslouží spíše pro přenos dat z nějakého čidla na balkóně, na předzahrádce, v menším bytě či domě a pravděpodobně jen skrze jednu jedinou betonovou nebo cihlovou stěnu.

Na stranu druhou, díky nízké aktivní spotřebě při vysílání a příjmu v řádu jednotek mA a desítek uA v době nečinnosti umožňují běh na baterii. Ostatně, právě proto slouží jako vysílače bezdrátových myší a klávesnic. 

Prototypovací moduly s čipy nRF24L01 a nRF24L01+

Po úvodní teoretické omáčce se konečně pojďme podívat na obvyklé podoby prototypovacích modulů, se kterými se při vývoji svých experimentů setkáte nejčastěji. Zpravidla se jedná o destičku zhruba velikosti poštovní známky – jen o něco užší.

A pokud znáte Wi-Fi čipy od Espressifu, nRF24L01 a nRF24L01+ si velmi snadno spletete s Wi-Fi destičkou formátu ESP-01, který vypadá prakticky identicky. Liší se jen v drobných SMD součástkách a pochopitelně vlastním čipu a pinoutu – rozložení komunikačních a napájecích vývodů.

Klepněte pro větší obrázek
Modul je zpravidla vybavený tištěnou anténou, anebo konektorem pro připojení externí 

Rádiové vysílače z rodiny nRF24 komunikují s řídícím čipem skrze sběrnici SPI, která sama o sobě používá čtyři piny, modul má ale zpravidla vyvedené ještě další dva pomocné. Pokud k tomu přičtete napájení, jsme na osmi vodičích, i když v praxi se jich používá jen sedm.

Mimochodem, když už tu padla řeč na napájení, čip nRF24L01 musíte připojit k 3V (3,3V) zdroji a nikoliv 5V, jak bývá u mnoha prototypovacích stavebnic zvykem, protože byste jej poškodili. Samotné signální vodiče jsou ale s 5V napětím kompatibilní, takže sběrnici SPI už můžete přímo napojit na adekvátní piny 5V desky Arduino Uno a podobných.

Vysílač, který odešle textovou zdravici

Jakmile destičku vysílače propojíme s Arduinem, o vše ostatní se už postará některá z mnoha dostupných knihoven pro stejnojmenné vývojové prostředí. I když jsme si v úvodu řekli, že samotný Nordic Semiconductors už rodinu starých čipu nRF24L01 nepodporuje, o vývoj se postarala komunita, a tak na GitHubu najdete knihovny jak pro přenos zvuku, tak surových dat, což si dnes vyzkoušíme.

Klepněte pro větší obrázek
Budeme potřebovat dvě Arduina a dva vysílače nRF24L01. Jeden bude odesílat textovou zdravici, zatímco druhý ji po příchodu vypíše do počítače.

Z odkazu výše si můžete stáhnout základní knihovnu RF24, jejíž autoři k ní přibalili i hromadu hotových příkladů, na kterých se naučíte veškeré detaily. Ukažme si tedy nejjednodušší možný kód pro vysílač a přijímač. Vysílač bude v nekonečné smyčce každých deset sekund odesílat textovou zprávu Mame radi casopis Computer a přijímač ji bude vypisovat do sériové linky počítače.

Když bychom pak s laptopem, ke kterému bude připojené Arduino Uno s přijímačem, chodili po bytě nebo zahradě, snadno zjistíme, v jaké vzdálenosti nám začne příjem vypadávat a jaký má tedy vysílač dosah.

Nejprve kód vysílače:

#include <SPI.h>
#include <RF24.h>

RF24 radio(9,10);
uint8_t adresa[5] = {0, 1, 2, 3, 4};

void setup() {
  radio.begin();
  radio.setChannel(1);
  radio.setDataRate(RF24_2MBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setRetries(2,15);
  radio.setCRCLength(RF24_CRC_8);
  radio.openWritingPipe(adresa);
  radio.setPayloadSize(32);
}

void loop() {
  radio.powerUp();
  char zprava[] = "Mame radi casopis Computer";
  radio.write(zprava, strlen(zprava));
  radio.powerDown();
  delay(10000);
}

Pojďme si kód postupně projít. V úvodu nejprve odkážeme na vestavěnou knihovnu SPI pro práci se stejnojmennou sběrnicí a knihovnu RF24, kterou jsme stáhli z GitHubu. Poté vytvoříme objekt vysílače, který si pojmenujeme radio. Parametry 9 a 10 označují piny CE a CSN, které můžeme případně změnit. Viz schéma zapojení níže.

Následně vytvoříme pole adresa o velikosti 5 B a vyplníme jej pěti libovolnými znaky nebo číslicemi 0-255. Jak už název pole napovídá, bude se jednat o námi zvolenou adresu vysílacího zařízení. Když bychom tedy měli v domácnosti více přijímačů nRF24, každý z nich si můžeme rozlišit pomocí podobné adresy a přijímače pak budou reagovat výhradně na zprávy, které jsou určené pouze jim.

Klepněte pro větší obrázek
Schéma zapojení modulu vysílače nRF24L01 a destičky Arduino Uno skrze sběrnici SPI

Následuje hlavní funkce Arduina setup, která se zpracuje jako první ihned po připojení napájení. Nejprve v ní nastartujeme samotný vysílač pomocí metody begin. Poté nastavíme komunikační kanál z rozsahu 0-125. V dalším kroku zvolíme rychlost komunikace na 2 Mb/s (RF_2MBPS). Příliš vysoká rychlost může způsobit při slabém signálu neplechu, a tak máme k dispozici ještě 1Mb/s (RF24_1MBPS) a u modelu nRF24L01+ 250 kb/s (RF24_250KBPS).

Právě tato nejpomalejší rychlost je přidanou hodnotou varianty nRF24L01+, která je dnes zdaleka nejrozšířenější i na všech e-shopech. Díky nižší přenosové rychlosti totiž můžeme dosáhnout ještě o něco málo většího dosahu.

Tak, pokračujeme v četbě kódu. Nastavili jsme kanál a komunikační rychlost, ale ještě by se nám hodilo nastavit vysílací/přijímací výkon PA (Power Amplifier). Jak vidno, my jsme použili nejvyšší možné zesílení signálu RF24_PA_MAX. Opět získáme maximální dosah signálu, avšak za cenu vyšší spotřeby. Při menší vzdálenosti mezi vysílačem a přijímačem tedy můžeme zesílení snížit a to pomocí dalších variant RF24_PA_HIGH (-6 dBm), RF24_PA_LOW (-12 dBm) a konečně RF24_PA_MIN (-18 dBm).

Následuje metoda setRetries(0, 15). Tady vysílači říkáme, že pokud se mu zpráva nepodaří odeslat na první pokus, může to zkusit ještě 15×, přičemž mezi pokusy bude čekat 25 ms (0 = 25 ms, 1 = 50 ms, 2 = 75 ms atp.). Funkce setCRCLength nastaví délku kontrolního součtu na 8 bitů. Jen připomenu, že kontrolní součet CRC je speciální číslo, které se odešle společně s naší zprávou přijímači, a matematicky odpovídá zprávě. Když by se tedy část dat při letu poškodila, kontrolní součet už nebude odpovídat a přijímač bude vědět, že je třeba zprávu zahodit a počkat na další.

Tak, už se dostáváme opravdu k závěru konfigurace. Funkce openWritingPipe konečně nastavuje adresu odesílatele. To je oněch pět bajtů z úvodu, které si můžeme libovolně nastavit jako náš unikátní identifikátor. Nakonec ještě nastavíme délku zprávu na fixních 32 bajtů. Pokud bychom odesílali větší data, musíme je rozdělit právě na 32B dílky.

Rádiový vysílač nRF24L01+ je nakonfigurovaný a připravený k odesílání. O to se postaráme v druhé povinné funkci Arduina – smyčce loop, která se opakuje stále dokola. Zavoláním metody powerUp vysílač nejprve probudíme z úsporného režimu a pomocí metody write odešleme textové pole s naší zdravicí. Metoda write má vedle argumentu s názvem pole bajtů k odeslání ještě druhý argument s velikostí tohoto pole. Jelikož se v tomto případě jedná o textový řetězec, jeho délku zjistíme funkcí strlen.

Vysílač odeslal textovou zdravici, takže jej na závěr pomocí metody powerDown uspíme, aby spotřebovával co nejméně energie, počkáme 10 sekund a celé divadlo se zopakuje.

Přijímač zprávu zachytí i přes panelovou stěnu

Kód primitivního vysílače bychom měli a teď se podíváme, jak bude vypadat zdrojový kód přijímače:

#include <SPI.h>
#include <RF24.h>

RF24 radio(9,10);
uint8_t adresa[5] = {0, 1, 2, 3, 4};

void setup() {
  Serial.begin(115200);
  radio.begin();
  radio.setChannel(1);
  radio.setDataRate(RF24_2MBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setCRCLength(RF24_CRC_8);
  radio.openReadingPipe(1, adresa);
  radio.startListening();
}

void loop() {
  while(radio.available()){
    uint8_t delka = radio.getPayloadSize();
    uint8_t data[delka];
    radio.read(&data, sizeof(data));
    Serial.println((char *)data);
  }
}

Jako přijímač poslouží druhé Arduino Uno s modulem nRF24L01+. Jak vidno, většina instrukci v hlavní funkci setup se shoduje. Navíc pouze nastartujeme sériovou linku do počítače, aby se nám v konzoli prostředí Arduina začaly vypisovat příchozí zprávy.

A ještě v jednom se funkce setup liší. V jejím závěru tentokrát namísto vysílací adresy nastavíme přijímací adresu. Tedy zařízení, od kterého má přijímač získávat data, a pokud dostane nějaká cizí, musí jej zahodit.

Metoda openReadingPipe má tentokrát dva parametry. Adresu zařízení doplňuje ještě jeho číselný index, přijímač totiž může získávat data hned od několika příjemců naráz. Kdybychom tedy chtěli povolit další zdroj dat, znovu zavoláme metodu openReadingPipe, ovšem tentokrát s indexem 2 a odlišnou adresou.

Klepněte pro větší obrázek
Arduino v režimu přijímače bude skrze sériovou linku zobrazovat příchozí data do PC 

Na úplný závěr zavoláme metodu startListenning a rádiový čip začne poslouchat. Tady už na řadu opět přichází nekonečná smyčka loop, ve které se tentokrát stále dokola ptáme rádiového čipu, jestli nemá k dispozici nějaká data.

A pokud opravdu dorazila, zeptáme se, jak jsou veliká. Ve vysílači jsme nastavili délku dat na fixních 32 bajtů. Vytvoříme si tedy dostatečně veliké pole bajtů, aby se do něj vešla celá zpráva a pomocí metody read do něj zkopírujeme 32 bajtů z vyrovnávací paměti rádiového čipu.

Poté konečně bajty vypíšeme do sériové linky, přičemž ještě přetypováním na ukazatel datového typu char dáme Arduinu vědět, že se nejedná o surové bajty, ale o znaky ASCII. Pokud bude vysílač i přijímač v dosahu, v sériovém terminálu se začne každých deset sekund vypisovat naše naprogramovaná zdravice, která potěší všechny redaktory časopisu Computer.

Jelikož jsme v kódu nastavili maximální výkon rádiového čipu, data by měla i na destičce jen s tištěnou anténou bez problému překonat přinejmenším jednu železobetonovou stěnu českého paneláku a dorazit z jedné strany bytu na druhou.

RF-Nano, tedy vše v jednom

I když patří stárnoucí 2,4GHz rádiový čip nRF24L01+ díky své nízké ceně a spotřebě k těm nejoblíbenějším ve světě kutilů, počet potřebných kabelů pro jeho spojení s prototypovací deskou může leckoho odradit. Proto se v poslední době objevila na asijských e-shopech zajímavá alternativa, kdy je rádiový čip integrální součástí prototypovací desky Arduino. Na Aliexpressu ji najdete pod označením RF-Nano a cena už klesla pod stokorunu.

Klepněte pro větší obrázek
RF-Nano, tedy Arduino Nano s 2,4GHz vysílačem NRF24l01+

Tato verze má výhradně tištěnou anténu, dosah se tedy bude pohybovat nejvýše v řádu desítek metrů, nicméně získáte kompaktní destičku, která jako podklad používá klon Arduino Nano, jenž podporuje vývojové prostředí Arduino. V jeho manažeru desek tedy stačí zvolit jako cílovou desku Arduino Nano a opět použít knihovnu pro práci s rodinou rádiových čipů nRF24.

Klepněte pro větší obrázek
Cena těchto integrovaných destiček od léta klesla, takže jdou dnes k dispozici za cenu okolo 80 korun. RF-Nano je zajímavá testovací platforma pro začátečníky, která kombinuje klasické 5V Arduino s jednoduchým rádiem.

Nordic není jediný

Čipy nRF24 od Nordic Semiconductors jsou sice populární, ale zdaleka nejsou jediné, které dnes kutilové seženou ve formě prototypovacích modulů vedle Wi-Fi a Bluetooth. Pak je tu totiž ještě velký zástup drobných destiček s čipy, které pracují v subgigahertzovému pásmu 868 MHz a 433 MHz.

Díky nižší frekvenci jejich signál často projde i několika zdmi a i pro ně komunita napsala nepřeberné množství knihoven. K těm nejznámějším patří třeba rádiový čip CC1101 (PDF) od Texas Instruments, Si446x (PDFod Silicon Labs, SX1276 (PDF) s populární a velmi efektivní modulací LoRa od Semtechu nebo SPIRIT1 (PDF) od STMicroelectronics, který si oblíbili i čeští tvůrci stavebnice BigClown.

Klepněte pro větší obrázek
Kutilové mají na výběr hromadu prototypovacích modulů s rádiovými čipy, které běží zpravidla buď na 433 MHz, nebo 868 MHz

Kutilové tedy mají na výběr z celé plejády rádiových přenosů na laciných modulech všech možných parametrů a Wi-Fi, Bluetooth nebo dálkové protokoly NB-IoT a Sigfox skutečně nejsou jediným způsobem, jak bezdrátově přenášet data z jedné krabičky do druhé.

Na stranu druhou, drtivá většina těchto jednodušších vysílačů trpí oproti komplexním komunikačním protokolům v čele s Wi-Fi a Bluetooth absencí jakéhokoliv vestavěného a pokročilého zabezpečení včetně šifrování komunikace. 


Tento článek jsme původně připravili pro časopis Computer, ve kterém každý měsíc navazujeme na náš webový občasník Pojďme programovat elektroniku. 

Diskuze (9) Další článek: Výroba elektrických koloběžek se zjevně vyplatila. Automobilka Seat proto do nabídky přidá i elektrické skútry

Témata článku: Microsoft, C++, USB, Pojďme programovat elektroniku, Internet, Wi-Fi, Programování, Arduino, Bastlení, Bluetooth, GitHub, Myši, BigClown, DIY, Sigfox, PDF, Rádio, Byte, Power Amplifier, Wi-fi a Bluetooth, Texas Instruments, Čip, Modul, Plzeň, Destička

Aktuální číslo časopisu Computer

Megatest: 20 powerbank s USB-C

Test: mobily do 3 500 Kč

Radíme s výběrem routeru

Tipy na nejlepší vánoční dárky