• 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

Baubericht Lichtsteuerung mit zwei Arduinos und Neigungssensor (Interrupt-Steuerung)

Kasi-Hasi

Moderator
Mitarbeiter
Moin,

für meinen MST Scaler habe ich mir eine Lichtsteuerung gebaut, die ich hier im Detail vorstellen will.
Hintergrund dazu war, dass bei mir zum einen keine andere Steuerung so richtig funktioniert hat, mir zum anderen aber auch so einige Funktionen gefehlt haben. Und der Basteltrieb war natürlich auch ausschlaggebend :cool:

Hier ist das ganze zusammengefasst im Video, danach gehe ich auf die Details ein.


Funktionen
  • Steuerung über Gas/Lenkung und Schaltkanal vom RC-Empfänger
  • automatisch:
    • Bremslicht
    • Rückfahrlicht (beim zweiten "Bremsen" an der Funke)
    • Blinker im Stand und bei Lenkeinschlag an, werden bei Geradeausfahrt wieder ausgeschaltet
    • verzögerte Innenraumbeleuchtung bei Stillstand
    • Xenon-Einschaltsequenz für Haupt- und Zusatzscheinwerfer
    • Bestätigung über Schalteingaben und Fahrzeugzustand über RGB Status-LEDs

  • manuell über Schaltkanal (Mehrfachklicks):
    • 1x: Scheinwerfer/Rücklicht, Positionslicht an oder aus ("Abblendlicht")
    • 2x: Zusatzlicht, Nebelscheinwerfer an oder aus, Scheinwerfer auf volle Leistung ("Fernlicht")
    • "Fernlicht an" (2x drücken) schaltet auch Scheinwerfer ein (alles an), "Abblendlicht aus" (1x drücken) schaltet alles alles aus
    • 3x: Blinksystem an/aus
    • 4x: Warnblinkanlage
    • 5x: Modus-Umschalter für die Status-LEDs
      • Aus oder Nebelscheinwerfer
      • Standardlicht (z.B. Lila) oder Nebelscheinwerfer
      • Neigungssensor (leuchtet von Grün nach Rot je nach Neigung, ab Schwellwert wird Kippalarm ausgegeben (Längs- und Querachse)


Vorraussetzungen
(Diese Anforderungen sind das, was man benötigt, um das 1:1 nachzubauen, weniger Funktionen gehen natürlich immer)

  • 2x Arduino Nano
  • 1x Gyro MPU 6050
  • 1x ausreichend dimensioniertes BEC
  • viele bunte LEDs, 2 RGB-LEDs
  • passende Widerstände für die LEDs
  • passende Widerstände für die Akkuspannung (z.B. 9x 10k)
  • Verstärkungsschaltung oder -IC für die LEDs (Transistoren oder ein ULN2803)
  • 10-20m Litze/Kabel
Aufbau

Im Moment sind drei Komponenten verbaut, zwei Arduino Nanos (für Karo und Chassis) sowie ein Gyro (im Chassis). Diese drei werden über den I2C-Bus verbunden um Daten auszutauschen. Man muss also zu jeder Komponente nur 4 Kabel führen, die zwei Bus-Leitungen sowie Strom und Masse.

Der Nano im Chassis ist dabei der Master- er übernimmt den Sensorteil: Gyro auslesen, Akkustand prüfen, RC-Kanäle einlesen. Einzige "Ausgabe" sind die beiden Status-LEDs, da diese in der Stoßstange verbaut sind.
Der Nano in der Karo ist der Slave_1 - er empfängt die Werte vom Master und setzt entsprechend die Beleuchtung um.
Der Name deutet es bereits an, man kann dieses System mit mehreren Nanos erweitern, z.B. für einen Anhänger. Das wäre dann Slave_2.

Der Gyro sollte dicht am Chassis-Nano verbaut werden, da er von diesem auch die 3,3V bezieht. Da der Gyro "fest" am Chassis verbaut werden muss, sollte er mit dem Nano zusammen auf einer Platine sitzen, das erleichtert auch die Verkabelung.

Anschlüsse

Der I2C-Bus benötigt zwingend die Pins A4 und A5 auf dem Nano, diese sind also reserviert. Alle anderen Pins können frei belegt werden, auch für die Eingänge vom RC-Empfänger.
Eine Besonderheit sind die PWM-Pins. Auf diesen Pins können LEDs gedimmt, also in ihrer Helligkeit beeinflusst werden. Pins ohne PWM können nur (5V) an oder aus.

Die PWM-Pins auf einem Nano sind 3, 5, 6, 9, 10 und11.

Da die Ausgänge vom Arduino nicht wirklich belastet werden können (mehr als eine LED wird schon kritisch) sollte man grundsätzlich alle Ausgänge nur als Schaltsignal benutzen und dieses dann verstärken.

Ich habe bei mir noch ULN2803-Transistor-Relays gefunden, man kann aber auch einfach einen Transistor pro Ausgang nehmen.
Welche Ausgänge das Programm unterstützt, wird in den Sketches erläutert.


Programmierung

Die beiden Sketches für Master und Slave_1 unterteilen sich zur besseren Übersicht jeweils in mehrere Dateien, die auch genau so in den Sketch-Ordner gehören.

Die einzigen Änderungen, die man machen "muss" sind alle in der Datei 0_PinConnections.ino, dort wird die Pin-Belegung der einzelnen Ein- und Ausgänge festgelegt.
Optionale Änderungen, zum Beispiel Blink- und Dimmzeiten, Helligkeiten oder Verzögerungen (bis etwas leuchtet) sind alle in der Datei 1_UserConfig.ino konfiguriert.

In allen anderen Dateien muss eigentlich nichts geändert werden, wenn man nicht Änderungen im Programm-Ablauf vornehmen will.

Theoretisch kann auch alles wieder in einem Sketch und von einem einzelnen Nano gesteuert werden, da die Variablen für die Datenübertragung in beiden Teilen identisch sind. Man muss also nur die relevanten Teile kopieren, dann sollte es auch funktionieren.
Ich habe mich bemüht, vernünftig zu dokumentieren und den Code auch halbwegs aufzuräumen, will aber nicht ausschließen, dass ich manche Sachen überkompliziert gelöst habe.

Noch ein paar Bilder vom Einbau:

Das ist der Nano für die Karo mit zwei ULN-ICs. Von diesem gehen nur vier Kabel über einen Stecker Richtung Chassis, man kann die Karo also mit einem Handgriff abnehmen.

Der Testaufbau mit einem Breadboard ist übrigens mehr als empfehlenswert:

Bevor die erste LED verlötet wird, kann man so wirklich alle Funktionen durchtesten. Erst wenn auf dem Brett alles funktioniert, lötet man die LEDs zusammen. Dann ist das Schlimmste überstanden und der Rest ist nur noch Fleißarbeit.


Details zum Auswerten des RC-Empfängers

Wie bereits erwähnt war der Grund für das alles ja, dass andere Steuerungen bei mir nicht richtig funktionierten.
Das lag vorallem an einer Funktion "pulseIn" - diese kann ein PWM-Signal einlesen, allerdings "blockiert" sie damit den Arduino, bis sie fertig ist. Wenn man mehrere Kanäle gleichzeitig einlesen will, führt das schnell zu Fehlern. Bei mir kam z.B. gar nichts mehr an, sobald zwei Kanäle abgefragt wurden.

Die Lösung dafür ist eine Abfrage über Interrupts statt pulseIn. Das ist im ersten Moment sehr viel komplizierter, aber dafür eben auch sehr viel schneller und vorallem zuverlässiger. Der gesamte Teil dazu ist in der Datei 4_PWMRead.ino untergebracht. Alles was man davon braucht ist das Array RC_in, den Rest muss man also garnicht verstehen ;)



