Kaleidoskop // Gyroskop trifft Processing // Yasmin

Im Rahmen meines Semesterprojektes bin ich auf die Schnittstelle zwischen Arduino und Processing gestoßen und bekam dabei Lust weiter damit zu experimentieren. In diesem Protoyp kann man durch die Bewegung eines Gyroskops (GY-521 Modul) ein Kaleidoskop in Processing steuern.

https://editor.p5js.org/yasmin.moeller/sketches/75-GSj7T5

Das Skript für das Kaleidoskop habe ich vorerst in p5.js geschrieben und dann an Processing angepasst. In der Version in p5.js ist die Rotation des Kaleidoskops noch von der Position der Maus abhängig, in Processing hab ich die Bewegung des Kaleidoskops dann von der Drehung des Gyroskops um die Y-Achse abhängig gemacht. Die am Anfang des Skriptes definierten Konstanten können verändert werden, wodurch spannende Variationen des Musters entstehen.

Hier findet ihr den vollständigen Code für Processing:

https://github.com/YasminMoeller/kaleidoscope/blob/master/kaleidoscope.pde

[Bild des Schaltplans folgt….]

Als Sensor nutze ich das Gyroskop eines GY-521 Moduls. Den Code dafür habe ich aus folgendem Tutorial übernommen: https://mschoeffler.com/2017/10/05/tutorial-how-to-use-the-gy-521-module-mpu-6050-breakout-board-with-the-arduino-uno/

Meinen kompletten Code für das Arduino findet ihr hier:

https://github.com/YasminMoeller/kaleidoscope/blob/master/gyroscope.ino

In meiner Version sind unnötige Zeilen ausgegraut, aktuell nutze ich nur die Rotations-Daten der Y-Achse. Um diese lesbar an Processing weiter zu leiten, habe ich die seriellen Daten folgendermaßen aufgebaut:

<strong></strong>

 // send serial message over to processing
Serial.print('H');
Serial.print(",");
//Serial.print(convert_int16_to_str(accelerometer_y));
Serial.print(accelerometer_y);
Serial.print(","); // note that a comma is sent after the last field
Serial.println(); // send a cr/lf

delay(100);

 

Beispielhaft könnte eine Zeile der seriellen Daten so aussehen: H, 1243,
Processing erkennt am ‚H‘, dass die Nachricht beginnt, trennt an den Kommata und speichert den gesendeten Wert als Integer ab. Das passiert in der Funktion serialEvant(). Der empfangene Wert, im Beispiel 1243, wird dann weiterverwendet als Input für die Rotation des Kaleidoskops und die Position der Formen des Musters.
Zusätzlich habe ich ein Delay am Ende der Setup Funktion eingefügt, da es ohne häufig zu Fehlermeldungen kam.

Zur Kommunikation zwischen Arduino und Processing gibt es auch ein gutes Tutorial: https://learn.sparkfun.com/tutorials/connecting-arduino-to-processing/all

Die Daten der y-Rotation scheinen nach folgendem Muster aufgebaut zu sein:

[Schema folgt…..]

Dadurch ergibt sich für mich das Problem, dass ich nur eine Rotation von 180° auf das Kaleidoskop übertragen kann. Aber die halbe Rotation funktioniert schonmal sehr gut:

[GIF folgt….]