Inhaltsverzeichnis:

Laser Harp Synthesizer auf Zybo Board - Gunook
Laser Harp Synthesizer auf Zybo Board - Gunook

Video: Laser Harp Synthesizer auf Zybo Board - Gunook

Video: Laser Harp Synthesizer auf Zybo Board - Gunook
Video: Madis - Moondust (Laser Harp Live Performance) 2024, Juli
Anonim
Laser Harp Synthesizer auf Zybo Board
Laser Harp Synthesizer auf Zybo Board

In diesem Tutorial erstellen wir eine voll funktionsfähige Laserharfe unter Verwendung von IR-Sensoren mit einer seriellen Schnittstelle, die es dem Benutzer ermöglicht, die Stimmung und den Ton des Instruments zu ändern. Diese Harfe wird das Remake des uralten Instruments des 21. Jahrhunderts sein. Das System wurde mit einem Xilinx Zybo-Entwicklungsboard zusammen mit den Vivado Design Suites erstellt. Was Sie benötigen, um das Projekt abzuschließen:

  • 12 IR-Sensoren und -Emitter (je nach Anzahl der Strings mehr oder weniger einsetzbar)
  • Zybo Zynq-7000 Entwicklungsboard
  • Kostenlose Echtzeitbetriebszeit
  • Vivado Designsuite
  • Draht (zum Anschluss der Sensoren an die Platine)
  • 3 Stück PVC-Rohr ((2) 18 Zoll und (1) 8 Zoll)
  • 2 PVC-Ellbogen

Schritt 1: Holen Sie sich die Zybo DMA Audio-Demo von Digilent

Die FPGA-Seite dieses Projekts basiert weitgehend auf dem hier gefundenen Demo-Projekt. Es verwendet direkten Speicherzugriff, um Daten direkt aus dem Speicher zu senden, in den der Prozessor über AXI Stream schreiben kann, an einen I2S-Audioblock. Die folgenden Schritte helfen Ihnen, das DMA-Audio-Demoprojekt zum Laufen zu bringen:

  1. Möglicherweise ist eine neue Version der Board-Datei für das Zybo-Board erforderlich. Befolgen Sie diese Anweisungen, um neue Board-Dateien für Vivado zu erhalten.
  2. Befolgen Sie die Schritte 1 und 2 in den Anweisungen auf dieser Seite, um das Demoprojekt in Vivado zu öffnen. Verwenden Sie die Vivado-Methode, nicht die SDK-Hardwareübergabe.
  3. Möglicherweise erhalten Sie eine Meldung, die besagt, dass einige Ihrer IP-Blöcke aktualisiert werden sollten. Wenn ja, wählen Sie "IP-Status anzeigen" und wählen Sie dann auf der Registerkarte IP-Status alle veralteten IPs aus und klicken Sie auf "Ausgewählte aktualisieren". Wenn es fertig ist und ein Fenster erscheint, in dem Sie gefragt werden, ob Sie ein Ausgabeprodukt generieren möchten, fahren Sie fort und klicken Sie auf "Generieren". Wenn Sie eine kritische Warnmeldung erhalten, ignorieren Sie diese.
  4. Wechseln Sie in Vivado vom Design zum Quellen-Tab, um die Quelldateien anzuzeigen. Klicken Sie mit der rechten Maustaste auf das Blockdesign "design_1" und wählen Sie "HDL-Wrapper erstellen". Wenn Sie dazu aufgefordert werden, wählen Sie "Generierten Wrapper kopieren, um Benutzerbearbeitungen zuzulassen". Eine Wrapper-Datei für das Projekt wird generiert.
  5. Nachdem die kritischen Schritte, die im anderen Tutorial irgendwie ausgelassen wurden, abgeschlossen sind, können Sie zum zuvor verlinkten Tutorial zurückkehren und von Schritt 4 bis zum Ende fortfahren und sicherstellen, dass das Demoprojekt korrekt ausgeführt wird. Wenn Sie keine Möglichkeit haben, Audio für die Aufnahme einzugeben, nehmen Sie einfach mit Ihren Kopfhörern auf und hören Sie einen 5-10 Sekunden langen unscharfen Ton, wenn Sie die Wiedergabetaste drücken. Solange etwas aus der Kopfhörerbuchse kommt, wenn Sie die Wiedergabetaste drücken, funktioniert es wahrscheinlich ordnungsgemäß.

