Bluetooth do Arduino i nie tylko - To Proste! Cz.2

Bluetooth do Arduino i nie tylko - To Proste! Cz.2

 Witam w drugiej części artykułu, który poświęcony jest modułom komunikacji bezprzewodowej BLUETOOTH. W poprzedniej części omówiliśmy sposób funkcjonowania tejże bezprzewodowej transmisji danych, a także przyjrzeliśmy się bliżej modułom HC-05HC-06 , HC-08 (cz. I). Teraz kolejnym krokiem więc będzie zaznajomienie się z aplikacjami, które pozwolą nam na komunikację między Arduino wraz z modułem bluetooth, a naszym smartfonem.

 

Jak już wspomniałem w pierwszej części są dwa sposoby, dzięki którym stworzymy własne sterowanie i połączymy się z modułem za pomocą telefonu.

 Pierwszym z nich jest (jeżeli nie chcecie tracić czasu na tworzenie własnej aplikacji i może nie znacie się na tym) Bluetooth Electronics. Jest to aplikacja na telefon do pobrania w sklepie google PLAY, która jest niebywale prosta i intuicyjna w obsłudze. Aby odebrać dane z Arduino na smartfonie, wystarczy wpisać odpowiednią frazę w sketch-u Arduino, włączyć telefon, uruchomić aplikację, sparować z modułem i to wszystko. Możemy również wysyłać informacje do Arduino przez smartfon. Zasada funkcjonowania aplikacji jest dość prosta, a tak wygląda ekran startowy i wbudowane przykłady:


 Użytkownik ma do wyboru różne zakładki takie jak przełączniki, przyciski, pole tekstowe, suwaki i inne. Dzięki tym narzędziom stworzymy okno naszej aplikacji.

 Aplikacja ta posłużyła nam do odbioru informacjii z naszej stacji pogodowej, którą zbudowaliśmy i informacje wysyłaliśmy po przez moduł bluetooth.

  Aby zobaczyć stację meteorologiczną KLIKNIJ.

 Może na początek sprawdźmy i przeanalizujmy jak to działa. Myśle, że prostym przykładem będzie czujnik odległości, jakim jest ultrasonograf HC-SR04.

 No więc tak, na początek podłączmy wszystkie elementy razem i wgrajmy sketch do Arduino, który dostępny jest na stronie: http://www.keuwl.com/electronics.html . Otwórzmy aplikację, wyszukajmy nasz moduł,  połączmy się z nim i otwórzmy okno gotowego przykładu. Jak widać wszystko działa prawidłowo: na ekranie ukazuje się odległość i nawet wielka kontrolka zmienia kolory w zależności od dystansu. Aby to zrozumieć zajrzyjmy do kodu, który wgraliśmy do płytki mikrokontrolera.

 Na początku wygląda jak zwykły przykład z aplikacji ARDUINO. Kluczowe są tutaj te linie kodu:

Serial.print("*T"+String(echotime)+"*");
Serial.print("*D"+String(distance,1)+"*");

 

 Wygląda jak zwykłe wyświetlanie w monitorze portu szeregowego. Otóż tak, ponieważ jak już wspomniałem w pierwszej części moduł bluetooth komunikuje się poprzez port UART a więc szynę TX i RX. Należy więc rozpoczynać transmisję za pomocą kodu - Serial.begin(9600);

Jak sami widzicie to naprawdę nic skomplikowanego. Wyrażenie "*T"+String są to informacje wysyłane dla aplikacji: T to liczba “nadająca”, którą wpisujemy również w aplikacji jak na tym zdjęciu (oczywiście zamiast R ma być T).

 Receive znaczy odbierać. Więc jak chcemy odebrać wiadomość wpisujemy tą samą literę w programie Arduino i aplikacji. String jest to po prostu zmienną, a w nawiasie znajduje się wartość, którą chcemy wysłać. Tak samo postępujemy chcąc wyświetlić informacje w monitorze portu szeregowego.

 Sytuacja wygląda trochę inaczej, gdy chcemy wysłać informacje do Arduino. W tej sytuacji otwórzmy sobie przykład RC Car Demo na stronie internetowej i przeanalizujmy kod. Aplikacją zajmiemy się później.

Na początku mamy zadeklarowaną char jako bluetoothData.

char BluetoothData;

 

 Następnie w ustawieniach początkowych rozpoczynamy transmisję szeregową - Serial.begin(9600); a także ustawiamy przekaźniki jako wyjścia - pinMode(4,OUTPUT);.