Quellen

Ich habe mir das natürlich nicht alles allein ausgedacht.
Gerade das PWM-Zeug für den RC-Empfänger ist schon ne Hausnummer. Das habe ich daher nahezu unverändert von Kelvin Nelson übernommen:


Desweiteren habe ich noch folgende Quellen als Ideengeber und Anlaufstelle genutzt:

und natürlich auch Rockracers Steuerung:


Ausblick

"Fertig" ist natürlich kein Wort für einen Modellbauer. Nächster Punkt für meine Steuerung ist die Integration von einem kleinen OLED-Display, um die Akkuspannungen und die Temperatur vom Gyro-Sensor auszugeben.
Das funktioniert hier auf meinem Breadboard schon problemlos, das Display wird ja auch über den I2C-Bus angesteuert. Das Problem ist eher, dass mir der Innenraum noch fehlt, da muss also erst noch gebaut werden.

Danach könnte man über eine Hupe oder einen Ton-Generator/Lautsprecher nachdenken, auch wenn ich da zumindest im Moment noch kein Freund von bin. Aber ein kleines Piepsen für die Unterspannungswarnung wäre ganz sinnvoll.
 

Anhänge

Kasi-Hasi

Moderator
Mitarbeiter
Lipo-Überwachung

Für die Überwachung der einzelnen Zellen des Akkus nutze ich den Balancer-Anschluss.

