Sterowanie urządzeniami za pomocą telefonu z systemem Android i technologii bluetooth


Tomasz Bartuś



2017-11-12
Sterowanie urządzeniami za pomocą telefonu z systemem Android i technologii bluetooth

Wstęp

Współcześnie, najbardziej rozpowszechnionymi urządzeniami elektronicznymi są smartfony. Ma je już niemal każdy. Ich popularność sprawia, że często są wykorzystywane jako platformy obsługi różnych domowych urządzeń np.: telewizorów, systemów audio, systemów inteligentnych domów i innych. Można je także wykorzystać do obsługi projektów Arduino. Obecnie najbardziej rozpowszechnionym systemem operacyjnym dla telefonów komórkowych jest Android. Specjalnie dla tej platformy zostało stworzone środowisko programistyczne online App Inventor. Wykorzystamy je do tworzenia aplikacji na telefon obsługującej układ Arduino.

Układ
Fig. 1. Układ

MIT App Inventor umożliwia tworzenie aplikacji dla telefonów z systemem Android za pomocą przeglądarki www i telefonu (lub emulatora). Środowisko udostępnia dwa narzędzia: App Inventor Designer, w którym można zaprojektować wygląd aplikacji na telefon oraz App Inventor Blocks Editor, w którym, za pomocą składanych bloków można zbudować kod aplikacji. Programy budujemy wizualnie, dopasowując do siebie klocki, jak w Scratchu (Fig. 2). Efekty pracy na bieżąco można wyświetlić na swoim telefonie lub w emulatorze telefonu. Po ukończeniu projektu, można także utworzyć samodzielną aplikację do zainstalowania na telefonach.

Elementy środowiska programistycznego App Inventor
Fig. 2. Elementy środowiska App Inventor

Na początek, w oparciu o platformę Arduino utworzymy proste urządzenie obsługujące diodę LED. Za pomocą telefonu będziemy sterowali jej włączaniem i wyłączaniem. Komunikację pomiędzy układem Arduino, a telefonem, zapewni moduł bluetooth HC-05 (Fig. 3).

Moduł komunikacji bluetooth HC-05
Fig. 3. Moduł komunikacji bluetooth HC-05 (awers i rewers)

Do wykonanie układu potrzebne nam będą:

Lista części

  1. Arduino (Uno),
  2. moduł bluetooth HC-05,
  3. czerwona dioda LED,
  4. rezystor 220Ω (1 szt.),
  5. płytka prototypowa,
  6. przewody.

Zasada działania

Do komunikacji pomiędzy modułem bluetooth odbierającym sygnały z telefonu a płytką Arduino, wykorzystamy magistralę szeregową UART. Sygnał RX podłączamy do pinu 11, a TX do 10. Diodą LED będzie sterował pin 13 (Fig. 4).

Schemat ideowy

Schemat układu
Fig. 4. Schemat układu sterujacego diodą LED

Do Arduino wgrywamy poniższy program. Port szeregowy USB wykorzystamy do kontrolowania zmiennej odpowiedzialnej za wlączanie i wyłączanie diody LED. Dlatego, do podłączenia modułu bluetooth będziemy potrzebowali dodatkowego, wirtualnego portu szeregowego. Tworzymy go na cyfrowych pinach 11 i 10, za pomocą bliblioteki SoftwareSerial.

Kod

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(10, 11);     // TX, RX respetively
String state;                         // string to store message incoming from bluetooth module

void setup() {
  bluetooth.begin(9600);               // start bluetooth serial communication
  Serial.begin(9600);                  // Start serial communication to control the data on serial monitor
  pinMode(13, OUTPUT);                 // LED
}

void loop() {
  while (bluetooth.available()) {       // Check if there is an available byte to read
    delay(10);                          // Delay added to make thing stable
    char c = bluetooth.read();          // Conduct a serial read
    state += c;                         // build the string- either "on" or "off"
  }
  if (state.length() > 0) {
    Serial.println(state);
    if (state == "on") {
      digitalWrite(13, HIGH);
    }
    else if (state == "off") {
      digitalWrite(13, LOW);
    }
    state = "";                          // Reset the variable
  }
}

Aplikacja Android

Wchodzimy na stronę projektu MIT App Inventor. Musimy się zalogować przy pomocy konta Google. Po zalogowaniu, zostajemy przeniesieni do okna aplikacji ze spisem osobistych projektów. Za pomocą przycisku "Start new project" otwieramy nowy projekt i nadajemy mu dowolną nazwę np "LED_controller". Zostajemy przeniesieni do okna edytora blokowego (Fig. 5).

