• Hallo Zusammen, Aufgrund der aktuellen Situation setzten wir die Möglichkeit aus, sich mit Gmail zu registrieren. Wir bitten um Verständnis Das RCMP Team

Praxisbericht Lichsteuerung über RC-Empfänger mit (Arduino) Nano - Experimentierthema

BAXL

Admin
Mitarbeiter
Für Lichtsteuerungen mit Arduinos gibt es inzwischen viele Themen und Projekte. Entweder wird ein fertiges Projekt vorgestellt (was toll für die ist, die einfach nur nachbauen möchten), oder es gibt Themen mit endlosen Supportbemühungen. Ich werde mich jetzt mal von allem, was schon komplett fertig ist, lösen und quasi von vorne anfangen. Ich werde sicher verschiedene Teillösungen ausprobieren und zum Teil auch eigene Wege gehen. Im Vordergrund steht das Ausprobieren, an dessem Ende natürlich (m)eine fertige Schaltung und (m)ein fertiges Programm stehen soll. Irgendwie wird mein fertiges "Produkt" auch wieder eine neue Zusammenstellung von unzähligen Teilbemühungen von anderen fleißigen Makern sein. Die Essenz ist aber, dass ich nicht nur einfach Bausteinchen zusammensetzen will, sondern möglichst die Teillösungen verstehen und erklären können.

Die Basis, wie könnte es anders sein, wird die Vorlage von Rockracer sein, die ich schon sofort dadurch verändere, dass ich nicht für eine Schaltfunktion zwei digitale Ausgänge verwende, damit der Strom auch ausreicht. Das hat einige angenehme Nebeneffekte. 1. Es stehen mehr freie, unabhängige Schaltkanäle zur Verfügung und dadurch, dass jeweils nur ein Pin gesetzt werden mus, spart man hier und da ein paar Prozessortakte, die man vieleicht besser zur Abfrage der RC-Steuerkanäle benötigt.

Dafür sind natürlich zusätzliche Transistoren o.ä. nötig, damit der benötigte Strom auch geschaltet werden kann. Dafür war ich shoppen und werde im weiteren Verlauf des Themas folgende Platinen mit einem ULN2803 einsetzen.



Ich beginne mit der Belegung der Digitalkanäle des Nanos.
  • Blinker Links - Pin 4
  • Blinker Rechts - Pin 5
  • Rücklicht - Pin 6
  • Hauptscheinwerfer - Pin 7
  • Rückfahrscheinwerfer - Pin 8
Das soll für den Anfang reichen.

Als Eingänge für die Abfrage der RC-Kanäle
  • Gaskanal - Pin 2
  • Servokanal Lenkung - Pin 3
Die Abfrage der Steuerkanäle ist scheinbar bei vielen das größte Problem, weil der Nano damit gut beschäftigt ist und nebenher ja auch noch die Pins für die LEDs ein und wieder ausschalten muß. Beim Blinker wird es sogar noch aufwendiger als bei den anderen Lichtfunktionen, die quasi statisch sind.
Theoretisch könnte man auch eine kleine Hardware zwischen den nano und den Blinkern setzen, sodass der Nano nur ein High oder ein Low-Signal ausgeben braucht. Aber das nur so als Gedanke.

Edit: Das wäre z.B. eine Lösung, um das Blinken selbst (also das Ein und Ausschalten) auszulagern, sodass der Arduino sich nicht darum kümmern muß.
Blink LED als Taktgeber für Blinker

Die Testschaltung ist also noch sehr übersichtlich, der Nano, 5 Widerstände, 5 LEDs und ein paar Strippen.
Der Empfänger fehlt, kommt aber als nächstes dran.

 
Zuletzt bearbeitet:
D

Deleted member 1492

Gast
Du kniest Dich ja da richtig rein, Respekt! :thumbsup:

Interessant wäre noch ein Bremslicht, welches z.B. bei Nullstellung des Gashebels leuchtet.
 

BAXL

Admin
Mitarbeiter
Hallo Hermann, klar, mir ist es auf die Neven gegangen, dass ich immer nur in fremden Codes am stochern war. Den Hinweis nehme ich auf, ist abgespeichert :).
Ich könnte aber etwas Hilfe brauchen. Im Post #1 hatte ich die Idee mit der Blinkerzusatzschaltung erwähnt. Sowas wäre interessant und zwar mit möglichst wenig, leicht zu bekommende Bauteile, die ein 08/15 Elektronikbastler quasi da liegen hat. Also kein Elektronikbastler wie Dfence, der ein kleines Ersatzteillager vorhält :D.
Es sollten zwei Signale angeschlossen werden können, für rechts und links.

