Arduino - Programmierung

  • Seite 3 von 10
30.06.2023 12:17 (zuletzt bearbeitet: 30.06.2023 12:19)
#31
avatar

Zitat von Bkoeln im Beitrag #29
Mal eine andere Frage dazu. Wie führt ihr die Midisignale der einzelnen arduinos zusammen?

Du meinst beim Einsatz mehrere Geräte, dass alles dann aus einer Quelle kommt?

Ich habe in meinem Tisch drei Controller, diese haben alle ihren eigenen Midi Kanal und arbeiten unabhängig voneinander. Sofern es nicht unbedingt notwendig ist, würde ich auch nicht zwei oder mehr Controller verbinden wollen. Zum verbinden gibt es ja mehrere Möglichkeiten. Zum einen könnte man die Midi Signale zu einem Host schicken und dieser gibt sie dann gebündelt weiter. Der Nachteil wäre aber, dass die ohnehin knappen Pins dann noch knapper werden. Die zweite Möglichkeit wäre über eine serielle Kommunikation die Informationen auszutauschen, so dass ein Controller dann alles gebündelt hat und sendet. Eine andere Idee wäre die Controller mittels SPI zu verbinden und diese dann so kommunizieren zu lassen.

Alle Lösungen haben aber gemeinsam, dass es komplex wäre und wenn irgendwo was schief geht, dann will ich nicht derjenige sein, der so etwas Debuggen muss :) Auch wenn man eine eigene Lösung entwickelt, muss man zumindest ein Protokoll entwickeln, mit welchem sicher kommuniziert werden kann. Einfach so ohne Fehlerkorrektur etwas seriell zu verschicken ist mutig... Zumindest in meiner Konstellation sehe ich keinen Grund die Controller untereinander kommunizieren zu lassen.

Wenn ich mich nicht täusche hatte @Brassmann in einem anderen Forum mal beschrieben, wie er versuchte über Midi oder andere Protokolle in beide Richtungen zu kommunizieren. Ich weiß nicht, ob er es abschließend hinbekommen hat, aber ich weiß, dass er einiges zur Komplexität dieser simplen Aufgabe sagen kann :)


 Antworten

 Beitrag melden
30.06.2023 15:33
avatar  Montre
#32
avatar

Wie sind die Pins denn verdrahtet?


 Antworten

 Beitrag melden
30.06.2023 20:26
#33
So

Zitat von Montre im Beitrag #27
@Brassmann
Wenn Dir die Optimierung deines Codes zu schwierig ist, dann kann ich Tipps geben.
....

Vielen Dank für das Angebot! Dass ich die Matrix-Abfrage in zwei For-Schleifen packen kann, weiß ich. Ich habe es nur (noch) nicht gemacht. Mir geht das nicht direkt flüssig von der Hand, ich muss mich reindenken, nochmal nachdenken wie die For-Schleife geschrieben werden muss etc. Teilweise kopiere ich mir funktionierende Module aus vorangegangen Codes ein und fertig ist mein neuer Code für das revidierte 3. Manual. Ich bin ja schon froh, dass ich (aus meiner Sicht) den MIDI-Versand so "elegant" mit ineinandergreifenden For-Schleifen gepackt habe. Das Beispiel für Matrix-Abfrage, auf das ich aufsetze, war da viel viel länger, weil jeder Ton einzeln behandelt wurde. Sicher, ihr Profis könnt da nur müde drüber lächeln. Aber ich wusste vor einem dreiviertel Jahr noch gar nicht, was ein Arduino ist. Mir reicht das so, das ist für mich Mittel zum Zweck. Und der Zweck heißt Orgel üben/spielen . Denn am kommenden Sonntag ist Gottesdienst, ich bereite von langer Hand ein größeres Programm vor, außerdem komme ich in meiner aktuellen Lebenssituation nur abends ab ca. 21:00 zu irgendetwas. Das muss ich dann auf basteln, programmieren und üben aufteilen.