Schritt 2: Nehmen Sie einige Änderungen in Vivado vor

Nehmen Sie einige Änderungen in Vivado vor
Nehmen Sie einige Änderungen in Vivado vor

Jetzt haben Sie also die DMA-Audiodemo von Digilent zum Laufen gebracht, aber das ist hier keineswegs das Endziel. Wir müssen also zu Vivado zurückkehren und einige Änderungen vornehmen, damit unsere Sensoren in die PMOD-Header eingesteckt werden können und wir ihren Wert auf der Softwareseite verwenden können.

  1. Öffnen Sie das Blockdiagramm in Vivado
  2. Erstellen Sie einen GPIO-Block, indem Sie mit der rechten Maustaste in eine leere Stelle im Blockdiagramm klicken und im Menü "IP hinzufügen" auswählen. Suchen und wählen Sie "AXI GPIO".
  3. Doppelklicken Sie auf den neuen IP-Block und gehen Sie im Fenster IP neu anpassen zur Registerkarte IP-Konfiguration. Wählen Sie alle Eingänge aus und stellen Sie die Breite auf zwölf, da wir 12 "Saiten" auf unserer Harfe haben und daher 12 Sensoren benötigen. Wenn Sie weniger oder mehr Sensoren verwenden möchten, passen Sie diese Zahl entsprechend an. Setzen Sie auch den Enable-Interrupt.
  4. Klicken Sie mit der rechten Maustaste auf den neuen GPIO-IP-Block und wählen Sie "Verbindungsautomatisierung ausführen". Aktivieren Sie das Kontrollkästchen AXI und klicken Sie auf OK. Dies sollte die AXI-Schnittstelle automatisch verbinden, aber die Ausgänge des Blocks unbeschaltet lassen.
  5. Um Platz für den zusätzlichen Interrupt zu schaffen, doppelklicken Sie auf den xlconcat_0 IP-Block und ändern Sie die Anzahl der Ports von 4 auf 5. Anschließend können Sie den ip2intc_irpt-Pin des neuen GPIO-Blocks mit dem neuen unbenutzten Port des xlconcat-Blocks verbinden.
  6. Klicken Sie mit der rechten Maustaste auf den "GPIO"-Ausgang des neuen GPIO-IP-Blocks und wählen Sie "make external". Finden Sie heraus, wohin die Linie führt und klicken Sie auf das kleine seitliche Fünfeck und links sollte sich ein Fenster öffnen, in dem Sie den Namen ändern können. Ändern Sie den Namen in "SENSOREN". Es ist wichtig, denselben Namen zu verwenden, wenn die von uns bereitgestellte Einschränkungsdatei funktionieren soll, andernfalls müssen Sie den Namen in der Einschränkungsdatei ändern.
  7. Suchen Sie auf der Registerkarte "Quellen" die Einschränkungsdatei und ersetzen Sie sie durch die von uns bereitgestellte. Sie können entweder die Datei ersetzen oder einfach den Inhalt unserer Einschränkungsdatei kopieren und über den Inhalt der alten einfügen. Eines der wichtigen Dinge, die unsere Constraint-Datei tut, ist die Aktivierung der Pullup-Widerstände an den PMOD-Headern. Dies ist für die von uns verwendeten Sensoren erforderlich, jedoch sind nicht alle Sensoren gleich. Wenn Ihre Sensoren Pulldown-Widerstände benötigen, können Sie jede Instanz von "set_property PULLUP true" mit "set_property PULLDOWN true" ändern. Wenn sie einen anderen Widerstandswert als den auf der Platine benötigen, können Sie diese Leitungen entfernen und externe Widerstände verwenden. Die Pinnamen befinden sich in den Kommentaren in der Einschränkungsdatei und entsprechen den Beschriftungen im ersten Diagramm in den Zybo-Schaltplänen Seite, die Sie hier finden. Wenn Sie verschiedene Pmod-Pins verwenden möchten, passen Sie einfach die Namen in der Einschränkungsdatei an die Beschriftungen im Schaltplan an. Wir verwenden PMOD-Header JE und JD und verwenden jeweils sechs Datenpins, wobei die Pins 1 und 7 weggelassen werden. Diese Informationen sind wichtig, wenn Sie Ihre Sensoren anschließen. Wie im Schaltplan gezeigt, sind die Pins 6 und 12 des PMODS VCC und die Pins 5 und 11 sind Masse.
  8. Generieren Sie den HDL-Wrapper wie zuvor neu, kopieren und überschreiben Sie den alten. Wenn das erledigt ist, generieren Sie Bitstream und exportieren Sie die Hardware wie zuvor und starten Sie das SDK neu. Wenn Sie gefragt werden, ob Sie die alte Hardwaredatei ersetzen möchten, lautet die Antwort ja. Es ist wahrscheinlich am besten, das SDK beim Exportieren von Hardware zu schließen, damit es ordnungsgemäß ersetzt wird.
  9. Starten Sie das SDK.

