Lekce 17 - Arduino - Komunikace přes Bluetooth
V minulé lekci, Arduino - Měření teploty infračerveným teploměrem MLX90614 , jsem vytvořili projekt s infračerveným teploměrem MLX90614 a vysvětlili jsme si, na jakém principu funguje.
V tomto tutoriálu Arduina se zaměříme na bezdrátovou komunikaci. Konkrétně se naučíme pracovat s technologií Bluetooth. Vysvětlíme si, jak navázat komunikaci pomocí Bluetooth ve Windows, Linuxu i Androidu. V tutoriálu použijeme tento bluetooth modul. Princip je ale totožný, takže jej lze aplikovat i na jiné typy BT modulů.

BT modul a Arduino
BT modul má čtyři piny - RXD
, TXD
,
VCC
, GND
(může jich být i šest, ale piny
WakeUp
a State
nebudeme potřebovat). Piny
GND
a VCC
nám jsou jasné, jen si musíme pamatovat,
že modul používá 3,3 V. Piny RXD
a TXD
připojíme
na piny 0
a 1
na Arduinu - RXD
na
TX(1)
a TXD
na RX(0)
. Dáme si pozor na
nutné prohození RX
a TX
. Je však třeba mít na
paměti, že při každém nahrávání programu budeme muset modul odpojit.
Arduino MEGA má v sobě další tři 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");
Pokud máme jiné Arduino než MEGA, musíme si sériový port sami
vytvořit. Naimportujeme knihovnu SoftwareSerial.h
a vytvoříme si
sériovou linku na pinech 10
a 11
:
#include <SoftwareSerial.h> SoftwareSerial BT = SoftwareSerial(10,11); //vytvoření sériové linky bt TX, RX
Tato knihovna má ovšem určitá omezení:
- pokud vytvoříme sériových linek více, lze používat v danou chvíli vždy jen jednu. Pokud tedy budeme číst data z jedné linky a během toho přijdou jiná data na druhou linku, tak o ně přijdeme,
- 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í tedy už máme sériovou linku, na kterou můžeme modul připojit.
Opět zopakujme, ž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); //kromě vlastního názvu se používá stejně, //jako by to byla klasická linka } void loop() { BT.println("Ahoj"); delay(500); }
Vyslaná data určitě budeme chtít také někde číst. Prvně si vyzkoušíme komunikaci s Windows.
BT komunikace ve Windows
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 po nás systém 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í se poté port
objeví:

Nyní budeme potřebovat software, se kterým se na port lze připojit. Arduino IDE sice v sobě má serial monitor, ale pokud bychom jej chtěli použít, museli bychom přepínat port. Jednou z pohodlnějších možností je použití jiného programu, například open source PuTTY. Program stačí spustit, konfigurace je jednoduchá:

BT komunikace v Linuxu
V Linuxu je možné, že se situace bude lišit podle distribuce. Pro
distribuce na Debianu použijeme balíček blueman
, který
obsahuje správce bluetooth. Správce se spouští příkazem
blueman-manager
. Po otevření vyhledáme zařízení a spárujeme
ho. Potom na něj klikneme pravým tlačítkem myši a uvidíme jako první
možnost Připojit k Dev B s ikonkou kabelu k RS232. Po kliknutí se
zobrazí zpráva, kam byl port připojen (v našem případě na
/dev/rfcomm0
). K připojení na port použijeme příkaz
screen
:
screen /dev/rfcomm0
Takto potom vypadá výstup:

BT komunikace s mobilním zařízením
Komunikaci s BT lze realizovat i pomocí mobilního zařízení (telefonu i tabletu). Pro Android uživatele je dobrá například aplikace BlueTerm.
Ovládání zařízení přes BT
Posílat "Ahoj" stále dokola je sice fajn, ale oboustranná komunikace by byla lepší. Pojďme to tedy zkusit. Zkusíme si přes BT ovládat LEDku. V programu budeme kontrolovat, zda jsou na portu nějaká data. Pokud ano, přečteme je a zpracujeme. Poté přepneme LEDku nebo upozorníme našeho uživatele:
#include <SoftwareSerial.h> SoftwareSerial BT = SoftwareSerial(50,51); void setup() { BT.begin(9600); pinMode(13, OUTPUT); } void loop() { if(BT.available()) // Pokud jsou na portu data... { String vstup = ""; // Připravíme si proměnnou pro vstupní data. while(BT.available()) // Dokud bude co číst, { char input = BT.read(); // tak to přečteme znak po znaku vstup += String(input); // a každý přečtený znak přidáme do proměnné. } vstup.toLowerCase(); // Vše převedeme vše na malé znaky. vstup.replace("\n",""); // Některé programy odeslání na port zakončí novým řádkem, takže ho tu smažeme. if(vstup == "zapni") // Zjistíme co je ve vstupu, podle toho rozsvítíme, { digitalWrite(13, HIGH); BT.println("On"); } else if(vstup == "vypni") // zhasneme, { digitalWrite(13, LOW); BT.println("Off"); } else // nebo upozorníme uživatele. { BT.println("Neni validni prikaz. Napis \"zapni\" pro zapnuti nebo \"vypni\" pro vypnuti "); } vstup = ""; // Na konec si vyprázdníme proměnnou pro další cyklus. } }
Když teď program nahrajeme, spustíme Putty, screen nebo BlueTerm a zapneme LEDku, nebude to fungovat. Tyto aplikace počítají s tím, že na druhém konci běží nějaký terminál. Takže pokud Arduino pošle data, software si myslí, že terminál chce něco zobrazit a zobrazí to. Pokud ale začneme psát třeba na počítači, nedochází ke psaní jako takovému. Ve skutečnosti jsou stištěné klávesy posílány z počítače nebo mobilu do Arduina s tím, že Arduino si je zpracuje. Arduino ovšem není terminál a nic takového se tedy nestane.
Potřebujeme tedy nějaký software, který bude na sériový port odesílat data pro Arduino srozumitelná. Umí to například seriový monitor v Arduino IDE. Ten ale vyžaduje ručně přepínat port. Pohodlnější možností je stáhnout si jednoduchý program pod článkem (pro Windows, velikost je cca 18 kB). Po spuštění jen vybereme konkrétní port a uvidíme, že náš program funguje:

V příští lekci, { NEXT}, se naučíme pracovat s SD kartou.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 1409x (6.45 kB)
Aplikace je včetně zdrojových kódů