Da mein Regler 2S und 3S-Akkus verträgt, werde ich auch nur diese beiden Größen im Sketch abfragen, es ist aber kein Problem, auch einen 6S-Lipo zu überwachen. Man benötigt halt für jede Zelle einen freien Analog-Pin.

Wenn man den Balancer-Anschluss (vom 3S) mal durchmisst, bekommt man an den drei Kabeln der Zellen 3,7V, 7,2V und 11,1V raus, bei vollem Akku entsprechend 4,2V, 8,4V und 12,6V.
Der Analog-Pin verträgt 5V, alles darüber grillt den Chip, also muss die Spannung "geteilt" werden. Theoretisch kann man die erste Zelle direkt messen. Nimmt man dort auch einen Spannungsteiler, hat man aber hinterher keine Probleme, falls kein Balancer-Anschluss verbunden ist, also bei einem NiMH-Akku.
Der Spannungsteiler sorgt nämlich auch dafür, dass am analogen Eingang "0V" ankommt. Ist garnichts angeschlossen, fängt der Pin quasi aus der Luft irgendwelche Spannungen ein und verhunzt die Messergebnisse.

Spannungsteiler
Also, was ist dieser Spannungsteiler überhaupt?
Das sind zwei Widerstände in Reihe, ganz simpel.

Also: Uin(+) --- R1 --- R2 --- GND(-):


Und genau zwischen R1 und R2 können wir die geteilte Spannung (Uout) abgreifen.

Etwas detaillierter steht das auch hier:
Und im Video:


Unterm Strich ist das Verhältnis der beiden Widerstände wichtig.

Die Formel dafür ist ganz simpel: Uout=Uin * R2/(R1+R2)

Ein Beispiel: Ich nehme für beide Widerstande 10kOhm. Ich hatte nämlich eine Tüte mit 100 Stück davon noch in meiner Kiste ;)

Uout=5V * 10kOhm/(10kOhm + 10kOhm)
Uout=5V * 10kOhm/20kOhm
Uout=5V * 0,5
Uout=2,5V

nimmt man zweimal den gleichen Widerstand, halbiert sich also die Spannung.
Das is schonmal super für die erste Zelle und auch später im Programm einfach zu rechnen.

für die zweite Zelle nehme ich R1=20kOhm und R1 wieder 10kOhm.
Das kann ich nämlich mit meinen 10kOhm-Widerständen abbilden: da kommen dann drei in Reihe und zwischen dem zweiten und dritten nehme ich die Spannung ab.

Uout=5V * 10kOhm/(20kOhm + 10kOhm)
Uout=5V * 10kOhm/30kOhm
Uout=5V * 0,333
Uout=1,6666V

Die Spannung wird gedrittelt. Dann muss man im Programm später nur wieder * 3 rechnen.

Ok, dritte Zelle, was machen wir wohl diesmal?


Uout=5V * 10kOhm/(30kOhm + 10kOhm)
Uout=5V * 10kOhm/40kOhm
Uout=5V * 0,25
Uout=1,25V

Wer hätte es gedacht, Spannung wird geviertelt :p

Im Anhang der Schaltplan dazu, wenn man (wie ich) einfach die gleichen Widerstände nutzen will.

Arduino
Im Arduino kann nun das Signal vom Pin mit analogRead(A0) ausgelesen werden. Da kommt ein Wert zwischen 0 und 1023 raus, je nachdem, wo die Spannung ist (zwischen 0 und 5V).

Das rechnet man jetzt um: Zellspannung= A0-Wert * (5/1023.00) * 2

die 5 sind die 5V maximale Spannung. Das ist gleichzeitig der Wert zum kalibrieren. Man muss also mit Multimeter nachmessen und diesen Wert dann an die gemessene Spannung anpassen. Bei mir ist z.B. auf dem Pin für die erste Zelle der Wert 4.80 drin, damit der Arduino das gleiche Ergebnis wie mein Multimeter erzeugt.

die *2 am Ende ist der Ausgleich für unseren Spannungsteiler, weil wir die Spannung ja halbiert haben. Hier kommt für die anderen Zellen entsprechend *3 und *4 rein.

Wenn man den einzelnen Zell-Wert von Zelle 2 wissen will, muss man noch Zelle 1 abziehen. Von Zelle 3 dann Zelle 2 abziehen und so weiter.