Schritt 3: FreeRTOS zum Laufen bringen

Der nächste Schritt besteht darin, FreeRTOS auf dem Zybo-Board zum Laufen zu bringen.

  1. Wenn Sie noch keine Kopie haben, laden Sie FreeRTOS hier herunter und extrahieren Sie die Dateien.
  2. Importieren Sie die FreeRTOS Zynq-Demo unter FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_A9_Zynq_ZC702\RTOSDemo. Der Importvorgang ist ziemlich der gleiche wie für das andere Demoprojekt, aber da die FreeRTOS Zynq-Demo auf anderen Dateien im FreeRTOS-Ordner basiert, sollten Sie die Dateien nicht in Ihren Arbeitsbereich kopieren. Stattdessen sollten Sie den gesamten FreeRTOS-Ordner in Ihrem Projektordner ablegen.
  3. Erstellen Sie ein neues Board-Support-Paket, indem Sie auf "Datei" -> "Neu" -> "Board-Support-Paket" gehen. Stellen Sie sicher, dass Standalone ausgewählt ist und klicken Sie auf Fertig stellen. Nach einem Moment öffnet sich ein Fenster, aktivieren Sie das Kontrollkästchen neben lwip141 (dies verhindert, dass eine der FreeRTOS-Demos nicht kompiliert werden kann) und klicken Sie auf OK. Nachdem dies abgeschlossen ist, klicken Sie mit der rechten Maustaste auf das RTOSdemo-Projekt und gehen Sie zu "Eigenschaften", gehen Sie zur Registerkarte "Projektreferenzen" und aktivieren Sie das Kontrollkästchen neben dem neu erstellten BSP. Hoffentlich wird es erkannt, aber manchmal kann das Xilinx SDK bei solchen Dingen seltsam sein. Wenn Sie nach diesem Schritt immer noch eine Fehlermeldung erhalten, dass xparameters.h fehlt oder ähnliches, dann versuchen Sie, diesen Schritt zu wiederholen und möglicherweise das SDK zu beenden und neu zu starten.

Schritt 4: Laserharfencode hinzufügen

Nachdem FreeRTOS importiert wurde, können Sie die Dateien aus dem Laserharfen-Projekt in die FreeRTOS-Demo übernehmen

  1. Erstellen Sie einen neuen Ordner unter dem src-Ordner in der FreeRTOS-Demo und kopieren Sie alle bereitgestellten c-Dateien außer main.c in diesen Ordner.
  2. Ersetzen Sie die RTOSDemo main.c durch die bereitgestellte main.c.
  3. Wenn alles richtig gemacht wurde, sollten Sie an dieser Stelle in der Lage sein, den Laserharfencode auszuführen. Zu Testzwecken wird die Tasteneingabe, die im DMA-Demoprojekt verwendet wurde, jetzt verwendet, um Sounds ohne angeschlossene Sensoren abzuspielen (jede der vier Haupttasten funktioniert). Es spielt bei jedem Drücken eine Saite und durchläuft alle Saiten im System über mehrere Tastendrücke. Schließen Sie einige Kopfhörer oder Lautsprecher an die Kopfhörerbuchse auf dem Zybo-Board an und stellen Sie sicher, dass Sie die Geräusche der Saiten hören können, wenn Sie eine Taste drücken.

Schritt 5: Über den Code