Okno edytora wyglądu aplikacji
Fig. 5. Okno edytora wyglądu aplikacji
  1. W części Component zaznaczmy ekran "Screen1" i w "Properties" zmieńmy tytuł okna na LED controller oraz tło okna "BackgroundColor" na Dark Grey.
  2. Teraz zajmiemy się utworzeniem komponentu odpowiedzialnego za uzyskanie połączenia bluetooth. Stworzymy listę urządzeń sparowanych z telefonem, z której będziemy wybierać nasz moduł bluetooth podłączony do układu Arduino. Z okna Palette, z menu User Interface wybieramy komponent ListPicker i przeciągamy go do okna Viewer. Zaznaczamy wstawiony element i w oknie Properties zmieniamy mu właściwość width na "Fill parent". Spowoduje to, rozciągnięcie listy wyboru na szerokość całego okna aplikacji. Zmieniamy także właściwość Text z wstawionej automatycznie "Text for ListPicker1" na "Bluetooth".
    Lista rozwijana bluetooth
    Fig. 6. Komponent listy rozwijanej bluetooth
  3. Poniżej listy rozwijanej wstawimy etykietę, ktora będzie nas informowała o nawiązaniu połączenia z modułem. W tym celu z okna Palette, z menu User Interface wybieramy komponent Label i przeciągamy go do okna Viewer. Zaznaczamy wstawiony element i w oknie Properties zmieniamy mu właściwość TextAligment na "center" oraz width na "Fill parent". Kasujemy wartość właściwości Text.
  4. Do sterowania zapalaniem i gaszeniem diody LED użyjemy dwóch przycisków. Do ich umieszczenia w aplikacji wykorzystamy szablon HorrizontalArrangement znajdujący się w oknie Palette, w menu Layouts. Wybieramy komponent HorrizontalArrangement i przeciągamy go do okna Viewer. Zaznaczamy wstawiony element i w oknie Properties zmieniamy mu właściwość width na "Fill parent"
  5. Z okna Palette, z menu User Interface wybieramy komponent Button i przeciągamy go do okna Viewer. Do wnętrza utworzonego szablonu. Po dołożeniu pierwszego przycisku, w ten sam sposób dodajemy drugi przycisk. Zaznaczamy kolejno przyciski i zmieniamy i w oknie Properties zmieniamy mu właściwość width na "Fill parent". Dla pierwszego przycisku zmieniamy jego wlaściwość Text na "On", a drugiego na "Off".
    Lista rozwijana bluetooth
    Fig. 6. Dodanie przycisków: On (włączającego diodę LED) i Off (wyłączającego diodę LED)
  6. Aby dokonać połączenia bluetooth z naszym modułem HC-05, musimy do projektu dodać komponent BluetoothClient. Wybieramy go z okna Pallet, z menu Connectivity i przeciągamy do okna Viewer. Jego ikona pojawia się poniżej obrazu okna telefonu, wśród komponentów niewidocznych (Non-visible components).
  7. W podobny sposób dodajemy komponent Clock. Wybieramy go z okna Pallet, z menu Sensors i przeciągamy do okna Viewer. Jego ikona pojawia się poniżej obrazu okna telefonu, wśród komponentów niewidocznych (Non-visible components).
  8. Przechodzimy teraz do aplikacji Blocks. Zajmiemy się teraz zaprogramowaniemsposobu działania aplikacji (Fig. 7).
    Okno edytora blokowego
    Fig. 7. Okno edytora blokowego
  9. Najpierw zajmiemy się oprogramowaniem zdarzenia kliknięcia na ListPicker1. W tym celu w oknie Blocks wybieramy komponent ListPicker1. Z listy dostępnych klocków wybieramy obsługę zdarzenia "When ListPicker1.BeforePicking" i przeciągamy go do okna Viewer (Fig. 8).
    Fig. 8. Klocek zdarzenia "When ListPicker1.BeforePicking"
  10. Przed kliknięciem w aplikacji na ListPicker1 powinna zostać pobrana lista sparowanych urządzeń bluetooth. Aby oprogramować to zdarzenie, ponownie klikamy w oknie Blocks na komponent ListPicker1. Z listy dostępnych klocków wybieramy element deklaracji właściwości Elements "set_ListPicker1_Elements_to" i dodajemy go do klocka "When ListPicker1.BeforePicking" (Fig. 9).
    Fig. 9. Klocek zdarzenia "When ListPicker1.BeforePicking" z dodanym elementem "set_ListPicker1_Elements_to"
  11. W oknie Blocks klikamy na komponent BluetoothClient1. Z listy dostępnych klocków wybieramy element odpowiadający za pobranie listy sparowanych urządzeń bluetooth "BluetoothClient1_AdressesAndNames" i dodajemy go do wcześniej dodanego klocka "set_ListPicker1_Elements_to" (Fig. 10).
    Fig. 10. Klocek zdarzenia "BluetoothClient1_AdressesAndNames" dodany do elementu "set_ListPicker1_Elements_to"
  12. Mamy już opisane zdarzenie sprzed kliknięcia na listę dostępnych sparowanych urządzeń bluetooth. Teraz zajmiemy się zdarzeniem połączenia z wybranym urządzeniem bluetooth. W tym celu, w oknie Blocks ponownie klikamy na komponent ListPicker1 i z listy dostępnych klocków wybieramy element odpowiadający za opis zdarzenia po kliknięciu na listę możliwych połączeń When ListPicker1.AfterPicking. W oknie Blocks z listy Built-in wybieramy Control, a z niego wybieramy blok warunkowy "if then" i dodajemy go do istniejącego bloku "When ListPicker1.AfterPicking" (Fig. 11).
    Fig. 11. Klocek warunkowy "if then" dodany do elementu "When ListPicker1.AfterPicking"
  13. Do bloku instrukcji if, z właściwości komponentu BluetoothClient1 dodajemy klocek "call_BluetoothClient1.Connect_adress" (Fig. 12).
    Fig. 12. Klocek "call_BluetoothClient1.Connect_adress" dodany do bloka warunkowego "if then"
  14. W oknie Blocks wybieramy komponent ListPicker1. Z listy dostępnych klocków wybieramy ListPicker1:Elements po czym zmieniamy właściwość Elements na Selection. Dołączamy klocek do wejścia adresu instrukcji warunkowej if (Fig. 13).
    Fig. 13. Klocek "ListPicker1:Selection" dodany do bloka warunkowego "if then"
  15. Z kodu obsługującego zdarzenie sprzed wybrania urządzenia do sparowania "When ListPicker1.BeforePicking" duplikujemy całą instrukncję "set_ListPicker1_Elements_to" i dodajemy ją do instrukcji warunkowej "if then" (Fig. 14).
    Fig. 14. Obsługa połączenia bluetooth
  16. Zajmiemy się teraz obsługą zmiennej tekstowej informującej o uzyskaniu połączenia z modułem blutooth układu arduino. W momencie uzyskania połączenia, etykieta umieszczona w aplikacji pod listą urządzeń sparowanych ze smartfonem, powinna się zmienić z "not connected" na "connected". W menu Blocks klikamy na element Clock1 i z listy dostępnych klocków wybieramy klocek instrukcji warunkowej "When Clock1.Timer do" i przesuwamy ją do okna Viewer. Do jego wnętrza dołączamy blok instrukcji warunkowej "if then". Z właściwości komponentu BluetoothClient1 dodajemy klocek "BluetoothClient1.AdressAndNames". Zmieniamy jego właściwość na "IsConnected" i dołączamy go do bloku instrukcji If. Klikamy teraz na listę bloków elementu Label1 i wybieramy z niej klocek "set Label1.text to" i dołączamy blok do instrukcji then. Z listy elementów Built-in, z listy Text wybierz blok pusty i dodaj go do bloku instrukcji "set Label1.text to" i dodajemy do niego napis "Connected". Na koniec przed tą instrukcję dodajemy blok zmieniający kolor napisu Connected na biały. W tym celu z menu Label1 wybieramy blok "set Label1.TextColor to" i ustawiamy dla niej kolor biały.
    Fig. 15. Obsługa etykiety "Connected"
  17. Klikamy na niebieską ikonkę ustawień instrukcji "if then" i dodajemy do bloku "if" instrukcję "else". Kopiujemy do niego blok instrukcji "set Label1.text to "Connected"" i zmieniamy wartość zmiennej tekstowej na "Not connected".
    Fig. 16. Obsługa etykiety "Not connected"
  18. Zajmiemy się teraz oprogramowaniem zdarzeń związanych naciśnięciami przycisków. Z menu Blocks klikamy na element Button1 i wybieramy blok "When Button1.Click do". Po kliknięciu na przycisk pierwszy do modułu bluetooth ukłądu arduino powinna zostać wysłana instrukcja "On". Z menu elementu BluetoothClient1 wybieramy klocek "call BluetoothClient1.SendText to" i dodajemy do niego blok tekstowy z tekstem "on". Mamy oprogramowane wysyłanie polecenia zaświecenia diody LED. Pora na jej wyłączenie. Skopiujmy cały blok instrukcji i zmieńmy tekst na "off" (Fig. 17).
    Fig. 17. Obsługa wysyłania do modułu bluetooth poleceń załączających i wyłączających diodę LED

Cały kod aplikacji przedstawiono na Fig. 18.

Fig. 18. Kod aplikacji obsługującej sterowanie diodą LED za pomoca telefonu z systemem android i połaczenia bluetooth.

Teraz wystarczy wyeksportować aplikację do telefonu. Na telefonie instalujemy aplikację MIT AI2 Companion. Z menu środowiska programistycznego MIT PPP Inventor wybierzmy Connection > Al companion. Kod QR można zeskanować z poziomu aplikacji android MIT AI2 Companion.

Wykorzystane materiały


Magesh Jayakumar 2016. Course on MIT App Inventor and Arduino
 
 

Doktorat

Spis treści
Rozdzialy
Abstrakt [pl]
Abstract [eng]