Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose2015:beat_it_clean:start

beat_it

Ein Projekt von Salome Hohl, Gerrit Jasper, Felix Haller, Lea Höll

………so cool, wie Michael Jackson im gleichnamigen Lied tanzen konnte - so soll auch unser Roboter sich zur Musik bewegen können. Mit der Idee einen Tanzroboter zu bauen wollen wir Abhilfe schaffen für ein Problem, welches fast jeder kennt: der Freund, der nicht auf den Beat tanzen kann.

Der Tanzroboter beat_it nimmt mithilfe von Mikrofonen Musik wahr. Nach entsprechender Signalverarbeitung werden die beats-per-minutes eines gespielten Liedes ermittelt und anschließend bewegen die Motoren die Räder mit einer bestimmten Geschwindigkeit, sodass der Roboter anfängt, sich mit „Tanzschritten“ durch den Raum zu bewegen. Dabei kommen verschiedene Anwendungen aus der Tonanalyse, Physik und Mathematik vor, welche zwar ziemlich kompliziert sind, aber am Ende zum richtigen Ergebnis führen und es ermöglichen, den Roboter zum Tanzen zu bringen!

Dabei sind der physische Aufbau des Roboters, die richtige Tonanalyse, sowie die Programmierung der Motoren, welche die der Bewegung dienenden Räder antreiben, von besonderer Wichtigkeit.

1. Im physischen Aufbau geht es um das Grundgerüst des Roboters, auf dem sich der Teensy und ein Breadboard zur Tonwahrnehmung befinden.

2. Die Tonanalyse beschäftigt sich mit der Umrechnung der vom Mikrofon aufgenommen Signale in die beats-per-minutes. Dafür wurde ein Programm geschrieben, dass mithilfe der Autokorrelation die Taktschläge errechnet.

3. Die Tanzschritte behandeln die Programmierung der Fortbewegung des Roboters auf den Beat.

Physischer Aufbau

Verwendete Materialien:
  • Grundplatte (Holz Ø30)
  • Getriebemotoren: 37D Gearmotor with Encoder
  • Narben
  • Haltewinkel
  • H-Brücke
  • Räder (Ø 8)
  • „Laufrad“
  • Akku
  • Widerstände
  • Kondensatormikrofon (2009728)
  • Teensy 3.1
  • Potentiometer
  • Verstärker
  • Kabel

Der Aufbau des Roboters ist einfach gehalten und besteht zunächst aus drei Komponenten. *Holzplatte mit Getriebemotoren zwei Rädern und einem Laufrad *Breadboard mit H-Brücke und Teensy zum ansteuern der Motoren *Breadboard mit Teensy, Mikrofon und Verstärker

oben unten

An die Holzplatte sind zwei Räder, die mit Getriebemotoren verbunden wurden, angebracht. Vorne in der Mitte befindet sich das Laufrad, sodass der Roboter auch Drehbewegungen ausführen kann. Auf der Holzplatte befinden sich die beiden Breadboards und ein Akku für die Stromversorgung. Auf den Breadboards befindet sich eine Schaltung, bestehend aus Teensy 3.1 (ein Mikrocontroller), der sozusagen das „Gehirn“ des Roboters darstellt . Für die Kommunikation zwischen Teensy und Getriebemotoren ist die H-Brücke zuständig. Eine H-Brücke bringt im Gegensatz zu einem einfachen Spannungsteiler den Vorteil, dass man, je nach Einstellung der Widerstände, die Spannung, den Strom sowie die Polarität verändern kann. Unsere Getriebemotoren „Gearmotor with Encoder“ haben wir bereits so gut wie einsatzbereit übernehmen können. Dieser Motor besitzt sechs Kabel, welche mit der H-Brücke bzw. dem Teensy verbunden werden können. Wir haben uns dafür entschieden, nur das rote und das schwarze Kabel, also nur die zur einfachen Stromversorgung für den Motor notwendigen Kabel, mit unserer H-Brücke zu verbinden. Damit war es uns möglich, die Räder unseres beat_it überhaupt erst in Bewegung zu bringen, generell ihre Drehgeschwindigkeit zu verändern, als auch sie zu beschleunigen. Die weiteren vier Kabel für den Encoder haben wir ungenutzt gelassen. Sie hätten es uns möglich gemacht, von den Getriebemotoren eine Rückmeldung zu bekommen (z.B. wie weit genau sie sich gedreht haben) und dadurch die Geschwindigkeit genauer einstellen zu können. Da die exakte Geschwindigkeit an sich jedoch nicht wirklich notwendig ist, um den Takt beim Tanzen einzuhalten, haben wir darauf verzichtet, die Kabel mit anzuschließen. Die zweite Schaltung, die ebenfalls mit dem Teensy verbunden ist, dient zur Aufnahme der Musik. Sie besteht aus einem Kondensatormikrofon, das Schwingungen aufnimmt und sie in Stromstöße/Wechselspannung verarbeitet. Dabei ist ein zwischengeschalteter Kondensator dazu da, die Wechselspannung des Mikrofons weiterzuleiten und den Gleichstrom zu sperren. Das Potentiometer dient zu Regelung der Empfindlichkeit des Mikrofons und der Verstärker verstärkt das Eingangssignal des Mikrofons. Der Teensy ist hier wieder für die Kommunikation zwischen aufgenommen Daten und Computer zuständig: die Informationen werden mit dem in der Arduino-Software geschriebenen Programm verbunden, sodass der Roboter im Endeffekt die Befehle ausführt.

