Würfel-Controller Prototyp mit Accelerometer

Einführung ins Arduino-Programm und die Verdrahtung

Das Herzstück unseres ersten Soundcontrollers bildet ein Arduino NANO, welcher die Daten eines Beschleunigungssensors (MPU6050) verarbeitet und nach der Bestimmung dessen Lage, via des Seriellen Ports, jeweils eine MIDI-Note in einem Velocity-Bereich sendet.

Der nachfolgende Schaltpan zeigt unser Verdrahtungskonzept. Über den I2C-Bus (SCL und SDA) fragt der Arduino die Werte der drei Raumachsen vom Beschleunigungssensor ab. Da dieser ebenfalls die Erdbeschleunigung (1g) erfasst, ist es möglich aus den ausgegebenen Werten die Lage des Sensors zu ermitteln. Wenn die Werte X: 0g, Y:0g und Z:+1g vorliegen, bedeutet das beispielsweise, dass der Sensor gerade liegt, da die Erdbeschleunigung lediglich in positiver Richtung auf die Z-Achse wirkt.

Im folgenden wird nun die Programmierung des Arduinos erläutert. Für die vereinfachte Darstellung werden nachfolgend lediglich Auszüge des Codes gezeigt. Das vollständige Skript kann am Ende des Beitrags heruntergeladen werden.

accelgyro.getAcceleration(&acc_x, &acc_y, &acc_z);

Zu Beginn des Arduino-Sketchs wird die Methode .getAcceleration aufgerufen. Sie bietet die Möglichkeit, die Beschleunigungswerte der X-, Y- und Z-Achse abzufragen und anschließend jeweils in einem 16-Bit-Integer zu speichern. Das hat zur Folge, dass jede Variable, die den Achsen zugewiesen wurde, einen Wert von -32.768 bis 32.767 annehmen kann. Dabei gilt 16.000 ≈ 9.81 m/s2. Dies entspricht also genau der Erdbeschleunigung. Wenn die ausgelesenen Daten ein negatives Vorzeichen beinhalten, bedeutet dies, dass der Sensor auf dem Kopf steht.

if (acc_x < thr_x_plus && acc_x > thr_x_minus && acc_y < thr_y_plus && acc_y > thr_y_minus && acc_z > thr_z_plus && acc_z > thr_z_minus) {//trigger if 1 is up
        isSide(1);
    }

Der gezeigte Code-Ausschnitt ist ein Beispiel für eine IF-Anweisung von der sich im Sketch insgesamt sechs Stück befinden. Diese werden nacheinander im Loop durchlaufen. In diesem Beispiel wird verglichen, ob sich die ausgelesenen Werte über bzw. unter einem zuvor definierten Schwellwert befinden. In dieser speziellen Bedingung wird geprüft, ob die Beschleunigung entlang der Z-Achse größer oder gleich 9.81 m/s2 ist. Trifft diese Prüfung zu, bedeutet das, dass der Sensor sich in Ruhelage befindet und Seite 1 des Würfels nach oben zeigt. Daraufhin wird die Funktion isSide(1); aufgerufen und der Wert 1 für Seite 1 übergeben. Analog funktioniert die Abfrage für die anderen Seiten des Würfels. Da sich für jede Seite die Richtung in die geprüft ändert, wird die Funktion isSide(int); jedes mal mit dem individuellen Übergabewert aufgerufen.

bool isSide(int currentSide)
{
    if (side != currentSide)
    {
        MIDI.sendNoteOff(60, 0 , 1);
        side = currentSide;
        MIDI.sendNoteOn(60, side * 20 - 10, 1); //Should send 10, 30, 50, 70, 90, 110, depending on side 1-6
    }
}

Mit Hilfe der Funktion isSite( int ); wird überprüft, ob die aktuelle Würfelseite die gleiche wie im vorherigen Durchlauf ist. Falls dem nicht so ist, wird zunächst ein Note-Off-Signal an den PC gesendet. Anschließend wird die aktuelle Würfelseite für den Vergleich im nächsten Durchlauf gespeichert und anschließend ein Note-On-Signal gesendet. Die Seiten des Würfels sind auf jeweils von einander verschiedene Anschlagbereiche gemappt. Die Funktion wird fortlaufend ausgeführt.

Bilder vom Prototyping und Code Download

Verfasst von: