Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 50% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy

Lekce 14 - Arduino - Komunikace přes Bluetooth

S Arduinem již umíme komunikovat po kabelu, ale nebylo by lepší to umět i bez něj? K tomu použijeme bluetooth modul a budeme komunikovat přes něj.

Bluetooth modul

BT modul bude mít 4 piny - RXD, TXD, VCC, GND (občas 6, ale piny WakeUp a State nebudeme potřebovat). Piny GND a VCC nám jsou jasné, jen modul používá 3.3V. A kam s piny RXD a TXD? První možnost je připojit je na piny 0 a 1 na Arduinu - RXD na TX(1) a TXD na RX(0) - pamatujte na prohození RX a TX! Fungovat to bude, ale při každém nahrávání programu budeme muset modul odpojit. Pokud máte Arduino MEGA, tak to má v sobě další 3 sériové linky - Serial1 až Serial3

Linka TX RX
Serial1 18 19
Serial2 16 17
Serial3 14 15

Používají se stejně jako klasický Serial na pinech 0 a 1:

Serial1.begin(9600);
Serial1.println("ahoj");

Co ale když máme jiné Arduino? V tom případě není problém si sériový port prostě vytvořit. Naimportujeme knihovnu SoftwareSerial.h a vytvoříme si sériovou linku na pinech 10 a 11.

#include <SoftwareSerial.h>
//vytvoreni seriovy linky bt      TX, RX
SoftwareSerial BT = SoftwareSerial(10,11);

Tato knihovna má ovšem určitá omezení.

  • Pokud vytvoříte sériových linek více, lze používat jen jednu v danou chvíli. Takže pokud bude číst data z jednoho a mezitím přijdou na druhý, tak je buffer nezaznamená a přijdete o ně
  • Na Arduinu MEGA lze použít pouze piny 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69)
  • Na Arduinu Leonardo lze použít pouze piny 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

Nyní máme sériovou linku, na kterou můžeme modul připojit. Pamatujte, že se připojuje TX <-> RX. Modul máme s GND na GND, VCC na 3.3V, RXD na 10, TXD na 11. Nyní si zkusíme posílat přes BT nějaký text.

#include <SoftwareSerial.h>

SoftwareSerial BT = SoftwareSerial(10,11);
void setup() {
 BT.begin(9600); //vsiměte si, že kromě vlastního názvu se používá stejně,
                 //jako by to byla klasická linka
}

void loop() {
  BT.println("Ahoj");
  delay(500);

}

Teď když vysíláme, určitě budeme chtít data také někde číst. Prvně vyzkoušíme komunikaci s Windows.

Windows

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

V nastavení otevřeme Zařízení a tiskárny. Nahoře zvolíme přidat zařízení a za předpokladu zapnutého Bluetooth v počítači by se zde mělo objevit zařízení HC-06. Zvolíme jej a dáme párovat, pokud bude chtít kód, zadáme 1234 nebo 0000. Až bude párování dokončeno, v zařízení a tiskárny zvolíme vlastnosti a v kartě služby povolíme Sériový port. Ve správci zařízení by se poté měl objevit.

Nyní budeme potřebovat SW, se kterým se na port lze připojit. Arduino IDE sice v sobě má serial monitor, ale museli bychom přepínat port. Jednou z možností je použití jiného programu, například PuTTY

Linux

Zde se to bude nejspíše lišit podle distribuce. Já jsem nainstaloval balíček blueman, který obsahuje správce bluetooth spustitelný příkazem blueman-manager. Po otevření zvolíte vyhledat zařízení, jakmile se objeví HC-06 kliknete pravym a párovat. Potom na něj opět kliknete pravym a uvidíte jako první možnost Připojit k Dev B s ikonkou kabelu k RS232. Po kliknutí se vám zobrazí zpráva, kam byl port připojen.

U mě skončil na /dev/rfcomm0. Mohli bychom také použít putty, ale já použil screen a příkazem

screen /dev/frcomm0

jsem se připojil na port.

Mobilní zařízení

Komunikovat s BT modulem lze i z mobilu. Pro Android používám aplikaci BlueTerm, na Windows Phone je například BlueSPP

Opravdová komunikace přes BT