Następnie w głównej pętli loop musimy odebrać informacje z modułu bluetooth a więc tak jak i z monitora przez komendę:

 (Serial.available());

BluetoothData=Serial.read(); Ta komenda zamienia odczytane wartości z modułu na BluetoothData, którą zdeklarowaliśmy już wcześniej.

  Następnie znajdują się warunki logiczne, które zarządzają wydarzeniami po otrzymaniu konkretnych danych. Te dane wyglądają w następujący sposób:

(BluetoothData=='R')

(BluetoothData=='Y')

(BluetoothData=='r'||BluetoothData=='y')

 

 Pierwsze dwa z nich załączją przekaźniki po odczytaniu odpowiednich liter R i Y, które są nadawane, gdy w aplikacji wciśniemy odpowiednie przycisk. Gdy nie są wciśnięte to przekaźniki mają zostać wyłączone za co odpowiada trzecia linika kodu, a aplikacja wysyła wtedy małe litery “r” i “y”. Tak samo przedstawia się sytuacja, gdy chcemy poruszać samochodem w przód czy tył.

 Sterowanie z poziomu telefonu odbywa się za pomocą gotowego przykładu z aplikacji Bluetooth Electronics. Otwieramy więc przykład za pomocą przycisku Edit i widzimy cztery przyciski w różnych kolorach, które są podpisane. Po wciśnięciu przycisków wyświetla się informacja w prawym dolnym rogu jaka litera jest wysyłana w czasie wciśnięcia przycisku i jaka w czasie  braku jego aktywności. Dla przykładu żółty przycisk w prawo wysyła sygnał “y” w czasie jego braku aktywności, “Y” w czasie jego wciśnięcia. Jak widać najprostsze rozwiązania są najlepszymi rozwiązaniami.

 

 Wiemy jak sterować wyjściami i wejściami cyfrowymi, a jak sterować sygnałem PWM odbierając i wysyłając te informacje o wielkości współczynniku wypełnienia? Praktycznie tak samo, dla przykładu otwórzmy LED Brightness  ze strony keuwl. W tym przykładzie steruje się trzema diodami, rozjaśnia się je i przyciemnia poprzez właśnie sygnał PWM. Zerknijmy do sketchu Arduino. Na początku mamy zadeklarowane nazwy diod w postaci int i piny, pod które są te diody podłączone do Arduino, a więc są to piny 9, 10 oraz 11, ponieważ na tych pinach jest możliwość modelowania sygnału PWM. Tak wygląda owa linika kodu: int Red_LED_Pin = 9;

 Następnie mamy wartości tych trzech diod, również w postaci zmiennej int i wygląda ona tak: int Red_value=0;

Następnie jak i w przypadku poprzednim należy odebrać informacje z bluetooth

char BluetoothData;

  W ustawieniach początkowych setup trzy diody ustawione są jako wyjścia, ponieważ będą odbierać sygnał PWM - pinMode(Red_LED_Pin, OUTPUT);

Także uruchamiamy transmisję szeregową - Serial.begin(9600);

 W głównej pętli loop mamy warunki logiczne if - if (Serial.available()){{|br class="kix-line-break" />    BluetoothData=Serial.read(); //odbiór info. z modułu bluetooth
   if(BluetoothData=='R') Red_value=Serial.parseInt(); //odbiór litery “R” i jej wartości

 Jak widać komenda - Serial.parseInt(); odpowiedzialna jest za odbiór wartości sygnału PWM. Po odebraniu wszystkich wartości należy je wykonać za co odpowiadają te linie kodu - analogWrite(Red_LED_Pin, Red_value);

analogWrite - wysyła sygnał PWM  

(Red_LED_Pin, Red_value); - do diody czerwonej - Red_LED_Pin

Red_value - o odpowiedniej wartości współczynnika wypełnienia.

 

 Jak widać ten przykład był już trochę trudniejszy, lecz nadal do wykonania i zrozumienia. To rozwiązanie jest proste, szybkie i wygodne, ale nie jest ono jedyne. Jeżeli ktoś chciałby, aby jego aplikacja była ładniejsza, z większą ilością funkcji to może wykonać ją sam. Pisanie aplikacji brzmi jak zlecenie dla informatyka? Nic bardziej mylnego! Każdy z nas może stworzyć swoją własną aplikację, w miarę prosty sposób. Google stworzyło program, który działa na przeglądarce i służy do tworzenia aplikacji, a nazywa się appinventor. Jest to bardzo fajny pomysł, który posiada ogromny potencjał. Jego działanie opiszę w następnej części.