IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Bluetooth modul - Arduino

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
Používajú sa rovnako ako klasický Serial na pinoch 0 a 1:
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ť.

Arduino

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

Arduino

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.

Arduino

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.

Arduino

 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1394x (6.45 kB)

 

Predchádzajúci článok
Arduino a SD karta
Všetky články v sekcii
Arduino
Preskočiť článok
(neodporúčame)
Arduino a I2C zbernice
Článok pre vás napísal Adam Ježek
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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