AutomatisierterLEGO 10261 RollerCoaster

Hallo
Ich besitze seit ca. 7 wochen ein Arduino Uno und habe jetzt ein paar Fragen an euch.
Ich wollte zuerst erklären was ich machen wollte dies ist aber relativ schwer zu Papier zu bringen. Daher erwähne ich nur den Teil der mir noch fehlt. Ich möchte also nur wissen wie ich es umsetzte, den Rest probiere ich aus.

  1. Zwei lichtempfindliche Sensoren sollen wenn sie betätigt werden einen Befehl auslösen. Das Problem ist aber das sie nicht zur selben Zeit betätigt werden sondern LDR4 erst 10-40 Sekunden erst später betätigt wird.

  2. Die LDRs reagieren ja auf das Licht. Wenn ich jetzt meine Strecke abends einsetze habe ich andere Lichtverhältnisse als am Mittag. Gibt es eine Möglichkeit beim Starten des Arduinos alle LDR Werte zuspeichern? Sie sollen dann reagieren sobald der gespeicherte Wert um 50 höher ist. z.B. LDR1=300, LDR2=400, LDR3=250 usw. LDR1 soll bei 350 auslösen, LDR2 bei 450 und LDR3 bei 300.
    Ist dies möglich?

Über eine Antwort würde ich mich freuen.

Viele Grüße
Larry98

Das was du unter Punkt 2 beschreibst ist durchaus möglich.
Das wird z.B. durch eine "if-Abfrage" im Sketch erreicht.
Danach kannst du die Anweisung schreiben, die du brauchst.
Und du setzt für jeden Sensor eine eigene Abfrage ein, dann kannst du die unterschiedlich einstellen, bzw. abfragen.

Ja, um die unterschiedlichen Werte auch zu erkennen, macht man zuvor eine Refenzmessung, an der man erkennen kann, ob es Tag oder Nacht ist.
Daraus resultieren dann unterschiedliche Abfragewerte.

Ups....gerade erst gesehen: Wie willst du denn die LDRs betätigen ?

Hi

Du kannst eine Art Mittelwert der Sensorwerte mitführen.
So passen sich die 'Grundwerte' immer den aktuellen Helligkeiten an.
Hier musst Du aber darauf achten, daß ein zu erkennendes Ereignis nicht 'normalisiert' wird.

Da Du nicht schreibst, was Du wirklich willst, werden die Antworten auch eher wischi-waschi sein.

Das Mithalten des Sensor-Mittelwert hätte den Vorteil, daß Du keine harten Grenzen programmieren musst.
Ab welcher Abweichung der Sensor als Ausgelöst anzusehen ist, wirst Du austesten müssen - die Sensoren werden wohl etwas rauschen, bei zu engen Grenzen wirst Du eine Dauer-Erkennung haben.

MfG

Kurz erklärt ich habe eine Strecke aufgebaut mit 2 Zügen und je nachdem welcher LDR betätigt wird soll Motor 1 oder 2 an oder ausgeschaltet werden.

Punkt 2 ist auch im Moment noch nicht so wichtig. Beim testen habe ich halt bei jedem anschalten die aktuellen Werte über serial.printIn ausgelesen und dann bei den 4 Sensoren angepasst.

Mir würde es auch einfach nur reichen wenn er beim starten die werte kurz speichert und dann die werte im Programm anpasst.

Ich lasse die Züge sowieso nur kurz laufen (20 Minuten vielleicht) und dann schalte ich sie wieder aus. Von daher ist es nicht wichtig, dass die Anlage den ganzen Tag laufen muss.

Wenn du den besagten Wert in einer globalen Variable speicherst, bleibt dieser so lange erhalten, bis das System spannungslos ist.
Möchtest du den Wert über diese Zeit hinaus erhalten, kannst du den in dem internen EEProm speichern.

Hi

