Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

Hardware PC Arduino Arduino - Komunikace přes Bluetooth

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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 357x (16.5 kB)

 

 

Článek pro vás napsal Adam Ježek
Avatar
Jak se ti líbí článek?
9 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.
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
Aktivity (1)

 

 

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

Avatar
koty10cz
Člen
Avatar
koty10cz:29. května 21:42

Ahoj, mám takový problém a už opravdu nevím, jak dál. Vše mám propojené podle návodu (zkoušel jsem to přes SoftwareSerial i přes piny 0,1), mám nový notebook s win 10, nainstaloval jsem i ovladače pro seriovou komunikaci. Mám modul HC-05, dioda normálně bliká, ale když otevřu serial monitor a mám to vše udělaný podle návodu přes SoftwareSerial, tak se nic nevypisuje (mám v kódu pouze println("ahoj"); ). Když jsem to zkusil přes piny 0,1 a pak jsem odpojil usb (použil jsem místo notebooku powerbanku), tak to místo ahoj vypisovalo pouze bílé čtverečky. Celý den procházím různá fóra i v angličtině, ale prostě jsem tenhle problém nenašel. Předem moc díky za pomoc.

 
Odpovědět 29. května 21:42
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na koty10cz
Adam Ježek:29. května 21:47

Zkus na BT modulu spojit Tx a Rx, aby to co se na model pošle se poslalo zpátky. Pokud začneš do serial monitoru něco psát a nic se nevrátí je chyba v BT

Odpovědět 29. května 21:47
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
koty10cz
Člen
Avatar
Odpovídá na Adam Ježek
koty10cz:29. května 22:06

Děkuju za rychlou odpověď. Zkusil jsem to zapojit tak, jak jsem to vyfotil. No a kód mám takovýhle:

#include <SoftwareSerial.h>

SoftwareSerial moje = SoftwareSerial(2,3);

void setup() {
moje.begin(9600);
delay(500);
}

void loop() {

delay(1000);

}

Zkoušel jsem do toho loopu psát třeba i moje.println(mo­je.read()); ale to taky nic nedělalo, když jsem psal potom do serial monitoru. Když tam takhle nic nemám (jen delay), tak to je to samý.. pořád nic.. a když tam dám zase moje.println("a­aa"); tak to píše bílý čtverečky.

 
Odpovědět 29. května 22:06
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na koty10cz
Adam Ježek:29. května 22:11

Rx a Tx nech propojené, ale odpoj je od Arduina, k modulu nech připojené jen napájení. Tím modul odešle vše co přijal. Pak Otevři serial monitor a něco pošli. uvidíš co se stane.

Odpovědět 29. května 22:11
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
koty10cz
Člen
Avatar
Odpovídá na Adam Ježek
koty10cz:29. května 22:14

Jo takhle.. no tak to v pohodě funguje.. vrací to, co napíšu.

 
Odpovědět 29. května 22:14
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na koty10cz
Adam Ježek:29. května 22:19

Takže chyba je někde mezi Arduinem a modulem. Zkontroluj vedení, případně zkus jiný vodiče. Taky se ujisti, že máš všude nastavený stejný baudrate. A nebo jentak zkus prohodit TX a RX. Samozřejmě ten bílý drát odpoj.

Odpovědět 29. května 22:19
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
koty10cz
Člen
Avatar
Odpovídá na Adam Ježek
koty10cz:29. května 22:33

Tak jsem to celý propojil jinejma vodičema i bez použití toho nepájivého pole a je to teď tak, že když to mám správně (RX na TX a TX na RX), tak to nevypisuje nic.. a když to prohodím (TX na TX...) tak to zase vypisuje ty bílý čtverečky.. už tomu fakt nerozumím.. baudrate mám všude, kde jsem ho našel 9600 (v kódu, ve správci zařízení u toho bluetooth, v serial monitoru)

 
Odpovědět 29. května 22:33
Avatar
koty10cz
Člen
Avatar
Odpovídá na koty10cz
koty10cz:29. května 22:58

Zkouším si tady ještě hrát s tím baudrate a zjistil jsem, že když to mám připojený Tx na Tx aby mi to aspoň něco vypisovalo, tak když měním baudrate, tak to pak vypisuje i jiný znaky než ty čtverečky (třeba když jsem dal 19200, tak to vypisuje viz obrázek) mám tudíž trochu podezření, že v tom hraje roli to baudrate.. ale nevím co s tím.. dá se někde třeba zjistit, jestli náhodou ten modul není nastavený na jiný než 9600?

 
Odpovědět 29. května 22:58
Avatar
koty10cz
Člen
Avatar
Odpovídá na koty10cz
koty10cz:29. května 23:04

Tak to vypadá, že je po problému :-) musel jsem zkoušet různý baudrate až nakonec 38400 bylo to správný. Nevím teda, jak je možný, že to není 9600 jak udává výrobce, ale to už je vedlejší.. každopádně díky moc za pomoc a že jsi mě navedl na správnou cestu :-)

 
Odpovědět 29. května 23:04
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na koty10cz
Adam Ježek:29. května 23:17

Tyhle moduly se naj většinou nastavit. Najdi si model tvého modulu + AT commands

Odpovědět 29. května 23:17
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
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 31. Zobrazit vše