Zitat von Christian_Hofmann im Beitrag #28
Mit den Optimierungen ist das immer so eine Sache. Man kann in dem Code wohl eine Menge verbessern, aber ob der Aufwand den Nutzen überwiegt?


Für mich nicht. Solange mir die Arduino IDE anzeigt, dass ich 2% vom Speicher des Boards nutze, gehe ich nicht mehr auf Effizienz, als nötig. Übersichtlichkeit ja, übertriebenes Zusammenfassen auch der letzten noch überflüssigen Zeile nein.


Zitat von Christian_Hofmann im Beitrag #28

Bei solchen eigenen Lösungen kommt es ja weniger auf perfekte Leistung an, sondern unterm Strich darauf, dass es funktioniert. Das fängt ja schon an bei solchen Geschichten wie die Notennummer. Im Code steht bei ihm, genau so wie bei mir Tastencode 49,50,51 und so weiter. Ganz spontan gefragt ohne nachzuschauen, was für eine Note verbirgt sich hinter dem Code 85?


Also MIDI-Codes in Prosa übersetzen finde ich Unsinn. Das wird ja noch umständlicher. Dann merke ich mir lieber so ein paar Ankerpunkte (36 ist das große C, 60 das c1, etc.). Außerdem ist das kein täglich notwendiges Wissen.


Zitat von Christian_Hofmann im Beitrag #28

Nur ist es das Wert für ein Hobby Projekt an dem keiner außer man selbst arbeitet?


Ganz eindeutig nein und: never touch a running system.


Zitat von Montre im Beitrag #32
Wie sind die Pins denn verdrahtet?

Die Frage hab ich nicht verstanden. Kannst du die bitte noch einmal etwas erläutern?


Auf Bernds Frage antworte ich mal in einem eigenen Beitrag.


 Antworten

 Beitrag melden
30.06.2023 20:48 (zuletzt bearbeitet: 30.06.2023 20:50)
avatar  Montre
#34
avatar

Zitat von Brassmann im Beitrag #33
Die Frage hab ich nicht verstanden. Kannst du die bitte noch einmal etwas erläutern?

Welche Leitung ist an Pin row1/col1 angeschlossen? Wenn ich einen Prototypen bauen möchte, z.B. einen Hall-Sensor für einen Tastendruck am Arduino anschließen möchte - was muss ich da wie hardwaremäßig anschließen (ich bin Elektronik-Laie)?


 Antworten

 Beitrag melden
30.06.2023 20:57
#35
So

Zitat von Bkoeln im Beitrag #29
Wie führt ihr die Midisignale der einzelnen arduinos zusammen?

Sag nochmal, was du damit meinst. Aber vielleicht kan nich mit dem Folgenden ja schon deine Frage beantworten.

Zitat von Christian_Hofmann im Beitrag #31

Wenn ich mich nicht täusche hatte @Brassmann in einem anderen Forum mal beschrieben, wie er versuchte über Midi oder andere Protokolle in beide Richtungen zu kommunizieren. Ich weiß nicht, ob er es abschließend hinbekommen hat, aber ich weiß, dass er einiges zur Komplexität dieser simplen Aufgabe sagen kann :)


Soviel vorweg: er hat es hinbekommen und es funktioniert prima Alles in epischer Breite, wenn ich es mal geschafft habe, hier meinen Orgelbau-Bericht als Blog einzustellen. Bitte noch etwas Geduld.

Wo fange ich an. MIDI senden und empfangen kann mal grundsätzlich jeder Arduino. Jedoch kommt es auf den Weg an, ob es auch wirklich klappt. Und auch auf das USB-MIDI-Kabel, das dafür eingesetzt wird. Kauft man hier billigen Schrott, kommt auch nur MIDI-Schrott an.

Option 1: über USB - der (un-)bequeme Weg
Das geht v.a. mit dem Arduino Due gut. Der hat zwei USB-Anschlüsse: einen zum programmieren und einen nativen, der direkt auf den Chip geht (irgendwie so hab ich das verstanden). Das bedeutet aber praktisch, dass der Arduino Due sich, ohne dass man die Firmware nerd-mäßig flashen muss, am PC als ein USB-MIDI-Keyboard anmeldet. Das fand ich sehr charmant. Es gibt eine MIDIUSB Bibliothek, damit kann man prima Befehle senden. Und hier sind wir schon beim Punkt. Diese Bibliothek unterstützt das empfangen von MIDI-Informationen über USB nicht. Für reine Eingabe, sprich Noten auf Manual und Pedal spielen und senden, geht das prima. Will man an das USB-MIDI-Gerät "Arduino Due" jedoch MIDI senden (NoteOn/off, Sysex, ...) dann hängt sich alles auf (in meinem Fall damals Grandorgue). Das führte mich über Ulrichs Blogeintrag zu dem Thema zu Option 2.

Option 2 über DIN-Stecker - der altmodische Weg:
Man bastelt sich eine MIDI-Buchse mit 2 oder 3 Kabeln an den Arduino (Sabine hat das in einem Video beschrieben) und kann dann mit der MIDI-Bibliothek (MIDI.h) MIDI-Befehle senden. Der Sende-Weg ist wieder ganz einfach, wie bei USB. Empfangen ist schon schwieriger. Da muss man sich ein Optokoppler-Arrangement zusammenbauen, siehe Ulrichs Blog. Das habe ich jedoch schließlich gemacht und mir eine eigene bidirektionale MIDI-Arduino-Schnittstelle gebaut. Nun kann ich auch aus GO und HW MIDI-Befehle an den Arduino senden, der daraus dann etwas macht. Anwendungsfall: aktivierte Register für die Taster-Beleuchtung am Spieltisch und Darstellung von Informationen auf Displays (Setzernummer, Schwellerstellung, "Mischpult" für Perspektiven, uvm.).


Kommen wir dazu, wie die Signale "zusammengeschaltet" werden. Zumindest was ich aus deiner Frage interpretiere. Ich habe bei mir eine fast durchgängige Trennung der MIDI-Kanäle und zwar von unten nach oben: Pedal ist Kanal 1, 3. Manual ist Kanal 4. Registertaster sind auf Kanal 5 (senden auch NoteOn/Off). Die Schweller und Perspektiven-Potis sind auf den Kanälen 5-11. Hier gibt es eine Überschneidung, weil die Schweller vor den Registertastern da waren. Aber das ist nicht tragisch, weil hier andere Befehle gesendet werden (Change Control).

Nehmen wir nun das 3. Manual als Beispiel. Hier scanne ich die Tasten und rufe dann eine NoteOn/Off Funktion auf, die auf einem bestimmten Kanal sendet, hier Kanal 4. Derselbe Arduino sendet aber auch Change Control auf Kanal 5. Da ich hier durch die Matrix für 64 Tasten nur 16 Pins verbraucht habe, könnte ich noch zwei weitere Manuale mit 8x8 Matrix auf diesem Arduino anschließen. Ich würde dann nach dem Scannen der jeweiligen Matrizen z.B. andere Funktionen aufrufen, die dann NoteOn/Off auf Kanal 3 oder 2 senden.

Untereinander kommunizieren meine Arduinos eigentlich gar nicht, das ist auch nicht nötig. Entweder senden sie Informationen an GO/HW oder verarbeiten Informationen von da. Die aktuell gültige Wahrheit kennt immer GO/HW. So sendet mein Register-Arduino an HW welche Register aktiv sind, sodass sie in HW aktiviert werden. HW sendet dann die Information, dass sie aktiv sind, an meine MIDI-Schnittstelle. Der angeschlossene Arduino erhält die Information und weiß, dass er nun den Transistor am dazugehörigen Taster schaltet, damit die LED angeht. So kann ich halt auch problemlos mit Setzer arbeiten und sehe die aktivierten Registertaster leuchten.

Konnte ich deine Frage damit etwas beantworten?


 Antworten

 Beitrag melden
30.06.2023 21:05
#36
So

Zitat von Montre im Beitrag #34
Welche Leitung ist an Pin row1/col1 angeschlossen? Wenn ich einen Prototypen bauen möchte, z.B. einen Hall-Sensor für einen Tastendruck am Arduino anschließen möchte - was muss ich da wie hardwaremäßig anschließen (ich bin Elektronik-Laie)?

Ich habe ja versuchsweise ein M-Audio Keystation 61 geschlachtet und mir die Kontaktplatine rausgeholt. Von der habe ich die Elektronik entfernt und zum Schluss noch zweimal 8 Pins gehabt (8x8 Matrix). Gut, es waren 3x8 Pins, aber das hängt mit der Anschlagsdynamik zusammen, sodass man zwei Kontakte pro Taste hat, wo die Zeit zwischen Kontaktschluss gemessen und die Velocity abgeleitet wird. Ich habe davon aber nur einen Kontakt verwendet, also klassisch 8x8 (an/aus).

Die habe ich testweise direkt, im Endzustand jedoch über zwei Flachbandkabel an den Arduino angeschlossen, siehe Bilder. Der Rest ist Programmierung.

Bild entfernt (keine Rechte)

Bild entfernt (keine Rechte)


 Antworten

 Beitrag melden
01.07.2023 01:44
#37
avatar

Zitat von Brassmann im Beitrag #36
Die habe ich testweise direkt, im Endzustand jedoch über zwei Flachbandkabel an den Arduino angeschlossen, siehe Bilder. Der Rest ist Programmierung.

Ich würde ja mal gerne die Unterseite deiner Lochrasterplatine sehen die Teile sind ein Alptraum beim löten und sehen meist eher aus wie ein Arbeitsunfall :)

Kleiner Ratschlag aus leidvoller Erfahrung: Beim nächsten Projekt nimm die Lochraster Punkt-Ketten-Reihen Platinen (Beispiel: https://www.highlight-led.de/platine-160...ten-reihen.html ). Das erspart viel Frust. Wobei ich schon Leute gesehen habe die mit den normalen Platinen traumhafte Verbindungen hinbekommen. Entweder bin ich zu doof, oder die sind wahre Künstler :)


 Antworten

 Beitrag melden
01.07.2023 08:19
avatar  Bkoeln
#38
avatar

Meine Frage bezog sich darauf wie du die einzelnen arduinos die auf den verschiedenen Kanälen senden an den PC anschließt. Über einen midi-merger oder alle einzeln an USB?


 Antworten

 Beitrag melden
01.07.2023 08:30
#39
So

Ok, die Antwort hätte also viel kürzer rausfallen können. Und hier ist sie: Über einen USB-Hub. Hätte ich genug USB-Ports am Rechner, könnte ich die auch einzeln jeweils an einen Port anschließen. Das mit dem Hub geht so lange gut, wie nicht viel Leistung gezogen wird. Denn es stehen in Summe 500 mA über einen USB-Port am Rechner zur Verfügung. Braucht man an den Arduinos dann mehr, müsste man einen powered USB Hub verwenden. Einen solchen habe ich mir auch schon angeschafft, nur noch nicht installiert. Denn bislang funktioniert es auch so :-)


 Antworten

 Beitrag melden
05.07.2023 21:54 (zuletzt bearbeitet: 05.07.2023 21:58)
avatar  Montre
#40
avatar

Ich benötige für mein Spieltisch-Projekt einen Manual-Scanner für mindestens 61 Tasten * 4 Manuale = 244 Signale.

Ich habe dieses Board ("Pin- und Code-Kompatibilität mit dem Original") entdeckt, das 40 I/O's bietet, mit denen man eine Matrix 20x20 = 400 realisieren könnte.

AZ-MEGA2560-Board mit ATmega2560

Ist die Performance 16 MHz ausreichend für die Abfrage dieser Matrix und ggf. weitere Setzer, Schalter oder Register?
Was meint ihr mit Eurer Erfahrung?


 Antworten

 Beitrag melden
05.07.2023 22:09
#41
avatar

Zitat von Montre im Beitrag #40
Ist die Performance 16 MHz ausreichend für die Abfrage dieser Matrix und ggf. weitere Setzer, Schalter oder Register?

Das ist mehr als ausreichend. Mit dem Controller könntest du eine komplette Orgel mit Ventilen, Schalter und Anzeigen nebenbei noch steuern :)

Du führst ja keine komplexen Berechnungen aus, es ist ja nur Pins schalten und Zustand abfragen, dann reagieren. In diesem Szenario ist es theoretisch unmöglich überhaupt eine nennenswerte Last zu erzeugen. Bei den Controllern läuft dein Programm ja quasi in Echtzeit ab. Da gibt es keine anderen Prozesse oder Betriebssystem welches ins Gewicht fällt.


 Antworten

 Beitrag melden
05.07.2023 22:24
avatar  Montre
#42
avatar

Das bestätigt mir auch die Elektronik von GINO. Der Big-Midi 3.1 nutzt einen ATMEGA 8535, der bis zu 16 MHz taktet.


 Antworten

 Beitrag melden
05.07.2023 22:44
#43
avatar

Bei einer 20x20 Matrix wirst du aber dann noch Schieberegister brauchen bei dem Arduinoum so viele Pins abzufragen. 40 Pins sind nämlich dort nicht verfügbar.

Alternativ optimierst du deine Matrix. Wenn du vier Manuale hast, dann könnten sich alle vier Manuale ja die Spaltentreiber teilen und nur die Zeilenleser sind verbunden. Dann weißt du ja welche Zeilen von welchem Manual sind. Bei einer cleveren Programmierung könntest du in einem Durchgang dann auch gleich die Zustände an allen vier Manualen ablesen. Beispiel Spaltentreiber 1 und dann wird Zeilenleser vom Manual 1-4 in einem rutsch abgelesen.

Als erstes Programmierprojekt wäre das aber durchaus mutig.


 Antworten

 Beitrag melden
05.07.2023 22:52 (zuletzt bearbeitet: 05.07.2023 22:53)
avatar  Montre
#44
avatar

Aber die werden mir doch nicht Pins anbieten, die ich nicht abfragen kann (?). Das Handbuch dazu wäre ganz hilfreich.
Der 2560 ist schon ziemlich leistungsfähig, wenn ich mir das in der Tabelle hier so anschaue.


 Antworten

 Beitrag melden
05.07.2023 22:52
#45
So

Der Mega hat genug Pins, 20x20 kann er machen. Ich würde nur an deiner Stelle Original-Ware nehmen, also Arduino. Funduino Mega funktionierte bei mir auch gut und ist Plug&Play kompatibel mit der Arduino IDE. Bei Drittware kann es sein, dass du noch irgendwelche chinesischen Treiber installieren musst, damit das Board überhaupt erkannt wird.

Neu:
https://www.reichelt.de/arduino-mega-256...ASABEgJdavD_BwE

Gebraucht (der mit EthernetShield ist für dich vlt. interessant):
https://www.kleinanzeigen.de/s-anzeige/a...418715-168-2118
https://www.kleinanzeigen.de/s-anzeige/a...481932-168-2110
https://www.kleinanzeigen.de/s-anzeige/a...254791-168-4347


 Antworten

 Beitrag melden
Bereits Mitglied?
Jetzt anmelden!
Mitglied werden?
Jetzt registrieren!