Decoder mit Microcontroller |
Signale im Motorola-Format decodieren
und Magnetartikel steuern
Bauanleitungen
Unter "ARDUINO =>
Decoder" wird unter
"Teil 1" eine Schaltung "HJB Schaltdecoder 4 Servos OP v1.4"
beschrieben (siehe dort). Diese Schaltung habe ich modifiziert indem ich einen
ARDUINO NANO mit entsprechender Programmierung verwende. Dabei werden
viele bereits bekannte Schaltungsteile, sowie die komplette
Funktionalität, aus der Schaltung "HJB Schaltdecoder 4 Servos OP v1.4"
übernommen, sodass sich der Leser lediglich mit dem neuen Schaltungsteil
"ARDUINO NANO" zu beschäftigen hat. |
Teil 1: ein Decoder mit 4 Weichen-Servos und Anzeigen mittels ARDUINO NANO und 2 ATtiny85
Abb.1
Abb.2 |
Wir übernehmen die Eingangsstufe
von unserer bereits bekannten Schaltung "4 Servos OP v1.4" und bauen sie
auf einem Steckboard auf. Sodann wird eine Zentrale mit Keyboard
angeschlossen. Von Interesse sind nun die Ausgänge des IC1 MC145027, in
Abb.2 benannt mit E0, E1, E2, E3. Hier bieten sich nun 3 Möglichkeiten
an: 1. Wir entnehmen die erzeugten Pegel einer Tabelle (siehe unter ARDUINO => Decoder => Abb.5). 2. Wir messen mittels Multimeter die Pegel bei jeder Keyboard-Tastenbetätigung 1rt, 2rt, bis 4gn. und notieren uns diese. 3. wir schließen einen Logic Analyzer an die Schaltung an und betätigen die Keyboard-Tasten 1rt, 2rt, bis 4gn nacheinander. Das Ergebnis zeigt dann die folgende Abb.3 |
Abb.3 Channel 0, angeschlossen an E3 (siehe Abb.1), triggert bei jeder Keyboard-Tastenbetätigung. Die dabei jeweils erzeugten Pegel an E0, E1, E2 werden unter Channel 1, 2, 3 angezeigt. So erkennt man bei einer einzigen Messung die jeweiligen Pegel bei Tastenbetätigungen: Taste 1rt => Pegel LLL, Taste 2rt => Pegel LHL, bis Taste 4gn => Pegel HHH. Diese "Pegelmuster" von L´s und H´s an den Ausgängen E0 bis E3 müssen nun einem nachfolgen Microcontoller (wir werden hier einen ARDUINO NANO verwenden) zugeführt werden und dieser berechnet dann die zu schaltenden Ausgänge je nach anliegenden Pegeln. HINWEIS: Informationen zu Logic Analyzer finden Sie unter Messtechnik => Logic Analyzer |
Abb.4 Zahlen in den Kreisen nummerieren die Abfragen 1 bis 8 |
Um ein Programm für einen
Microcontroller zu erstellen, ist erst einmal die erforderliche
Programmstruktur zu überlegen. Bestens geeignet dazu ist ein
Flussdiagramm, welches in der linken Abb.4 dargestellt ist. Nach Programmstart wird E3 eingelesen (wird eine Keyboardtaste gedrückt, erscheint ein kurzer H-Impuls an E3). Ist nun E3=L, dann wurde keine Taste gedrückt und das Programm springt zum Anfang zurück. Ist E3=H, dann wurde eine Taste gedrückt und das Programm liest E0, E1, E2 ein. Danach führt das Programm Abfragen aus, um zu ermitteln welche Taste gedrückt wurde. E0=L UND E1=L UND E2=L => schalte Ausgang D9 auf H wenn nicht, nächster Schritt E0=H UND E1=L UND E2=L => schalte Ausgang D9 auf L wenn nicht, nächster Schritt E0=L UND E1=H UND E2=L => schalte Ausgang D8 auf H wenn nicht, nächster Schritt E0=H UND E1=H UND E2=L => schalte Ausgang D8 auf L wenn nicht, nächster Schritt E0=L UND E1=L UND E2=H => schalte Ausgang D9 auf H wenn nicht, nächster Schritt E0=H UND E1=L UND E2=H => schalte Ausgang D9 auf L wenn nicht, nächster Schritt E0=L UND E1=H UND E2=L => schalte Ausgang D8 auf H wenn nicht, nächster Schritt E0=H UND E1=H UND E2=H => schalte Ausgang D8 auf L wenn nicht, nächster Schritt Abfrage Ende Zurück zum Schleifenanfang |
Ein ARDUINO NANO kommt zum Einsatz
Abb.5 zeigt die Beschaltung der Eingangsstufe zum ARDUINO NANO |
Abb.6 |
Abb.6 zeigt den ersten Teil des
Sketch für den ARDUINO NANO, welcher nur einmal beim Start ausgeführt
wird. Deklaration: hier werden erforderliche Variablen definiert, sowie zugehörige Anschlüsse am ARDUINO NANO Inizialisierung hier werden die zugehörigen Ausgänge des ARDUINO NANO definiert. |
Abb.7 |
Abb.7 zeigt den zweiten Teil des
Sketch für den ARDUINO NANO. Hier startet die Schleife. Es folgt die Abfrage des NANO-Eingang A3: wenn der Wert X3 (das ist der Pegel, welcher am NANO-Eingang A3 anliegt) größer 50 ist (also mit Sicherheit größer 2 Volt; d.h. H ist), dann werden die nachfolgenden Abfragen ausgeführt. Diese nachfolgenden Abfragen weisen nacheinander den Variablen E0, E1, E2 die an den NANO-Eingängen A0, A1, A2 anliegenden Pegel zu, also jeweils HIGH (H) oder LOW (L). |
Abb.8 |
Abb.8 zeigt den dritten Teil des
Sketch für den ARDUINO NANO. Mittels 8 UND-Abfragen der jeweiligen Werde (H oder L) von E0, E1, E2 werden die Adressen ADR1, ADR2, ADR3, ADR4 auf HIGH (H) oder LOW (L) gesetzt. in der Programmiersprache bedeutet z.B.: if ( (E0==LOW)&&(E1==HIGH)&&(E2==LOW) ) wenn E0=L UND E1=H UND E2=L dann digitalWrite (ADR2,HIGH); schreibe in ADR2 ein H-Pegel Da in der Deklaration mit int ADR2=8; und in der Inizialisierung pinMode(8, OUTPUT); der NANO-Ausgang D8 definiert wurde, erscheint am Ausgang D8 ein H-Pegel (also 5 Volt) Entsprechendes gilt hier für die anderen Abfragen. ENDE der Abfragen. Schleifenende und Rücksprung zum Schleifenanfang. |
Das war´s schon was für für das Programm eines ARDUINO NANO erforderlich ist. Das Listing habe ich mit Kommentaren versehen und zusätzlich neben der Abb.8 noch durch ein paar Erklärungen ergänzt. Anzumerken ist noch, dass im Flussdiagramm (Abb.4) bei "keine Taste gedrückt" zum Anfang gesprungen wird; im Sketch (Abb.7 bis Abb.8) springt das Programm bei Nichterfüllung der Abfrage (also keine Taste gedrückt) zum Ende der der Abfrage umfassenden geschweiften Klammern {...} und kehrt dann zum Schleifenanfang zurück, was auf das Selbe herausläuft! Grundlegende Informationen zum ARDUINO finden Sie unter ARDUINO => Grundlagen. |
Schießt man einen Logic Analyzer an
den so programmierten ARDUION NANO an (Channel-Anschlüsse wie in Abb.5)
und betätigt nacheinander die Keyboard-Tasten
1rt, 2rt,
3rt,
4rt,
1gn,
2gn,
3gn,
4gn, so erhält man
folgendes Messergebnis: Abb.9 Wir erkennen im Messergebnis folgendes: E3: liefert bei jedem Tastendruck (Keyboard-Taste) ein H-Impuls E0, E1, E2: zeigt die vom IC MC145027 decodierten Pegel zur jeweils gedrückten Taste ADR1: ist der Ausgang D9 des NANO und bei Taste 1rt auf H und bei Taste 1gn auf L (unser Ausgang für Adresse 1) ADR2: ist der Ausgang D8 des NANO und bei Taste 2rt auf H und bei Taste 2gn auf L (unser Ausgang für Adresse 2) ADR3: ist der Ausgang D7 des NANO und bei Taste 3rt auf H und bei Taste 3gn auf L (unser Ausgang für Adresse 3) ADR4: ist der Ausgang D6 des NANO und bei Taste 4rt auf H und bei Taste 4gn auf L (unser Ausgang für Adresse 4) Die Schaltung funktioniert also wie erwartet korrekt. Wer über keinen Logic Analyzer verfügt, kann natürlich etwas umständlicher mit einem Multimeter an den Ausgängen D9 bis D6 nach jeder Tastenbetätigung messen messen. Oder man verwendet dazu die nachfolgend beschriebene Anzeige. |
Anzeigen und Weichenservos
Abb.10 Die Abbildung 10 zeigt den vollständigen Schaltplan. Die Schaltung setzt sich aus 4 Bereichen zusammen: 3 Bereiche kennen wir bereits aus der Schaltung "Schaltdecoder 4 Servos OP v1.4", siehe unter ARDUINO => Decoder => Teil 1 (Beschreibungen siehe dort), diese sind hier in Abbildung 10 dargestellte Bereiche: Decoder, Anzeigen, und Weichendecoder. Der 4. Bereich ARDUINO Nano wurde oben beschrieben. |
In
Abbildung 10 wurden Ziffern in farbigen Kreisen für Anschlusspunkte
eines Logic Analyzer eingezeichnet. Die untere Abbildung 11 zeigt das
Ergebnis, wenn wiederum Keyboardtasten in der Reihenfolge
1rt,
2rt,
3rt,
4rt,
1gn,
2gn,
3gn,
4gn betätigt wurden. Abb.11 Channel 0 bis 7 wurden bereits weiter oben auf der Seite beschrieben. Channel 8 bis11 zeigen die von den zwei ATtiny85 erzeugten PWM-Signale für die vier Servos. Das Programm für die ATtiny85 mit Beschreibungen kenn wir bereits, siehe unter Servosteuerung => Download 2W30ATtiny84 (ganz am Ende auf dieser Seite). Anmerkung: die ATtinies erzeugen, je nach Stellung, permanente PWM-Signale, welche den Servos zugeführt werden. Der verwendete Servo funktioniert aber nun so, dass er sich selber abschaltet, wenn er seine jeweilige Endposition erreicht hat und verbraucht dann natürlich auch keinen Strom mehr. Ich habe aber auch leider bemerkt, dass es unter den Servos Typ "9g SG90" Exemplare gibt, die bei gewünschten Endpositionen nicht korrekt abschalten und dann weiter "zittern". Diese Exemplare sind dann leider nicht verwendbar (möglicher Weise könnte man im PWM-Programm die beiden Servopositionsstellungen so verändern, dass dieser Effekt nicht mehr auftritt. Ich werde dies bei Gelegenheit einmal ausprobieren). |
Schaltungstestaufbau
Die Schaltung habe ich zu
Testzwecken auf einem Steckbord aufgebaut, damit können
Sie ebenfalls die Schaltung ausprobieren. Abb.12 Die Schaltung auf 2 Steckbords Steckplatine A: 5V Stromversorgung, Decoder, ARDUINO NANO, 2 ATtiny85. Steckplatine B: Treiber-IC ULN2803A mit Anzeige-LRDs, Treiber-IC UDN2981A mit 4 angeschlossenen Servos. Anmerkung: dieser Aufbau dient lediglich zu Testzwecken! Möglicherweise genügt die hier gezeigte Stromversorgung nicht den Anforderungen zum Betreiben aller 4 Servos; dann sollte eine stärkere 5V Stromversorgung verwendet werden. |
Warum die PWM-Signale nicht mit dem ARDUINO NANO erzeugt werden, sondern mit 2 ATtiny85 Im Prinzip würde ein Programm zur Erzeugung der PWM-Signale spielend Platz im ARDUINO NANO finden. Das Programm wäre aber deutlich langsamer zur gleichzeitigen Ansteuerung von 4 Servos. Mit dieser hier gezeigten Schaltung bedient der ARDUINO NANO lediglich die Ansteuerung der 2 ATtiny85, welche dann sofort reagieren und die Servos bedienen. Lohnt es sich einen ARDUINO NANO einzusetzen? Gegenüber der Schaltung "HJB Schaltdecoder 4 Servos OP v1.4" (siehe "ARDUINO => Decoder" unter "Teil 1") werden folgende Bauteile eingespart: 1x 47HC138, 2x LTV847, 1x 4044, 15x 510 Ohm. Bauteilkosten 2,87 € (Reichelt Preis März 2024). Für die hier beschriebene Schaltungslösung mit einem ARDUINO NANO kommt der Preis von 18,50 € hinzu (Reichelt Preis März 2024). Die Schaltung ist also um 18,50 € - 2,87 € = 15,63 € teurer! Der Einsatz eines ARDUINO NANO lohnt sich nicht! Daher werden auch keine Downloads zu dieser Schaltung eingestellt. Jedoch sollte gezeigt werden, wie ein Programm für einen Microcontroller aussehen kann. |
Teil 2: ein Decoder mit 4 Weichen-Servos und Anzeigen mittels 1 ATtiny84 und 2 ATtiny85
Im obigen Teil 1 verwendeten wir
einen ARDUINO NANO, welcher für unsere Schaltung viel mehr
Funktionalität besitzt als erforderlich ist. Für unsere Zwecke
vollkommen ausreichend ist ein deutlich preiswerter ATtiny84, welcher
über mehr Pins verfügt als ein ATtiny85. Dennoch war die Beschäftigung
mit dem Teil 1 nicht vergeblich! Denn: 1. mit einem ARDUINO NANO können Programme sehr einfach zu Überprüfungen hochgeladen werden. 2. Unser Programm (Sketch) kann ohne Änderungen für einen ATtiny84 verwendet werden. Lediglich die Verdrahtung ist anzupassen. Somit genügen im Folgenden wenige Erklärungen. Dennoch werde ich vollständigkeitshalber Flussdiagramm und Sketch lediglich mit angepassten Kommentaren wiedergeben. |
Abb.13 |
Die Abbildung 13 zeigt die
Anschlussbelegungen vom IC MC145027 zum ATtiny84, sowie vom ATtiny84 zum IC UDN2981. Weiter ist das 14-polige IC ATtiny84 abgebildet. In den blauen Kreisen sind die Nummern angegeben, die im Programm (Sketch) für die Zuweisungen der ATtiny84-Pins zu verwenden sind. |
Abb.14 |
Die
Abbildung 14 zeigt im Grunde dasselbe Flussdiagramm wie in Abbildung 4,
nur dass ich hier die Bezeichnungen statt eines ARDUINO UNO die des
ATtiny84 angebe. Nach Programmstart wird E3 eingelesen (wird eine Keyboardtaste gedrückt, erscheint ein kurzer H-Impuls an E3). Ist nun E3=L, dann wurde keine Taste gedrückt und das Programm springt zum Anfang zurück. Ist E3=H, dann wurde eine Taste gedrückt und das Programm liest E0, E1, E2 ein. Danach führt das Programm Abfragen aus, um zu ermitteln welche Taste gedrückt wurde. E0=L UND E1=L UND E2=L => schalte Nr. 9 auf H wenn nicht, nächster Schritt E0=H UND E1=L UND E2=L => schalte Nr. 9 auf L wenn nicht, nächster Schritt E0=L UND E1=H UND E2=L => schalte Nr. 8 auf H wenn nicht, nächster Schritt E0=H UND E1=H UND E2=L => schalte Nr. 8 auf L wenn nicht, nächster Schritt E0=L UND E1=L UND E2=H => schalte Nr. 9 auf H wenn nicht, nächster Schritt E0=H UND E1=L UND E2=H => schalte Nr. 9 auf L wenn nicht, nächster Schritt E0=L UND E1=H UND E2=L => schalte Nr. 8 auf H wenn nicht, nächster Schritt E0=H UND E1=H UND E2=H => schalte Nr. 8 auf L wenn nicht, nächster Schritt Abfrage Ende Zurück zum Schleifenanfang |
Die unteren Abbildungen 15 bis 17
zeigen das Listing für den ATtiny84 Sketch. Vergleicht man diese mit den
obigen Abbildungen 6 bis 8 für das Listing des ARDUINO NANO, so wird man
feststellen, dass sich die Listings, bis auf
meine eingefügten Kommentare, nicht unterscheiden. D. h. die
Programme sind Identisch! Die eingefügten unterschiedlichen Kommentare
bieten lediglich eine Hilfe bezüglich der sich unterscheidenden
Anschlüsse (Pins) vom ARDUINO NANO zum ATtiny84. Ein großer Vorteil, dass ein für den ARDUINO NANO (oder auch UNO) geschriebenes Programm unverändert auch für einen ATtiny84 verwendbar ist (sofern hierfür die ATtiny84-Pins ausreichen!), ist u. A. folgender: Man entwickelt sein Programm erst einmal auf einem ARDUINO NANO (oder UNO), kann das Programm beliebig testen, bis es zufriedenstellend funktioniert (ein wiederholtes Hochladen von Versuchsprogrammen ist ja mit dem über USB an den PC verbundenen ARDUINO leicht möglich). Erst wenn hier alles wunschgemäß funktioniert, überträgt man unverändert das Programm auf einen ATtiny84! Dazu muss natürlich (ähnlich wie bei einem ATtiny85) erst ein Bootloader auf den ATtiny84 gebrannt werden, bevor der Sketch hochgeladen werden kann. Dies werde ich (demnächst) unter ARDUINO => ARDUINO ATiny-Brenner einstellen. HINWEIS: Es ist von großem Vorteil, alle Variablen und Anschlüsse unter Deklaration und Inizialisierung zu definieren! Denn bei Änderungen von Anschlüssen (Pins) sind lediglich in diesen zwei Bereichen entsprechende Änderungen durchzuführen, vorausgesetzt Variablennamen bleiben unverändert. Dann muss in der Endlosschleife nichts geändert werden. Es war und ist also nicht umsonst, dass wir uns zunächst mit dem ARDUINO NANO beschäftigen und uns dann in die Thematik eines ATtiny84 einarbeiten! |
Abb.15 |
Abb.15 zeigt den ersten Teil des
Sketch für den ATtiny84, welcher nur einmal beim Start ausgeführt
wird. Deklaration: hier werden erforderliche Variablen definiert, sowie zugehörige Anschlüsse am ATtiny84. Inizialisierung hier werden die zugehörigen Ausgänge des ATtiny84 definiert. |
Abb.16 |
Abb.16 zeigt den zweiten Teil des
Sketch für den ATtiny84. Hier startet die Schleife. Es folgt die Abfrage des ATtiny84-Eingang A3 = Pin 10: wenn der Wert X3 (das ist der Pegel, welcher am ATtiny84-Eingang A3 anliegt) größer 50 ist (also mit Sicherheit größer 2 Volt; d.h. H ist), dann werden die nachfolgenden Abfragen ausgeführt. Diese nachfolgenden Abfragen weisen nacheinander den Variablen E0, E1, E2 die an den ATtiny84-Eingängen A0=Pin13, A1=Pin12, A2=Pin11 anliegenden Pegel zu, also jeweils HIGH (H) oder LOW (L). |
Abb.17 |
Abb.17 zeigt den dritten Teil des
Sketch für den ATtiny84. Mittels 8 UND-Abfragen der jeweiligen Werde (H oder L) von E0, E1, E2 werden die Adressen ADR1, ADR2, ADR3, ADR4 auf HIGH (H) oder LOW (L) gesetzt. in der Programmiersprache bedeutet z.B.: if ( (E0==LOW)&&(E1==HIGH)&&(E2==LOW) ) wenn E0=L UND E1=H UND E2=L dann digitalWrite (ADR2,HIGH); schreibe in ADR2 ein H-Pegel Da in der Deklaration mit int ADR2=8; und in der Inizialisierung pinMode(8, OUTPUT); der ATtiny84-Ausgang D8 definiert wurde, erscheint am Ausgang D8 ein H-Pegel (also 5 Volt) Entsprechendes gilt hier für die anderen Abfragen. ENDE der Abfragen. Schleifenende und Rücksprung zum Schleifenanfang. |
Der komplette Schaltplan mit Anzeigen und Weichenservos
Abb.18 Wie in Abbildung 10, nur dass statt einem ARDUINO NANO ein ATtiny 84 zum Einsatz kommt.
|
Der komplette Schaltungsaufbau auf 2 Steckboards
Abb.19
|
Die Platine
Ohne Platine ist die Schaltung wohl kaum betriebssicher aufzubauen. Deshalb erstellt ich ein Platinen-Layout. Es gibt 2 Möglichkeiten: entweder kommt ein einseitig kupferkaschiertes Material zur Anwendung, wobei einige Verbindungen auf der Oberseite mittels Drahtbrücken zu erstellen sind, oder man treibt den etwas anspruchsvolleren Aufwand und verwendet zweiseitig kupferkaschiertes Material (wobei dann natürlich Durchkontaktierungen erforderlich sind). Auch ein Bestückungsaufdruck ist sehr hilfreich. |
Abb.20 Vergleiche die Abbildung 20 mit Abbildung 12 unter ARDUINO => Decoder , die Ersparnis an Bauteilen ist deutlich! |
Bei einer 1-seitigen Platine stellen in
Abb.12 die hellgrünen Linien Drahtbrücken dar, bei einer 2-seitgen
Platine Leiterbahnen auf der Bestückungsseite (A),
wobei dann die goldfarben dargestellte Bohrungen Durchkontaktierungen (B)
sind. Zwei 90°-Winkel (C)
dienen zur Befestigung einer Frontplatte, wenn die Schaltung in ein
19"-Gehäuse eingeschoben werden soll, was sinnvoll und platzsparend ist,
da sicher mehr als eine Platine zum Einsatz kommen wird. Möchte man auch
am 19"-Gehäuse Stellungsanzeigen haben, so finden LEDs auf der
Frontplatte Platz. Die Verbindungen erfolgen über die 16-polige
Steckleiste (rot umrandetes Rechteck). Eine 32-polige gewinkelte
Federleiste (rechts auf der Platine) stellt die externen Verbindungen
zur Verfügung. Dieses Platinenlayout wurde von mir noch nicht bestückt aufgebaut und getestet, jedoch gewissenhaft mit dem getesteten Schaltplan überprüft. |
Diese Schaltung eignet sich für zwei Anwendungsfälle: (a) als Weichendecoder für 4 Weichen mit Servoantrieben, (b) als Signaldecoder für 4 2-begriffige Licht-Signale. Formsignale, welche nicht mit Dauerstrom angesteuert werden können, können hier nicht angeschlossen werden, da die Schaltung dafür keine Impulse liefert. |
Download Decoder mit 4 Weichen-Servos und Anzeigen mittels 1 ATtiny84 und 2 ATtiny85 im Download enthalten: - Flussdiagramm - Schaltplan - Platinenlayout und Bestückungsaufdruck - Anschlussbelegungen - Kommentiertes Listing (Sketch) für ATtiny84 Download für erforderlichen Sketch für die ATtiny´s 85 2W30ATtiny85 Beschreibungen hierzu siehe unter ARDUINO=>Servosteuerung |
Für einen ATtiny84 ist ein anderer Bootloader als für einen
ATtiny85 erforderlich; ebenso für das Hochladen von Programmen! ATtiny84-Bootloader ist unter ARDUINO => ARDUINO ATtiny-Brenner eingestellt. |