Ale k čemu nám je posílat "Ahoj" stále dokola? Zkusíme tedy komunikovat oboustranně. Co třeba ovládat LEDku přes BT? Program se nám znatelně změní - Budeme kontrolovat, zda jsou na portu nějaká data, a pokud jsou, tak je přečteme, zpracujeme, a poté LEDku přepneme, nebo vynadáme uživateli aby se naučil psát.

#include <SoftwareSerial.h>

SoftwareSerial BT = SoftwareSerial(50,51);

void setup() {
  BT.begin(9600);
  pinMode(13, OUTPUT);
  }

void loop() {
  if(BT.available()) {
    String vstup = "";
    while(BT.available()) {
      char input = BT.read();
      vstup += String(input);
      }
    vstup.toLowerCase();
    vstup.replace("\n","");

    if(vstup == "zapni") {
      digitalWrite(13, HIGH);
      BT.println("On");
      }
    else if(vstup == "vypni") {
      digitalWrite(13, LOW);
      BT.println("Off");
      }
    else {
      BT.println("Neni validni prikaz. Napis \"zapni\" pro zapnuti nebo \"vypni\" pro vypnuti ");
      }

    vstup = "";
    }

  }

Takže co se tady vlastně děje?

if(BT.available()) {

Pokud jsou na portu data...

String vstup = "";
while(BT.available()) {
   char input = BT.read();
   vstup += String(input);
}

Připravíme si proměnnou pro vstupní data. A dokud bude co číst, tak to přečteme znak po znaku a ten přidáme do stringu.

vstup.toLowerCase();
vstup.replace("\n","");

Nejdřív převedeme vše na malé znaky, aby nezáleželo na velikosti. Některé programy odeslání na port zakončí novým řádkem, takže ho tu smažeme.

if(vstup == "zapni") {
      digitalWrite(13, HIGH);
      BT.println("On");
      }
    else if(vstup == "vypni") {
      digitalWrite(13, LOW);
      BT.println("Off");
      }
    else {
      BT.println("Neni validni prikaz. Napis \"zapni\" pro zapnuti nebo \"vypni\" pro vypnuti ");
      }

A tady už jenom zjistíme, co je ve vstupu, podle toho rozsvítíme/zhas­ne/vynadáme uživateli.

Teď program nahrajte, spusťte Putty/screen/Blu­eTerm a zapněte LEDku. Nefunguje, že? Tyto aplikace počítají s tím, že na druhém konci běží nějaký terminál. Takže pokud nám Arduino pošle data, software si myslí, že terminál chce něco zobrazit a zobrazí to. Pokud ale začneme psát, tak nedochází ke psaní jako takovému, ale klávesy jsou posílány na druhý konec aby je terminál zpracoval (písmena napíše, u šipky prochází historii atd a to zobrazuje). Arduino ovšem není terminál a nic takového se tedy nestane.

Potřebujeme SW, který bude na sériový port odesílat data. Umí to například serialmonitor v Arduino IDE, ale pokud se vám nechce přepínat portm určitě můžete zagooglit a něco najít. Další možnost je stáhnout si pod článkem stáhnout jednoduchý prográmek (asi 18 kB). Napsal jsem to narychlo když jsem potřeboval takto používat dva porty (což Arduino IDE neumožňuje), ale pro naše účely bohatě postačí. Po spuštění jen vyberte port a zkuste, jak program funguje.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 1053x (16.5 kB)

 

Předchozí článek
Arduino a SD karta
Všechny články v sekci
Arduino
Článek pro vás napsal Adam Ježek
Avatar
Jak se ti líbí článek?
9 hlasů
Autor se převážně věnuje Arduinu a psaní tutoriálů z této oblasti, občas napíše příležitostně nějakou tu zprávičku. Většinu svého volného času momentálně věnuje Linuxu a/nebo Raspberry Pi. Také umí C#, HTML, CSS, PHP a Python.
Aktivity (1)

 

 

Komentáře

Avatar
Petr Mutina
Člen
Avatar
Petr Mutina:22.9.2015 1:15

Tento Bluetooth modul nedoporučuji kupovat! A to jak verzi HC-05, tak i verzi HC-06. Důvodem je to, že čip slyší na sadu AT příkazů, pomocí kterých můžete měnit jméno, heslo, přenosovou rychlost a podobně. Každopádně by měl, ale nedělá to. Po několika hodinách (asi 5) zkoušení a Googlování jsem to vzdal. A nejsem jediný, komu se to nepovedlo. Pokud tedy chcete něco na pokusy, je to ideální věc - já sám jsem s tím udělal projekt pro SOČ. A jinak - za ten program získáváš zlatého bludišťáka! :D

 
Odpovědět
22.9.2015 1:15
Avatar
Ondřej Hoos
Člen
Avatar
Odpovídá na Petr Mutina
Ondřej Hoos:22.9.2015 9:04

Musíš dát PIO11 na +3.3V a modul sylší na AT příkazy, zrovna včera jsem si s tim hrál ;)

 
Odpovědět
22.9.2015 9:04
Avatar
Petr Mutina
Člen
Avatar
Odpovídá na Ondřej Hoos
Petr Mutina:22.9.2015 15:26

