Das Projekt IrgendwasMitMusik ist ein automatisches Xylophon, was ein spezielles Notenblatt verarbeitet und diese Noten dann automatisch abspielt. Für das Notenblatt wird ein Blatt Papier mit Löchern versehen. Dieses wird in das Lesegerät geschoben. Dort blockiert das Blatt das Licht des Lichtstreifens oder lässt es auf die Phototransistoren (Lichtmesser) einfallen. Das Notenblatt wird durch einen Stepper-Motor immer um eine Einheit weiter transportiert, bis das gesamte Notenblatt gelesen wurde.(siehe Abb. 2) Diese „Noten“ werden gespeichert und interpretiert. Dementsprechend dreht sich einer der drei Servo-Motoren auf den übergebenen Winkel. Die drei Schlägel sind an den drei Servo-Motoren befestigt. Dadurch wird der Kopf des Schlägels über die richtige Platte des Xylophons gedreht. Der Schlägel befindet sich nicht im Gleichgewicht, sondern liegt auf einer Platte des Hubmagneten auf. Schlussendlich wird der richtige Hubmagnet betätigt, sodass der Schlägel die Platte auf dem Xylophon trifft und ein Ton erklingt. Diese Prozedur wiederholt sich, bis zum Ende der Noten, welche gespeichert sind.
P.S. Unser Projekttitel IrgendwasMitMusik stammt daher, dass es anfangs ein Platzhalter war für einen anständigen Namen, jedoch haben wir uns mit der Zeit an den Namen emotional angehängt, sodass wir den Namen nicht mehr rausschmeißen konnten.
Der Roboter besteht aus dem Lesegerät und dem Abspielgerät. Das Lesegerät hat acht Phototransistoren, mit welchen das Notenblatt interpretiert wird. Dabei schiebt der Stepper Motor das Blatt weiter. Das Abspielgerät besteht aus drei Servos und drei Hubmagneten, welche die Schlägel einstellen und das Xylophon anschlagen.
Diese ist mit einer weiteren Schraube, die von der anderen Seite kommt, mit Hilfe eines Schrumpfschlauchs und ein wenig Sekundenkleber veklebt. Die entstandene Stange wird vom Stepper gedreht und bekommt durch Heißkleber etwas Gripp. (siehe Abb. 6) Das Notenblatt wird zwischen dieser Stange und vier Rollen gedrückt und so fortbewegt. Dabei ist zu berücksichtigen, dass die Reibung zwischen Schrauben und Gestell manchmal zu hoch ist, wodurch der Stepper stockt. Das ist aber kein Problem beim Lesen, da sich das Programm in einem Loop befindet.
„Setup“ außerhalb setup(): Die Servos werden hier initialisiert, mitsamt der Variablen, die sich außerhalb der Methoden befinden müssen (globale Variablen). Hier ist es gut zu wissen, dass A0, A1 etc. als Integer gelten. So kann das Array initialisiert werden.
#include <Servo.h> Servo cde; //Servos zuständig für jeweils die Notengruppe (C,D,E) (F,G,A) (H,C) Servo fga; Servo hc; //Testwerte, damit man beim Testen nicht im ganzen Code rumsuchen muss. int einPinAn = 2500; //Ein Phototransistor ist beleuchtet int keinPinAn = 1200 ; //Kein Phototransisotr ist beleuchtet int notenblatt[300]; //Der Array, wo die Noten gespeichert werden. int tonzahl = 0; //Zählt die Anzahl der hinzugefügten Noten int analog_pin[] = {A0, A1, A2, A3, A4, A5, A6, A7};
Methode setup(): Es initialisiert die analogen Pins in einer Schleife und auch alle benötigten digital Pins. Dazu kommen auch die Servos.
void setup() { Serial.begin(2400); for (int i = 0; i < 8; i++) { //for-loop für alle analogen Pins, die an die jeweiligen Phototransistoren angeschlossen sind. pinMode(analog_pin[i], INPUT); } pinMode(2, OUTPUT); //Hubmagneten pinMode(4, OUTPUT); pinMode(7, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); // Arduino blinkt, wenn es gerade ein Ton gelesen hat. pinMode(10, INPUT); //Output (Knopf für das Abspielen von Noten) pinMode (9, INPUT); //Read (Schalter für das Lesen der Noten) cde.attach(3); //Servos fga.attach(5); hc.attach(6); pinMode(12, OUTPUT); //Direction digitalWrite(12, HIGH); //Einstellung der Drehrichtung pinMode(11, OUTPUT); //Step (Für den Stepper am Lesestand) }
Methode loop(): Hier wird auf vier Zustände geprüft. (siehe Abb. 9) - Leseschalter ist an: Während der Leseschalter an ist, wird folgendes ausgeführt: Zuerst bewegt sich der Stepper immer um einen Schritt, bis nur ein Phototransistor beleuchtet wird. Da es sich dann in einem Zustand befinden sollte, in dem es liest, wird die Methode ablesen(int i) 8 Mal ausgeführt, jedes Mal für einen Phototransistor. - Knopf für das Spielen: Hier wird einfach nur die Methode abspielen() aufgerufen. Optional kann für die Kontrolle der Noten auch die Methode ausgeben() aufrufen, um die Noten bei dem Serial Monitor auszugeben. - Keine Angabe: Gibt konstant „Bitte eine Aktion waehlen“ aus. - Beide Ausgewählt: Gibt konstant „Bitte nur eine Aktion waehlen“ aus.
void loop() { // Serial.println(analogRead(4)); //Tester if (digitalRead(9) == HIGH && digitalRead(10) == LOW) { while ((holInputSumme() > einPinAn || holInputSumme() < keinPinAn) && digitalRead(9) == HIGH) { digitalWrite(11, HIGH); delay(3); digitalWrite(11, LOW); delay(3); } if (holInputSumme() < einPinAn && holInputSumme() > keinPinAn) { for (int i = 1; i <= 8; i++) { ablesen(i); digitalWrite(LED_BUILTIN, LOW); } } } else if (digitalRead(9) == LOW && digitalRead(10) == HIGH) { ausgeben(); //Test abspielen(); } else if (digitalRead(9) == LOW && digitalRead(10) == LOW) { Serial.println("Bitte eine Aktion waehlen"); } else if (digitalRead(9) == HIGH && digitalRead(10) == HIGH) { Serial.println("Bitte nur eine Aktion waehlen"); } }
Methode holInputSumme(): Gibt die Summe der Lichtwerte von den Phototransistoren aus. Es ist besser, den Wert nicht als Variable zu speichern, damit man nicht aus Versehen „alte“ Zustände kontrolliert, sondern immer die neusten Lichtwerte prüft.
int holInputSumme() { return analogRead(A0) + analogRead(A1) + analogRead(A2) + analogRead(A3) + analogRead(A4) + analogRead(A5) + analogRead(A6) + analogRead(A7); }
Methode ablesen(int note): bekommt eine Note übergeben, die es lesen soll und trägt sie ein, wenn folgende Bedingungen (if's) erfüllt sind. - 'if': Es wird geprüft, ob wirklich nur ein Phototransistor beleuchtet wird. Wenn ja, prüft es in einer for-Schleife, ob alle anderen Phototransistoren beleuchtet werden. - 'if': Hier wird der Trick verwendet, dass int note -1 äquivalent zu dem Index des analogen Pins ist, zu dem der Phototransistor der Note verbunden ist. So werden bei „if (i != note - 1)“ alle anderen Phototransistoren geprüft, ob sie Werte unter 500 liefern, was heißen würde, dass sie nicht beleuchtet werden. Wenn dies der Fall ist, wird die Variable „anderePin“s nicht verändert, sondern bleibt als true. Ansonsten liefert sie nach der Schleife „false“. - 'if': Wenn nun „anderePins“ true liefert und der entsprechende Phototransistor zu der Note beleuchtet wird, wird die Note eingetragen und der Zähler „tonzahl“ um eins addiert. Auch kommt das Licht bei dem Arduino an, um zu signalisieren, dass eine Note gelesen wurde. Danach kommt der Stepper in Aktion und rollt das Papier weiter bis kein Licht mehr auf die Phototransistoren fällt. Diese Aktion ist mit der Stepper-schleife in der loop() Methode verbunden.
void ablesen(int note) { if (holInputSumme() < einPinAn) { boolean anderePins = true; for (int i = 0; i < 8; i++) { if (i != note - 1) { anderePins = anderePins || analogRead(analog_pin[i]) < 500; } } if (analogRead(analog_pin[note - 1]) > 500 && anderePins) { notenblatt[tonzahl] = note; tonzahl++; digitalWrite(LED_BUILTIN, HIGH); delay(1000); while (holInputSumme() < einPinAn && holInputSumme() > keinPinAn) { digitalWrite(11, HIGH); delay(3); digitalWrite(11, LOW); delay(3); } delay(1000); } } }
Methode ausgeben(): Einfacher for loop mit println() für die Kontrolle.
void ausgeben() { for (int i = 0; i < tonzahl; i++) { Serial.println(notenblatt[i]); } }
Methode abspielen(): ist eine for-Scheife, in der mit jeder Schleife eine Note abgespielt wird. Das Array „notenblatt“, in der alle Noten gespeichert sind, wird auf die eingetragene Note geprüft und führt die entsprechende Bewegung mit dem Stepper und dem Hubmagneten aus.
void abspielen() { int x = 500; //Pause für den Hubmagneten int y = 400; //Pause zwischen das Spielen der Noten for (int i = 1; i < tonzahl; i++) { switch (notenblatt[i]) { case (1): cde.write(109); delay(200); digitalWrite(2, HIGH); delay(x); digitalWrite(2, LOW); delay(y); break; case (2): cde.write(98); delay(200); digitalWrite(2, HIGH); delay(x); digitalWrite(2, LOW); delay(y); break; . . . //Noch weiter bis case(8) } } }
https://www.makerguides.com/a4988-stepper-motor-driver-arduino-tutorial/
\https://www.mintgruen.tu-berlin.de/robotikWiki/doku.php?id=techniken:schalten
Bauteil | Menge |
---|---|
Phototransistor | 8 |
Lichtstreifen (12V) | 1 |
Stepper | 1 |
Rolle | 4 |
Zahnscheibe | 3 |
Zahnriemen | 1 |
Schalter/Taster | 3 |
Bauteil | Menge |
---|---|
Hubmagnet | 3 |
Servo | 3 |
Holzperle | 3 |
Gewichte | 3 |
Schlägel | 3 |
Aluminiumplatte | 3 |
Xylophon | 1 |
Netzteil (12V) | 1 |
Schrauben | |
Holz | |
Muttern, Unterlegscheiben |
Elektrobauteile | Menge |
---|---|
Arduino | 1 |
Stepperplatine | 3 |
Kondensator | 4 |
Mosfet | 3 |
Leerlaufdiode | 3 |
Widerstände | |
Kabel |
Insgesamt konnten wir mit unserem Projekt IrgendwasMitMusik das umsetzen, was wir uns vorgenommen hatten. Das fertige Produkt ist dem ursprünglichen Plan sehr ähnlich, und auch zeitlich entsprach unsere Umsetzung etwa unserer Projektplanung. Der Roboter liest im Lesezustand über den Lesestand die Noten ein und spielt im Spielzustand diese auf dem Abspielgerät ab.
Das Einlesen der Noten funktioniert zu großen Teilen. Trotz dessen liest der Roboter manchmal Noten mehrfach ein oder die erste Note wird gar nicht oder falsch eingelesen. Dazu muss man lediglich das Notenblatt anpassen, sodass die erste Reihe frei gelassen wird von Löchern. Außerdem ist das Einlesen über die Phototransistoren nicht zu hundert Prozent genau. Das Abspielgerät funktioniert relativ gut, allerdings wird der Prozess manchmal unterbrochen und es muss erneut eingelesen werden. Besonders bei langen Notenblättern werden diese oft nicht vollständig abgespielt. Dies ist vermutlich darauf zurückzuführen, dass die Spannung des Arduinos beim Betreiben der Servos einbricht. Dies ist ein Problem, welches wir erst zum Schluss identifiziert haben, weshalb wir nicht noch die Möglichkeit hatten ein weiteres Netzteil mit 5V anzuschließen. Darauf lassen sich vermutlich auch vergangene kleine Probleme zurückführen, die wir mit den Servos hatten.
Bei einer Verbesserung des Projekts müsste man den Anschluss der Servos verändern. Außerdem könnte man das Lesen verbessern, indem man den Lesestand größer baut. Dadurch könnten die Phototransistoren größere Abstände haben und die Löcher im Notenblatt größer sein. Bei unserem Aufbau ist dies allerdings von der Lichtquelle abhängig.
Einen Phototransistor kann man für eine Pause im Stück nutzen. Dadurch verringert sich allerdings die Anzahl der potenziell spielbaren Noten. Dies haben wir nur kurz getestet und ließe sich noch ausbauen.
Für eine Erweiterung des Projektes, kann man versuchen Akkorde zu spielen. wobei dafür das Prinzip des Lesens verändert werden müsste und die Zuteilung der Schlägel auf drei konkrete Platten eventuell aufgebrochen werden muss.
Trotz der Einschränkungen von Corona konnten wir also unseren Roboter fertigstellen und sind insgesamt zufrieden mit unserem Projekt.