Ich baue diese Musiksequenzer .
Nur ist es nicht gerade ein Sequenzer, es ist eine physische Schnittstelle für einen Sequenzer. Der Sequenzer ist eine Anwendung, die auf einem Laptop ausgeführt wird, mit dem der Sequenzer verbunden ist. Auf diese Weise kann der Benutzer Drum-Loops im laufenden Betrieb erstellen. Es macht ziemlich viel Spaß, erfordert aber einen Laptop, da der Sequenzer nicht an Bord ist.
Am liebsten würde ich die Sequenzierung an Bord meines Geräts durchführen.
Nehmen wir nun an, ich weiß, wie man die Klassenkonformität für USB-MIDI-Konnektivität löst, und nehmen wir an, ich kann herausfinden, wie ein Arduino verkabelt wird, um MIDI-Noten von einem 5-poligen DIN-Port zu senden. Was mich am meisten beunruhigt, ist die zeitliche Verschiebung des Tempos aufgrund des inkonsistenten Timings in Minutenbeträgen über jeden Lauf der Ereignisschleife.
Einige Dinge, die ich weiß:
Sie sollten sich nicht darauf verlassen
delay()
, die Tempo-Schleife zu steuern. Verzögerung stoppt den gesamten Betrieb der Firmware, und das kann nicht funktionieren, da ich die physische Benutzeroberfläche nach Änderungen abfragen muss, während die Sequenz ausgeführt wird.Berechnungen basierend auf
millis()
sind besser, da die Firmware nach Ablauf einer bestimmten Anzahl weiterarbeiten und funktionieren kann.Obwohl keine meiner physischen Steuerungen Interrupt-Routinen auslöst, können einige Vorgänge die
loop()
Ausführung der Hauptsteuerung verzögern . Wenn ich eine Funktion entwerfe, die auf Benutzereingaben wartet, kann dies offensichtlich dazu führen, dass eine "Frist" verpasst wird, wenn diemillis()
Anzahl weit überschritten ist. Ich weiß, dass dieses Problem von mir selbst verursacht wurde ...
Fragen:
A. Ist das AVR-basierte Arduino ein geeigneter Mikrocontroller, um eine Benutzeroberfläche abzufragen und eine geschäftskritische Zeitschleife auszuführen? Ich weiß, dass es jetzt ein ARM-basiertes Arduino gibt, das viel schneller ist. Wäre ein Teensy 3.0 eine bessere Alternative? Beide sind 3,3-V-Karten, das ist also eine weitere Reihe von Problemen, mit denen man arbeiten muss ... aber das werde ich vorerst ignorieren.
B. Soll ich die Aufgabe in zwei Mikroprozessoren aufteilen? Eine für das Abrufen und Aktualisieren der Benutzeroberfläche und eine für die geschäftskritische Zeitschleife.
c. Etwas anderes?
Mein Hauptziel ist es, überhaupt keinen Computer benutzen zu müssen. Ich möchte auch den Swing berechnen, aber in diesem Fall bedeutet Swing nichts, wenn ich kein gesperrtes und zeitgenaues Tempo habe. Danke für deinen Rat!
noInterrupts();
stoppt den Jitter, stoppt aber auch alle gewünschten Interrupts.Antworten:
Interrupts sind Ihr Freund für zeitkritische Aufgaben, aber nur, wenn Sie die zeitkritischen Aspekte in den Interrupt einfließen lassen und keine anderen Interrupts mit höherer Priorität auftreten. Die Mikrocontroller des "AVR-basierten" Arduino (z. B. des ATmega328P) haben feste Interrupt-Prioritäten, wie auf Seite 58ff des Datenblattes beschrieben . Wenn Sie also TIMER2 COMPA als kritischen Timing-Interrupt und keine anderen Interrupts verwendet haben, sollten Sie in Ordnung sein (da es die höchste Priorität hat). Wenn Sie auch Interrupts mit niedrigerer Priorität verwenden möchten, müssen Sie sicherstellen, dass alle globalen Interrupts wieder aktivieren, wenn Sie ihre Interrupt-Serviceroutine eingeben:
(S. 14 des Datenblattes )
Dies ist bei ARM-basierten Arduinos etwas anders, da ihr Cortex-M3-Kern über einen "Nested Vector Interrupt Controller" verfügt, bei dem die Prioritäten nicht festgelegt sind (in der Software festgelegt werden können) und die Behandlung verschachtelter Interrupts die Norm ist. Für zeitgesteuerte kritische Anwendungen bietet Ihnen das ARM-basierte Arduino mehr Flexibilität. Ich denke jedoch nicht, dass dies für Ihre Bewerbung wirklich notwendig ist.
Die größere Frage ist wirklich, wie einfach diese Dinge mit den Arduino-Bibliotheken implementiert werden können. Um die beste Leistung zu erzielen, müssen Sie wahrscheinlich bis zu einem gewissen Grad außerhalb der Bibliotheken codieren, zumindest für die zeitkritischen Bits, dh Dinge wie delay () oder millis () insgesamt vermeiden.
Ob Sie teilen müssen oder nicht, hängt davon ab, wie viel Verarbeitung Sie beabsichtigen. Auch hier kann das Verlassen der Bibliotheken möglicherweise zu einer besseren Leistung führen.
quelle
Dies kann mit der entsprechenden Programmierung definitiv auf einem ATmega328P erfolgen (abhängig von der Komplexität des Drum-Loops. Ich gehe von ~ <50 Drum-Ereignissen im Loop aus. Ist das sinnvoll?).
Beachten Sie, dass ich ATmega328P sagte , nicht unbedingt ein Arduino .
In der Arduino-Umgebung werden im Hintergrund viele Standardfunktionen ausgeführt, was eine äußerst deterministische Programmierung (da Sie für etwas zeitkritisches benötigen) schwierig macht.
Die eigentliche Frage, die Sie hier stellen müssen, ist, wie interessiert Sie an der Programmierung sind und wie interessiert Sie an der Entwicklung eines Instruments?
Ich bin mir zwar ziemlich sicher, dass mit einem einzigen ATmega alles möglich ist (Drum-Loop, mehrere analoge Eingänge, LCD, Tasten, MIDI-Interface), aber die eigentliche Frage ist, wie viel Arbeit es kosten wird, alles einzudrücken? Möchten Sie erneut lernen, eingebetteten MCU-Code zu optimieren oder Instrumente zu erstellen? Es ist ganz einfach, einfach zu einem schnelleren MCU gehen , wenn nötig, aber Sie müssen die MCU Leistung bestimmen , was Sie brauchen jetzt , so sechs Monate Arbeit in, Sie erkennen nicht , Sie nicht können ganz alle Arbeit so schnell wie möglich bekommen brauchen.
Wenn ich Sie wäre, würde ich es als erstes ohne Arduino-Zeug zum Laufen bringen (im Grunde genommen als rohes ATmega behandeln und AVR-Studio oder ähnliches verwenden). Dann können Sie viel effektiver analysieren, welche Art von Leistung Sie benötigen und ob der ATmega sie verwalten kann.
Sobald Sie frei von Arduino sind, können Sie viel mehr verschiedene MCUs verwenden (diese sind im Allgemeinen ähnlicher als unterschiedlich. Wenn Sie eine aus der Dokumentation herausfinden können, können Sie dies wahrscheinlich auch für andere tun).
Ich habe in letzter Zeit viel mit den ATxmega-Geräten gearbeitet und sie sind wirklich nett. Sie erhalten drei Interrupt-Prioritäten, die die Verwaltung zeitkritischer Inhalte vereinfachen. Es ist auch sehr schön, mit ihnen zu arbeiten (vernünftige Peripheriedesigns! Praktische Portstrukturen! Usw. ...).
Es gibt auch die LPC-Geräte von NXP, die ARM-basiert sind, sowie einige der ARM-Geräte von Atmel (wie sie auf dem Arduino Due verwendet werden) oder die STM32-MCUs von ST. Jedes dieser Geräte bietet eine deutlich höhere Leistung als ein ATmega oder sogar ein ATxmega.
Der Hauptnachteil eines größeren, leistungsstärkeren Prozessors ist der Preis. Wenn Sie jedoch nicht Tausende dieser Einheiten herstellen, werden die Montage- und Herstellungskosten pro Einheit den Kostenunterschied (der wahrscheinlich nur wenige Dollar betragen wird) erheblich übersteigen ) dass es grundsätzlich irrelevant ist.
quelle
Ich musste mich über Timer informieren, bevor ich über Timing-Genauigkeit nachdachte (auch den Bau eines Midi-Step-Sequenzers mit einem Arduino, obwohl er garantiert weniger cool aussieht als diese ^^). Diese Artikelserie war die informativste:
http://maxembedded.com/category/microcontrollers-2/atmel-avr/avr-timers-atmel-avr/
Im Moment denke ich, dass meine Lösung für ein genaues Timing sein wird.
A. Verwenden Sie das AVR-Arduino
B. Halten Sie die Aufgabe auf einem Mikroprozessor
C. Verwenden Sie mit Bedacht Vorskalierer, Timer und Interrupts, um die erforderliche Präzision zu erzielen.
AKTUALISIEREN
Mit dem grundlegenden Midi-Tutorial für Arduino und nachdem ich mir diesen Artikel über Timer und Prescaler angesehen habe, habe ich mir den folgenden Code ausgedacht. Der Code verwendet den Timer1- und CTC-Modus, um jede Viertelsekunde eine Midi-Note und jede Viertelsekunde eine Note abzuspielen (die genau 120 Schläge pro Minute betragen sollte). Leider kommt dies immer noch nur langsamer als 120 bpm, obwohl dies der nächste ist, den ich bekommen habe ...
AKTUALISIEREN
Ich habe jetzt seit ~ 24 Stunden damit zu kämpfen und endlich einige Antworten aus dem Forum bekommen. Ich denke, dass der Code, den ich oben verwendet habe ^^, ziemlich gut ist. Verwenden des ISR, Verwenden des CTC-Modus und von Prescalern usw. Nachdem ich mich an das Forum gewandt habe, denke ich, dass es bei der Lösung weniger darum geht, Präzision auf dem Midi-Sequenzer zu erreichen, sondern mein gesamtes Hardware-Setup (meine Synthesizer und Sampler) an das gleiche anzuschließen Midi-Uhr, ob die Uhr vom Arduino stammt oder nicht.
quelle
Abhängig davon, wie schrittweise Sie den Übergang von einem angebundenen Computer zu einem µC-basierten System durchführen möchten, können Sie einen Raspberry Pi in diese Box legen (25 bis 35 US-Dollar im Einzelhandel ). Auf diese Weise können Sie einen vollständigen (wenn auch stromsparenden) Linux-basierten Computer mit USB-Anschlüssen und GPIO-Pins haben.
quelle