Der Rest ist dann Kleinkram in der Programmierung, also was man mit den Werten machen will. Ich lasse die Status-LED wild blinken, das reicht mir als Vorwarnung.

Verpolungsschutz
Zu beachten ist, dass kein Verpolungsschutz verbaut ist. Man könnte z.B. eine Sperrdiode verbauen, die beeinflusst aber auch wieder das Messergebnis, da muss man dann nachkalibrieren.
Ich verwende bei mir eine Balancer-Buchse wie beim Ladegerät, da kann der Balancer-Anschluss dann nur in eine Richtung angeschlossen werden.

Falls man das nicht macht, kann es passieren, dass man eine Zelle vom Akku direkt auf die Masse vom Akku kurzschließt. Das kann dann also böse knallen, also lieber nen Deppenschutz mit einlöten ;)
 

Anhänge

Stalinger

Mitglied
Hi,

bekommst du beim überprüfen des Skeetch auch Warnmeldungen ?
8_mainLoop.ino: In function 'void loop()':
8_mainLoop.ino:543:7: warning: jump to case label [-fpermissive]
default:
^~~~~~~
8_mainLoop.ino:438:17: note: crosses initialization of 'int16_t Axis_Y'
int16_t Axis_Y = Gyro_Pos_Z; // Zweite zu überwachende Achse (soll nur eine Achse überwacht werden, hier die gleiche angeben)
^~~~~~
8_mainLoop.ino:437:17: note: crosses initialization of 'int16_t Axis_X'
int16_t Axis_X = Gyro_Pos_Y; // Erste zu überwachende Achse (Siehe 3_Variables für Auswahl der Gyro-Achse)
^~~~~~

Die RGB LEDs zeigen den Fahrzeugzustand soweit gut an mit dem Farbverlauf, aber bei etwas ruckligen Bewegungen/Erschütterungen des Gyros fangen die Warnblinker an zu leuchten, als ob das Fahrzeug am Umkippen wäre.
P.S habe den Gyro lose auf dem Tisch liegen, also ein Testaufbau.

Gruß Stalinger
 

Kasi-Hasi

Moderator
Mitarbeiter
Oh, hab den schon ne Weile nicht kompiliert, aber an Warnmeldungen kann ich mich nicht erinnern; zumindest hat er das am Ende hochgeladen, das hat mir immer gereicht.

Der Gyro ist bei mir auch sehr empfindlich, wenn ich übers Feld hoppel, schlägt der auch schnell an. Ich weiß nicht, ob man dem Gyro die Empfindlichkeit nehmen kann oder ob man das im Sketch abfangen sollte. bisher hab ich das immer nur hingenommen - das ist ja nur am Hang interessant und da fährt man ja sehr behutsam. Für's Feldhoppeln schalt ich das auch oft aus.
 

Carsten345

Mitglied
Hallo Leute
Hab nun alles aufgebaut und das Gyro arbeitet einwandfrei, sowie die Innenraum Beleuchtung ist an. Irgendwie werde ich aber nicht schlau an welchen Pins der Receiver angeschlossen wird, den von Seiten der Funke tut sich nix. Hab den Empfänger an die Pins A0 - A3 angeschlossen, aber es gibt keine Reaktion.
Mfg Carsten
 

Kasi-Hasi

Moderator
Mitarbeiter
Empfängt der Arduino denn was vom Empfänger?

kommentier doch mal in der 8_mainLoop die Ausgabe der Kanäle raus:
//-- Ausgabe der Kanäle von -1.00 bis 1.00
/*
Serial.print("CH1: ");
Serial.print(RC_in[CH1]);
Serial.print(" | CH2: ");
Serial.print(RC_in[CH2]);
Serial.print(" | CH3: ");
Serial.print(RC_in[CH3]);
Serial.print(" | CH4: ");
Serial.print(RC_in[CH4]);
Serial.println(); // uncomment when printing calibrated receiver input to serial.
*/

unter 7_mainSetup muss dies aktiv sein:
Serial.begin(9600); // Seriellen Port öffnen (Debug)

Dann siehst du im seriellen Monitor die einzelnen Kanäle (oder auch nicht).


...ich hab nochmal in die PinConnections geschaut:
//const int pwmPIN[]={A0,A1,A2,A3}; // 4-Kanal-Empfänger (Spektrum SRS4210)
const int pwmPIN[]={2,3,4,5}; // 4-Kanal-Empfänger (Spektrum SRS4210)

versuch doch mal Pin 2,3,4,5 und nicht die analogen, die sind ja für die Spannungsmessung des Akkus vorgesehen.
 
Top Bottom