A opravdu ti to fungovalo? Protože i to jsem zkoušel, dokonce jsem musel odstranit tu fólii a PIO11 připájet ručně. Taky je možné, že všechny 3 moduly, které jsem měl k dispozici, byly vadné. :)

 
Odpovědět
22.9.2015 15:26
Avatar
Ondřej Hoos
Člen
Avatar
Odpovídá na Petr Mutina
Ondřej Hoos:22.9.2015 18:57

Zkoušel jsem to na dvou kusech, změnil sem jak název tak PIN. Možné je samozřejmě vše, přec jen e-bay. Možná nějakej pitomej firmware, ale pořád by tam přec jen měla bejt možnost změny názvu a pinu :/

 
Odpovědět
22.9.2015 18:57
Avatar
Ondřej Hoos
Člen
Avatar
Odpovídá na Petr Mutina
Ondřej Hoos:22.9.2015 18:59

Mám moduly s touto redukcí http://www.ebay.com/…400562862516?… tedy bez osazeného tlačítka, to jsem dopájel sám a vše ok.

 
Odpovědět
22.9.2015 18:59
Avatar
Michal Žůrek - misaz:22.9.2015 19:35

ta fólie na tom modulu má nějaký význam nebo je tam jen protož e na DPS už se nevlezlo logo výrobce?

 
Odpovědět
22.9.2015 19:35
Avatar
Petr Mutina
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
Petr Mutina:22.9.2015 21:58

Řekl bych, že to (fólie) nějaký zvláštní význam nemá. Podle mě to tam je jen proto, aby ty dvě destičky držely pohromadě (pár malých kapiček cínu by to nemusely udržet). :D

 
Odpovědět
22.9.2015 21:58
Avatar
ostrozan
Redaktor
Avatar
ostrozan:27.9.2015 17:52

Tyto moduly používám a žádné problémy jsem nikdy neměl - a bužírka (folie) má ryze praktický význam - nahrazuje vlastně krabičku -nehrozí že při experimentech na našich stolech - dobře víme jak to tam vypadá
:-) modul zničíme nějakým zkratem, či vyšším napětím z jiné holé desky

 
Odpovědět
27.9.2015 17:52
Avatar
Jakub Čillík:2.10.2015 19:48

Bude to fungovať aj na samostatnom čipe či už ATmega328 alebo ATmega8?

 
Odpovědět
2.10.2015 19:48
Avatar
Odpovídá na Jakub Čillík
Michal Žůrek - misaz:2.10.2015 19:51

Jaké Arduino používá ATMega8? Ale každopádně by to mělo fungovat, ono to je jen o té sériové lince.

 
Odpovědět
2.10.2015 19:51
Avatar
Adam Ježek
Redaktor
Avatar
Odpovídá na Jakub Čillík
Adam Ježek:2.10.2015 19:51

Ano, teoreticky by melo.

Odpovědět
2.10.2015 19:51
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Jakub Čillík:2.10.2015 21:46

Ďakujem, no myslel som to tak že niektoré (hlavne MEGA) mikrokontroléry sa dajú programovať aj cez Arduino a tak som myslel že či by to išlo aj na samostatnom mikrokontroléry. Len sa bojím že nebudú fungovať tie RX a TX piny...

No ďakujem tak či tak

 
Odpovědět
2.10.2015 21:46
Avatar
Adam Ježek
Redaktor
Avatar
Odpovídá na Jakub Čillík
Adam Ježek:2.10.2015 22:05

Teď sem z toho komentáře dostal dojem, že hodláš ten čip programovat přes to bluetooth. A ten zbytek mě zmát. Můžeš prosimtě trochu přesnějc popsat o co se pokoušíš

Odpovědět
2.10.2015 22:05
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Jakub Čillík:3.10.2015 11:47

