Processing – interfejs na sterydach

Każdy, kto zainteresuje się Arduino raczej prędzej niż później natknie się na nazwę Processing. Processing jest to oprogramowanie na bazie którego zbudowano Arduino IDE. Ale to nie jedyne pole styczności.

Najpierw – co to jest Processing?

Jest to język programowania (na licencji open source) wraz ze środowiskiem IDE stworzonym z myślą o ludziach zajmujących sztuką elektroniczną oraz komunikacją wizualną (za angielską Wikipedią). A po ludzku? Wystarczy przejrzeć na przykład serwis Vimeo pod kątem tagu processing.org. Albo grupę processing na YouTube. Wizualizacja danych, eksperymenty multimedialne, itp. Obejrzyjmy na przykład ruch pociągów w Melbourne:

Ebb and Flow of Melbourne Trains by Flink Labs from Flink Labs on Vimeo.

No właśnie, a skąd dane? A mogą być z Arduino, które oczujnikowane może dostarczyć sporo różnych danych do wizualizowania.

Podam teraz prosty przepis jak wykorzystać Arduino i Processing do zbudowania khm… oscyloskopu :) Oscyloskop – to za dużo powiedziane – wizualizacja napięcia na jednym wejściu analogowym jest właściwszym określeniem.

Arduino robi jedno – mierzy napięcie na wejściu analogowym i wysyła informacje na port szeregowy. Aplikacja w napisana w Processingu zbiera te dane i rysuje kreskę. Po kolei:

W Arduino IDE wpisujemy prosty szkic:

 
void writeOscilloscope(int value) {
  Serial.print( 0xff, BYTE );                // send init byte
  Serial.print( (value >> 8) & 0xff, BYTE ); // send first part
  Serial.print( value & 0xff, BYTE );        // send second part
}

#define ANALOG_IN 0

void setup() {
  Serial.begin(9600);
}

void loop() {
  int val = analogRead(ANALOG_IN);
  writeOscilloscope(val);
}

Kompilujemy, wgrywamy go w Arduino i zamykamy IDE. Teraz uruchamiamy Processing i wpisujemy taki szkic:

import processing.serial.*;

Serial port;  // Create object from Serial class
int val;      // Data received from the serial port
int[] values;
int i;
void setup() 
{
  size(640, 480);
  // Open the port that the board is connected to and use the same speed (9600 bps)
  port = new Serial(this, Serial.list()[0], 9600);
  values = new int[width];
  smooth();
  i=0;
}

int getY(int val) {
  return (int)(val / 1023.0f * height) - 1;
}

void draw()
{
  while (port.available() >= 3) {
    if (port.read() == 0xff) {
      val = (port.read() << 8) | (port.read());
    }
  }
  i++;
  if (i>=width-1)
    i=0;
  values[i] = val;
  background(0);
  stroke(255);
  for (int x=1; x<width; x++) {
    line(width-x,   height-1-getY(values[x-1]), 
         width-1-x, height-1-getY(values[x]));
  }
}

odpalamy i można zacząć mierzyć :) Jak to działa w praktyce?

Arduino accelerometer with poorman’s oscilloscope in background from Starter Kit on Vimeo.

Kilka słów wyjaśnienia:

  • sam dopiero zaczynam swoją przygodę z Processingiem, ale zapowiada się fascynująco, tym niemniej zdaję sobie sprawę, że moja wiedza o Processingu jest jeszcze minimalna
  • pomysł na całość i kod zostały zaczerpnięte z Accrochages, kod wyświetlający został minimalnie uproszczony w stosunku do oryginału
  • TO NIE JEST OSCYLOSKOP :) nie te czasy i częstotliwości, ale jest to niekiedy przydatne narzędzie :) jeżeli wymagania nie są zbyt wygórowane

Od razu dodam – że to co się rusza na filmie to prototyp czujnika przyspieszenia, działającego w 3 osiach (na filmie widać odczyt tylko z jednej), z maksymalnym odczytem 3g lub 11g. Prototyp prototypem, ale te czujniki przyspieszenia już są dostępne na Nettigo. Na razie nie zdążyłem przygotować jeszcze dokumentacji (czyli opisu wyprowadzeń wraz z informacją jak podłączać). Ale jeżeli ktoś potrzebuje – to już można kupić :) Ewentualny zakup niewątpliwie przyspieszy stworzenie dokumentacji :)