SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Przetwarzanie i wizualizacja danych z Arduino

Projektując jakieś urządzenie za pomocą Arduino, często zachodzi konieczność obserwowania różnych odczytów i wyników działania naszego programu. Pierwsze co przychodzi nam do głowy to skorzystanie z możliwości monitorowania portu szeregowego do którego "wyrzucamy" nasze dane. Metoda ta jest bardzo wygodna, jednak bywa niewystarczająca.

Jak wiemy port szeregowy pozwoli nam tylko na obserwację wyników jedynie w trybie tekstowym - prezentując je linijka po linijce. Co jednak w przypadku, gdybyśmy chcieli widzieć odczyty temperatury na ładnym wykresie albo zaprezentować działanie akcelerometru? Z pomocą przyjdzie nam program Processing 2.

Przetwarzanie i wizualizacja wyników.

Processing 2 to program napisany w języku Java (podobnie jak IDE do Arduino) wspomagający nas w wizualizacji odbieranych danych na porcie szeregowym (ale i nie tylko). Program dostępny jest za darmo zarówno dla platformy Windows, Linux jak i MacOS. Wystarczy go tylko pobrać, rozpakować i uruchomić. Jego wygląd bardzo przypomina znane nam już IDE od Arduino.

Zanim jednak przystąpimy do wizualizacji naszych danych, wypadałoby  w odpowiedni sposób wysłać nasze dane z Arduino na port szeregowy. Jak to zrobić?

Joystick

Jako przykład, posłużymy się odczytem położenia w osi X/Y drążka joysticka analogowego. Jego konstrukcja jest banalnie prosta - drążek osadzony jest na dwóch potencjometrach, zmieniających swoją rezystancję w zależności od wychylania w wybranej osi. Podłączenie ogranicza się jedynie do podpięcia zasilania, masy oraz wyjść X i Y. Przedstawiona wersja joysticka posiada jeszcze przycisk, który uaktywnia stan niski na odpowiedni pin po wciśnięciu drążka.

Prosty program dla Arduino

Program jest banalnie prosty - będziemy odczytywać pomiar z dwóch wejść analogowych i jednego wejścia cyfrowego. Następnie wyślemy wyniki do portu szeregowego:

  1. int xValue = 0; // wartość odczytu osi X
  2. int yValue = 0; // wartość odczytu osi Y
  3. int bValue = 0; // wartość odczytu przycisku
  4.  
  5. void setup()
  6. {
  7.   Serial.begin(9600); // Otwieramy port szeregowy
  8.   pinMode(2, INPUT);  // Konfigurujemy Pin 2 jako wejście
  9. }
  10.  
  11. void loop()
  12. {
  13.   // Odczytujemy wartości portu analogowego A0 i A1
  14.   xValue = analogRead(A0);        
  15.   yValue = analogRead(A1);  
  16.  
  17.   // Odczytujemy wartość stanu logicznego na pinie 2
  18.   bValue = digitalRead(2);  
  19.  
  20.   // Wyświetlamy nasze dane, oddzielając je przecinkiem                     
  21.   Serial.print(xValue,DEC);
  22.   Serial.print(",");
  23.   Serial.print(yValue,DEC);
  24.   Serial.print(",");
  25.   Serial.print(!bValue,DEC);
  26.  
  27.   // Kończymy znakiem nowej linii ułatwiającym późniejszą analizę
  28.   Serial.print("\n");
  29.  
  30.   // Małe opóźnienie przed następnym pomiarem
  31.   delay(2);                     
  32. }

Na porcie szeregowym otrzymamy dane, które będziemy mogli odebrać w Processing 2 i odpowiednio przetworzyć.

Wizualizacja w Processing 2