Tonanalyse

Die Tonanalyse ist mit der komplizierteste Teil am ganzen Projekt. Es gilt erst einmal, die Musik wahrzunehmen, Signale zu verarbeiten und daraus den Beat zu erkennen. Die Musik wird mithilfe der im Punkt 1 „Physischer Aufbau“ beschriebenen Kombination aus Kondensatormikrofon und Verstärker in Wechselstromsignale umgewandelt, welche mithilfe des Teensy 3.1. sowie des Programmes Arduino bearbeitet werden.

Das Mikrofon an sich sendet zuerst nur einfache Daten an den Teensy. Diese Werte lassen sich einfach vom Teensy auslesen. Mithilfe einer bereits vorhandenen Software library lassen wir den Teensy das Audiorohsignal in mehrere Frequenzbereiche zerlegen. Dieses Signal kann man sich auch gut ausgeben lassen und man erhält eine hilfreiche Tabelle, in der Frequenzintensitäten zu spezifischen Zeitpunkten dargestellt werden.

Anschließend wendet man die Autokorrelation an; ein Verfahren, welches vor allem in der Signalverarbeitung sehr populär ist. Das Grundprinzip besteht darin, nun das Signal an einem gewissen Zeitpunkt mit sich selber zu einem anderen Zeitpunkt zu vergleichen. Dies können wir in der Beaterkennung verwenden, da elektronische Lieder häufig Wiederholungen aufzeigen. Deshalb eignet sich Autokorrelation für unsere Beaterkennung sehr gut. Die Autokorrelation besteht aus einer Fourier-Transformation, welche nochmal auf die bereits transformierten Signale angewandt wird. Die komplexen Zahlen werden darauf quadriert und danach wieder invers Fourier-transformiert. Dies verkürzt den Prozess der Autokorrelation soweit, dass es auch Microprozessoren schnell genug ausrechnen können.

Nach der Autokorrelation haben wir also ein Tabelle, die uns zeigt, zu welchen Zeitpunkt sich das Signal selber am meisten ähnelt. Da die unverschobene Autokorrelation mit sich selbst am ähnlichsten ist, ist sie zum Zeitpunkt 0 am höchsten. Deshalb wird sie bei der folgenden Maximumbestimmung nicht verwendet. Nun muss nur noch die höchste Übereinstimmung des Signals zu bestimmten Zeitpunkt gefunden werde. Wir nehmen als das Maxiumum der Autokorrelation und messen darauf den zeitlichen Abstand zum Nullpunkt in Millisekunden. Das rechnen wir anschließend auf Minuten hoch und wir haben den Bpm.

Hochrechnung auf Minuten: (Zeitpunkt(Maximum)-Zeitpunkt(0)) * 60 / 1000

Nun bleibt noch ein Problem: Der errechnete Bpm kann sich durch ein ganzzahliges Skalar unterscheiden. Zum Beispiel 112 Bpm = 2*56Bpm. Der Großteil westlicher Musik und vor allem elektronischer Musik verwendet 4/4 Takte. Deshalb sind beispielsweise Lieder mit 56Bpm genau so schnell wie Lieder mit 112Bpm. Damit der Roboter aber Tanzschritte immer gleich ausführt verdoppeln wir die Bpm bis er mindestens 100 erreicht, ein Minimum, das man bei Electro erwarten kann.

Tanzschritte

