• 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

Anleitung Komplexe Lichtsteuerung für unter 5 EUR (Arduino)

Kasi-Hasi

Moderator
Mitarbeiter
Hatte ich schon, deswegen hab ich den ja zum Test mal an den Nano geklemmt. Wobei ich ja auch nen Nachbau hab der nur mit dem old Bootloader geht...

Der andere Nano macht übrigens das Gleiche, auch ein andere Empfänger ändert nix. Naja vielleicht teste ich morgen nochmal.
 

Kasi-Hasi

Moderator
Mitarbeiter
Der Empfänger hat direkt vom Arduino Strom bekommen, also Masse und 5V. Nix Batterie, alles über USB versorgt.
 

BAXL

Admin
Mitarbeiter
Ich könnte mir jetzt nur noch vorstellen, dass es die Fernsteuerung an sich ist (Hersteller, Typ), dass da Inkompatibilitäten mit dem PWM auftauchen osä.
 

Kasi-Hasi

Moderator
Mitarbeiter
Ich hab zwei verschiedene probiert, einmal die DX6 mit DMS2 und dann das Teil was bei LC Racing dabei lag, irgendwas mit Batan oder so.

Werd mal mit nem eigenen Sketch versuchen, beide Eingänge gleichzeitig auszulesen, eventuell ist in der Bibliothek ja irgendwas schief.
 

BAXL

Admin
Mitarbeiter
Dann scheint der Arduino nicht schnell genug zu sein, oder wird durch andere Nebenaktivitäten "abgelenkt".
Es gibt sogar Fälle, da schalten die Leute die Interrupts sogar ab. Das hatte ich bei der Auswertung von dem Ultraschallmodul, bei dem ein Ausgabeimpuls des Sensors ungenau gemessen wird, wenn die Interrupts eingeschaltet sind. Es wird dann wohl auf Versuch und Irrtum herauslaufen.

Bis zur Nutzung von Interrupts bin ich allerdings auch noch nicht gekommen.

Edit:
Hast Du Dir die Lib vom Wilfried Dingens mal angesehen?

Edit edit:

ich habe mal reingesehen, das ist schon starker Tobak, den ich auch nicht mehr mal eben verstehe. Herausgefunden habe ich allerdings, dass die Lib für maximal 2 RC-Kanäle taugt.

Zitat aus der readme:
An arduino library for comunicate with a rc receiver
This library can read and decode PPM signals from simple RC receivers. On Arduino Uno there are 2 channels supported, on others like leonardo or mega, 4 channels.
 
Zuletzt bearbeitet:

Kasi-Hasi

Moderator
Mitarbeiter
Ich hab heute nochmal rumgespielt, lies mir irgendwie keine Ruhe dass das bei allen klappen soll außer mir.

Das Problem der PulseIn-Funktion scheint (bei mir) der Timeout zu sein. Mal ganz simpel zusammengeschrieben:

int pin1 = 3;
int pin2 = 5;

int led1 = 6;
int led2 = 9;
int led3 = 8;
unsigned long duration1;
unsigned long duration2;

void setup() {
// Serial.begin(9600);
pinMode(pin1, INPUT);
pinMode(pin2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);

digitalWrite(led1, HIGH);
delay(300);
digitalWrite(led2, HIGH);
delay(300);
digitalWrite(led3, HIGH);
delay(1000);

digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
delay(1000);

}

void loop() {

// duration1 = pulseIn(pin1, HIGH, 25000);
// duration2 = pulseIn(pin2, HIGH, 25000);


duration1 = pulseIn(pin1, HIGH);
duration2 = pulseIn(pin2, HIGH);



// Serial.print(duration1);
// Serial.print(" | ");
// Serial.println(duration2);


if(duration1 > 1625)
digitalWrite(led1, HIGH);
else
digitalWrite(led1, LOW);

if(duration1 < 1375)
digitalWrite(led2, HIGH);
else
digitalWrite(led2, LOW);

if(duration2 > 1625)
digitalWrite(led3, HIGH);
else
digitalWrite(led3, LOW);
}
An Pin 3 und 5 sind die Eingänge zum Receiver für Gas/Lenkung, an den Ausgängen hängt eine LED mit Widerstand. Lade ich das so hoch (das rot markierte ist das wichtige) funktioniert das, ich kann Lenken (duration1), dann leuchtet entweder LED1 oder LED2 und gleichzeitig kann ich Gas geben (duration2) und die dritte LED leuchtet auch auf.

Sobald ich aber den orangen Teil nutze (der quasi in jedem Beispiel mit den "25000" für den Timeout angegeben wird), funktioniert das nicht mehr, LED2 leuchtet plötzlich dauerhaft, da duration1 nur "0" ist.


Ich hab zuerst gedacht, dass liegt an der seriellen Ausgabe, aber selbst wenn man die raus nimmt funktioniert das (bei mir) nicht.
Ich raff jetzt nur nicht, warum das überall funktionieren soll, nur bei mir nicht. Oder ist Nano (nachbau) doch nicht gleich Nano?
 

BAXL

Admin
Mitarbeiter
Ich weiß jetzt auch nicht genau woran es liegt, aber nur mal zum Testen setze duration2 hinter den Auswertenblock von duration1, also direkt vor den Auswerteblock duration2. Ist nur ein Bauchgefühl...
 

Kasi-Hasi

Moderator
Mitarbeiter
ich glaub das is alles nix mit pulseIn. Das beispiel da oben funktioniert, sobald da aber etwas code und paar mehr eingangs/ausgangs-Pins dazukommen gerät das total ins stocken.
Werd also ab morgen mal lernen, wie das mit den interupts funktioniert...
 

Cybermungo

