Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose18:melodyracerpublic:start

Dokumentation Melody Racer

Abbildung 1: Melody Racer

Projektbeteiligte

Max Lethaus, Sebastian Thümmel, Carolin Prieske

Einleitung

Waren dir Leiern bisher immer zu langweilig? Dann ist der Melody Racer genau das richtige für dich. Der Melody Racer ist ein Roboter, der eine Spur abfährt und die daneben befindlichen Noten erkennt und als Melodie wiedergibt. Die Spur kann dabei, wie in Abbildung 2 aussehen.

Abbildung 2: Notenspur
Abbildung 3: Melody Racer in Aktion

Umsetzung

Konstruktion

Materialliste
  • Holz
  • zwei Räder
  • Stützrad
  • Anitvibrations Gummimatte
Abbildung 4: Konstruktion

Das Grundgerüst des Melody Racer ist auf einer Holzplatte erbaut worden. Zur Fortbewegung wurden zwei Steppermotoren unter der Holzplatte befestigt und hinten nochmal ein Rad für mehr Stabilität. Da die Motoren zu laut sind wurde zwischen Motor und Holzgerüst jeweils eine Antivibrationsmatte angebracht. Die Kamera wurde mit Gummis an eine zusätzliche Erhöhung angebracht, um einen größeren Kamerawinkel zu erhalten. Die Steckplatine und der RaspberryPi sind über dem Rad mit Klettverschluss angebracht. Auf der Steckplatine befinden sich die Treiber für die Stepper, sowie die nötigen Kabel & Co und der RaspberryPi. Außerdem ist der Lautsprecher mithilfe der Steckplatine an den RaspberryPi angeschlossen, um die Tonausgabe zu ermöglichen.

Elektronik

Materialliste
  • RaspberryPi
  • Steppermotoren
  • Treiber
  • Sony PS 3 Kamera
  • Lautsprecher
Abbildung 5: Elektronik des Melody Racers

Wir benutzen einen RaspberryPi, weil wir für die Bildverarbeitung mehr Rechenleitung brauchen, als ein Arduino hat.

Steuerung

Das Programm muss auf dem RaspberryPi gestartet werden und läuft nicht automatisch nach dem Boot. Deswegen braucht man entweder einen bildschirm und eine Tastatur, oder einen Laptop mit SSH zugang zum RaspberryPi. Das Programm wird dann über die Kommandozeile gestartet.

Fahren

Die Steppermotoren werden an Treiber angeschlossen, um sie über den RaspberryPi steuern zu können. Dieser Treiber nimmt Gound, 5V und noch 2 GPIO Pins entgegen. Um über den einen der beiden Pins kann man die Drehrichtung steuern, während der andere die Stepps steuert. Jedes mal, wenn der Step Pin eine Spannug aufbaut, bewegt sich der Motor ein Stück. Um bei einigermaßen gleich bleibender Geschwindigkeit auf einer Spur bleiben zu können, mussten wir lenken, indem wir die Motoren unterschiedlich schnell fahren lassen. Dass zu bewerkstelligen war schwerer als anfangs angenommen. Die Geschwindigkeit der Motoren ist von der Frequenz des Step Pins abhängig. Ein normales Programm führt jedoch nur eine Aufgabe nach der anderen aus, weshalb es unmöglich ist mehr als eine Frequenz gleichzeitig an die Pins weiter zu geben. Um dieses Problem zu lösen mussten wir unser Programm multithreaden. Multithreading ist das Computer-äquivalent zum Multitasking. Mit Hilfe vom threading modul aus der Python standart libary haben wir deshalb thread klassen erstellt die separat zum Hauptprogramm laufen und die vom Hauptprogramm bestimmten Geschwindigkeiten umsetzen. Eine ähnlich gebaute klasse wird ebenfalls für den Lautsprecher verwendet, welcher ebenfalls seine eigene Frequenz braucht.

import RPi.GPIO as GPIO
 
# zum Frequenz bestimmen
import threading
from time import sleep

Lenken

