MIDI für Kirchenorgel – 3

Mikrocontroller und Systemarchitektur

Schon seit vielen Jahren arbeite ich in meiner Freizeit mit den CPUs von ATMEL (inzwischen übernommen von Microchip). Die Entwicklungswerkzeuge sind mir halbwegs vertraut, für üblichen Steuerungsaufgaben reicht die inzwischen angestaubte 8-bit-Architektur mit bis zu 20 MHz aus.

ATMEL CPUs, oben in der der bastelfreundlichen DIP-Ausführung, unten SMD
Von Springob – Eigenes Werk, CC BY 3.0, https://commons.wikimedia.org/w/index.php?curid=5054949

Warum ATMEL?

Ich habe in meiner Bastelkiste auch STM32, ESP8266, ESP32-Boards herumliegen. Diese sind viel leistungsfähiger, und teilweise mit WLAN besser an fortschrittliche Bedienung mit Smartphone und Tabletts anzupassen. Aber: sie haben zu wenige Ports (s.u.) und sind für mich bis auf einige „Hello World“-Projekte Neuland. Mit dieser Hypothek wollte ich so ein Großprojekt nicht zusätzlich belasten.

Folgende Ein-/Ausgänge sind nötig:

  • 2 x 8 Bit Datenleitungen für die serielle Ansteuerung der Schieberegister plus 4 Steuerleitungen (20 Leitungen)
  • 4 Datenleitungen plus 2 Steuerleitungen für das LCD
  • 1 Leitung A/D für die Tasten (erzeugen Spannung über geschaltetes Widerstandsnetzwerk, die eingelesen wird)
  • 2-3 x 2 serielle Leitung (RxD/TxD) für MIDI, RS232 (PC-Anschluss), Kommunikation mit anderem Mikrocontroller (als Option)

Das macht minimal 31 Port-Leitungen, wobei ein paar Reserven für spätere Erweiterungen und eigene Leitungen für das JTAG Interface (4x) sinnvoll wären.

