Ovládání pomocí Bluetooth – pro Arduino

Spojení přes Bluetooth v pásmu 2,4 GHz sice nemá velký dosah, ale v rámci místnosti většinou stačí, je poměrně spolehlivé, a od doby, kdy se stalo součástí téměř všech mobilních telefonů, je vždy po ruce. Jak to udělat, abychom byli schopni přes Bluetooth ovládat jednoduchá i složitější zařízení?

Jako vysílač povelů nám poslouží telefon, tablet, počítač vybavený Bluetooth (BT) nebo PC s levným USB adaptérem. Na druhé straně budeme potřebovat BT modul se sériovým výstupem a nějaký dekodér, který dokáže přicházející kódované povely převést na logický signál, následně přes silové obvody na zapnutí či vypnutí příslušných zařízení.

V první řadě si musíme uvědomit, že spojení je vždy obousměrné a je obvyklé, že přijetí dat je ověřeno jejich odesláním zpět. Nelze jednoduše říci, že jedna strana je vysílačem a druhá přijímačem jako je to obvyklé například při IR ovládání, obě strany vysílají i přijímají. Pro naše účely budeme jako vysílač označovat tu stranu, ze které přicházejí povely, jako přijímač stranu u ovládaného zařízení.

Spojení je typu master / slave mezi dvěma zařízeními, master navazuje spojení a v našem případě je to vždy vysílač (mobil, tablet, ..). Na druhé straně nám postačuje použít BT modul, který vždy zastává podřízenou funkci a nic jiného neumí, jako příklad si vezmeme rozšířený modul HC-06. Pokud bychom chtěli navázat spojení mezi dvěma zařízeními vlastní konstrukce, museli bychom použít nejméně jeden modul, který dovoluje provoz jak v nadřízeném, tak podřízeném režimu, například HC-05, jehoobsluha je ale trochu jiná.

IMGP9591b

Bluetooth modul HC-05

Strana vysílače

V PC se při instalaci modul většinou hlásí jako standardní sériový (COM) port. Předpokládejme, že BT modul na straně přijímače je zapnutý, stačí napájení, aby byl aktivní. Na straně masteru (PC) necháme vyhledat všechna dostupná BT zařízení, mělo by se mezi nimi objevit jedno s textovým označením HC-06. Pokud se ukazuje jeho adresa (12-ti místné číslo, někdy se zobrazuje a zadává po dvoučíslích oddělené dvojtečkami), opíšeme si ji, některé programy vyžadují toto číslo zadat ručně, jiné se spokojí s potvrzením názvu zařízení. Pokusíme se navázat spojení. Poprvé budeme vyzváni, abychom zadali heslo (PIN), bývá to čtyřmístné číslo, které musíme zjistit z dokumentace k BT modulu přijímače. Jestliže jsme heslo po zakoupení modulu nezměnili, je u HC-06 od výrobce nastaveno na hodnotu 1234. Pak už by měl modul trvalým svitem LED indikovat navázané spojení. V případě PC se toto dělá na úrovni systému (zařízení a tiskárny) a tady také zjistíme i číslo COM portu, které bylo zařízení přiděleno. Pod Androidem to je až součástí programu, který si vybereme ke komunikaci, většinou stačí jen klepnout na slovní označení dostupného BT zařízení.

blueset

Instalace BT modulu do PC

Potřebujeme nainstalovat nějaký program, pomocí něhož budeme povely zadávat a případně přijímat zpět odesílané informace. Nejuniverzálnější a současně nejméně pohodlné na ovládání jsou textové terminály, například Hercules setup utility (Windows XP a novější). Tento program umí komunikovat přes více rozhraní, pro nás bude podstatné spojení přes sériové porty. Musíme vybrat ten, který jsme zjistili v nastavení. Další zadání parametrů (rychlost komunikace) bývá zbytečné. Jakmile dostaneme potvrzení o otevření portu, měl by i BT modul (možná s malým zpožděním) signalizovat navázané spojení.

bluepc

Univerzální terminál Hercules

Každý napsaný znak je okamžitě odeslán, jestliže podržíme klávesu, je automaticky opakován. Toho můžeme i využít například při zvyšování nebo snižování hodnoty nějakého parametru, nicméně když potřebuje nějaké zařízení jen zapnout nebo vypnout, je vhodné přiřadit dva různé povely (jeden pro zapnutí, druhý pro vypnutí), ne prvním použitím povelu zapínat a druhým použitím stejného povelu vypínat. Spojení s BT modulem se ukončí uzavřením sériového kanálu.

