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í.

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ů.

Bluetooth modul - Arduino - Hardware

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 TXDpř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 - Serial1Serial3:

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í:

Arduino - Hardware

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á:

Arduino - Hardware

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:

Arduino - Hardware

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:

Arduino - Hardware

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 1394x (6.45 kB)
Aplikace je včetně zdrojových kódů

 

Předchozí článek
Arduino - Měření teploty infračerveným teploměrem MLX90614
Všechny články v sekci
Arduino - Hardware
Přeskočit článek
(nedoporučujeme)
Arduino - Práce s SD kartou
Článek pro vás napsal Adam Ježek
Avatar
Uživatelské hodnocení:
19 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