Das kann man doch machen - beim Start werden die Sensor-Werte erfasst und als 'hell' betrachtet.
Sollte wider Erwartung ein Zug einen der Sensoren beim Start bereits abdunkeln, kann man Veränderungen in Richtung Hell direkt übernehmen - spätestens der erste Zwischenbereich zweier Wagons würde den Hell-Wert auf einen helleren Wert setzen.
Wenn das Ganze nicht Tageslicht abhängig ist, wirst Du kaum Drift haben, einen gleitenden Mittelwert könnte man, wenn unbedingt gebraucht, trotzdem einführen.

Ob ein Speichern im EEprom hier Sinn macht?
Bei Außenlicht abhängigem LDR-Wert wird jeder gespeicherte Richt-Wert falsch sein.
Ohne eine Abhängigkezt mit dem Außenlich muß ich mir Das auch nicht merken - ich sehe hier keinen Grund, was zwischenzuspeichern.

MfG

postmaster-ino:
Das kann man doch machen - beim Start werden die Sensor-Werte erfasst und als 'hell' betrachtet.
Sollte wider Erwartung ein Zug einen der Sensoren beim Start bereits abdunkeln, kann man Veränderungen in Richtung Hell direkt übernehmen - spätestens der erste Zwischenbereich zweier Wagons würde den Hell-Wert auf einen helleren Wert setzen.
Wenn das Ganze nicht Tageslicht abhängig ist, wirst Du kaum Drift haben, einen gleitenden Mittelwert könnte man, wenn unbedingt gebraucht, trotzdem einführen.

Wie kann ich das ganze codetechnisch umsetzten. Ich bin wie erwähnt Anfänger und habe mein Arduino erst seit 7 Wochen.

Und wie kann ich Punkt 1 umsetzten?

Was hast du denn bisher als Sketch fertig ?

Hi

Für die Umsetzung sind die äußeren Bedingungen nicht ganz unwichtig.
Wo werden die LDR verbaut, wovon werden Diese erregt?
Das Abdunkeln geschieht wohl durch 'dazwischen fahren'.
Wird dabei ein Gleichabschnitt 'besetzt' und/oder frei gemeldet?
Tageslicht/wechselnde Beleuchtung? (selber hatte ich gerne meine Dampflok im völlig dunklem Raum fahren lassen, da so der 3er-Scheinwerfer super zur Geltung kam - allerdings reine analoge Anlage ohne irgend welche Automatismen).

Und die berechtigte Frage: Was hast Du bereits umgesetzt?
LDR auslesen klappt?

Deinen Sketch bitte in Code-Tags ( < /> Schaltfläche ) hier rein kopieren - vorher ggf. STRG+T in der IDE ausführen.

MfG

Da ich jetzt sowieso den Code poste dachte ich mir ich schreibe doch genau was ich machen möchte
Ich habe mir die LEGO Achterbahn 10261 direkt zum Release gekauft.
LEGO sieht es vor die Züge durch die Kurbel hochzukurbeln oder indem man einen M-Motor einbaut.
Mit dem M-Motor läuft aber die Kette die ganze Zeit auch wenn kein Zug darauf ist.
Mit LEGO Boost (160€) kann man seine Achterbahn programmieren damit die Kette sich erst bewegt wenn
ein Zug am Sensor vorbeifährt. Wie lange die Kette läuft ist aber programmiert in Sekunden.
So findet nach der Kette keine Abfrage statt und da der Zug es auch noch bei einer niedrigen Geschwindigkeit (bei
fast leeren Batterien) die Kette hochschaffen soll ist die Dauer der Kette länger programmiert.

Zudem fährt der Zug ständig ohne in der Station zu halten. Also habe ich mich hingesetzt
und mir ein Arduino Uno gekauft + 4 LDR Sensoren. Und einen zweiten Motor in die Station zur Beschleuningung aus
der Station.

Realisierung

  1. Sensor: Vor der Kette
  2. Sensor: Nach der Kette/Vor der ersten Abfahrt
  3. Sensor: vor der Station

Wenn der Zug also über den ersten Sensor fährt wird die Kette gestartet. Kurz vor der ersten Abfahrt ist der zweiten
Sensor der die Kette stoppt.

