LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[PROJEKT] Sterowanie diodami WS2812 za pomocą smartfona – KAmduino UNO, KAmodBT-HC05 oraz diody WS2812

W projekcie zrealizujemy komunikację Bluetooth między płytką KAmduino UNO a smartfonem. Następnie stworzymy prostą aplikację, za pomocą której będziemy sterować diodami adresowanymi WS2812 dołączonymi do KAmduino UNO. Skupimy się na komunikacji oraz aplikacji RoboRemo, w której utworzymy aplikację do sterowania naszymi diodami. Sterowanie diodami WS2812 zostało szczegółowo przedstawione w artykule [PROJEKT] KAmodWS2812 + KAmduinoUNO, dlatego przed przystąpieniem do realizacji projektu polecam zapoznanie się z tym artykułem.

Do realizacji projektu sterowania diodami WS2812 za pomocą smartfona będziemy potrzebować następujących elementów:

Pierwszym krokiem będzie przygotowanie aplikacji sterującej, dzięki której będziemy kontrolować jasność świecenia diod WS2812. Do tego celu wykorzystamy aplikacje RoboRemo, która pozwala stworzyć proste aplikacje bez programowania za pomocą interfejsu graficznego. W naszej aplikacji umieścimy trzy suwaki (slidery), za pomocą których będziemy sterować jasnością poszczególnych kanałów barwnych: czerwonego, zielonego oraz niebieskiego. Pobieramy bezpłatną wersję programu RoboRemo – w przeciwieństwie do płatnej wersji możemy umieścić tylko 5 elementów (suwaków, przycisków, wskaźników itp.) na ekranie. Jednak do naszego projektu w zupełności wystarczy bezpłatna wersja programu.

Po uruchomieniu programu zobaczymy następujący ekran:

Rysunek 1. Okno programu RoboRemo

Aby stworzyć naszą aplikację, klikamy na przycisk menu znajdujący się w lewym górnym rogu okna.

Rysunek 2. Menu programu RoboRemo

Otwiera się menu i aby edytować wygląd naszej aplikacji, wybieramy pozycje edit ui. Tło ekranu głównego zmieni kolor z białego na szary- jesteśmy teraz w trybie edycji interfejsu. Aby dodać element, musimy kliknąć na dowolny obszar okna – zostanie wyświetlona lista elementów, które mogą tworzyć interfejs naszej aplikacji. Znajdziemy tu przyciski, slidery, wskaźniki, pola tekstowe itp. (rysunek 3).

Rysunek 3. Okno dodawania elementów do interfejsu 

Nas będą interesować slidery – wybieramy pozycję slider (rysunek 3). Na ekranie pojawi się poziomy slider. Zgodnie z instrukcją wyświetlaną na ekranie, aby przemieścić element, musimy wybrać jego lewy góry róg. Jeżeli natomiast chcemy powiększyć lub zmniejszyć element, musimy wybrać jego prawy dolny róg elementu. Zmieniamy jego kształt aby przypomniał ten na rysunku 4.

Rysunek 4. Wygląd suwaka do sterowania jasnością diody WS2812

Następnie musimy przypisać temu suwakowi odpowiednie id. Dzięki niemu będziemy mogli dowiedzieć się, z którego suwaka pochodzi przesłana wartość jasności i napisać odpowiedni kod programu dla KAmduino UNO. Aby dodać id wybieramy środek naszego elementu – pojawi nam się nowe okno, gdzie wybieramy opcje set id (rysunek 5). Pierwszy suwak będzie odpowiedzialny za kolor czerwony, dlatego w oknie wpisujemy literę R (od słowa RED) (rysunek 6).

Rysunek 5. Zmiana id elementu 

Rysunek 6. Ustawienie id pierwszego suwaka odpowiedzialnego za kolor czerwony

Analogicznie tworzymy dwa kolejne suwaki, które będą odpowiadać za kolor zielony (id – G) oraz niebieski (id-B). Powinno to wyglądać jak na rysunku 7.

Rysunek 7. Wygląd aplikacji z 3 suwakami