Mitglied
Ich glaube ich/wir sollte keine Doktorarbeit daraus machen... Wenn ich den Kabelbaum "auftrenne" und den Widerstand so wähle, daß nicht mehr als 3V ankommen müsste es ja passen, oder?
 
Sobald ich aber den orangen Teil nutze (der quasi in jedem Beispiel mit den "25000" für den Timeout angegeben wird), funktioniert das nicht mehr, LED2 leuchtet plötzlich dauerhaft, da duration1 nur "0" ist.
Versuch 50'000 timeout. 25'000 ist zu kurz. Ich verwende diesen Wert in meinem ESP32 sound controller und es funktioniert wunderbar.

Im Anhang ein Beispiel, wie das Ganze auf einem ATmega 328 basierten Arduino mittels Interrupt gelöst werden kann. Es werden 4 Signale gelesen und es funktioniert im Meccano-Kran meines Vaters wunderbar. Es ist viel schneller als pulseIn. ich habe das damals so gelöst, damit noch genug Rechenzeit für den Geschwindigkeit-Fader zur Verfügung steht. Hoffe, es ist hilfreich.

Ich habe nun eine erste Version meiner rcTrigger Library herausgegeben. Sie erleichtert das Auslösen von Impulsen über einen Analogkanal mit und ohne Memory. Es stehen auch 2 verschiedene Memory-Funktionen (kurz und lang) zur Verfügung. Ähnlich wie bei den Beier Modulen:

Besonders einfach wird die Lichtsteuerung in Kombination mit der statusLED Library:
 

Anhänge

Zuletzt bearbeitet:

bernd-das-brot

Mitglied
Ich habe auch wieder ein kleines Arduino-Projekt am laufen, daß einen RC-Kanal mittels Interupt auswertet und in veränderter Form weiter reicht. Dabei zeigen sich schon die Grenzen der Leistungsfähigkeit. Wenn ich mir über der seriellen Monitor den Status von zwei Merkern anzeigen lasse, läuft das angeschlossene Servo noch flüssig, ab 3 Merkern beginnt es zu ruckeln. Bei anderen Projekten, ohne RC-Auswertung, habe ich mir schon viel umfangreichere Datensätze anzeigen lassen, ohne daß die Ausgabe gestört wurde. Das Einlesen der Kanäle ist schon sehr rechenintensiv, dann noch PWM Signale generieren, lässt kaum noch Luft für komplexere Programme übrig. Auch im Netz finden sich solche Berichte. Es sieht wohl so aus, daß er mit dem Einlesen von 3 Kanälen schon kaum noch Puffer für weitere Aufgaben hat und ab 4 Kanälen ist der Arduino ausgelastet.

Ein möglicher Lösungsansatz wäre, die Auswertung der RC-Kanäle einem zweiten Arduino zu überlassen, der nur die Werte weiter reichen muß. Auf diese Art umgeht man auch wieder, daß man etliche Funktionen, wie z.B. das Blinken oder Dimmen über externe Hardware realisieren muß, das soll man sich mit dem Microcontroller ja eigentlich sparen.
 

Kasi-Hasi

Moderator
Mitarbeiter
Also über Interrupts kann ich problemlos 4 Kanäle auslesen, hab ich hier ja beschrieben:


Man muss das nichtmal im Detail verstehen (tu ich auch nicht), man zieht das in seinen Code und das läuft.
 
Wenn ich mir über der seriellen Monitor den Status von zwei Merkern anzeigen lasse
Der serielle monitor frisst halt auch viel Leistung. Was viel bringt, die Ausgabe zyklisch, aber ohne delay() zu machen, schneller kann ja eh niemand lesen:
Code:
void showParsedData() {
  static unsigned long lastSerialTime;
  if (millis() - lastSerialTime > 250) { // Print the data every 250ms
    lastSerialTime = millis();
    Serial.print("axis 1 ");
    Serial.println(axis1);
    Serial.print("axis 2 ");
    Serial.println(axis2);
    Serial.print("axis 3 ");
    Serial.println(axis3);
    Serial.print("axis 4 ");
    Serial.println(axis4);
    Serial.println("");
  }
}
 

bernd-das-brot

Mitglied
Also über Interrupts kann ich problemlos 4 Kanäle auslesen, hab ich hier ja beschrieben:


Man muss das nichtmal im Detail verstehen (tu ich auch nicht), man zieht das in seinen Code und das läuft.
Du hast es ja mit zwei Arduinos gelöst! Wenn ein Arduino 4 Kanäle auslesen und die vollständige Steuerung übernehmen soll, dann ist er damit überfordert. Das gilt vor allem, wenn auch noch PWM-Signale am Ausgang erzeugt werden sollen.

@TheDIYGuy999
Ich weiß, daß der serielle Monitor Leistung frisst, aber wie schon geschrieben habe, während der Entwicklung eines anderen Projekt, mit einigen PWM-gesteuerten Ausgängen, bei dem ich zwischenzeitlich mit zu vielen Variablen und Merken herumhantiert habe, wurden viel mehr Daten über den seriellen Monitor ausgegeben, ohne das etwas beeinträchtigt wurde.

Jetzt hat ein RC-Eingang und ein PWM-Ausgang ausgereicht, um ab zwei Datensätzen über Seriell das System ins Stocken zu bringen.
 

Kasi-Hasi

Moderator
Mitarbeiter
Nee, das lief alles auf einem arduino. Der Zweite ist nur da, um das mit zwei Datenleitungen zu machen. Der macht auch eigentlich nix rechenintensives mehr, der kriegt nur die Steuerinfos vom ersten.

Und ich werte auch noch nen Gyro-Sensor aus zusätzlich, das is auch noch kein Problem. Gut, ich erstelle keine PWMs für nen Servo oder sowas, aber ich hab noch nicht festgestellt, dass der Arduino ins schwitzen kommt.
 
Top Bottom