Die DIP-Version ATMegas mit maximal 40 Pins kommen damit nicht in Frage, da diese damit jetzt von vornherein komplett ausgelastet wären und ferner keine 3 seriellen Schnittstellen haben. Kurzfristig plante ich, die Aufgaben auf 2 CPUs zu verteilen, die miteinander kommunizieren (z.B. Ein-/Ausgabe zu den Tasten/Magneten und Benutzerinterface. Der erhöhte Entwicklungsaufwand schreckte mich aber doch ab.

Arduino

Es bleiben also die ATMega CPUs in SMD-Ausführung, was zum schnellen Selbstbau leider ungeeignet ist. Auf der Suche nach Fertigmodulen z. B. vom ATMega 1280 stieß ich unerwartet auf einen alten Bekannten: Den Arduino, hier in Form des Arduino Mega. Ich finde die Arduino-Idee großartig, denn sie ermöglicht einen niederschwelligen Zugang zur Arbeit mit Mikrocontrollern und bietet eine unglaubliche Menge an Zubehör mit Bibliotheken. Für ernsthafte Projekte hatte ich jedoch noch nie Arduinos eingesetzt: Die Entwicklungsumgebung ist wenig leistungsfähig im Vergleich zum AVR Studio, v. a. was Debugging angeht. In Echtzeit-Systemen habe ich zudem nicht viel übrig Code, in denen massiv „delay“-Schleifen enthalten sind und der auf Portbits mit aufwändigen Unterprogrammen statt mit schneller Bitmanipulation. Ich wollte daher keine Arduino-Bibliotheken verwenden, zumal das dort verwendete C++ auf einem Mikrocontroller auch nicht sehr performant ist und ich reines „C“ bevorzuge. Wie ich jedoch herausfand, kann man die Arduinos auch perfekt als reine Hardware benutzen, d.h. direkt per SPI/JTAG programmieren und den Bootloader deaktivieren.

Daher setzte ich bald einen Arduino Mega mit einem Prototype-Shield (kleine Lötfläche für eigene Schaltungen) als Zentrale ein:

Der Arduino Mega befindet sich unter dem aufgesteckten Prototype-Shield
Über das aufgestecke Protoype-(im Bild „Expansion“)-Shield steuert der Mikrocontroller die gesamte Peripherie

Auf dem Expansion-Shield befinden sich außer der Standard-MIDI-Ansteuerung mit Optokoppler nur wenig Elektronik. Hauptsächlich werden die Portleitungen PA0…7, PB 0…7 etc. an die entsprechenden Buchsen zum Anschluss der Peripherie weitergegeben.

LCD

LCD-Keyboard-Shield. Die Tasten verändern über eine Widerstandsnetzwerk die Analogspannung an einem A/D-Eingang – nur eine Leitung für alle Tasten nötig!

Für die ersten Tests bot es sich an, ein fertiges LCD-Keyboard-Shield zu verwenden. Mit 2×16 Zeichen ist es aber knapp bemessen, so dass es für den wirklichen Einsatz durch ein 4×20-Zeichen-LCD ersetzt wurde. Für diese Standard-Text-LCDs mit dem HD44780-Controller gibt es viele Bibliotheken (1).

Schicker als so ein schnödes Text-Display wäre ein grafikfähiges, am besten mit Touch. Die gibt es und sie sind nicht teuer – aber belegen schon wieder sehr viele Ports und bedeuten natürlich viel mehr Softwareaufwand. Ausprobiert habe ich auch ein Display von Nextion, das die Entwicklung der Benutzeroberfläche am PC erlaubt und mit überschaubarem Aufwand seriell mit dem Mikrocontroller interagiert. Letztlich beschloss ich jedoch, eine grafisches Benutzerinterface als Option für später anzusehen, zumal das in der Orgel selbst schwer unterzubringen wäre.

Die Signalverteilung an die Schieberegister/MOSFETs

Der I/O-Verteiler besteht im wesentlichen aus den CMOS 4504 Konvertern, die 5V in 12V wandeln (links), bzw umgekehrt (rechts):

Hier mal Details zu Problemen der Hardware-Entwicklung: Anders als im Datenblatt versprochen, arbeiten die 4504, wenn nur eine von beiden Versorgungsspannungen anliegt, nicht zuverlässig (2). Daher wurden manchmal über das „OE“-Signal die Transistoren freigeschaltet wurden, wenn die 12V-, aber nicht die 5V- Versorgungsspannung anlag. Da aber die Schieberegister 4094 ohne die CPU (5V fehlt ja) nicht initialisiert werden, liegen an deren Ausgängen nach dem Einschalten zufälligen Werte an, die dann u.U. über die MOSFETs die Magnetventile aktivierten. Um dies zu vermeiden, wurden im im Rahmen des Entwicklungsprozesses die entsprechenden 4504 von einem eigenen Spannungsregler (3) versorgt, der seine Spannung sowohl von den 5V der CPU als auch den 12V der Orgel bezieht, in der Schaltung als „5V<12V“. bezeichnet:

Der LP2950 versorgt einige der Konverter 5V->12V mit 5V

Leider gab es auch mit dieser Schaltung gelegentlich ein kurzes (< 0,1 s) Durchschalten der Transistoren beim Einschalten, so dass die 12V für die Transistoren letztlich doch durch eine kleine Relais-Schaltung von der CPU verzögert aktiviert werden mussten.

Anmerkung

(1) Leider viele davon nur für Arduino, wenige generisch für alle ATMEL CPUs in „reinem“ C. Zudem musste ich feststellen, dass viele davon sich nicht an die Timing-Vorgaben des Datenblatts halten und ich sie sicherheitshalber umgeschrieben habe.

(2) Wie sie nämlich auf der Seite ohne Versorgungsspannung das 0V-Eingangssignal interpretieren, ist nicht sicher: Fast immer als „0“ (wie man das erwarten würde), leider gelegentlich aber auch als „1“. Zu dem Problem fand ich einen Eintrag im TI-Support-Forum einen Leidensgenossen: „the 5V power supply is not always present… the device … output switching unexpectedly“. Ausweichende Antwort “ The logic forum engineers are experts and more familiar with the CD4504B. They will give your answers“. Deren Antwort konnte ich allerdings nicht finden, trotzdem wurde das Problem als erledigt gekennzeichnet.

(3) Über die Diodenschaltung D2/D1 erhält der Spannungsregler die höhere der beiden Eingangsspannungen. Bei 12V gar kein Problem, bei alleiniger 5V von der CPU fallen aber von den 5V (nur!) 0,08 V am LP2950 (bei 0,1 mA Stromentnahme) ab, hinzu kommen 0,28 V von der Schottky-Diode. Somit ist die Versorgungsspannung der 4504 um 0,36 V niedriger als die der CPU. Die Eingangssignale von der CPU können also um 0,36 V über der Versorgungsspannung des 4504 liegen, was jedoch niedrig genug ist, um nicht die Schutzschaltung der Eingänge zu überlasten.

Dieser Beitrag wurde unter Basteln, Mikrocontroller/Arduino abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.