Programování Bluetooth modulů HC-05 (1)

Bluetooth moduly HC-05 jsou od výrobce nastaveny tak, že je lze „nějak“ předdefinovaně použít, nicméně pokud potřebujeme změnit třeba přenosovou rychlost nebo jen navázat spojení mezi dvěma moduly, neobejdeme se bez nastavení („naprogramování“) pomocí AT povelů. Jak na to? Není to složité, ale trochu pracné, a také náročné na pozornost a pečlivost.

V první řadě si musíme uvědomit, že moduly HC-05 mají napájení 5 V, ale vstupní i výstupní úrovně 3,3 V. Mají (nejméně) dva režimy funkce. V prvním „programovacím“ režimu přijímají AT povely a odpovídají na ně, komunikuje se přes sériový terminál, bezdrátově se nic nevysílá ani nepřijímá. V druhém „provozním“ režimu dělají moduly to, k čemu jsou určeny, přijímají a vysílají data přes Bluetooth v pásmu 2,4 GHz.

HC-05  může vystupovat jak jako podřízený tak jako nadřízený a programování může probíhat různými rychlostmi komunikace. Klíčový je vývod modulu označený někdy jako KEY, někdy jako Wake Up. Je-li na tomto vývodu L (nebo je nezapojený), je modul v provozním režimu (to jestli je nadřízený nebo podřízený se určuje jinak). Do programovacího režimu se modul dostane, když na vývod KEY přivedeme úroveň H (tj. cca 2 – 3 V). Dál se možnosti dělí. Když je úroveň H na KEY už v okamžiku zapojení napájení, nastaví se programovací režim s pevně danou přenosovou rychlostí 38400 Bd. Druhá možnost je, že zapojíme napájení a okamžik počkáme, modul signalizuje připravenost k párování (prostě nějak rozsvítí/rozbliká LED). Teprve potom přivedeme úroveň H na KEY a tím nastavíme programovací režim, ale s komunikační rychlostí podle toho, jaká je aktuální nastavená komunikační rychlost pro přenos dat (typicky třeba 9600 Bd).

K nastavení modulů budeme používat počítač PC a nějaký sériový terminál, zde si budeme postup ukazovat na terminálu Hercules. Je to freewarový program a jeho instalační soubor lze stáhnout z této adresy. V programu zvolíme záložku pro sériový port, nastavíme číslo (COM) portu, komunikační rychlost, přenos 8 bitů, bez parity a handshake.

term2

Teminál Hercules pro COM port

Bluetooth moduly nemůžeme připojit přímo k sériovému výstupu z počítače, protože na něm jsou signály s úrovní přibližně ±10 V, tím by se modul téměř jistě zničil. Stejný signál by měly dávat i různé převodníky USB/COM (USB/RS232). Existují USB převodníky, které mají na výstupech jen úrovně TTL (0 – 5 V), ani tyto převodníky bychom neměli bez dalšího oddělení používat, pravděpodobně hned nezničí blutooth modul, ale nemají správné úrovně. Jediným převodníkem, který by mělo jít použít tak, jak se prodává, je převodník USB/COM s úrovněmi 0 – 3,3 V, takový ale není úplně běžný.

Budeme vycházet z toho, že máme obvyklý převodník na standardní signály rozhraní RS232 (±10 V) nebo přímo COM port na počítači. Vyrobíme si přípravek podle následujícího schématu, ten má na straně modulu potřebné úrovně <3,3 V.

pripravek2

Přípravek pro programování Bluetooth modulů

Zapojíme sériovou linku, přípravek i bluetooth modul HC-05. V terminálu v PC nastavíme port a rychlost 38400 Bd a otevřeme port. V dolní části okna jsou tři řádky pro připravená odesílaná data. Do jednoho si připravíme text „AT“ (bez uvozovek) jako text (nezaškrtnuté políčky HEX), do jiného data „0D0A“ jako HEX (zaškrtnuté políčko), to není nic jiného než znaky CR a LF pro odřádkování a ukončení povelu, což modul HC-05 vyžaduje.

