Processing + Arduino + Eclipse (+ Proclipsing) — tutorial


W związku z tym, że ostatnio w ramach Medialab majstrowałem co nieco — postanowiłem opublikować mały tutorial wyjaśniający jak zacząć korzystać z Processing komunikującego się z Arduino a wszystko nie w processingowym edytorku, ale w Eclipse.

Dlaczego warto korzystać z Eclipse?
IDE (o ile w ogóle można o tym edytorku tak powiedzieć) dostarczane wraz z Processing, sprawdza się w przypadku malutkich programików. Jednak w momencie, kiedy nasza aplikacja zaczyna obrastać klasami, jej debugowanie (wyszukiwanie i naprawianie błędów) staje się praktycznie niemożliwe. Nawet w przypadku poszukiwania nie wiadomo gdzie, postawionej nieświadomie kropki, processingowy edytorek lubi się zgubić, a wręcz wprowadzić nas w błąd. Wtedy pozostaje tylko wertowanie całego kodu (wszystkich klas) linijka po linijce — w Eclipse (oraz innych poważnych IDE) takiego problemu nie ma. Błędy w składni są lokalizowane w locie, a do tego mamy do dyspozycji zestaw narzędzi umożliwiających prześledzenie co dzieje się z programem w trakcie jego działania oraz wspomagających zarządzenie kodem oraz całym projektem. Dodatkowo do Eclipse możemy zainstalować plugin Proclipsing ułatwiający pracę z Processing.

A teraz konkrety, czyli jak zacząć korzystać z Processing + Arduino w Eclipse (+ Proclipsing):

  1. Instalujemy Arduinoszczegóły na temat instalacji Arduino na stronie Arduino.
  2. Instalujemy Processingszczegóły na temat instalacji Processing na stronie projektu Processing.
  3. Konfigurujemy Processing oraz Arduino tak aby się ze sobą komunikowały za pomocą podstawowej metody wykorzystującej Firmata (wgrywamy Firmata do Arduino, instalujemy biblioteki Arduino oraz Serial dla Processing, testujemy za pomocą przykładowego kodu, nie zapominając o ustawieniu poprawnego portu COM w ów kodzie) — wszystko krok po kroku jest opisane w instrukcji na Android Playground.
  4. Jeśli wszystko poszło dobrze, przykładowy kod (sekcja Example) wklejony do Processing IDE, powinien się uruchomić i sterować stanem pinu 13 podłączonego Arduino (działanie powinno być również obserwowalne dzięki wbudowanej LED na płytce w pobliżu pinu 13, choć nie wszystkie wersje Arduino takową posiadają).
    Jeśli jednak stan pinu 13 pozostaje bez zmian, Processing nie zwraca żadnego błędu, a diody TX, RX na Arduino nie mrugają, prawdopodobnie podałeś niewłaściwy port COM via który ma się komunikować z Arduino. Metoda println(Arduino.list()); wylistuje wszystkie dostępne porty COM w konsoli, a wchodząc do Arduino IDE następnie menu Tool → Serial Port sprawdzamy pod którym z nich jest podpięte Arduino. W linijce 'arduino = new Arduino(this, Arduino.list()[XXX], 57600);zaXXX` należy wpisać numer portu COM na którym komunikuje się Arduino z komputerem (w przykładzie domyślnie jest 0, czyli pierwszy na liście).
  5. Instalujemy Eclipse IDE for Java Developers: http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/indigosr2
  6. Instalujemy Plugin Proclipsing: szczegółowy opis instalacji na stronie Proclipsing.
  7. W Eclipse tworzymy nowy projekt File → New Project → Processing → Processing Project → Next → Podajemy nazwę projektu „Project Name” proponuję ArduinoTest, lokalizację processingu tj. folder w którym znajduje się plik processing.exe „Processing Path” oraz folder z processingowymi projektami „Processing Sketch Path” (łatwo go zlokalizować w Processing IDE: Ctrl+K)
  8. Jeśli wskazaliśmy prawidłowe foldery, w okienkach „Select Libraries” to Import powinny pojawić się checkboxy umożliwiające łatwy import bibliotek do naszego projektu już na starcie — zaznaczamy w górnym serial, w dolnym arduino → klikamy Finish.
  9. W okienku Package Explorer lub Project Explorer rozwijamy nasz projekt ArduinoTest → src → arduinotest → (podwójny klik) ArduinoTest.java
  10. Usuwamy wszystko i wklejamy program testowy:
package arduinotest;

import processing.core.PApplet;
import cc.arduino.*;
import processing.serial.*;

public class ArduinoTest extends PApplet
{

 Arduino arduino;
 int ledPin = 13;

 public void setup()
 {
  println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[0], 57600);

  //nie zapomnij podać poprawny numer portu COM
  arduino.pinMode(ledPin, Arduino.OUTPUT);
 }

 public void draw()
 {
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(1000);
 }
}

Jeśli wszystko pójdzie dobrze, po uruchomieniu (CTRL+F11), program będzie sterował pinem 13, dokładnie tak, jak to miało miejsce w punkcie 4. kiedy uruchamialiśmy przykładowy program z poziomu Processing IDE.

Jeśli macie pytania, uwagi, coś nie działa, etc. — piszcie, chętnie pomogę :)

Problemy

Jeśli używacie JDK x64/Windows x64 możecie spotkać się z czymś takim:

java.lang.UnsatisfiedLinkError:
D:Eclipse workspaceArduinoTestlibbaseserialrxtxSerial.dll:
Can't load IA 32-bit .dll on a AMD 64-bit platform thrown
while loading gnu.io.RXTXCommDriver java.lang.UnsatisfiedLinkError:
D:Eclipse workspaceArduinoTestlibbaseserialrxtxSerial.dll:
Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at gnu.io.CommPortIdentifier.(CommPortIdentifier.java:123)
at processing.serial.Serial.list(Unknown Source)
at cc.arduino.Arduino.list(Arduino.java:139)
at arduinotest.ArduinoTest.setup(ArduinoTest.java:14)
at processing.core.PApplet.handleDraw(Unknown Source)
at processing.core.PApplet.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Animation Thread" java.lang.RuntimeException:
Error inside Serial.ports()
at processing.serial.Serial.errorMessage(Unknown Source)
at processing.serial.Serial.list(Unknown Source)
at cc.arduino.Arduino.list(Arduino.java:139)
at arduinotest.ArduinoTest.setup(ArduinoTest.java:14)
at processing.core.PApplet.handleDraw(Unknown Source)
at processing.core.PApplet.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Wynika to z faktu, że plugin Proclipsing, domyślnie ładuje do naszego projektu 32 bitową wersję pliku rxtxSerial.dll obsługującego komunikację z portem szeregowym (COM) — musimy go teraz zastąpić wersją 64 bitową:

  1. W Project Explorer rozwijamy ArduinoTest → lib → base → (prawy przycisk myszy) serial → Import → General → File System → Next
  2. Następnie przy polu From Directory klikamy Browse, wyszukujemy folder z Processingiem (w którym znajduje się plik processing.exe), dalej rozwijamy i wskazujemy modes\java\libraries\serial\library → windows64 → OK
  3. Po prawej stronie zaznaczmy checkbox rxtxSerial.dll → Finish, powinien pojawić się komunikat „Overwrite 'rxtxSerial.dll’ in folder 'ArduinoTest\libs\base\serial’?” → Yes.
  4. Po uruchomieniu programu powinno wszystko działać.

Zobacz więcej