Das Prinzip, mit dem der Roboter lenkt ist eigentlich simpel: Um so weiter links der Roboter von der Spur entfernt ist, desto schneller muss sich das linke Rad drehen und folglich langsamer das rechte Rad. Einem Computer kann man jedoch nicht einfach sagen, dass er mal so nach Bauchgefühl auf der einen Seite schneller fahren soll. So schlummert hinter dieser simple klingenden Aufgabe eine ziemlich schwere Problematik der Regelungstechnik, über die man ganze Arbeiten schreiben könnte, nur um die Steuerung noch etwas sauberer und effizienter zu machen. Für unsere Zielsetzung reichte jedoch eine einfachere Formel aus. Dazu hat unseren lenken() Funktion einen kleinen Streifen des Kammerbildes ausgelesen. In der Mitte des Streifens sollte sich nach Möglichkeit die Spur befinden. Lenken() berechnet dann die durchschnittliche Position der schwarzen stellen auf dem Kamerabild (ähnlich wie bei einem Notenspiegel). dieser durchschnitt liegt zwischen 0 und 1. Liegt er bei 0,5 ist die Spur genau Mittig, und beide Motoren fahren mit einem delay von 0,5 geteilt durch V (die Geschwindigkeitskonstante) (die man im code festlegen kann). Wandert die Spur zur Seite des Bildes errechnet lenken() z.B. einen durchschnitt von 0,25 und weist dem einen Motor eine delay-Zeit von 0,25 / V zu.Während der andere Motor 0,75 / V zugewiesen bekommt. So lenkt die Funktion proportional stark zur Größe der Abweichung.

Kamera

Die Sony PS 3 Kamera ist ebenfalls an den RaspberryPi angeschlossen und die Bildverarbeitung funktioniert über die Bibliothek OpenCV. (Die benötigten Pakete sind in dem Raspian repository und müssen nicht selber kompilliert werden)

Abbildung 6: Thresholding 1)

Hier benutzenen wir „thresholding“ um ein Binäres Bild zu erzeugen mit nur schwarze und weiße Pixel. Dieses Bild ist eigentlich ein zweidimensionales Array wo weiße Pixel den Wert 255 haben und schwarze 0. Den Schwellenwert ist immer gleich. Mit „adaptive gaussian thresholding“ (siehe Ab. 6) haben wir es leider nicht zum Laufen gebracht.

Noten erkennen

Um die Noten zu erkennen, wird nur ein horizontaler Streifen mit der y-Kordinate 400 betrachtet. Es wird jede 25 Pixel geguckt, ob der Block (25×25 Pixel) schwarz ist und es entsteht eine Liste (Array) von True/False Werten. Wir haben ebenfalls anfangs eine Liste deklariert mit den Frequenzen der Noten C3 bis C7 (siehe unten). Falls an einer Stelle in der Liste zur Notenerkennung „True“ steht, wird die Frequenz an dem gleichen Index der Liste der Notenfrequenzen genommen und diese wird dann zur Tonausgabe verwendet.

Ton

Die eigentliche Idee war Piezosummer für die Tonausgabe zu nutzen. Aber, aufgrund der hohen Lautstärke der Steppermotoren und der niedrigen Spannung für den Piezo, mussten wir einen Lautsprecher nehmen.

# Frequenzen der Noten C3 bis C7 in Hz (nicht alle genutzt)
noten = [131, 147, 165, 175, 196, 220, 247, 262, 294, 330, 349, 392, 440, 494,
 523, 587, 659, 698, 784, 880, 988, 1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093]

Ergebnis

Der Roboter kann eine Spur verfolgen und Noten spielen. Das funktioniert relativ gut, manchmal klappt das Zusammenspiel aus Noten erkennen und in der Spur bleiben nicht, aber es wurde fast gänzlich behoben. Den Anfang von „Alle meine Entchen“ konnte der Roboter problemlos abspielen. Man muss aber die Notenblöcke sehr genau in der richtigen Größe zeichnen. Sonst kann es passieren, dass zwei verschieden angedachte Töne, vom Melody Racer als ein Ton gespielt wird oder zwei aufeinanderfolgende Töne werden mit auslassen eines Tons gespielt. Gleichzeitig mehrere Noten zu spielen, ist nicht möglich.

Abbildung 7: Alle meine Entchen

Code

projektesose18/melodyracerpublic/start.txt · Zuletzt geändert: 2018/11/09 11:04 von d.golovko