Następnie możemy zmienić kolory naszych suwaków, wybieramy opcje elementu (klikając na jego środek) i wybieramy opcję set color. Pojawi się okno wyboru koloru suwaka. Możemy teraz przyporządkować kolory zgodnie z kolorami, za które będą odpowiedzialne, czyli od lewej kolor czerwony, zielony oraz niebieski (rysunek 8).

Rysunek 8. Ostateczny wygląd interfejsu naszej aplikacji

Następnie wychodzimy z trybu tworzenia naszego interfejsu klikając przycisk menu, a następnie wybierając opcje don’t edit ui:

Rysunek 9. Don’t edit ui – wyjście z trybu edycji interfejsu

Tło zmieni kolor na biały (kolor tła można zmienić w opcjach programu). Oznacza to, że aplikacja znajduje się w trybie sterowania i możemy spróbować poruszać dodanymi przez nas suwakami.

Rysunek 10. Aplikacja w trybie sterowania

 

Teraz przejdziemy do warstwy sprzętowej naszego projektu, pierwszym krokiem będzie stworzenie układu jak na rysunku poniżej:

 

Rysunek 11. Schemat podłączenia poszczególnych elementów do KAmduino UNO

 

Pin KAmduin UNO Diody WS2812
+5V VCC
GND GND
6 DI
Pin KAmduino UNO Pin modułu Bluetooth
+5V +V
GND GND
+3,3V +3,3V
0 – RX TxD
1 – TX RxD

Pierwszym krokiem będzie podłączenie pierścienia z diodami WS2812. Musimy dołączyć zasilanie (5 V oraz GND) oraz wejście DI do pinu 6, na płytce KAmduino UNO.

Kolejnym krokiem będzie podłączenie modułu Bluetooth – KAmodBT-HC05. Układ HC-05 znajdujący się w module pracuje z napięciem 3,3 V, jednak na płytce znalazły się konwertery stanów logicznych, dzięki którym możemy bezpiecznie podłączyć go do naszego KAmduino UNO (które pracuje na napięciu 5 V). Moduł do komunikacji wykorzystuje interfejs UART, dlatego pin RxD modułu podłączamy do pinu 1 – TX w KAmduino UNO, natomiast pin TxD modułu łączymy z pinem 0 – RX (zgodnie z tabelą podaną wyżej). Oprócz tego musimy podłączyć do modułu zasilanie, 3,3 V, 5 V oraz GND. Po podłączeniu wszystkich elementów nasz układ prezentuje się następująco:

Rysunek 12. Podłączone moduły (diody WS2812 oraz Bluetooth) do płytki KAmduino UNO

Teraz przejdziemy do przygotowania programu do sterowania diodami WS2812 dla płytki KAmduino UNO:

// Sterowanie diodami RGB za pomocą smartfonu 
// Autor: Patryk Mądry 
// https://mikrokontroler.pl


#include <Adafruit_NeoPixel.h> // Biblioteka do sterowania diodami
#define PIN            6       // Pin do sterowania diodami ws2812
#define NUMPIXELS      16      // Ilość diod ws2812 w pierścieniu

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); 

void setup() 
{
  
  Serial.begin(38400); // Prędkość transmisji modułu Bluettoth
  pixels.begin(); // Uruchomienie działania biblioteki Adafruit_NeoPixel
  
}
// Zmienne programu 
char OdebraneDane[20]; 
byte indeks;
int Dioda_R = 0;  // wartosc jasnosci dla diod czerwonych 
int Dioda_G = 0;  // wartosc jasnosci dla diod zielonych
int Dioda_B = 0;  // wartosc jasnosci dla diod niebieskich 


char znak ="";


void zapal_diody()
{
    for(int i=0;i<NUMPIXELS;i++)
   {
      pixels.setPixelColor(i, pixels.Color(Dioda_R,Dioda_G,Dioda_B)); // Ustawienie kolorów dla poszczegolnych barw 
      pixels.show(); 
      
  }
  
}

void Odbierz_Dane() // Dekodowanie ramki 
{
  
  if (OdebraneDane[0] == 'R') 
  {
     Dioda_R = atoi(OdebraneDane + 2);
  }
  else if (OdebraneDane[0] == 'G') 
  {
     Dioda_G = atoi(OdebraneDane + 2);
  }
  else if (OdebraneDane[0] == 'B') 
  {
     Dioda_B = atoi(OdebraneDane + 2);
  }
}



void loop() 
{

   if (Serial.available() > 0  ) //
  {
   
   delay(50);
   
   do{
   
    znak = (char)Serial.read();
   OdebraneDane[indeks] = znak;
   indeks++;

   }while(znak != '\n');
   
   OdebraneDane[indeks] = 0;
   indeks=0;
   
   
      Odbierz_Dane();
       zapal_diody();
  }
  

Teraz omówię powyższy kod programu (znajduje one się również w załączniku do tego artykułu).

Na samym początku musimy dodać bibliotekę Adafruit_NeoPixel.h do naszego programu. Następnie określamy, którym pinem będziemy sterować naszym ciągiem diod oraz podać ich ilość:

#include <Adafruit_NeoPixel.h> // Biblioteka do sterowania diodami
#define PIN            6       // Pin do sterowania diodami ws2812
#define NUMPIXELS      16      // Ilość diod ws2812 w pierścieniu

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

Następnie ustawiamy szybkość transmisji danych z modułem Bluetooth (domyślnie ustawiona jest ona na 38400 i taką wartość wpisujemy do naszego programu) oraz inicjujemy uruchomienie biblioteki do sterowania diodami adresowanymi.

void setup() 
{
  Serial.begin(38400); // Prędkość transmisji modułu Bluetooh
  pixels.begin(); // Uruchomienie dzialania biblioteki Adafruit_NeoPixel
  
}

W dalszej cześć programu deklarujemy niezbędne do działania programu zmienne. Tablica OdebraneDane to struktura, do której zostaną zapisane dane odbierane przez KAmduino Uno. Zmienna indeks to zmienna pomocnicza potrzebna do zapisu danych w tablicy OdebraneDane oraz zmienne Dioda_R, Dioda_G, Dioda_B, które będą przechowywać wartość jasności dla barw czerwonej, zielonej oraz niebieskiej. Zmienna znak będzie przydatna do odczytywania danych przychodzących do mikrokontrolera z modułu Bluetooth.

// Zmienne programu 
char OdebraneDane[20]; 
byte indeks;
int Dioda_R = 0;  // wartość jasności dla diod czerwonych 
int Dioda_G = 0;  // wartość jasności dla diod zielonych
int Dioda_B = 0;  // wartość jasności dla diod niebieskich 
char znak ="";

W funkcji zapal_diody() znajduje się pętla, która będzie odczytywała wartość zmiennych Dioda_R, Dioda_G, Dioda_B, a następnie ustawiała jasność poszczególnych barw dla diod.

void zapal_diody()
{
    for(int i=0;i<NUMPIXELS;i++)
   {
      pixels.setPixelColor(i, pixels.Color(Dioda_R,Dioda_G,Dioda_B)); // Ustawienie kolorów dla poszczegolnych barw 
      pixels.show(); 
   }  
}

Zadaniem funkcji Odbierz_Dane(), jest dekodowanie odebranych danych, funkcja sprawdza pierwszy znak w tablicy OdebraneDane i sprawdza, który kolor uległ zmianie (który suwak przesunął użytkownik w aplikacji). Następnie odczytuje wartość i przypisuje tą wartość do zmiennej odpowiedzialnej za dany kolor. Przykładowo, gdy w tablicy OdebraneDane będą się znajdować następujące znaki: R 255, funkcja zapisze do zmiennej Dioda_R wartość 255.

void Odbierz_Dane() // Dekodowanie ramki 
{
  
  if (OdebraneDane[0] == 'R') 
  {
     Dioda_R = atoi(OdebraneDane + 2);
  }
  else if (OdebraneDane[0] == 'G') 
  {
     Dioda_G = atoi(OdebraneDane + 2);
  }
  else if (OdebraneDane[0] == 'B') 
  {
     Dioda_B = atoi(OdebraneDane + 2);
  }
}

W tablicy OdebraneDane znajdują się kolejne odebrane znaki. Są one typu char (czyli znak). Aby zamienić je na wartość liczbową, zastosowano funkcję atoi(), która zamienia znaki (tekst) na wartość liczbową, która jest przypisywana do zmiennej int, a następnie wykorzystywana w funkcji do sterowania diodami. Ponieważ pierwszym znakiem w tablicy OdebraneDane jest liczba, następnie występuje znak spacji, konwertowanie znaków na liczbę zaczynamy od 3 elementu tablicy OdebraneDane, dlatego:

atoi(OdebraneDane + 2);

Następnie przechodzimy do głównej pętli programu. Najpierw sprawdzamy czy KAmduino UNO odebrało jakieś dane z modułu Bluetooth. Jeżeli tak ( Serial.available() > 0), to czekamy 50 milisekund i przystępujemy do zapisywania danych do tablicy OdebraneDane. Odbywa się to w pętli do … while, kolejne znaki są zapisywane do tablicy OdebraneDane, aż do momentu, gdy w odebranym buforze znajdzie się znak „\n”, który oznacza koniec linii.

void loop() 
{

   if (Serial.available() > 0  ) //
  {
   
   delay(50);
   
   do{
   
     znak = (char)Serial.read();
     OdebraneDane[indeks] = znak;
     indeks++;

   } while(znak != '\n');
   
   OdebraneDane[indeks] = 0;
   indeks=0;
   
   
      Odbierz_Dane();
      zapal_diody();
  }
  
}

Następnie zerujemy zmienną indeks i wykonujemy funkcje Odbierz_Dane() oraz zapal_diody().

Tak przygotowany program wgrywamy na KAmduino UNO.

 UWAGA!
Na czas programowania układu należy odłączyć przewody od modułu Bluetooth (brązowy i zielony przewód, czyli TX i RX) od płytki KAmduino UNO, ponieważ może to powodować problemy z zaprogramowaniem mikrokontrolera. Po wgraniu programu na płytkę należy z powrotem podłączyć moduł KAmodBT-HC05 do płytki KAmduino UNO.

Teraz musimy sparować nasz smartfon z modułem Bluetooth KAmodBT-HC05. Przechodzimy to ustawień Bluetooth i uruchamiamy łączność Bluetooth. Następnie na na liście pojawi się urządzenie o nazwie KAmodBT-HC05, które należy wybierać (należy pamiętać, aby płytka Arduino była zasilana).

Rysunek 13. Ustawienia Bluetooth – lista dostępnych urządzeń 

Moduł poprosi nas o podanie kodu PIN (wpisujemy domyślny kod 1234), następnie wciskamy przycisk OK. Od teraz nasz smartfon jest sparowany z modułem Bluetooth znajdującym się na płycie stykowej, można to zauważyć poprzez częstotliwość pracy diody zielonej na module KAmodBT-HC05.

Rysunek 14. Parowanie modułu Bluetooth z telefonem komórkowym – podanie kodu PIN

Uruchamiamy ponownie aplikacje RoboRemo. Przechodzimy do menu (rysunek 15), a następnie wybieramy pozycję connect. Następnie wybieramy typ połączenia – w naszym przypadku jest to Bluetooth (rysunek 16).

Rysunek 15. Menu – połączenie z modułem 

Rysunek 16. Wybór metody komunikacji w naszym przypadku Bluetooth

Pojawi się okienko z listą dostępnych urządzeń wybieramy nasz moduł KAmodBT-HC05 oraz port 1 (rysunek 17 oraz 18).

Rysunek 17. Wybór urządzenia, z którym będziemy się łączyć 

Rysunek 18. Wybór portu

Czekamy na połączenie i powinien nam się pojawić ekran naszej aplikacji (rysunek 10). Teraz przesuwając suwaki, będziemy zmieniać jasność świecenia poszczególnych barw w naszych diodach adresowanych WS2812 podłączonych do KAmduino. Ten efekt został pokazany na poniższym wideo:

 

W projekcie została zrealizowana prosta komunikacja między smartfonem a płytką KAmduino Uno przy wykorzystaniu łączności Bluetooth. Za pomocą aplikacji RoboRemo stworzyliśmy prostą aplikację, która pozwoliła na sterowanie diodami adresowanymi WS2812.

Autor: Patryk Mądry