- Erforderliche Materialien:
- Schaltplan:
- Schema und Erklärung:
- Das verstehen
- Klaviertöne auf Arduino spielen:
- Programmieren des Arduino:
- Spielen, aufnehmen, wiedergeben und wiederholen! ::
Arduino war ein Segen für Leute, die nicht aus der Elektronik stammen, um einfach Sachen zu bauen. Es war ein großartiges Prototyping-Tool oder um etwas Cooles auszuprobieren. In diesem Projekt werden wir mit dem Arduino ein kleines, aber lustiges Klavier bauen . Dieses Klavier ist ziemlich schlicht mit nur 8 Druckknöpfen und einem Summer. Es verwendet die Tone () - Funktion von Arduino, um verschiedene Arten von Klaviernoten auf dem Lautsprecher zu erstellen. Um es ein wenig aufzupeppen, haben wir die Aufnahmefunktion in das Projekt aufgenommen. Dadurch können wir eine Melodie aufnehmen und bei Bedarf wiederholt abspielen. Klingt interessant, oder !! Also lasst uns bauen…
Erforderliche Materialien:
- Arduino Uno
- 16 * 2 LCD-Anzeige
- Summer
- Trimmer 10k
- SPDT-Schalter
- Druckknopf (8 Nr.)
- Widerstände (10 k, 560 R, 1,5 k, 2,6 k, 3,9, 5,6 k, 6,8 k, 8,2 k, 10 k)
- Steckbrett
- Kabel anschließen
Schaltplan:
Das komplette Arduino Piano Project kann mit einigen Verbindungsdrähten auf einem Steckbrett aufgebaut werden. Das mit Fritzing erstellte Schaltbild, das die Steckbrettansicht des Projekts zeigt, ist unten dargestellt
Folgen Sie einfach dem Schaltplan und verbinden Sie die Drähte entsprechend, die Drucktasten und den Summer, wie sie bei einem PCB-Modul verwendet werden. In der tatsächlichen Hardware haben wir jedoch nur den Schalter und den Summer verwendet. Dies sollte Sie nicht sehr verwirren, da sie dieselbe Art von Pinbelegung haben. Sie können sich auch auf das folgende Bild der Hardware beziehen, um Ihre Verbindungen herzustellen.
Der Wert der Widerstände von links liegt in der folgenden Reihenfolge: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k und 10k. Wenn Sie nicht denselben DPST-Schalter haben, können Sie einen normalen Kippschalter wie den im obigen Schaltplan gezeigten verwenden. Schauen wir uns nun die Schaltpläne des Projekts an, um zu verstehen, warum wir die folgenden Verbindungen hergestellt haben.
Schema und Erklärung:
Die oben gezeigten Schaltpläne für den Schaltplan sind unten angegeben, sie wurden ebenfalls mit Fritzing erstellt.
Eine Hauptverbindung, die wir verstehen müssen, ist, wie wir die 8 Drucktasten über den analogen A0-Pin mit dem Arduino verbunden haben. Grundsätzlich benötigen wir 8 Eingangsstifte, die an die 8 Eingangsdrucktasten angeschlossen werden können, aber für Projekte wie dieses können wir 8 Stiftstifte des Mikrocontrollers nicht nur für Drucktasten verwenden, da wir sie möglicherweise für die spätere Verwendung benötigen. In unserem Fall muss das LCD-Display angeschlossen werden.
Wir verwenden also den analogen Pin des Arduino und bilden einen Potentialteiler mit variierenden Widerstandswerten, um die Schaltung zu vervollständigen. Auf diese Weise wird beim Drücken jeder Taste eine andere analoge Spannung an den analogen Pin angelegt. Eine Beispielschaltung mit nur zwei Widerständen und zwei Drucktasten ist unten gezeigt.
In diesem Fall empfängt der ADC-Pin +5 V, wenn die Drucktasten nicht gedrückt werden. Wenn die erste Taste gedrückt wird, wird der Potentialteiler durch den 560R-Widerstand vervollständigt. Wenn die zweite Taste gedrückt wird, wird der Potentialteiler mit der 1,5 konkurriert k Widerstand. Auf diese Weise variiert die vom ADC-Pin empfangene Spannung basierend auf den Formeln des Potentialteilers. Wenn Sie mehr über die Funktionsweise des Potentialteilers und die Berechnung des vom ADC-Pin empfangenen Spannungswerts erfahren möchten, können Sie diese Seite mit dem Potentialteiler-Rechner verwenden.
Ansonsten sind alle Verbindungen einfach, das LCD ist mit den Pins 8, 9, 10, 11 und 12 verbunden. Der Summer ist mit Pin 7 verbunden und der SPDT-Schalter ist mit Pin 6 von Arduino verbunden. Das gesamte Projekt wird über den USB-Anschluss des Laptops mit Strom versorgt. Sie können den Arduino auch über die DC-Buchse an eine 9-V- oder 12-V-Versorgung anschließen, und das Projekt funktioniert weiterhin genauso.
Das verstehen
Der Arduino verfügt über eine praktische Tone () -Funktion, mit der Signale mit unterschiedlicher Frequenz erzeugt werden können, mit denen mithilfe eines Summers unterschiedliche Sounds erzeugt werden können. Lassen Sie uns also verstehen, wie die Funktion funktioniert und wie sie mit Arduino verwendet werden kann.
Vorher sollten wir wissen, wie ein Piezo-Summer funktioniert. Wir haben vielleicht in unserer Schule etwas über Piezokristalle gelernt. Es ist nichts anderes als ein Kristall, der mechanische Schwingungen in Elektrizität umwandelt oder umgekehrt. Hier legen wir einen variablen Strom (Frequenz) an, für den der Kristall vibriert und so Schall erzeugt. Damit der Piezo-Summer etwas Rauschen erzeugt, muss der elektrische Piezo-Kristall vibrieren. Die Tonhöhe und der Ton des Rauschens hängen davon ab, wie schnell der Kristall vibriert. Daher können der Ton und die Tonhöhe durch Variieren der Frequenz des Stroms gesteuert werden.
Okay, wie bekommen wir eine variable Frequenz von Arduino? Hier kommt die Funktion ton () ins Spiel. Der Ton () kann eine bestimmte Frequenz an einem bestimmten Pin erzeugen. Bei Bedarf kann auch die Zeitdauer angegeben werden. Die Syntax für ton () lautet
Syntax Ton (Pin, Frequenz) Ton (Pin, Frequenz, Dauer) Parameter Pin: Der Pin, auf dem die Tonfrequenz erzeugt werden soll: Die Frequenz des Tons in Hertz - vorzeichenlose Int-Dauer: Die Dauer des Tons in Millisekunden (optional1) - lange ohne Vorzeichen
Die Pin-Werte können beliebige Ihrer digitalen Pins sein. Ich habe hier Pin Nummer 8 verwendet. Die Frequenz, die generiert werden kann, hängt von der Größe des Timers in Ihrem Arduino-Board ab. Für UNO und die meisten anderen gängigen Karten beträgt die minimale Frequenz 31 Hz und die maximale Frequenz 65535 Hz. Wir Menschen können jedoch nur Frequenzen zwischen 2000 Hz und 5000 Hz hören.
Klaviertöne auf Arduino spielen:
Okay, bevor ich überhaupt mit diesem Thema anfange, möchte ich klarstellen, dass ich ein Anfänger mit Noten oder Klavier bin. Bitte verzeihen Sie mir, wenn etwas, das unter dieser Überschrift erwähnt wird, Kauderwelsch ist.
Wir wissen jetzt, dass wir die Tones-Funktion in Arduino verwenden können, um einige Sounds zu erzeugen, aber wie können wir Töne einer bestimmten Note mit derselben spielen. Zum Glück gibt es eine Bibliothek namens "Pitches.h" von Brett Hagman. Diese Bibliothek enthält alle Informationen darüber, welche Frequenz welcher Note auf einem Klavier entspricht. Ich war überrascht, wie gut diese Bibliothek tatsächlich funktionieren und fast jede Note auf einem Klavier spielen konnte. Ich habe das gleiche verwendet, um die Klaviernoten von Pirates of Caribbean, Crazy Frog, Mario und sogar Titanic zu spielen, und sie klangen fantastisch. Hoppla! Wir kommen hier ein wenig vom Thema ab. Wenn Sie also daran interessiert sind, probieren Sie das Spielen von Melodien mit dem Arduino-Projekt aus. Weitere Erklärungen zur Pitches.h- Bibliothek finden Sie in diesem Projekt.
Unser Projekt hat nur 8 Druckknöpfe, so dass jeder Knopf nur eine bestimmte Musiknote spielen kann und somit insgesamt nur 8 Noten spielen können. Ich habe die am häufigsten verwendeten Noten auf einem Klavier ausgewählt, aber Sie können eine beliebige 8 auswählen oder das Projekt sogar mit mehr Drucktasten erweitern und weitere Noten hinzufügen.
Die in diesem Projekt ausgewählten Noten sind die Noten C4, D4, E4, F4, G4, A4, B4 und C5, die mit den Tasten 1 bis 8 gespielt werden können.
Programmieren des Arduino:
Genug der Theorie, lassen Sie uns zum lustigen Teil der Programmierung des Arduino kommen. Das vollständige Arduino-Programm finden Sie am Ende dieser Seite. Sie können nach unten springen, wenn Sie eifrig sind oder weiterlesen, um zu verstehen, wie der Code funktioniert.
In unserem Arduino-Programm müssen wir die analoge Spannung von Pin A0 lesen, dann vorhersagen, welche Taste gedrückt wurde, und den entsprechenden Ton für diese Taste spielen. Dabei sollten wir auch aufzeichnen, welche Taste der Benutzer gedrückt hat und wie lange er gedrückt hat, damit wir den Ton wiedergeben können, der später vom Benutzer gespielt wurde.
Bevor wir zum logischen Teil gehen, müssen wir deklarieren, welche 8 Noten wir spielen werden. Die jeweilige Frequenz für die Noten wird dann aus der Tonhöhenbibliothek entnommen, und dann wird ein Array wie unten gezeigt gebildet. Hier beträgt die Frequenz zum Spielen der Note C4 262 und so weiter.
int notes = {262, 294, 330, 349, 392, 440, 494, 523}; // Frequenz für C4, D4, E4, F4, G4, A4, B4 einstellen,
Als nächstes müssen wir erwähnen, an welche Pins das LCD-Display angeschlossen ist. Wenn Sie genau den oben angegebenen Schaltplänen folgen, müssen Sie hier nichts ändern.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pins, an die das LCD angeschlossen ist LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Als nächstes initialisieren wir in unserer Setup- Funktion nur das LCD-Modul und den seriellen Monitor für das Debuggen. Wir zeigen auch eine Intro-Nachricht an, um sicherzustellen, dass die Dinge wie geplant funktionieren. Als nächstes haben wir innerhalb der Hauptschleifenfunktion zwei while-Schleifen.
Eine while-Schleife wird ausgeführt, solange der SPDT-Schalter mehr aufzeichnet. Im Aufnahmemodus kann der Benutzer die erforderlichen Töne bezahlen und gleichzeitig wird auch der gerade gespielte Ton gespeichert. Die while-Schleife sieht also unten so aus
while (digitalRead (6) == 0) // Wenn der Kippschalter auf Aufnahmemodus eingestellt ist {lcd.setCursor (0, 0); lcd.print ("Aufnahme.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }}
Wie Sie vielleicht bemerkt haben, haben wir zwei Funktionen in der while-Schleife. Mit der ersten Funktion Detect_button () wird ermittelt, welche Taste der Benutzer gedrückt hat, und mit der zweiten Funktion Play_tone () wird der jeweilige Ton abgespielt . Abgesehen von dieser Funktion zeichnet die Funktion Detect_button () auch auf, welche Taste gedrückt wird, und die Funktion Play_tone () zeichnet auf, wie lange die Taste gedrückt wurde.
In der Funktion Detect_button () lesen wir die analoge Spannung von Pin A0 und vergleichen sie mit einigen vordefinierten Werten, um herauszufinden, welche Taste gedrückt wurde. Der Wert kann entweder mit dem obigen Spannungsteilerrechner oder mit dem seriellen Monitor ermittelt werden, um zu überprüfen, welcher Analogwert für jede Taste gelesen wird.
void Detect_button () { analogVal = analogRead (A0); // Analoge Spannung an Pin A0 lesen pev_button = button; // erinnere dich an die vorherige Taste, die der Benutzer gedrückt hat, wenn (analogVal <550) button = 8; if (analogVal <500) button = 7; if (analogVal <450) button = 6; if (analogVal <400) button = 5; if (analogVal <300) button = 4; if (analogVal <250) button = 3; if (analogVal <150) button = 2; if (analogVal <100) button = 1; if (analogVal> 1000) button = 0; / **** Zeichne die gedrückten Tasten in einem Array auf *** / if (button! = pev_button && pev_button! = 0) { aufgezeichnet_button = pev_button; button_index ++; aufgezeichnet_Taste = 0; button_index ++; } / ** Ende des Aufnahmeprogramms ** / }
Wie gesagt, innerhalb dieser Funktion zeichnen wir auch die Reihenfolge auf, in der die Tasten gedrückt werden. Die aufgezeichneten Werte werden in einem Array mit dem Namen record_button gespeichert . Wir prüfen zuerst, ob eine neue Taste gedrückt wurde. Wenn sie gedrückt wird, prüfen wir auch, ob es sich nicht um die Taste 0 handelt. Dabei ist die Taste 0 nichts, aber es wird keine Taste gedrückt. Innerhalb der if-Schleife speichern wir den Wert an der durch die Variable button_index angegebenen Indexposition und erhöhen dann auch diesen Indexwert, damit wir nicht an derselben Position überschreiben.
/ **** Zeichne die gedrückten Tasten in einem Array auf *** / if (button! = Pev_button && pev_button! = 0) { aufgezeichnet_button = pev_button; button_index ++; aufgezeichnet_Taste = 0; button_index ++; } / ** Ende des Aufnahmeprogramms ** /
Innerhalb der Funktion Play_tone () spielen wir den entsprechenden Ton für die gedrückte Taste unter Verwendung mehrerer if- Bedingungen. Außerdem verwenden wir ein Array mit dem Namen record_time, in dem wir die Zeitdauer speichern, für die die Taste gedrückt wurde. Die Operation ähnelt der Aufzeichnung der Tastenfolge, indem wir mit der Funktion millis () bestimmen, wie lange jede Taste gedrückt wurde, und um die Größe der Variablen zu verringern, teilen wir den Wert durch 10. Für die Taste 0 bedeutet dies, dass der Benutzer dies nicht tut Wenn wir etwas drücken, spielen wir für die gleiche Dauer keinen Ton. Der vollständige Code innerhalb der Funktion ist unten dargestellt.
void Play_tone () { / **** Zeichne die Zeitverzögerung zwischen jedem Tastendruck in einem Array auf *** / if (button! = pev_button) { lcd.clear (); // Dann bereinige es note_time = (millis () - start_time) / 10; aufgezeichnet_Zeit = Notizzeit; time_index ++; start_time = millis (); } / ** Ende des Aufnahmeprogramms ** / if (button == 0) { noTone (7); lcd.print ("0 -> Pause.."); } if (button == 1) { Ton (7, Noten); lcd.print ("1 -> NOTE_C4"); } if (button == 2) { Ton (7, Noten); lcd.print ("2 -> NOTE_D4"); } if (button == 3) { Ton (7, Noten); lcd.print ("3 -> NOTE_E4"); } if (button == 4) { Ton (7, Noten); lcd.print ("4 -> NOTE_F4"); } if (button == 5) { Ton (7, Noten); lcd.print ("5 -> NOTE_G4"); } if (button == 6) { Ton (7, Noten); lcd.print ("6 -> NOTE_A4"); } if (button == 7) { Ton (7, Noten); lcd.print ("7 -> NOTE_B4"); } if (button == 8) { Ton (7, Noten); lcd.print ("8 -> NOTE_C5"); } }
Schließlich muss der Benutzer nach der Aufnahme den DPST in die andere Richtung schalten, um den aufgenommenen Ton abzuspielen. Wenn dies erledigt ist, bricht das Programm aus der vorherigen while- Schleife aus und tritt in die zweite while-Schleife ein, in der wir die Noten in der Reihenfolge der Tasten spielen, die für eine zuvor aufgezeichnete Dauer gedrückt wurden. Der Code, um dasselbe zu tun, ist unten gezeigt.
while (digitalRead (6) == 1) // Wenn der Kippschalter auf den Wiedergabemodus gestellt ist { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Jetzt läuft.."); für (int i = 0; i <sizeof (aufgenommener_Button) / 2; i ++) { Verzögerung ((aufgezeichnete_Zeit) * 10); // Warten Sie, bevor Sie die nächste Melodie bezahlen, wenn (aufgezeichnet_Taste == 0) noTone (7); // Benutzer darf keine andere Taste berühren Ton (7, Notizen - 1)]); // spiele den Sound ab, der der vom Benutzer berührten Taste entspricht } } }
Spielen, aufnehmen, wiedergeben und wiederholen!::
Stellen Sie die Hardware gemäß dem gezeigten Schaltplan her und laden Sie den Code und die angezeigte Zeit auf die Arduino-Karte hoch. Positionieren Sie das SPDT im Aufnahmemodus und beginnen Sie mit der Wiedergabe der Töne Ihrer Wahl. Durch Drücken jeder Taste wird ein anderer Ton erzeugt. In diesem Modus zeigt das LCD „ Aufnahme…“ an und in der zweiten Zeile sehen Sie den Namen der Note, die gerade gedrückt wird, wie unten gezeigt
Sobald Sie Ihren Ton abgespielt haben, schalten Sie den SPDT-Schalter auf die andere Seite und auf dem LCD sollte „ Now Playing..“ angezeigt werden . Beginnen Sie dann mit der Wiedergabe des gerade gespielten Tons. Der gleiche Ton wird immer wieder gespielt, solange der Kippschalter in der in der folgenden Abbildung gezeigten Position gehalten wird.
Die vollständige Arbeitsweise des Projekts finden Sie im folgenden Video. Ich hoffe, Sie haben das Projekt verstanden und es genossen, es zu bauen. Wenn Sie Probleme beim Erstellen dieses Beitrags haben, geben Sie diese im Kommentarbereich an oder verwenden Sie die Foren für technische Hilfe zu Ihrem Projekt. Vergessen Sie auch nicht, das unten angegebene Demonstrationsvideo zu überprüfen.