Teď zapojíme napájení modulu. Nastaví se programovací režim a pevná přenosová rychlost. V terminálu by se zatím mělo vypsat hlášení o otevření portu, nic víc. Stiskneme tlačítko SEND pro povel AT, vypíše se, ale ještě se nic neděje. Stiskneme tlačítko SEND pro odřádkování, nyní by se měl kurzor posunout na začátek nového řádku a vypsat „OK“. Toto OK je potvrzení od modulu, že přijal kontrolní povel AT. Tento povel nic nedělá, jen potvrdí přijetí, slouží právě pro ověření komunikace. Nyní je modul připraven k vyčítání hodnot nastavení a programování.

Nebudeme zde procházet všechny možné povely AT, soustředíme se jen na ty, které se nejvíce hodí:

AT

bez parametru, nic nemění, odpoví hlášením OK. Používá se k ověření funkčnosti spojení.

AT+VERSION?

vrátí verzi programového vybavení modulu, např. +VERSION:2.0-20100601

AT+ORGL

odpoví OK, nastaví modul do výchozího stavu

AT+ADDR?

vrátí platnou adresu modulu, například +ADDR:14:1:338fc (pozor, nevýznamové nuly v jednotlivých částech zápisu se zde nevypisují, takže tento zápis znamená adresu 00:14:01:03:38:fc v zápisu, jak ho obvykle vidíme třeba v počítači nebo mobilu)

AT+NAME?

vrátí jméno modulu, například +NAME:HC-05

AT+NAME=<Param>

zadáváme jako parametr nové jméno modulu, pod kterým je vidět při spojení. Odpověď je OK. Ke změně jména nedochází hned, platí až po vypnutí napájení a delší prodlevě na vybití kondenzátorů na modulu.

 AT+PSWD?

vrátí kontrolní heslo, které je potřebné pro spojení, například +PSWD:1234 je standardní heslo od výrobce (1234).

AT+PSWD=<Param>

zadáváme jako parametr nové heslo modulu, odpověď je OK. Změna platí hned.

AT+ UART?

vrací nastavenou přenosovou rychlost, počet stop bitů (hodnota 0 znamená 1 stop bit, hodnota 1 znamená 2 stop bity) a paritu (hodnota 0 znamená bez parity, hodnota 1 znamená lichou paritu, hodnota 2 sudou paritu). Příklad: +UART:9600,0,0 znamená 9600 Bd, 1 stop bit, bez parity.

AT+UART=<Param>,<Param2>,<Param3>

nastavuje parametry komunikace, první je rychlost (4800, 9600, 19200, 38400, 57600, 115200, 23400, 460800, 921600, 1382400), druhý počet stopbitů (0, 1 stejně jako u předchozího příkazu) a paritu (0, 1, 2 stejně jako u předchozího příkazu). Příklad AT+UART=38400,0,0 . POZOR – toto je rychlost standardní datové komunikace, netýká se programovacího režimu tak jak jsme jej vyvolali, ten má pevně nastavenou rychlost 38400 Bd.

AT+ROLE?

vrátí režim 0 = Slave (podřízený), 1 = Master (nadřízený), 2 = Slave-Loop (podřízený)

AT+ROLE=<Param>

nastavuje režim pro spojení, parametry jsou stejné jako v předchozím příkazu

AT+CMODE?

vrátí režim pro párování 0 = spárování jen se zařízením s předem udanou adresou (platí pouze pro master, na funkci slave nemá vliv), 1 – spárování s jakýmkoli blízkým zařízením bez ohledu na adresu, 2 – pro režim Slave-Lopp

AT+CMODE=<Param>

nastaví režim pro párování s parametry stejně jako v předchozím příkazu

AT+BIND=<Param>

nastaví adresu zařízení, s nímž smí být modul spárován. Pozor na formát adresy, pro adresu 00:14:01:03:38:FD se bude zadávat jako AT+BIND=0014,01,0338FD . Platí v součinnosti s CMODE pro master.

AT+INIT

inicializace SPP záznamů


Příklady použití krok za krokem

