14. diel - Arduino - Komunikácia cez Bluetooth
S Arduino už vieme komunikovať po kábli, ale nebolo by lepšie to vedieť aj bez neho? K tomu použijeme bluetooth modul a budeme komunikovať cez neho.
BT modul bude mať 4 piny - RXD, TXD, VCC, GND (občas 6, ale piny Wakeup a State nebudeme potrebovať). Piny GND a VCC nám sú jasné, len modul používa 3.3V. A kam s piny RXD a TXD? Prvá možnosť je pripojiť je na piny 0 a 1 na Arduino - RXD na TX (1) a TXD na RX (0) - pamätajte na prehodenie RX a TX! Fungovať to bude, ale pri každom nahrávaní programu budeme musieť modul odpojiť. Pokiaľ máte Arduino MEGA, tak to má v sebe ďalšie 3 sériovej linky - Serial1 až Serial3
linka | TX | RX |
Serial1 | 18 | 19 |
SERIAL2 | 16 | 17 |
Serial3 | 14 | 15 |
Serial1.begin(9600); Serial1.println("ahoj");
Čo ale keď máme iné Arduino? V tom prípade nie je problém si sériový
port jednoducho vytvoriť. Importujete knižnicu SoftwareSerial.h
a
vytvoríme si sériovú linku na pinoch 10 a 11.
#include <SoftwareSerial.h> //vytvoreni seriovy linky bt TX, RX SoftwareSerial BT = SoftwareSerial(10,11);
Táto knižnica má však určité obmedzenia.
- Ak vytvoríte sériových liniek viac, je možné používať len jednu v danú chvíľu. Takže ak bude čítať dáta z jedného a medzitým prídu na druhý, tak je buffer nezaznamená a prídete o ne
- Na Arduino MEGA možno použiť iba 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 Arduino Leonardo možno použiť iba piny 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (Mosi).
Teraz máme sériovú linku, na ktorú môžeme modul pripojiť. Pamätajte, že sa pripája TX <-> RX. Modul máme s GND na GND, VCC na 3.3V, RXD na 10, TXD na 11. Teraz si skúsime posielať cez BT nejaký 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); }
Teraz keď vysielame, určite budeme chcieť dáta tiež niekde čítať. Najprv vyskúšame komunikáciu s Windows.
Windows
V nastavení otvoríme Zariadenia a tlačiarne. Navrchu zvolíme pridať zariadení a za predpokladu zapnutého Bluetooth v počítači by sa tu malo objaviť zariadenie HC-06. Zvolíme ho a dáme párovať, ak bude chcieť kód, zadáme 1234 alebo 0000. Keď bude párovanie dokončené, v zariadení a tlačiarne zvolíme vlastnosti a v karte služby povolíme Sériový port. V správcovi zariadenia by sa potom mal objaviť.
Teraz budeme potrebovať SW, s ktorým sa na port možno pripojiť. Arduino IDE síce v sebe má serial monitor, ale museli by sme prepínať port. Jednou z možností je použitie iného programu, napríklad PuTTY
Linux
Tu sa to bude pravdepodobne líšiť podľa distribúcie. Ja som
nainštaloval balík blueman
, ktorý obsahuje správca bluetooth
spustiteľný príkazom blueman-manager
. Po otvorení zvolíte
vyhľadať zariadenie, akonáhle sa objaví HC-06 kliknete pravym a párovať.
Potom na neho opäť kliknete pravym a uvidíte ako prvú možnosť
Pripojiť k Dev B s ikonkou kábla k RS232. Po kliknutí sa vám
zobrazí správa, kam bol port pripojený.
U mňa skončil na /dev/rfcomm0
. Mohli by sme tiež použiť
putty, ale ja použil screen a príkazom
screen /dev/frcomm0
som sa pripojil na port.
Mobilné zariadenia
Komunikovať s BT modulom možno iz mobilu. Pre Android používam aplikáciu BlueTerm, na Windows Phone je napríklad BlueSPP
Naozajstná komunikácia cez BT
Ale k čomu nám je posielať "Ahoj" stále dokola? Skúsime teda komunikovať obojstranne. Čo treba ovládať LEDky cez BT? Program sa nám znateľne zmení - Budeme kontrolovať, či sú na porte nejaké dáta, a ak sú, tak je prečítame, spracujeme, a potom LEDky prepneme, alebo vynadajú užívateľovi aby sa naučil písať.
#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 čo sa tu vlastne deje?
if(BT.available()) {
Ak sú na porte dáta ...
String vstup = ""; while(BT.available()) { char input = BT.read(); vstup += String(input); }
Pripravíme si premennú pre vstupné dáta. A kým bude čo čítať, tak to prečítame znak po znaku a ten pridáme do stringu.
vstup.toLowerCase(); vstup.replace("\n","");
Najskôr prevedieme všetko na malé znaky, aby nezáležalo na veľkosti. Niektoré programy odoslanie na port zakončí novým riadkom, takže ho tu zmaž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 tu už len zistíme, čo je vo vstupe, podľa toho rozsvietime / zhasne / vynadajú užívateľmi.
Teraz program nahrajte, spustite Putty / screen / BlueTerm a zapnite LEDky. Nefunguje, že? Tieto aplikácie počítajú s tým, že na druhom konci beží nejaký terminál. Takže ak nám Arduino pošle dáta, softvér si myslí, že terminál chce niečo zobraziť a zobrazí to. Pokiaľ ale začneme písať, tak nedochádza ku písanie ako takému, ale klávesy sú posielané na druhý koniec aby ich terminál spracoval (písmená napíše, u šípky prechádza histórii atď a to zobrazuje). Arduino však nie je terminál a nič také sa teda nestane.
Potrebujeme SW, ktorý bude na sériový port odosielať dáta. Vie to napríklad serialmonitor v Arduino IDE, ale ak sa vám nechce prepínať porty určite môžete zagooglit a niečo nájsť. Ďalšia možnosť je stiahnuť si pod článkom stiahnuť jednoduchý programík (asi 18 kB). Napísal som to narýchlo keď som potreboval takto používať dva porty (čo Arduino IDE neumožňuje), ale pre naše účely bohato postačí. Po spustení len vyberte port a skúste, ako program funguje.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 1403x (6.45 kB)