Dann fährt der Zug die restliche Strecke entlang.
Kurz vor der Station fährt er über einen weiteren Sensor (LDR 3). Der Zug ist nun in der Station und wartet dort
seine 4 Sekunden. Nach den 4 Sekunden beschleunigt der Zug heraus (Motor 2 an).
Wenn der Zug wieder über LDR 1 fährt schaltet er den Stationsmotor aus (Motor 2) und schaltet wieder den Motor
für die Kette (Motor 1) an.

LDR1> Motor1 (Kette) an
LDR2> Motor1 (Kette aus)
LDR3> Motor2 (Station an nach x sekunden)

Das funktioniert auch recht gut mit einem Zug.

Jetzt möchte ich aber einen weitern Zug hinzufügen.

Dazu habe ich oben auf der kette noch ein weiteren Sensor angebracht.

Genau dort soll der Zug stehen bleiben (Motor1 aus) sofern ein Zug noch auf der Strecke ist. (LDR2 zuvor überfahren
aber LDR 3 noch nicht überfahren.

Und das ist genau das was mir noch fehlt.

#include <legopowerfunctions.h>

LEGOPowerFunctions lego(13);

int licht1;
int licht2;
int licht3;
int licht4;




void setup() {
Serial.begin(9600);
pinMode (13, OUTPUT);

}

void loop() {
licht1 = analogRead(3);//vor der Kette
licht2 = analogRead(1);//Nach der Kette/Vor der ersten Abfahrt
licht3 = analogRead(2);//Station
licht4 = analogRead(0);//Auf der Kette


Serial.println(licht3);

if (licht1 >  210) {
  lego.SingleOutput(0, PWM_FWD5, RED, CH1);//Kette bewegen (Motor 1 an)
  lego.SingleOutput(0, PWM_FLT, BLUE, CH1);//Stationsbescheluning aus (Motor 2 aus)
 } 
if (licht2 >  480) {
  lego.SingleOutput(0, PWM_FLT, RED, CH1);//Kette stoppen (Motor 1 aus)
 } 
if (licht3 >  480) {
  delay(4000);//4 sekunden warten
  lego.SingleOutput(0, PWM_REV7, BLUE, CH1);//Stationsbescheluning (Motor 2 ein)

}
}

Hi,

warum LDR und nicht Reed? Würde einiges erleichtern.

Oder IR reflex Lichtschranken?

Gruß

MiReu

MiReu:
Hi,

warum LDR und nicht Reed? Würde einiges erleichtern.

Oder IR reflex Lichtschranken?

Gruß

MiReu

Wurde in einem Tutorial zu Lego Zügen auch so angewendet.
In Zukunft steige ich aber vielleicht auf andere Möglichkeit um. Jetzt möchte ich erstmal mein Projekt fertigstellen.
Dann kann ich später immer noch Dinge verbessern.

Versteh ich jetzt nicht? Sind Fehler, auch die von anderen, nicht dazu da daraus zu lernen?

Überlege mal was du für einen Aufwand treiben musst, alleine um zu erkennen wie hell es beim Starten der Anlage ist. Mit Reed oder IR muss nur der Zustand des Sensors abgefragt werden, kein Spannungsteiler usw., ein Digitaleingang je Sensor oder ein Analogeingang für alle genügt und das Programm wird auch einfacher.

Man muss nicht alles nachmachen, nur weil es dazu ein Tutorial oder Video oder... gibt :wink:

Ansonsten, zeig doch mal Bilder oder ein Video von deinem Projekt.

Gruß

MiReu

Ich habe mir jetzt doch noch etwas anders überlegt.
Wie kann ich eine variabel setzten und sie später wieder auflösen?
Beispiel:

if (licht1 >  210) {
ABSCHNITT 1 auf wahr setzten
ABSCHNITT 4 auf wahr setzten

if (licht2 >  300) {
[b]ABSCHNITT 1 auf falsch setzten
ABSCHNITT 2 auf wahr setzten

if (licht3 >  500) {
ABSCHNITT 2 auf falsch setzten
ABSCHNITT 3 auf wahr setzten

if (licht4 >  500) {
ABSCHNITT 3 auf falsch setzten
ABSCHNITT 4 auf wahr setzten




Und dann 
WENN ABSCHNITT 3 wahr ist UNDif (licht2 >  500)
lego.SingleOutput(0, PWM_FLT, RED, CH1);//Kette stoppen (Motor 1 aus)

Hi

Eigentlich GENAU SO :o
Der Datentyp für wahr/falsch ist boolean (statt int/byte/whatever).
Diese Variable kannst Du dann nur noch true/false/HIGH/LOW/1/0 setzen.

Wenn Du allerdings viele Abschnitte hast, wäre zu überlegen, ob man Diese nicht zusammen fassen kann - als normale boolean-Variable brauchtst Du jedes Mal ein ganzes Byte - zerlegt in Bits bekommst Du 8 Abschnitte auf dem gleichen Platz (1 Byte) unter.

Das ging glaube mit Bitfield in einem struct - jupp, zwar kein Foren-Link, aber M$ wird hier auch wissen, was Die Da schreiben:
CPP Bit-fiels @ M$
Und dann doch der Forenlink, User combie

MfG

Danke für den Tipp mit boolean
Hat perfekt geklappt @postmaster-ino

Jetzt versuche ich mich gerade noch mit der Umstellung von delay auf millis. Leider blicke ich da noch nicht ganz durch.

 if (Abschnitt4 == true){
delay(4000);//4 sekunden warten

lego.SingleOutput(0, PWM_REV5, BLUE, CH1);//Stationsbescheluning (Motor 2 ein)

}

Delay soll durch millis ersetzt werden.

Larry98:
Delay soll durch millis ersetzt werden.

Du musst dir das Beispiel "BlinkWithoutDelay" aus der IDE ansehen.

Hallo Larry,
für mich stellt sich Deine Aufgabe überschaubar dar.

Für die sich über den Tag ändernden Lichtverhältnisse wertest Du besser nicht absolute Werte, sondern den Gradienten aus. Heißt, Du mißt einen Wert und anschließend den nächsten. Ist der Unterschied gering, handelt es sich um eine Änderung der Lichtverhältnisse. Ist der Unterschied groß, liegt es an der Auslösung Deines Sensorwunsches. Als nächsten Schritt überschreibst Du den ersten Meßwert, mit dem Zweiten. Der zweite Meßwert wird jetzt zur Referenz für den kommenden 3. Meßwert. Dann mißt Du den Dritten und bildest die Differenz mit der letzten Messung. So erhälst Du super simpel einen gleitenden, selbstangleichenden Referenzwert.

Für die Auslösung des zeitverzögerten 2,. Sensors, nach dem ersten, wartest Du in einer Schleife bis der erste Sensor wie oben beschrieben auslöst. Sobald das geschehen ist, verzeigst Du in die nächste Prüfung für den zweiten Sensor. Dieser Sensor mißt ebenfalls den Gradienten, nach dem Verfahren wie beim ersten Sensor für eine Timeoutzeit von vlt 60 Sekunden. Tritt das Ereignis vor dem Timeout ein führt Du eine Verzweigung in die nächste Aufgabe aus, andernfalls gehts beim eintreten des Timeouts wieder zurück zur messung mit dem ersten Sensor.

Ist es das, was Du machen willst?

Viele Grüße und
immer mit dem fliesskomma rechnen :wink:

So ich bin jetzt wieder aus dem Urlaub zurück und kann nun weiter machen :wink:

Ein kleines Video habe ich auch auf YouTube hochgeladen:

Ich möchte jetzt doch in der Zukunft die LDRs durch eine bessere Lösung ersetzen.

MiReu:
Hi,

warum LDR und nicht Reed? Würde einiges erleichtern.

Oder IR reflex Lichtschranken?

Gruß

MiReu

Welche davon ist am kleinsten und besten geeignet?

Hier noch ein paar Bilder von den Achterbahnzügen und Achterbahnschienen.