No :-) , v sérii týchto návodov je aj článok o chipe, ktorý je srdcom Arduino Uno (ATmega328) a ja mám doma aj Arduino Uno aj Mega ale aj chip ATmega8 ktorý sa podobá 328 :-) a chcel by som pomocou iba toho chipu (bez celej dosky Arduina) napojiť tento bluetooth modul. Už som to skúšal ale základné piny RX a TX na samostatnom chipe nefungujú tak ako by mali. Musím použiť tú knižnicu "SoftwareSerial".

 
Odpovědět
3.10.2015 11:47
Avatar
Adam Ježek
Redaktor
Avatar
Odpovídá na Jakub Čillík
Adam Ježek:3.10.2015 12:08

Mělo by to fungovat bez problémů. A čip potřebuje mít připojený krystal, pokud není nahrán firmware používající interní.

Odpovědět
3.10.2015 12:08
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Jakub Čillík:3.10.2015 12:50

Akurát som to vyskúšal a nejde to no nevadí, nejako sa s tým ešte pohrám

ďakujem za pomoc

 
Odpovědět
3.10.2015 12:50
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Jakub Čillík
ostrozan:3.10.2015 14:38

Atmega 8 a 328 se možná podobají (fyzicky) asi budou i pinově kompatibilní ale jsem si jistý, že třeba USART registry mají na jiných adresách a stejné to bude u většiny registrů porty nevyjímaje - porovnej Register Summary v datasheetech obou typů - 328ka je upravená 32ka do menšího pouzdra - 8k paměti u atmega 8 přece jenom není nic moc (proti 32k u 328ky) a proto ti program hex. vygenerovaný pro Atmega328 nikdy nebude fungovat v Atmega8

jinak chipy v arduinu se programují přes USART a přes bootloader, který si musíš někde sehnat a nahrát do "čistého" čipu
a nebo mít ISP programátor (mrkni na PonyProg) přes SPI nahrát hex. soubor vygenerovaný IDE arduina

 
Odpovědět
3.10.2015 14:38
Avatar
Jakub Čillík:3.10.2015 22:28

Ano ISP mám, pomocou toho programujem cez Arduino IDE ATmega8 a mám doma aj 32 dvojku ale nemyslel som si že 8 a 328 sa až tak budú líšiť.

 
Odpovědět
3.10.2015 22:28
Avatar
Robert Grüner:30.10.2016 17:26

Ahoj, zkoušel jsem uvedený kód pro komunikaci , ale nefungovalo mi to správně , musel jsem zaměnit řádek "vstup += String(input);" na "vstup = vstup + String(input);"

 
Odpovědět
30.10.2016 17:26
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Robert Grüner
ostrozan:30.10.2016 18:28

Tomu nevěřím, tos musel dělat nějakou jinou chybu -

vstup += String(input); a vstup = vstup + String(input);

je to samé

 
Odpovědět
30.10.2016 18:28
Avatar
Odpovídá na ostrozan
Robert Grüner:30.10.2016 18:56

já to vím, ale přesto mi to četlo pouze první 3 znaky a v druhém sledu zbytek. Teď jsem to zkoušel znova se stejným výsledkem.

 
Odpovědět
30.10.2016 18:56
Avatar
koty10cz
Člen
Avatar
koty10cz:29.5.2017 21:42

Ahoj, mám takový problém a už opravdu nevím, jak dál. Vše mám propojené podle návodu (zkoušel jsem to přes SoftwareSerial i přes piny 0,1), mám nový notebook s win 10, nainstaloval jsem i ovladače pro seriovou komunikaci. Mám modul HC-05, dioda normálně bliká, ale když otevřu serial monitor a mám to vše udělaný podle návodu přes SoftwareSerial, tak se nic nevypisuje (mám v kódu pouze println("ahoj"); ). Když jsem to zkusil přes piny 0,1 a pak jsem odpojil usb (použil jsem místo notebooku powerbanku), tak to místo ahoj vypisovalo pouze bílé čtverečky. Celý den procházím různá fóra i v angličtině, ale prostě jsem tenhle problém nenašel. Předem moc díky za pomoc.

 
Odpovědět
29.5.2017 21:42
Avatar
Adam Ježek
Redaktor
Avatar
Odpovídá na koty10cz
Adam Ježek:29.5.2017 21:47