V případě mobilu a tabletu je nutné nejprve povolit použití BT. Pro zařízení s Androidem je vhodným univerzálním terminálem například SENA BTerm. Po instalaci v menu Bluetooth Management zadáme adresu BT modulu přijímače nebo necháme vyhledat všechna dostupná zařízení, pak vybereme HC-06 a potvrdíme. Při prvním použití opět musíme zadat PIN. Příště, až se bude navazovat spojení, stačí už jen zvolit poslední připojené zařízení nebo vybrat ze seznamu, heslo už nebude třeba. Spojení se ukončí vypnutím programu přes volbu Exit. Ještě je dobré nastavit v terminálu, aby přechod na nový řádek (tlačítko Enter) generoval jak při odesílání dat tak při zobrazování přijímaných dat ASCII znaky (řídící kódy) CR i LF ($0D i $0A) a zapnout automatické scrollování pracovní plochy, jinak by byly výpisy nepřehledné.

IMGP9582b

Bluetooth terminál SENA BTerm na displeji telefonu

Příkladem jednoduchého specializovaného programu pro Android, který zobrazí na displeji tlačítka a při jejich použití vyšle příslušné kódy přes BT, je Robot Control (Wise Owl Apps, LLC) volně dostupný na https://play.google.com/store. Program je původně určený pro ovládání malých robotů, takže má tlačítka pro pohyby vpřed, vzad, vpravo, vlevo, obrat vpravo, obrat vlevo, stop a tři tlačítka f1 až f3. Robot Control vyžaduje ruční zadání adresy a generované kódy jsou pevně dané, to je nevýhoda, protože přizpůsobit se musí ovládané zařízení. Tento program se osvědčil zejména na starších verzích Androidu, na nových je v některých případech nestabilní. Přehled kódů je v PDF dokumentaci, kterou lze stáhnout na stejném místě jako program.

robot_control

Program Robot Control pro starší telefony

Druhým programem pro Android, který se osvědčil, je Robot Bluetooth Control od českého autora Ondřeje Peliše. Volba je snadná výběrem ze seznamu známých nebo vyhledaných zařízení. Program mimo jiné nabízí čtyři kurzorová tlačítka směru, jedno červené pro vypínání a devět funkčních tlačítek, která si uživatel může v nastavení sám pojmenovat. Výhodou je, že všechny kódy vysílané po stisku tlačítek se dají nastavit. Kromě tlačítek najdeme na displeji i zónu, do níž se vypisují přijaté zprávy, a to buď ve formě čísel (HEX), nebo textově s možností změny kódování znaků. Program tedy v sobě kombinuje pohodlnější zadávání povelů tlačítky a možnost zpětného hlášení od přístroje v textové formě.

rbt

Program Robot Bluetooth Control na tabletu

Modul HC-06 a jeho nastavení

Modul HC-06 respektive HC-06-D (se stabilizátorem 3,2 V na větší desce) má čtyři popsané vývody vyvedené na kolíkové kontakty (RxD, TxD, GND a VCC) na jedné straně, na druhé je anténa vytvořená meandrem na DPS. Napájecí napětí modulu může být v rozmezí 3,3 až 5 V a je pro obvody stabilizováno na desce, vstupní napětí vyšší než 7 V modul zničí. Úroveň vstupního i výstupního signálu je 3,2 V, při spolupráci s mikrokontrolérem napájeným napětím 5 V je třeba úrovně přizpůsobit. Výstupní signál jde brát jak z vývodu TxD, tak z vývodu RxD, což nahrává komunikaci s modulem po jediném vodiči, pokud by to bylo třeba.

IMGP0272b

Vývody BT modulu HC-06

LED na modulu signalizuje stav. Pokud bliká, není navázáno spojení a modul lze přes vývody TxD / RxD programovat příkazy AT. Jestliže LED svítí, je navázáno spojení a vše ze vstupu se považuje za přenášená data. Výchozí nastavená rychlost sériového přenosu je 9600 Bd (bez parity, 8 bit, 1 stopbit). V přehledu je výčet akceptovaných povelů a odezva na RxD.

