processing.org
Świetny program do nauki programowania – gdyż w bardzo prosty sposób wyświetla grafikę. IDE jest proste, intuicyjne, bardzo podobne do Arduino IDE (w rzeczy samej – to też produkt MIT). Wiele osób, w tym także my, będziemy używać processing do graficznego przedstawienia tego, co „mówi” do nas Arduino (czyli Serial.print z Arduino trafi do processinga, który wyświetli stosowną grafikę). Warto wspomnieć o kilka zalet tego softwaru:
- wieloplatfromowy (Linux, Mac, Windows)
- darmowy (w tym także do celów komercyjnych)
- wyświetla grafikę 2D, ale także 3D
- obsługuje OpenGL
- ogromna liczba dodatkowych bibliotek, rozszerzających możliwości
- dużo manuali online (a także książek).
Podstawy
Język programowania to C++ (Java, JavaScript, Ruby, Python) więc nie powinniśmy się czuć się nieswojo. Przyjrzyjmy się szkieletowi typowego programu („skeczu”)
void setup(){ size(800,600); background(0); } void draw(){ ellipse(10,10, 60, 100); fill(12, 23, 34); rectangle(50,50, 100, 200); }
Widzimy dwie funkcje – setup() oraz draw() – podobnie, jak programując w Arduino IDE. To podobieństwo nie jest przypadkowe, bo jak już wspomniałem projekt powstał przez ludzi z MIT. Dlatego też znaczenie funkcji setup() jest takie samo jak w Arduino – funkcja wykona się tylko jeden raz, na początku programu. Kolejna funkcja – draw() – będzie się wykonywana „w kółko”, czyli po zakończeniu wykona się ponownie – czyli tak, jak funkcja loop() w Arduino IDE (co prawda w przypadku processinga można zmienić takie zachowanie, ale nie wnikajmy w takie szczegóły).
Po zapoznaniu się z podstawowymi prymitywami graficznymi processinga (prostokąt, linia, elipsa) przeszliśmy do części głównej dzisiejszych zajęć – połączenia Arduino z grafiką.
Wysyłamy liczby z Arduino
W przyszłości będziemy wyświetlać odczyty z podłączonych czujek (np. czujki pola magnetycznego SS49e, o czym było na poprzednich zajęciach), ale teraz upraszczamy maksymalnie i wykorzystujemy Arduino do nadawania pseudolosowych liczb całkowitych. Uruchamiamy Arduino IDE i wpisujemy poniższy skech
void setup(){ Serial.begin(9600); } void draw(){ Serial.println(random(1024)); delay(200); }
Odczyt danych z portu COM w processingu
import processing.serial.*; Serial moj_port; void setup(){ println("lista dostepnych portow COMM: "); println(Serial.list()); println("probuje port: ", Serial.list()[0]); moj_port = new Serial(this, Serial.list()[0], 9600); } int dane; void draw(){ if (moj_port.available() > 0){ dane = moj_port.read(); println("wczytalem: ", dane); }//if }
Ważne w powyższym programie jest wybórk konkretnego portu szeregowego, czyli linijka
moj_port = new Serial(this, Serial.list()[0], 9600);
gdzie ja wybrałem pierwszy element (indeks zerowy tablic, czyli [0]) z listy dostępnych portów (Serial.list()) – ale może się zdarzyć, że u Was nie będzie to pierwszy, a jakiś inny element – dlatego wypisałem na ekranie całą listę i port, z którym próbuję się połączyć. Proszę przyjrzeć się tym komunikatom, jeśli coś nie idzie tak jak powinno.
Oczywiście programik nic nie wyświetla graficznego, tylko odczytuje dane (i to błędnie! o czym wspomniałem na końcu zajęć – problem ten rozwiążemy później) i wypisuje je na ekranie. Przechodzimy do grafiki (prostej).
Kreślimy wykres
Lekko modyfikujemy programik.
import processing.serial.*; Serial moj_port; int xPos; void setup(){ println("lista dostepnych portow COMM: ", Serial.list()); println("probuje port: ", Serial.list()[0]); moj_port = new Serial(this, Serial.list()[0], 9600); } int dane; void draw(){ if (moj_port.available() > 0){ dane = moj_port.read(); println("wczytalem: ", dane); rect(xPos, height/2, 10, dane); xPos+=10; if (xPos >= width) { xPos = 0; background(0); } }//available }
Bardzo prymitywna grafika, ale niech to wystarczy na dzisiaj.
Pozostaje kilka kwestii do rozwiązania:
- poprawne wczytywanie liczb (z Arduino wysyłamy 0..1023, a processing „widzi” tylko jakieś małe liczby, <30?)
- ładniejsza grafika.
Zapraszam na kolejne zajęcia!