Viele von Ihnen, die dieses Tutorial lesen, werden wahrscheinlich hier lernen, wie man Audio einrichtet oder DMA verwendet, um etwas anderes zu tun oder ein anderes Musikinstrument zu erstellen. Aus diesem Grund widmen sich die nächsten Abschnitte der Beschreibung, wie der bereitgestellte Code in Verbindung mit der zuvor beschriebenen Hardware funktioniert, um mithilfe von DMA eine funktionierende Audioausgabe zu erzielen. Wenn Sie verstehen, warum die Codeteile vorhanden sind, sollten Sie in der Lage sein, sie an das anzupassen, was Sie erstellen möchten.

Unterbrechungen

Zuerst werde ich erwähnen, wie Interrupts in diesem Projekt erstellt werden. Wir haben es so gemacht, dass wir zuerst eine Interrupt-Vektor-Tabellenstruktur erstellt haben, die die ID, den Interrupt-Handler und eine Referenz auf das Gerät für jeden Interrupt verfolgt. Die Interrupt-IDs stammen aus xparameters.h. Der Interrupt-Handler ist eine Funktion, die wir für DMA und GPIO geschrieben haben, und der I2C-Interrupt kommt vom Xlic I2C-Treiber. Die Gerätereferenz verweist auf Instanzen jedes Geräts, die wir an anderer Stelle initialisieren. Gegen Ende der Funktion _init_audio durchläuft eine Schleife jedes Element in der Interrupt-Vektortabelle und ruft zwei Funktionen auf, XScuGic_Connect() und XScuGic_Enable(), um die Interrupts zu verbinden und zu aktivieren. Sie verweisen auf xInterruptController, einen Interrupt-Controller, der standardmäßig in FreeRTOS main.c erstellt wird. Im Grunde hängen wir also jeden unserer Interrupts an diesen Interrupt-Controller, der bereits von FreeRTOS für uns erstellt wurde.

DMA

Der DMA-Initialisierungscode beginnt in lh_main.c. Zuerst wird eine statische Instanz einer XAxiDma-Struktur deklariert. Dann wird es in der Funktion _init_audio() konfiguriert. Zuerst wird die configure-Funktion aus dem Demoprojekt aufgerufen, die sich in dma.c befindet. Es ist ziemlich gut dokumentiert und kommt direkt aus der Demo. Dann wird der Interrupt verbunden und aktiviert. Für dieses Projekt wird nur der Master-to-Slave-Interrupt benötigt, da alle Daten vom DMA an den I2S-Controller gesendet werden. Wenn Sie Audio aufnehmen möchten, benötigen Sie außerdem den Slave-to-Master-Interrupt. Der Master-to-Slave-Interrupt wird aufgerufen, wenn der DMA das Senden der Daten beendet hat, die Sie ihm gesagt haben. Dieser Interrupt ist für unser Projekt unglaublich wichtig, denn jedes Mal, wenn der DMA mit dem Senden eines Puffers von Audiosamples fertig ist, muss er sofort mit dem Senden des nächsten Puffers beginnen, da sonst zwischen den Sends eine hörbare Verzögerung auftreten würde. In der Funktion dma_mm2s_ISR() können Sie sehen, wie wir mit dem Interrupt umgehen. Der wichtige Teil ist gegen Ende, wo wir xSemaphoreGiveFromISR() und portYIELD_FROM_ISR() verwenden, um _audio_task() zu benachrichtigen, dass es die nächste DMA-Übertragung einleiten kann. Wir senden konstante Audiodaten, indem wir zwischen zwei Puffern wechseln. Wenn ein Puffer an den I2C-Block übertragen wird, werden die Werte des anderen Puffers berechnet und gespeichert. Wenn dann die Unterbrechung vom DMA kommt, schaltet der aktive Puffer um, und der kürzlich geschriebene Puffer beginnt mit der Übertragung, während der zuvor übertragene Puffer mit neuen Daten überschrieben wird. Der Schlüsselteil der Funktion _audio_task ist, wo fnAudioPlay() aufgerufen wird. fnAudioPlay() übernimmt die DMA-Instanz, die Länge des Puffers und einen Zeiger auf den Puffer, aus dem die Daten übertragen werden. Ein paar Werte werden an I2S-Register gesendet, um es wissen zu lassen, dass weitere Samples kommen. Dann wird XAxiDma_SimpleTransfer() aufgerufen, um die Übertragung einzuleiten.

I2S-Audio