Povel (na TxD) Odezva (na RxD) Význam
AT OK kontrola funkce
AT+BAUD1 OK1200 nastavení přenosové rychlosti 1200 Bd
AT+BAUD2 OK2400 nastavení přenosové rychlosti 2400 Bd
AT+BAUD3 OK4800 nastavení přenosové rychlosti 4800 Bd
AT+BAUD4 OK9600 nastavení přenosové rychlosti 9600 Bd
AT+BAUD5 OK19200 nastavení přenosové rychlosti 19200 Bd
AT+BAUD6 OK38400 nastavení přenosové rychlosti 38400 Bd
AT+BAUD7 OK57600 nastavení přenosové rychlosti 57600 Bd
AT+BAUD8 OK115200 nastavení přenosové rychlosti 115200 Bd
AT+NAMExxxx OKxxxx nastaví jméno modulu na xxxx (tovární HC-06)
AT+PINxxxx OKsetpin nastaví PIN na xxxx (tovární 1234) *
AT+PN Přenos bez parity (od verze firmware 1.5)
AT+PO Přenos s lichou paritou (od verze firmware 1.5)
AT+PE Přenos se sudou paritou (od verze firmware 1.5)

* nový PIN platí až po vypnutí a prodlevě cca 30 s na vybití

Mikrokontrolér může opakovat nastavení modulu třeba vždy po zapnutí, ale není to nutné, jednou vložené parametry zůstávají platné až do další změny povelem. Problém může být v tom, že při nastavené různé přenosové rychlosti v mikrokontroléru a v modulu se žádné srozumitelné povely nepřenesou. Dojde-li k situaci, kdy není jasné, jaká rychlost přenosu je v modulu zadaná, odešlete do modulu s určitými prodlevami (řekněme 1 s) potřebný povel změny rychlosti komunikace postupně ve všech možných rychlostech. Ty špatné se nepřečtou, při té správné se modul nastaví. Je to poněkud brutální způsob, ale nic nepoškodí a funguje.

Zapínáme jednu LED na dálku

Asi nejjednodušším možným příkladem je požadavek na zapnutí / vypnutí jednoho okruhu, který bude v našem případě reprezentovat LED. Výstup je možné samozřejmě libovolně posílit, opticky nebo pomocí relé oddělit a spínat libovolnou zátěž včetně síťových spotřebičů, tím se ale už nebudeme detailně zabývat.

Využijeme Arduino Mini PRO, které je z našeho hlediska prakticky totožné s Arduinem UNO. V tomto případě nebudeme ani muset zahrnou do obvodu LED, využijeme LED na desce spojené s D13. Výstup modulu v úrovních 3,2 V se vstupem Arduina bez problémů přečte a pull-up na vývodu RxD v Arduinu jj mnohem slabší, než pull-up BT modulu, a „nepřetáhne“ úroveň z pásma 3,2 V. Jediný vývod RxD Arduina je využíván jak při programování mikrokontroléru, tak pro čtení dat modulu, obě činnosti ale nemůže dělat současně, takže při programování je třeba BT modul odpojit.

Můžeme vyzkoušet i ovládání pomocí programu SENA BTerm, je to sice méně pohodlné a musíme si pamatovat, co který kód znamená, ale tlačítka p a q jsou „shodou okolností“ na protilehlých okrajích virtuální klávesnice a hledají se dobře, stisk jiných tlačítek nemá žádný účinek.

prvni pokus B

Zapojení řízení jedné LED s Arduinem Mini PRO


// Ovladani LED pres BT modul HC-06 - Arduino
int znak;                                             // promenna povelu
void setup() {
  Serial.begin (9600);                                // komunikace 9600 Bd
  pinMode(13,OUTPUT);                                 // interni LED
}

void loop() {
  if (Serial.available() > 0) {znak = Serial.read();} // nacteni povelu
  if (znak == 112) {digitalWrite(13,HIGH);}           // zapnuti ... p
  if (znak == 113) {digitalWrite(13,LOW);}            // vypnuti ... q
}
IMGP0297b

Ovládání LED na Arduinu pomocí BT

Tři LED se zpětným potvrzením

Komunikace mezi BT vysílačem (telefonem) a BT modulem HC-06 je vždy obousměrná, ale z komunikace mezi HC-06 a mikrokontrolérem jsme zatím využívali jen jeden směr, to nyní změníme. Rozšíříme ovládání na tři LED a současně necháme mikrokontrolér, aby provedení přijatého povelu potvrdil zpětným textovým hlášením. Příklad takového ověření při ovládání z terminálu SENA BTerm je na dalším obrázku.

IMGP9588b

Zpětné hlášení v programu SENA BTerm

Opět budeme k ovládání používat program Robot Bluetooth Control, upravíme popisy tlačítek F1, F4 a F7 na on1, on2 a on3 a popisy tlačítek F3, F6 a F9 na off1, off2 a off3, české popisy se zkratkami zap a vyp se bohužel nevejdou. Příslušné kódy pro zapínání jednotlivých LED budou 201, 203 a 205 a pro vypínání 202, 204 a 206 (vše dekadicky), později se ukáže, že ovládací kódy by neměly odpovídat znakům, které bude mikrokontrolér předávat v potvrzení. V programu vypneme automatické opakování povelu při delším stisku, vedlo by to k mnoha zpětným hlášením. V tomto případě se již budeme muset zabývat přizpůsobením úrovní signálů.

IMGP0279b

Zpětná hlášení v Robot Bluetooth Control

Pro Arduino zůstává polarita pulzů sériové komunikace standardní, signál TxD modulu s RxD Arduina propojíme jako v předchozím případě jednosměrné komunikace. Ačkoli na internetu v mnoha případech autoři uvádějí, že přizpůsobení úrovní není nutné a vývody RxD modulu a TxD Arduina se spojují přímo nebo přes odporový dělič pro snížení úrovně, tato možnost v daném případě nefungovala a bylo nutné spínat RxD proti zemi samostatným tranzistorem. LED budou na vývodech D2, D3 a D4. Právě v tomto případě je podstatné, aby se použité povely a znaky vysílané v potvrzení nepřekrývaly. Opět v průběhu programování Arduina nesmí být BT modul připojen.

druhy pokus B

Schema řízení tří LED přes BT a Arduino

IMGP0286b

Zapojení se třemi LED na kontaktním poli

// Ovladani 3 LED pres BT modul HC-06 se zpetnym potvrzenim
int znak;                                              // promenna povelu
void setup() {
  Serial.begin (9600);                                 // komunikace 9600 Bd
  pinMode(2,OUTPUT);                                   // vystup LED1
  pinMode(3,OUTPUT);                                   // vystup LED2
  pinMode(4,OUTPUT);                                   // vystup LED3
}
 
void loop() {
  if (Serial.available() > 0) {znak = Serial.read();}  // nacteni povelu
    switch (znak){                                     // rozhodovani
      case 201: digitalWrite(2,HIGH);                  // rozsvitit 1. LED
        Serial.println(" LED-1 zapnuta"); break;       // poslat potvrzeni
      case 202: digitalWrite(2,LOW) ;                  // zhasnout 1. LED
        Serial.println(" LED-1 vypnuta"); break;       // poslat potvrzeni
      case 203: digitalWrite(3,HIGH);                  // rozsvitit 2. LED
        Serial.println(" LED-2 zapnuta"); break;       // poslat potvrzeni
      case 204: digitalWrite(3,LOW) ;                  // zhasnout 2. LED
        Serial.println(" LED-2 vypnuta"); break;       // poslat potvrzeni
      case 205: digitalWrite(4,HIGH);                  // rozsvitit 3. LED
        Serial.println(" LED-3 zapnuta"); break;       // poslat potvrzeni
      case 206: digitalWrite(4,LOW) ;                  // zhasnout 3. LED
        Serial.println(" LED-3 vypnuta"); break;       // poslat potvrzeni
    }
    znak = 0;
}

Snažil jsem se ukázat, že ovládání pomocí Bluetooth není nijak složité ani drahé, uvažovaný modul HC-06 lze koupit už za cenu kolem 120 Kč včetně poštovného z Číny a vysílač většina z nás již beztak nosí v kapse. Dostatečná přenosová rychlost až 115 kBd dovoluje například i konstrukci bezdrátově připojených textových a jednoduchých grafických terminálů nebo přenos zvuku. Jediným skutečným omezením, které musíme brát v úvahu, je relativně malý dosah přibližně 10 m, v místnostech s mnoha kovovými předměty nebo vlhkem a vodou někdy i jen 5 m.