Nachdem unser Roboter beat_it jetzt den Takt bzw. im besten Fall sogar die BPM des Liedes herausgefunden hat, geht es an das eigentliche Tanzen. Dieser Abschnitt ist in drei Unterbereiche aufgeteilt. Zunächst einmal die Bewegung an sich, anschließend die Tanzschritte als Ganzes und zuletzt diese zufällig durchgeführt, zeitlich jedoch an das Lied angepasst und somit passend zum Beat des Liedes.

Anschließend an die im physischen Teil bereits erläuterten Vorbereitungen für die Bewegungen der Räder (M1 und M2) von beat_it ist nun der nächste Schritt der Programmierteil.

In unserem Arduino-Programm müssen unsere Teensy-Pins M1IN1, M1IN2, M2IN1 und M2IN2 initialisiert und deklariert werden, anschließend werden ihnen im Serial.begin die Eigenschaft OUTPUT zugeordnet. Diese Pins wiederum sind mit der H-Brücke verbunden und steuern, wieviel Strom auf unsere Motoren übertragen wird. Angetrieben werden die Motoren durch eine Pulsweitenmodulation (PWM) der elektrischen Spannung auf die Räder, die durch die dadurch entstehenden elektrischen Impulse gesteuert werden.

Die digitalen Signale unseres Teensys können auf diese Weise analoge Geräte wie einen Motor steuern. Mit dem Befehl analogWrite können wir mit Werten von 0 bis 255 genau diese Impulse hervorrufen. Wird der Wert 255 eingetragen, gibt es ein konstantes Signal von 5 Volt, je kleiner der Wert, desto häufiger wird die Stromzufuhr regelmäßig kurz abgebrochen. Bei dem Wert Null, wird dauerhaft kein Strom übertragen, der Motor bewegt sich also gar nicht.

Für die einfache Vorwärts- oder Rückwärtsbewegung ist es nun wichtig, je einem der Pins IN1 und IN2 den Wert 0 zuzuordnen und dem anderen eben den Wert, mit dessen Geschwindigkeit sich das Rad bewegen soll, und das je für die beiden Motoren M1 und M2 gleich zu tun. Eine Drehung unseres Roboters wird einfach durch eine langsamere Geschwindigkeit auf einem der beiden Motoren hervorgerufen. Ist das linke Rad langsamer, fährt unser beat_it nach links und genauso mit rechts. Damit haben wir unsere einfachen Bewegungsabläufe bereits erstellt. Wir haben sie in eigenen Methoden in unser Programm geschrieben.

Nun zu den Tanzschritten. Dies ist, nachdem wir bereits Methoden für die einzelnen Bewegungen haben, nicht weiter kompliziert.

Auch die einzelnen Tanzschritte (wir haben uns für insgesamt fünf Verschiedene entschieden, die je bis zu vier verschiedene Bewegungen nacheinander aufrufen), haben wir in einzelne Methoden geschrieben, um unsere eigentlich Loop möglichst übersichtlich zu halten. Hier gab es nur ein kleines Problem. Die Dauer einer Bewegung innerhalb unseres Tanzschrittes haben wir anfangs mithilfe eines delays (also einer Pause) von einer bestimmten Zeitspanne geregelt. Leider stoppt ein delay das gesamte Programm und damit auch die Beaterkennung. Um dies zu umgehen, haben wir jede Bewegung in eine if-Schleife geschrieben.

Aussichten:

Als letzter Punkt fehlt nun noch die zeitliche Anpassung an den Takt bzw. die BPM. Das haben wir einmal über den Parameter millis gemacht, der die Zeit ab dem Beginn des Programms in Millisekunden zählt, und dann noch mit dem Intervallparamter interval, welchem wir abhängig von der ausgerechneten BPM deklarieren. Ein Intervall entspricht hierbei einem Viertel der Dauer eines Tanzschrittes, bei vier verschiedenen Bewegungen also genau einer dieser. In unserer Loop werden nun die Tanzschritte zufällig über den Befehl random aufgerufen, was sich alle vier Intervalle wiederholt. Angefangen wird das Tanzen des Robotors, indem wir den Zeitpunkt eines Beatschlages nehmen und ein kleines Vielfaches unseres BPMs hinzufügen und diesen Zeitpunkt dann als Start verwenden.

Dies liegt momentan jedoch noch in der Zukunft. Auch das Verbinden zwischen Beaterkennung und Tanzen ist noch zu bearbeiten. Das endgültige Ergebnis unseres Roboters beat_it werden wir innerhalb der nächsten Woche hochladen. findbeats.zip

projektesose2015/beat_it_clean/start.txt · Zuletzt geändert: 2016/01/21 12:45 (Externe Bearbeitung)