Zkus na BT modulu spojit Tx a Rx, aby to co se na model pošle se poslalo zpátky. Pokud začneš do serial monitoru něco psát a nic se nevrátí je chyba v BT

Odpovědět
29.5.2017 21:47
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
koty10cz
Člen
Avatar
Odpovídá na Adam Ježek
koty10cz:29.5.2017 22:06

Děkuju za rychlou odpověď. Zkusil jsem to zapojit tak, jak jsem to vyfotil. No a kód mám takovýhle:

#include <SoftwareSerial.h>

SoftwareSerial moje = SoftwareSerial(2,3);

void setup() {
moje.begin(9600);
delay(500);
}

void loop() {

delay(1000);

}

Zkoušel jsem do toho loopu psát třeba i moje.println(mo­je.read()); ale to taky nic nedělalo, když jsem psal potom do serial monitoru. Když tam takhle nic nemám (jen delay), tak to je to samý.. pořád nic.. a když tam dám zase moje.println("a­aa"); tak to píše bílý čtverečky.

 
Odpovědět
29.5.2017 22:06
Avatar
Adam Ježek
Redaktor
Avatar
Odpovídá na koty10cz
Adam Ježek:29.5.2017 22:11

Rx a Tx nech propojené, ale odpoj je od Arduina, k modulu nech připojené jen napájení. Tím modul odešle vše co přijal. Pak Otevři serial monitor a něco pošli. uvidíš co se stane.

Odpovědět
29.5.2017 22:11
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
koty10cz
Člen
Avatar
Odpovídá na Adam Ježek
koty10cz:29.5.2017 22:14

Jo takhle.. no tak to v pohodě funguje.. vrací to, co napíšu.

 
Odpovědět
29.5.2017 22:14
Avatar
Adam Ježek
Redaktor
Avatar
Odpovídá na koty10cz
Adam Ježek:29.5.2017 22:19

Takže chyba je někde mezi Arduinem a modulem. Zkontroluj vedení, případně zkus jiný vodiče. Taky se ujisti, že máš všude nastavený stejný baudrate. A nebo jentak zkus prohodit TX a RX. Samozřejmě ten bílý drát odpoj.

Odpovědět
29.5.2017 22:19
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
koty10cz
Člen
Avatar
Odpovídá na Adam Ježek
koty10cz:29.5.2017 22:33

Tak jsem to celý propojil jinejma vodičema i bez použití toho nepájivého pole a je to teď tak, že když to mám správně (RX na TX a TX na RX), tak to nevypisuje nic.. a když to prohodím (TX na TX...) tak to zase vypisuje ty bílý čtverečky.. už tomu fakt nerozumím.. baudrate mám všude, kde jsem ho našel 9600 (v kódu, ve správci zařízení u toho bluetooth, v serial monitoru)

 
Odpovědět
29.5.2017 22:33
Avatar
koty10cz
Člen
Avatar
Odpovídá na koty10cz
koty10cz:29.5.2017 22:58

Zkouším si tady ještě hrát s tím baudrate a zjistil jsem, že když to mám připojený Tx na Tx aby mi to aspoň něco vypisovalo, tak když měním baudrate, tak to pak vypisuje i jiný znaky než ty čtverečky (třeba když jsem dal 19200, tak to vypisuje viz obrázek) mám tudíž trochu podezření, že v tom hraje roli to baudrate.. ale nevím co s tím.. dá se někde třeba zjistit, jestli náhodou ten modul není nastavený na jiný než 9600?

 
Odpovědět
29.5.2017 22:58
Avatar
koty10cz
Člen
Avatar
Odpovídá na koty10cz
koty10cz:29.5.2017 23:04

Tak to vypadá, že je po problému :-) musel jsem zkoušet různý baudrate až nakonec 38400 bylo to správný. Nevím teda, jak je možný, že to není 9600 jak udává výrobce, ale to už je vedlejší.. každopádně díky moc za pomoc a že jsi mě navedl na správnou cestu :-)

 
Odpovědět
29.5.2017 23:04
Avatar
Adam Ježek
Redaktor
Avatar
Odpovídá na koty10cz
Adam Ježek:29.5.2017 23:17

Tyhle moduly se naj většinou nastavit. Najdi si model tvého modulu + AT commands

Odpovědět
29.5.2017 23:17
Počkej chvíli, poradím se s křišťálovou koulí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 31 zpráv z 31.