Vycházíme ze stavu, v jakém jsou moduly po zakoupení. Pokud již s modulem byly dělány pokusy a není jasné, jak je nastavený, nebo pokud chcete mít jistotu, že je vše v přesně definovaném stavu, postupujeme takto:

  • připojíme signál KEY (WAKE UP) na úroveň H (sepneme spínač na přípravku)
  • připojíme napájení, nastavíme v terminálu příslušný port, rychlost 38400 Bd, 8 bitů, bez parity
  • všechny následující AT příkazy ukončujeme znaky CR a LF (0D0A v HEX kódu)
  • ověříme příkazem AT spojení, odpověď by měla být OK
  • příkazem AT+ORGL nastavíme modul do výchozího stavu, odpověď by měla být OK
  • ve všech případech je samozřejmé, že máme správné napájení modulu (5 V) a že signály jsou v úrovních 3,3 V !
1/ HC-05 jako podřízený modul ovládaný z mobilu
  • jako příklad k modulu HC-05 připojíme sériový LCD displej s pevně nastavenou rychlostí komunikace 9600 Bd. Komunikace je jednosměrná, při použití propojíme TxD na modulu a RxD na displeji. Při programování Bluetooth modulu postupujeme podle následujících bodů
  • připojíme signál KEY (WAKE UP) na úroveň H (sepneme spínač)
  • připojíme napájení, nastavíme v terminálu příslušný port, rychlost 38400 Bd, 8 bitů, bez parity
  • příkazem AT+ROLE=0 nastavíme podřízený režim (není nutné, už by měl být)
  • příkazem AT+UART=9600,0,0 nastavíme 9600 Bd, 1 stop bit, bez parity
  • příkazem AT+NAME=LCD_DISP nastavíme nové jméno (není nutné, ale doporučuji, aby se při párování s mobilem názorně zařízení identifikovalo)
  • příkazem AT+PSWD=9713 nastavíme nové heslo 9713 (není nutné, ale doporučuji kvůli bezpečnosti respektive omezení možnosti neoprávněného připojení)
  • odpojíme napájení, počkáme na vybití kondenzátorů, modul připojíme k displeji
  • zapneme napájení, modul bliká a čeká na spárování
  • v mobilu zapneme sériový terminál (nebo oobládací program, který budeme používat), necháme vyhledat bluetooth zařízení, mělo by se mezi nimi objevit jedno se jménem LCD_DISP, zvolíme ho
  • budeme vyzváni ke vložení hesla, vložíme ho
  • modul se spároval, bliká dvojbliky, zadávaná data z klávesnice mobilu ze zobrazují na LCD modulu podle nastavené tabulky znaků a příslušných řídících povelů

term3

2/ Spojení dvou modulů HC-05 (data do displeje posíláme z PC)
  • chceme na stejný displej posílat data z našeho PC prostřednictvím spojení dvou modulů HC-05, párování má být co nejjednodušší (s jakýmkoli vhodným modulem v blízkosti). I když se zdá, že komunikace je jednosměrná, je stále obousměrná, jen jeden ze směrů nyní nepoužíváme. Tento případ je naprosto stejný jako by bylo třeba i ovládání robota, vysílání telemetrických dat nebo programování Arduina na dálku bez spojení kabelem s PC.
  • modul pro LCD displej připravíme přesně podle předchozího příkladu (použijeme již připravený a vyzkoušený komunikací s mobilem)
  • druhý modul HC-05 připojíme do přípravku, zapojíme signál KEY (WAKE UP) na úroveň H (sepneme spínač)
  • připojíme napájení, nastavíme v terminálu Hercules příslušný port , rychlost 38400 Bd, 8 bitů, bez parity (už asi je z předchozího programování)
  • příkazem AT+ROLE=1 nastavíme nadřízený režim
  • příkazem AT+UART=38400,0,0 nastavíme 38400 Bd, 1 stop bit, bez parity – tato rychlost se týká spojení mezi PC a vysílacím modulem, nesouvisí s rychlostí komunikace mezi přijímacím modulem a LCD ani s rychlostí komunikace při tomto programování. Zařízení, které data vysílá, nemá možnost kontroly, jestli je zařízení na druhé straně stíhá odebírat. Mimo jiné i z tohoto důvodu lze doporučit, aby komunikace obou modulů bluetooth byla nastavená na stejnou přenosovou rychlost, nicméně nutné to není.
  • příkazem AT+CMODE=1 nastavíme možnost párování s jakýmkoli blízkým (nejbližším) podřízeným bluetooth zařízením
  • příkazem AT+INIT připravíme párování
  • odpojíme napájení, vypneme vypínač (vývod KEY či WAKE UP na L)
  • zapneme napájení, po chvilce se na obou modulech rozblikají LED diody dvojblikem, spojení je navázáno a můžeme přenášet data
  • tento způsob má podstatnou nevýhodu, může dojít nejen ke spárování předpokládané dvojice modulů, ale i s jiným zařízením jak na straně nadřízené, tak na straně podřízené

term5

3/ Spojení konkrétních modulů HC-05 – 1. způsob
  • chceme na displej posílat data z našeho PC prostřednictvím spojení dvou modulů HC-05 stejně jako v předchozím případě, ale tak, aby se nadřízený modul mohl spárovat jen s jedním konkrétním podřízeným modulem (tím u displeje). První způsob je založen na tom, že poprvé spárujeme moduly předchozím způsobem (vezme se nejbližší modul s nejsilnějším signálem a tento proces kontrolujeme) a provedenou volbu následně uzamkneme, takže příště se může spárovat už jen stejný modul.
  • podřízený modul nastavíme stejně jako v prvním příkladu (použijeme již prověřený)
  • nadřízený modul nastavíme stejně jako ve druhém příkladu (použijeme již prověřený, pokud můžeme zaručit, že mezitím neměl možnost se spárovat s jiným bluetooth modulem)
  • nadřízený modul připojíme k přípravku, nastavíme programovací režim a zapneme napájení
  • příkazem AT+CMODE=0 povolíme spárování jen se zařízením se známou udanou adresou (v tabulce už je touto dobou zapsán druhý modul u displeje z předchozího spojení)
  • odpojíme napájení, vypneme spínač (provozní režim), zapneme napájení, moduly by se měly rychle spárovat a můžeme přenášet data. S jiným podřízeným modulem už se náš nadřízený nespáruje.
4/ Spojení konkrétních modulů HC-05 – 2. způsob
  • stále stejný cíl, ale tentokrát do nadřízeného modulu ručně zadáme přesnou adresu podřízeného modulu, s nímž se smí spárovat (stačí nám znalost adresy, nemusí se programovat dvakrát)
  • podřízený modul nastavíme stejně jako v prvním příkladu (použijeme již prověřený), navíc si ale příkazem AT+ADDR? zjistíme jeho adresu. V našem případě odpověď byla +ADDR:14:1:33905 tedy adresa 00:14:01:03:39:05 v zápise, jak ho dávají mobilní telefony.
  • nadřízený modul připojíme do přípravku, zapneme spínač (programovací režim), připojíme napájení, nastavíme v terminálu Hercules příslušný port, rychlost 38400 Bd, 8 bitů, bez parity (už asi je z předchozího programování)
  • příkazem AT+ROLE=1 nastavíme nadřízený režim
  • příkazem AT+UART=38400,0,0 nastavíme 38400 Bd, 1 stop bit, bez parity – tato rychlost se týká spojení mezi PC a vysílacím modulem, nesouvisí s rychlostí komunikace mezi přijímacím modulem a LCD ani s rychlostí komunikace při probíhajícím programování. Je to jen usnadnění, abychom v terminálu nemuseli při přechodu z programovacího do provozního režimu a zpět měnit přenosovou rychlost.
  • příkazem AT+CMODE=0 nastavíme možnost párování jen se zařízením, které je již známé a v tabulce (v tomto okamžiku ale ještě žádné známé není).
  • příkazem AT+BIND=14,01,033905 nastavíme předem zjištěnou adresu podřízeného modulu (tím jsme tuto adresu zapsali povelem do tabulky podobně jako to v předchodím příkladu udělalo úspěšné spárování s nejbližším podřízeným modulem)
  • odpojíme napájení, vypneme vypínač (provozní režim)
  • zapneme napájení, po chvilce se na obou modulech rozblikají LED diody dvojblikem. Spojení je navázáno a můžeme přenášet data, s jiným podřízeným module se ale nadřízený nespáruje.