audio.c und audio.h sind die Orte, an denen die I2S-Initialisierung stattfindet. I2S-Initialisierungscode ist ein ziemlich verbreiteter Codeblock, der an einer Reihe von Stellen im Umlauf ist. Sie können leichte Abweichungen von anderen Quellen finden, aber dieser sollte funktionieren. Es ist ziemlich gut dokumentiert und musste für das Harfenprojekt nicht viel geändert werden. Die DMA-Audio-Demo, aus der sie stammt, verfügt über Funktionen zum Umschalten auf die Mikrofon- oder Line-Eingänge, sodass Sie diese verwenden können, wenn Sie diese Funktionalität benötigen.

Klangsynthese

Um zu beschreiben, wie die Klangsynthese funktioniert, werde ich jedes der Klangmodelle auflisten, die bei der Entwicklung verwendet wurden, die zur endgültigen Methode geführt haben, da Sie so ein Gefühl dafür bekommen, warum es so gemacht wird, wie es gemacht wird.

Methode 1: Eine Periode von Sinuswerten wird für jede Saite bei der entsprechenden Frequenz für die Musiknote dieser Saite berechnet und in einem Array gespeichert. Die Länge des Arrays ist beispielsweise die Periode der Sinuswelle in Samples, was der Anzahl der Samples/Zyklus entspricht. Wenn die Abtastrate 48 kHz und die Notenfrequenz 100 Hz beträgt, dann gibt es 48.000 Samples/Sekunde und 100 Zyklen/Sekunde, was zu 4800 Samples pro Zyklus führt, und die Array-Länge beträgt 4800 Samples und enthält die Werte von einem kompletten Sinuswellenperiode. Wenn die Saite gespielt wird, wird der Audio-Sample-Puffer gefüllt, indem ein Wert aus dem Sinuswellen-Array genommen und als Sample in den Audio-Puffer gelegt wird von 4800 Samples wird ein Sinuswellenzyklus in den Audiopuffer gelegt. Eine Modulo-Operation wird für den Array-Index verwendet, so dass er immer zwischen 0 und der Länge liegt, und wenn der Array-Index einen bestimmten Schwellenwert überschreitet (wie etwa 2 Sekunden Samples), wird die Zeichenfolge deaktiviert. Um mehrere Saiten gleichzeitig zu spielen, verfolgen Sie den Array-Index jeder Saite separat und addieren Sie den Wert der Sinuswelle jeder Saite zusammen, um jedes Sample zu erhalten.

Methode 2: Um einen musikalischeren Ton zu erzeugen, beginnen wir mit dem vorherigen Modell und fügen jeder Grundfrequenz Harmonische hinzu. Harmonische Frequenzen sind Frequenzen, die ganzzahlige Vielfache der Grundfrequenz sind. Anders als bei der Addition zweier unabhängiger Frequenzen, was dazu führt, dass zwei verschiedene Klänge gleichzeitig gespielt werden, klingt es bei der Addition von Obertönen weiterhin wie nur ein Klang, jedoch mit einem anderen Ton. Um dies zu erreichen, addieren wir jedes Mal, wenn wir den Wert der Sinuswelle am Ort (Array-Index % Array-Länge) zum Audio-Sample hinzufügen, auch (2 * Array-Index % Array-Länge) und (3 * Array-Index % Array-Länge)) und so weiter für beliebig viele Harmonische. Diese multiplizierten Indizes durchqueren die Sinuswelle bei Frequenzen, die ganzzahlige Vielfache der ursprünglichen Frequenz sind. Um eine bessere Klangkontrolle zu ermöglichen, werden die Werte jeder Harmonischen mit einer Variablen multipliziert, die den Anteil dieser Harmonischen im Gesamtklang darstellt. Zum Beispiel könnten die Werte der Sinus-Grundwelle alle mit 6 multipliziert werden, um einen größeren Einfluss auf den Gesamtklang zu haben, während die 5. Harmonische einen Multiplikator von 1 haben könnte, was bedeutet, dass ihre Werte viel weniger zum Gesamtklang beitragen.