Kiedy mamy już działający projekt, a dane wysyłane są już na port szeregowy, możemy przystapić do odebrania ich w Processing 2 i pokazać w zupełnie inny sposób. Jako, że przykładem jest joystick, będziemy chcieli pokazać położenie naszego drążka oraz wyświetlić odebrane wyniki. Zobaczmy jak będzie wyglądał nasz program tym razem:

  1. import processing.serial.*; // importujemy bibliotekę serial
  2.  
  3. Serial myPort; // definiujemy port
  4.  
  5. int x;   // zmienna przechowująca wartość z A0
  6. int y;   // zmienna przechowująca wartość z A1
  7. int b;   // zmienna przechowująca wartość z cyfrowego pinu 2
  8. PFont f; // defincja zmiennej czcionki
  9. String portName;
  10.  
  11. void setup()
  12. {
  13.   size(512, 512); // rozmiar okna
  14.  
  15.   // portName = Serial.list()[0]; // wybieramy nazwę portu 0 z listy dostępnych
  16.   portName = "/dev/ttyACM0";      // lub jeśli znamy jego nazwę
  17.  
  18.   // otwieramy port
  19.   myPort = new Serial(this, portName, 9600);
  20.  
  21.   // wybieramy czcionkę i rozmiar
  22.   f = createFont("Arial", 16, true); // Arial, 16px, anti-aliasing
  23.   textFont(f, 16); // rozmiar 16px
  24. }
  25.  
  26. // pętla rysująca
  27. void draw()
  28. {
  29.   fill(0); // ustawiamy kolor wypełnienia na czarny
  30.   clear(); // czyścimy ekran
  31.  
  32.   fill(255); // ustawiamy kolor wypełnienia na biały
  33.  
  34.   if (b == 1) // sprawdzamy czy wciśnięto przycisk
  35.   {
  36.     // rysujemy okrąg większy o określonych współrzędnych
  37.     ellipse(x/2, 512-(y/2), 50, 50);
  38.   } else
  39.   {
  40.     // rysujemy okrąg mnieszy o określonych współrzędnych
  41.     ellipse(x/2, 512-(y/2), 25, 25);
  42.   }
  43.  
  44.   // wyświetlamy dane
  45.   text("AnalogX="+(1023-x)+" AnalogY="+(1023-y),10,20);
  46. }
  47.  
  48. // obsługa danych z portu szeregowego
  49. void serialEvent(Serial port)
  50. {
  51.   // odczytujemy dane do momentu wystąpienia znaku nowej linii n
  52.   String input = port.readStringUntil(10);
  53.  
  54.   if (input != null)
  55.   {
  56.     // rozbijamy odczyt po przecinku i nowej linii
  57.     int[] vals = int(splitTokens(input, "\n"));
  58.     
  59.     // przypisujemy do zmiennych
  60.     x = vals[0];
  61.     y = vals[1];
  62.     b = vals[2];   
  63.   }
  64. }

Po uruchomieniu programu, możemy już obserwować co się dzieje w naszym projekcie:

Git? Git :)

Dodatkowe informacje:

Przykłady, dokumentację oraz sam program, znajdziecie na stronie domowej: https://processing.org/

Reklama

Komentarze Komentarze
Avatar 1
Michał Windows 7 / Safari 537.36
15 March 2014 - 15:36 Rzeszów

Witam.

Mam problem z tym programem. Program Processing wyrzuca mi taki błąd: "Error, disabling serialEvent() for COM5
null"

W programie ustawiłem wybór portu na automatyczny.

Co może być nie tak?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 27.0
15 March 2014 - 19:35 Bytom

Czy automatycznie wybrany prot COM5 zgadza się z faktycznym portem?

Avatar 1
Michał Windows 7 / Safari 537.36
16 March 2014 - 00:14 Rzeszów

A w jakim sposób mogę to sprawdzić? Podpinałem kabel pod każdy z portów USB i taki sam błąd wywala.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 27.0
18 March 2014 - 22:04 Bytom

Port powinien być taki sam jaki widnieje Ci przy flashowaniu pod IDE

Avatar 1
ft Windows 7 / Mozilla Firefox 37.0
18 April 2015 - 16:24 Brak informacji

U mnie "płytka" jest na com 7, a w processingu ustawiam na 1
i wszystko gra :)

Avatar 1
Bom109 Windows 7 / Safari 537.36
12 July 2014 - 16:31 Katowice

Niestety u mnie ten sam błąd w Arduino IDE mam podany COM7 i w Processingu też podaję COM7 i ten błąd: "Error, disabling serialEvent() for COM10
null"Być może to wina Windowsa... Sprawdzę później na Linuxie jak to działa.

Avatar 1
kuba Windows 7 / Mozilla Firefox 35.0
02 February 2015 - 12:35 Brak informacji

i jak rozwiązałeś ten problem z tym błedem Error, disabling serialEvent() for COM3
null"
bo u mnie tez sie pojawia i program nie pokazuje nic???

Avatar 1
DAGON Windows 7 / Mozilla Firefox 40.0
21 September 2015 - 00:02 Brak informacji

poniewaz jest blad w programie ,w lini 57 powinno byc :
int[] vals = int(splitTokens(input, ","));
i zeby dzialal dobrze przycisk w programie na arduino dopisac w linie 26 : Serial.print(",");

Avatar 1
Tullio Windows 7 / Mozilla Firefox 57.0
01 January 2018 - 16:58 Brak informacji

Thank you ,very usefull blog