Aber nun weiter im Thema. Die Schaltung wurde nun um einen RC-Empfänger erweitert. Ich hatte noch eine DEVO-10 hier und einen DEVO-RX1002. Angeschlossen habe ich +5V, Masse und an Pin 2 vom Nano den THRO-Kanal, also Gaskanal.

Ein Simpelprogramm ließt nun den Pin 2 aus und zwar mit der Funktion pulseIn(Pinnummer, Pegel, Timeout); das bedeutet in meinem Beispiel pulseIn(2,HIGH,25000);
Ich "gucke also auf den Digitalpin 2 und warte, dass ein HIGH-Pegel anliegt, als Ergebnis lasse ich mir die Pulslänge in Millisekunden ausgeben. Wenn innerhalb von 25 ms nix kommt, wird einfach eine 0 ausgegeben. Bei meiner DEVO hatte ich als 0% Gas - 1090, 50% Gas - 1480 und bei 100% Gas - 1880. Damit lässt sich schon mal arbeiten.

Jetzt checke ich das Ganze mal mit zwei Kanälen.

Edit:

Mit zwei Kanälen klappt es nackend auch. Also es wird nur Pin 2 und Pin 3 Eingelesen und das Ergebnis auf dem seriellen Monitor dargestellt. Dabei hat der Nano aber nur damit zu tun und braucht nichts weiter auswerten oder steuern.

Das Programm ist total simpel (und von jemanden kopiert und modifiziert):
Code:
const int CH_2_PIN = 2;
const int CH_3_PIN = 3;

void setup() {
Serial.begin(9600);

}

void loop() {
int ch_2 = pulseIn(CH_2_PIN, HIGH, 25000);
Serial.print("Gas:");
Serial.print(ch_2);
delay(5);

int ch_3 = pulseIn(CH_3_PIN, HIGH, 25000);
Serial.print(" - Lenker:");
Serial.println(ch_3);
delay(5);
}
So sieht der Aufbau jetzt aus:

 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Nach etwas herumspielen mit dem Programmcode konnte ich eine halbwegs funktionierende Version mit der Auswertung von zwei RC-Kanälen fertigstellen.Das Problem war, dass sporadisch mal nur der eine, oder der andere Kanal ausgewertet wurde. Die Ursache wahr wahrscheinlich in dem Timeout wert in der pulseIn() Auswertefunktion. Nachdem ich die 25000 aus beiden Aufrufen (für RC-Kanal Gas und RC-Kanal Lenkung) funktionierte es plötzlich für beide RC-Kanäle.

Die Blinker blinken allerdings noch nicht. Die weiße LED ist Fahrlicht und die blaue LED der Rückfahrscheinwerfer.


Der rudimentäre Code dafür sieht so aus:

Code:
const int CH_2_PIN = 2;
const int CH_3_PIN = 3;

// Pinbelegung am Nano
byte BliLiPin = 4;
byte BliRePin = 5;
byte RuecklPin = 6;
byte LichtPin = 7;
byte RueckfahrPin = 8;

// Merker für Schaltzustand
byte Licht = 0;
byte Bremse = 0;
byte BlinkerLi = 0;
byte BlinkerRe = 0;
byte Rueckfahrlicht = 0;

// Eingelesene Empfängerwerte
int Gaswert = 0;
int Lenkung = 0;

// Schellenwerte RC Ausgang
const int RC_Min = 1090;
const int RC_Mitte = 1480;
const int RC_Max = 1880;
const int RC_Fernlicht = 1600;

void setup() {
pinMode (BliLiPin, OUTPUT);
pinMode (BliRePin, OUTPUT);
pinMode (RuecklPin, OUTPUT);
pinMode (LichtPin, OUTPUT);
pinMode (RueckfahrPin, OUTPUT);
Serial.begin(9600);

}