term6

5/ Spojení pomocí více modulů HC-05 s retranslací
  • máme stále stejný cíl, přenos dat z počítače na sériový LCD displej, ale tentokrát potřebujeme (třeba kvůli prodloužení dosahu, vykrytí plochy místnosti, nebo překonání překážky, jakou může být například panelová budova nebo i silné stropy sklepních prostor), aby signál prošel jednou retranslací. To znamená, že data odchází z PC sériovým kabelem, jsou vyslána prvním modulem HC-05 s označením 1A, jeho signál přijme modul označený jako 1B a po krátkém kabelu ho předá třetímu modulu 2A, ten signál vyšle a konečně jej přijme modul 2B, který jej předá přímo displeji. Moduly 1B a 2A spolu tvoří retranslační jednotku (stanici, bod). Na konci si vysvětlíme, proč má smysl uvádět tento složitější (i když reálný) případ.
retrans

Propojení modulů HC-05 s retranslací

To podstatné je nastavení jednotlivých modulů. Máme zde situaci, kdy se musí vždy spárovat moduly 1A a 1B jako jedna dvojice a jako druhá dvojice 2A a 2B. Jako nadřízené stanovíme moduly 1A a 2A (to není podmínkou, mohlo by to být i jinak) a těm musíme „vysvětlit“, že se smí spárovat výhradně jen s jedním pevně daným podřízeným modulem. Budeme uvádět už jen zkrácené příkazy nastavení s komentářem, vše „zbytečné“ jako čitelné pojmenování modulů zde není uvedeno.

Modul 1A (jeho adresa je 14:01:033905)

AT+ORGL                uvedení do výchozího stavu
AT+UART=38400,0,0      38400 Bd (musí být stejné s PC)
AT+ROLE=1              nadřízený modul
AT+CMODE=0             párovat jen určený modul
AT+BIND=14,01,033906   adresa modulu 1B ke spárování

Modul 1B (jeho adresa je 14:01:033906)

AT+ORGL                uvedení do výchozího stavu
AT+UART=38400,0,0      38400 Bd (musí být stejné s modulem 2A)
AT+ROLE=0              podřízený modul

Modul 2A (jeho adresa je 14:01:0339FC)

AT+ORGL                uvedení do výchozího stavu
AT+UART=38400,0,0      38400 Bd (musí být stejné s modulem 1B)
AT+ROLE=1              nadřízený modul
AT+CMODE=0             párovat jen určený modul
AT+BIND=14,01,0339AD   adresa modulu 2B ke spárování

Modul 2B (jeho adresa je 14:01:0339AD)

AT+ORGL                uvedení do výchozího stavu
AT+UART=9600,0,0       9600 Bd (musí být stejné s displejem)
AT+ROLE=0              podřízený modul

Všimneme si toho, že retranslační zařízení je tvořeno pouze dvěma moduly HC-05 bez jakéhokoli mikrokontroléru, je potřeba jen jedno napájecí napětí +5 V. Smysl tohoto příkladu je v tom, že v okamžiku zapnutí máme dva nadřízené a dva podřízené moduly a ty se musí spárovat vždy přesně daným způsobem, toho se dosáhne pevně zadanými adresami. Funguje to? Funguje, jen je při přenosu znát malé zpoždění, které signál po cestě nabere. Teoreticky je možné takto retranslací předávat signál i vícekrát.


Moduly HC-05 toho umí mnohem víc, můžeme využívat vstupy a výstupy přímo na nich, můžeme zjišťovat, které moduly jsou v dosahu pro připojení, měřit inzitu signálu od nich, signál pro programovací režim může ovládat mikrokontrolér a pak lze například střídat několik podřízených zařízení nebo chvíli vystupovat jako podřízený, chvíli jako nadřízený. Možností je mnoho, další podrobnosti najdete třeba v tomto materiálu FOR4FP2HKZAVRT6 .