Methode 3: Okay, jetzt haben wir also einen sehr schönen Ton auf den Noten, aber es gibt immer noch ein ziemlich entscheidendes Problem: Sie spielen mit einer festen Lautstärke für eine feste Dauer. Um überhaupt wie ein echtes Instrument zu klingen, sollte die Lautstärke einer gespielten Saite mit der Zeit sanft abklingen. Um dies zu erreichen, wird ein Array mit den Werten einer exponentiell abfallenden Funktion gefüllt. Wenn nun die Audio-Samples erstellt werden, wird der von jeder Saite kommende Klang wie in der vorherigen Methode berechnet, aber bevor er zum Audio-Sample hinzugefügt wird, wird er mit dem Wert am Array-Index dieser Saiten im Array der exponentiellen Decay-Funktion multipliziert. Dadurch wird der Ton im Laufe der Zeit gleichmäßig verteilt. Wenn der Array-Index das Ende des Decay-Arrays erreicht, wird der String gestoppt.

Methode 4: Dieser letzte Schritt ist es, was den Saitenklängen ihren realistischen Saitenklang verleiht. Vorher klangen sie angenehm, aber klar synthetisiert. Um zu versuchen, eine echte Harfensaite besser zu emulieren, wird jeder Harmonischen eine andere Abklingrate zugewiesen. Bei echten Saiten gibt es beim ersten Anschlagen der Saite einen hohen Anteil an hochfrequenten Obertönen, die den Zupfklang erzeugen, den wir von einer Saite erwarten. Diese hochfrequenten Obertöne sind sehr kurz der Hauptteil des Klangs, der Klang der angeschlagenen Saite, aber sie klingen sehr schnell ab, wenn die langsameren Obertöne übernehmen. Für jede harmonische Zahl, die bei der Klangsynthese verwendet wird, wird ein Decay-Array mit jeweils eigener Decay-Rate erstellt. Jetzt kann jede Harmonische unabhängig mit dem Wert ihres entsprechenden Decay-Arrays am Array-Index der Saite multipliziert und dem Klang hinzugefügt werden.

Insgesamt ist die Klangsynthese intuitiv, aber rechenintensiv. Das gleichzeitige Speichern des gesamten Saitenklangs im Speicher würde zu viel Speicher beanspruchen, aber die Berechnung der Sinuswelle und der Exponentialfunktion zwischen jedem Frame würde viel zu lange dauern, um mit der Geschwindigkeit der Audiowiedergabe Schritt zu halten. Im Code werden eine Reihe von Tricks verwendet, um die Berechnung zu beschleunigen. Alle Berechnungen, mit Ausnahme der anfänglichen Erstellung der Sinus- und Exponentialzerfallstabellen, werden im Integer-Format durchgeführt, was eine Verteilung des verfügbaren numerischen Raums in der 24-Bit-Audioausgabe erfordert. Zum Beispiel hat die Sinustabelle eine Amplitude von 150, so dass sie glatt, aber nicht so groß ist, dass viele zusammen gespielte Saiten mehr als 24 Bit addieren können. Ebenso werden die exponentiellen Tabellenwerte mit 80 multipliziert, bevor sie auf ganze Zahlen gerundet und gespeichert werden. Die harmonischen Gewichte können diskrete Werte zwischen 0 und 10 annehmen. Außerdem werden alle Samples tatsächlich verdoppelt und die Sinuswellen werden um 2 indiziert, wodurch die Abtastrate effektiv halbiert wird. Dies begrenzt die maximal spielbare Frequenz, war aber notwendig, um die aktuelle Anzahl von Saiten und Obertönen schnell genug berechnen zu können.

Dieses Soundmodell zu erstellen und zum Laufen zu bringen, erforderte auf der Prozessorseite erhebliche Anstrengungen, und es wäre unglaublich schwierig gewesen, es im Zeitrahmen dieses Projekts auf der Fpga-Seite von Grund auf neu zum Laufen zu bringen (stellen Sie sich vor, Sie müssten den Bitstream jedes Mal neu erstellen Mal wurde ein Stück Verilog geändert, um den Klang zu testen). Es könnte jedoch wahrscheinlich eine bessere Möglichkeit sein, dies auf dem fpga zu tun, da möglicherweise das Problem beseitigt wird, dass Samples nicht schnell genug berechnet werden können und mehr Saiten, Obertöne und sogar Audioeffekte oder andere Aufgaben auf dem ausgeführt werden können Prozessorseite.

Schritt 6: Verdrahten der Sensoren

Verdrahten der Sensoren
Verdrahten der Sensoren