void loop() {
Gaswert = pulseIn(CH_2_PIN, HIGH);

if (Gaswert>(RC_Mitte+10)| Gaswert<(RC_Mitte-10)){
  Bremse=1; Licht=0;
  digitalWrite(RuecklPin, Bremse);
  digitalWrite(LichtPin, Licht);}
 if (Gaswert>(RC_Mitte+35)|Gaswert<(RC_Mitte-35)){
  Licht=1;Bremse=0;
  digitalWrite(RuecklPin, Bremse);
  digitalWrite(LichtPin, Licht);}

if (Gaswert<(RC_Mitte-35)){Rueckfahrlicht = 1;digitalWrite(RueckfahrPin, Rueckfahrlicht);}else if (Gaswert>(RC_Mitte-35)){Rueckfahrlicht = 0;digitalWrite(RueckfahrPin, Rueckfahrlicht);}




Lenkung = pulseIn(CH_3_PIN, HIGH);

if (Lenkung<(RC_Mitte-250)){BlinkerLi = 0; BlinkerRe = 1;digitalWrite(BliLiPin, BlinkerLi);digitalWrite(BliRePin, BlinkerRe);}
if (Lenkung>(RC_Mitte+250)){BlinkerRe = 0; BlinkerLi = 1;digitalWrite(BliLiPin, BlinkerLi);digitalWrite(BliRePin, BlinkerRe);}
if (Lenkung>(RC_Mitte-25)&Lenkung<(RC_Mitte+25)){BlinkerLi = 0; BlinkerRe = 0;digitalWrite(BliLiPin, BlinkerLi);digitalWrite(BliRePin, BlinkerRe);}
}
 
Zuletzt bearbeitet:

danielegal

Mitglied
Wenn ich jetzt zb diesen Sketch hier nehmen würde ,was möchte ich da ändern damit ich nicht jedes mal meine Kabel anders anschließen muss?
Pinbelegung am nano?
 

BAXL

Admin
Mitarbeiter
Wenn ich jetzt zb diesen Sketch hier nehmen würde ,was möchte ich da ändern damit ich nicht jedes mal meine Kabel anders anschließen muss?
Pinbelegung am nano?
Ne, ne, ne, mal langsam mit den jungen Pferden, das ist noch eine frühe Betaversion und nicht für den endgültigen Einsatz gedacht. Wenn Du aber scharf darauf bist, hier sind die Belegungen. Aber Vorsicht, das ist wirklich nur eine reine Version in der Entwicklung! Da blinkt noch nix und es ist beim Anschluß mehrerer LEDs an eine Kanal ein "Stromverstärker" nötig (ULN2803, Transistor o.ä.)

Die grundsätzliche Belegung werde ich wohl so lassen und wenn nicht ist es keine Aktion im Vereinbarungsteil eben andere Zahlen hinter die Funktion zu schreiben :)

Als Eingänge für die Abfrage der RC-Kanäle
  • Gaskanal - Pin 2
  • Servokanal Lenkung - Pin 3
Ich beginne mit der Belegung der Digitalkanäle des Nanos.
  • Blinker Links - Pin 4
  • Blinker Rechts - Pin 5
  • Rücklicht - Pin 6
  • Hauptscheinwerfer - Pin 7
  • Rückfahrscheinwerfer - Pin 8
Und aufpassen, je nachdem wie herum das Lenkservo lenkt (das weiß ich ja vorher nicht ;) ), müssen die Werte für Links und Rechts im Code gestauscht werden, bzw. die LEDs jeweils am anderen Kanal angeschlossen werden.
 

BAXL

Admin
Mitarbeiter
Kurzer Zwischenstatus.

Wie sich gezeigt hat, ist die Umsetzung der Blinkfunktion mit einigen Schwierigkeiten behaften, insbesondere beim Timing. Man kann zwar mit millis() Timer etwas herumtricksen, das kritische Moment bleibt aber die parallele Auswertung der Empfängerkanäle. Einer alleine geht gut, zwei zusammen klappen einigermaßen, bei drei gleichzeitg auszuwertenden Kanälen setzen zum Teil massive Timing-Probleme ein, besonders wenn man die Ausgangsport mit digitalWrite() manipuliert. Eine direke Portmanipulation könnte Abhilfe bringen, weil dafür wesentlich weniger Prozessortakte nötig sind, ebenfalls das Arbeiten mit Interrupts, nur muß man dann ganz genau wissen was man tut.

Gerade Einsteiger werden sich sehr schwer damit tun, weil die "normale" Programmierung des Arduinos schon jede Menge Hürden bereithält. Darum habe ich nach einer Lösung gesucht, um zumindest das Problem des Blinkens zu mildern. Meine Idee war es, dass der Arduino an den den Blinkerkanälen immer nur ein statisches Signal ausgibt (also jweils nur ein digitalWrite() Befehl) und eine nachgeschaltete Minielektronik diese Signale verwendet um eine eigene Blinkschaltung zu aktivieren.

Dafür gibt es viele Möglichkeiten, diskreter Aufbau mit Transistoren, Widerständen und Kondensatoren, oder der Aufbau mit einem NE555 Timerbaustein. Trotzdem sind immer noch mindestens zwei weitere Transistoren für das Durchschalten der LED nötig.

Um das zu vereinfachen, verwende ich eine Blinkdiode. Diese benötigt selbstverständlich auch einen Vorwiderstand, an dem im Takt eine Spannung abfällt. Diese pulsierende Spannung soll einen Transistor in genau dem Takt durchschalten.
Zwei weitere Transistoren für die LEDs (rechts und Links) werden mit ihrer Emitter-Kollektorstrecke dazu in Reihe geschaltet. D.h. dass der Hauptstrom permanent ein und wieder ausgeschaltet wird, im Takt der Blink LED. Nun muß nur noch die Basis der Beiden "LED-Transistoren" über den Arduino angesteuert werden. Es alterniert also nicht das Blinksignal an den Basen, sonderm schlicht der Hauptstrom. Wie das prinzipell geht steht in dem Thema: Blink LED als Taktgeber für Blinker

Die dort gezeigt Schaltung muß an den Basen der beiden "LED-Transistoren" modifiziert werden, weil der Arduino ein High-Signal (+5V) ausgibt, die Schaltung aber an der Basis derzeit permanent Plus hat und zum Schalten auf Masse gezogen werden will.
 
D

Deleted member 1492

Gast
Einfach statt NPN Transistoren PNP Typen verwenden?

Sperren bei "High", schalten durch bei "Low"

PNP Transistor.jpg
 
Zuletzt von einem Moderator bearbeitet:

BAXL

Admin
Mitarbeiter
Da kannst Du sehen, dass ich kein Vollblutelektroniker bin. :) Danke für den Tipp. Ich muß nur mal sehen, ob ich PNP in meinem Fundus habe.
 

Kasi-Hasi

Moderator
Mitarbeiter
Irgendwie finde ich das ist keine gute Lösung - du beraubst dich mit der Blinkdiode ja jeder Steuermöglichkeit durch den Arduino. Und das Problem mit den Empfänger-Eingängen wird damit ja auch nicht gelöst.
 

BAXL

Admin
Mitarbeiter
Irgendwie finde ich das ist keine gute Lösung - du beraubst dich mit der Blinkdiode ja jeder Steuermöglichkeit durch den Arduino. Und das Problem mit den Empfänger-Eingängen wird damit ja auch nicht gelöst.
Warum beraube ich mich da einer Steuermöglichkeit? Die Blinkerlampen am Fahrzeug sollen blinken. Da ändert sich doch nichts. Wer nun immer an und aus macht, ist doch egal. Zumindest klappt es schon mal bei zwei Kanälen besser, weil Prozessorzeit eingespart wird. Ich robbe mich ja an die endgültige Lösung heran, dazu sind auch mal Zwischenschritte nötig. Wenn ich sofort eine 100% Lösung liefern will (will ich das wirklich?), dann werde ich nie fertig. Wenn ich der totale Crack wäre, dann hätte ich das mal eben hingezaubert, bin ich aber nicht und verbessere Stück für Stück. Wenn Du eine gut funktionierende Lösung parat hast, dann her damit. :) Also nicht nur vage Vorschläge, sondern konkrete Sachen zeigen.

Btw. Das Thema lautet Experimentierthema und nicht "Hier eine fertige Lösung für Copy und Paste was jeder auch ohne große Kenntnisse hinbekommt".
 

DFENCE

Mitglied
Das Blinken kannst auch einfach it nem NE555 realisieren, der bekommt das Statische Signal vom Arduino und Wandelt das in ein Getaktetes Signal um.
Unbenannt.jpg

Vor 50 Jahren die Anfänge der Digital Schaltungen vor 30-40 Jahren war das doch ne Grundschaltung die Jeder gemacht hat in der "Schule" Digitale Flip Flop Schaltung mit nem 555 ? Oder einfach nur Blinklicht mittels NE555. Das Teil war damals schon im Kosmos Elektronikbaukasten drin als Digitaler Taktgeber glaub ich mich zu Erinnern :unsure:
 

BAXL

Admin
Mitarbeiter

DFENCE

Mitglied
Natürlich versteh ich warum, du willst dem Arduino die Aufgabe des Blinkens abnehmen und so mehr Prozessorleistung rauskitzeln also gibst du statt nen Blink Signal nen "Statisches" aus und nutzt du ne Blink LED als Taktgeber.

Meine Idee war einfach nen NE555 als Taktgeber zu nehmen statt eine LED zu missbrauchen, mit nem 555 könntest dann auch ne Flip Flop Schaltung Realisieren für nen Lichtsignal Anlage von nem Ami Polizei Fahrzeug ( Rot Blau Wechsel )

Klar ist nen NE555 aufwendiger, aber nicht Elektroniker Scheitern ja schon oft daran überhaupt so ne Schaltung aufzubauen. :unsure:
 

DFENCE

Mitglied
Kleiner Nachtrag ich bin grad am Überlegen ob es nicht sogar noch mehr nen Arduino entlasten kann mit nem NE555 im Grunde brauchst ja nur Reset auf Ground ziehen und schon hört der Intervall auf, also müsste der Arduino Lediglich neutral Stellung erfassen und nen Pin auf Ground ziehen.
Die Schaltung ist sehr Simpel und man kann den Blink Intervall selbst bestimmen
Hier die Beispiele für ne Blink Schaltung und für ne Wechsel Blink Schaltung
NE555 Blinkerschaltung

Theoretisch sollte nen ne555 auch mit 200mA belastbar sein, also für mehrere Gelbe LED´s brauchst nix weiter als die Schaltgruppe mit dem NE555 die über die Stromversorgung vom Arduino gespeißt wird.

Natürlich ist das ganze Aufwänder aber es wäre ne Idee wie sowas auch Realisierbar ist, man braucht ja nicht viel dafür.
 

Kasi-Hasi

Moderator
Mitarbeiter
Warum beraube ich mich da einer Steuermöglichkeit? Die Blinkerlampen am Fahrzeug sollen blinken. Da ändert sich doch nichts. Wer nun immer an und aus macht, ist doch egal. Zumindest klappt es schon mal bei zwei Kanälen besser, weil Prozessorzeit eingespart wird. Ich robbe mich ja an die endgültige Lösung heran, dazu sind auch mal Zwischenschritte nötig. Wenn ich sofort eine 100% Lösung liefern will (will ich das wirklich?), dann werde ich nie fertig. Wenn ich der totale Crack wäre, dann hätte ich das mal eben hingezaubert, bin ich aber nicht und verbessere Stück für Stück. Wenn Du eine gut funktionierende Lösung parat hast, dann her damit. :) Also nicht nur vage Vorschläge, sondern konkrete Sachen zeigen.

Btw. Das Thema lautet Experimentierthema und nicht "Hier eine fertige Lösung für Copy und Paste was jeder auch ohne große Kenntnisse hinbekommt".
War gar nicht so bös gemeint... du beraubst dich halt der Möglichkeit, die Blinker "anders" als mit reinem Blinken anzusteuern. Also z.B. nem schnelleren Blinken oder ne Blink/Bremslicht-Funktion oder Dauerleuchten auf halber Kraft bei angeschaltetem Licht.

Und für die Kanal-Abfrage gibt es ja ne gute Lösung über die Interrupts. Ich behaupte auch gar nicht, dass ich das verstanden habe, aber man kann sich den Code ja reinkopieren und das funktioniert. Hab das ja hier versucht zu erläutern:

Ist ja keine Schande, anderer Leute Code zu nutzen, man muss ja nicht das Rad jedes Mal neu erfinden. Damit kann man jedenfalls die RC-Kanäle problemlos einlesen. Das Ansteuern einer unabhängigen Blink-Funktion über millis() ist dann auch locker möglich.

Es ist halt irgendwie widersinnig, nen voll programmierbaren Mikrocontroller zu nutzen und dem dann aber nen NE555 oder so dahinter zu setzen. Das packt der Arduino ja locker auch alleine.
 

BAXL

Admin
Mitarbeiter
Hallo Kollegen:)

ich freue mich über eure Anregungen und Vorschläge, ich bin ja froh dass eine Resonanz kommt. Die Vorschläge und Lösungsansätze sind gut und ich greife die garantiert noch auf. In diesem Thema hatte ich eine bestimmte Intention
1. Eine einfache und vor allem einfach zu verstehende Lösung für den Blinkertakt um den Arduino zu entlasten.
2. Ich wollte die Idee mit der Blinkdiode erfolgreich zum Laufen bringen, weil ich das sonst in den typischen Foren nie gefunden habe, weil sich kaum einer ernsthaft damit auseinandersetzen wollte. ( nach dem Motto - und jetzt erst recht) also sportlicher Ehrgeiz von mir.
3. Eine Lösung mit möglichst wenig Bauteilen, weil es Nichtelektronikern bereits schwer fällt eine ganz simple LED Schaltung zu realisieren, von dem Programm will ich gar nicht erst reden, ich hatte bereits einige Kandidaten hier im Forum.

Ich schätze eure Meinung aber sehr hoch ein und möchte mich ausdrücklich dafür bedanken.:thumbsup:
 
Top Bottom