14. díl - Arduino - Komunikace přes Bluetooth

Hardware PC Arduino 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

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ženo 246x (16.5 kB)

 

  Aktivity (1)

Článek pro vás napsal Adam Ježek
Avatar
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.

Jak se ti líbí článek?
Celkem (7 hlasů) :
4.857144.857144.857144.857144.85714


 


Miniatura
Předchozí článek
Arduino a SD karta
Miniatura
Všechny články v sekci
Arduino
Miniatura
Následující článek
Arduino a I2C sběrnice

 

 

Komentáře
Zobrazit starší komentáře (11)

Avatar
Jakub Čillík:

Ď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
Tým ITnetwork
Avatar
Odpovídá na Jakub Čillík
Adam Ježek:

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  +1 2.10.2015 22:05
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Jakub Čillík:

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
Tým ITnetwork
Avatar
Odpovídá na Jakub Čillík
Adam Ježek:

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  +1 3.10.2015 12:08
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Jakub Čillík:

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
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Jakub Čillík
ostrozan:

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  +1 3.10.2015 14:38
Avatar
Jakub Čillík:

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:

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. října 17:26
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Robert Grüner
ostrozan:

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. října 18:28
Avatar
Odpovídá na ostrozan
Robert Grüner:

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. října 18:56
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 10 zpráv z 21. Zobrazit vše