Um die Saiten zu erstellen, haben wir IR-Break-Beam-Sensoren verwendet, die erkennen, wann die Saite gespielt wird. Wir haben unsere Sensoren über den folgenden Link bestellt. Die Sensoren haben ein Strom-, Masse- und Datenkabel, während die Sender nur ein Strom- und Massekabel haben. Wir haben die 3,3 V- und Massestifte der PMOD-Header verwendet, um sowohl die Emitter als auch die Sensoren mit Strom zu versorgen. Um alle Sensoren und Sender mit Strom zu versorgen, müssen alle Sensoren und Sender parallel geschaltet werden. Die Datenleitungen von den Sensoren müssen jeweils zu ihrem eigenen pmod-Pin gehen.

Schritt 7: Konstruieren des Skeletts

Konstruktion des Skeletts
Konstruktion des Skeletts

Um die Form der Harfe zu erzeugen, werden die drei Teile als Skelett verwendet, auf dem die Sensoren und Emitter platziert werden. Auf einem der beiden 18-Zoll-PVC-Rohrstücke richten Sie die Sensoren und Emitter in abwechselnder Reihenfolge 1,5 Zoll voneinander aus und kleben sie dann auf das Rohr. Auf dem anderen 18-Zoll-PVC-Rohr richten Sie die Sensoren und Emitter in abwechselnder Reihenfolge aus, aber achten Sie darauf, die Reihenfolge zu versetzen (dh wenn das erste Rohr zuerst einen Sensor hatte, sollte das zweite zuerst einen Emitter haben und umgekehrt). Es müssen längere Drähte an den Daten-, Strom- und Erdungsdrähten angelötet werden, um sicherzustellen, dass sie die Platine erreichen können.

Schritt 8: Aufbau der Holzaußenseite

Aufbau der Holzfassade
Aufbau der Holzfassade

Dieser Schritt ist optional, wird aber dringend empfohlen. Die Holzaußenseite lässt die Harfe nicht nur schön aussehen, sondern schützt auch die Sensoren und Drähte vor Beschädigungen. Der Holzrahmen kann durch einen hohlen rechteckigen Ring aus Holz geschaffen werden. Die Innenseite des Rechtecks muss eine Öffnung von mindestens 1-1/2 Zoll haben, damit das Rohr und das Sensorskelett passen. Sobald der Rahmen aufgebaut ist, bohren Sie zwei Löcher, die die Drähte vom Sensor und den Emittern herauslassen, um sie mit der Platine zu verbinden.

*Hinweis: Es wird empfohlen, Zugangspunkte hinzuzufügen, um das Rohrskelett entfernen und einsetzen zu können, falls Reparaturen oder geringfügige Anpassungen erforderlich sind.

Schritt 9: Alle Teile zusammenfügen

Alle Teile zusammenfügen
Alle Teile zusammenfügen

Sobald alle vorherigen Schritte abgeschlossen sind, ist es Zeit, die Harfe zu bauen. Legen Sie zuerst das Rohrskelett in die Holzaußenseite. Stecken Sie dann die Drähte für die Sensoren und Emitter in die richtige Position auf der Platine. Öffnen Sie dann das SDK und klicken Sie auf die Debug-Schaltfläche, um das Board zu programmieren. Sobald das Board programmiert ist, schließen Sie einen Kopfhörer oder einen Lautsprecher an. Abhängig davon, welcher Sensor in welchem pmod-Port landet, sind die Saiten Ihrer Harfe wahrscheinlich von Anfang an nicht in Ordnung. Da es bei so vielen Drähten schwierig sein kann zu sagen, welcher Draht zu welchem Sensor geht, haben wir eine Möglichkeit integriert, String-Nummern in die Interrupt-Bit-Positionen in der Software zuzuordnen. Suchen Sie nach "static int sensor_map[NUM_STRINGS]" und passen Sie die Werte im Array an, bis die Saiten der Reihe nach vom niedrigsten zum höchsten abgespielt werden.

Das Menü kann durch Öffnen eines seriellen Terminals (z. B. RealTerm) verwendet werden und die Baudrate auf 115200 und die Anzeige auf ANSI eingestellt werden. Das Menü kann mit den Tasten w und s navigiert werden, um sich nach oben und unten zu bewegen, und mit den Tasten a und d, um die Werte zu ändern.

Schritt 10: ROCK OUT

Sobald die Harfe voll funktionsfähig ist. Meistere die Harfe und höre den süßen Klang deiner eigenen Musik!

Empfohlen: