Go Down

Topic: KI für Carrera Bahn (Read 9010 times) previous topic - next topic

bimini

Jan 11, 2012, 04:39 pm Last Edit: Jan 14, 2012, 01:17 pm by bimini Reason: 1
Hallo

Ich bin Schüler eines Technischen Gymnasiums und bei uns steht demnächst eine größere Projektarbeit an. Bei der Themenauswahl sind wir sehr frei und da ich ich schon länger mit einem Arduino Liebäugle nehme ich das jetzt als Anlass mich damit zu beschäftigen. In Assembler (8051) und Java habe ich ein gutes Grundwissen. Auch mit der Architektur von Mikrocontrollern kenne ich mich ganz gut aus und ich kann mit Lötkolben und Oszilloskop umgehen und habe sowohl ein Analoges als auch ein digitales Speicheroszilloskop zur Verfügung.

Meine Projektidee ist es eine selbstfahrendes Auto für eine Carerra-Bahn zu bauen. Realisiert soll das ganze mit einem 3-Achsen Accelerometer Modul (ADXL330). Sobald das Auto in die Kurve fährt soll der Arduino die Geschwindigkeit soweit herunter regeln (PWM) das die Zentrifugalkraft einen bestimmten wert nicht übersteigt und das Auto nicht abfliegt. Da der Sensor ja erst anschlägt wenn das Auto bereits in der Kurve ist denke ich darüber nach für kurze zeit den Motor umzupolen um die Geschwindigkeit schnell genug zu reduzieren. Anfänglich soll sich nur der Sensor im Fahrzeug selbst befinden und der Arduino in der Mitte der Strecke und über eine "Angel" mit dem Auto verbunden sein. Falls es Zeitlich noch reicht soll später alles ins Auto verfrachtet werden und dann eine Nano, Mini oder sowas bit.ly/6uo86g zum Einsatz kommen. Evtl. besteht auch die möglichkeit eine Platine zu fräsen. Dies will ich Anfangs noch nicht machen da dann die Stromversorgung über die Schienen erfolgen muss und das ganze möglichst kompakt sein sollte.

Bezüglich der Bestellung und Realisierung sind noch ein paar Fragen aufgetaucht.

1: Um erstmal die Realisierung zu testen hab ich gedacht das ich anfangs erst mal ein Logging Programm entwickel um die wirkenden G Kräfte aufzuzeichnen. Brauch ich um die Messwerte zu speichern ein SD Karten Modul oder reicht erst mal der Ram auf dem µC. Es reicht ja nur die Y-Achse aufzuzeichnen.

2: Das PWM Signal kann ich ja ganz einfach über eine Transitor-Schaltung verstärken. Frequenzmäßig dürften ja einige 100 Hz reichen.

3: Da der Sensor eine VCC von max. 3,6 V  hat und der Sensor die Daten von 0 - VCC ausgibt. Müßte man diese Signale noch verstärken um den kompletten Analogbereich des Arduinos nutzen zu können oder kann man den Bereich der 1024 schritte auch verlagern (ich denke nicht)?

4: Um das Ganze späte möglichst kompakt zu machen will ich einen Mini oder Nano verwenden (Anfangs einen Uno)  da die aber recht teuer sind wollte ich fragen ob ein "DFRduino Pro Mini 8Mhz" nehmen kann da der nur 1/4 des Original Mini kostet. Kann ich den mit der Platine des Uno's programmieren (mit dem Offiziellen Mini soll das ja angeblich gehen) oder brauch ich da noch ein Programmiermodul.






Udo Klein

1) Du brauchst doch vermutlich eh nur Maximum und Minimum und wenn's hochkommt noch die Varianz. Wieso sollte dazu der Speicher nicht reichen?

2) Das ist keine Frage

3) Wieso nimmst Du nicht eine Arduino Variante die mit 3V auskommt? Die darfst Du auch mit 3.6V betreiben --> keine Verstärkung nötig und Du kommst mit einer einzigen Versorgungsspannung aus.

4) 8MHz Varianten kommen mit 3V aus ;)   Du hattest Eingangs gesagt Du kennst Dich mit Controllern gut aus, wieso musst Du das noch fragen?
Check out my experiments http://blog.blinkenlight.net

bimini


1) Du brauchst doch vermutlich eh nur Maximum und Minimum und wenn's hochkommt noch die Varianz. Wieso sollte dazu der Speicher nicht reichen?

Ja stimmt eigentlich. Wie kann ich den Internen Speicher denn auslesen? Hab mir die IDE noch nicht angeschaut. Werde mich die nächsten Tage mal damit Auseinandersetzten. Bei dem 8051 hab ich mir solceh werte entweder auf dem Display ausgeben lassen oder über den Debugger in den Speicher reingeschaut.
Quote

2) Das ist keine Frage

Gut wollte mich nur absichern.
Quote

3) Wieso nimmst Du nicht eine Arduino Variante die mit 3V auskommt? Die darfst Du auch mit 3.6V betreiben --> keine Verstärkung nötig und Du kommst mit einer einzigen Versorgungsspannung aus.

Das mit der 3V Variante ist bisschen schwierig da ja früher oder später die Komplette Elektronik über die Bahn versorgt werden soll und auf der Bahn 14,6V anliegen. Um in das empfohlene Spektrum (12V) des Uno's zu kommen muss ich also nur einen kleine Widerstand nehmen.
Quote

4) 8MHz Varianten kommen mit 3V aus ;)   Du hattest Eingangs gesagt Du kennst Dich mit Controllern gut aus, wieso musst Du das noch fragen?

Ich hab jetzt gerade gesehen das es auch eine 16MHz+5V variante gibt. Diese wäre ist imho besser geeignet. Obwohl ich auch da auf 8V runter muss. Die frage ist halt ob Dieser Controller auch von dem USB Umsetzter des Uno's programmiert werden kann. Wenn ich dich richtig verstanden hab ist das einzige Hindernis beim 8MHz+3,3V die Spannung. Stimmt das so.
Mit dem satz das ich mich recht gut mit Mikrocontrollern auskenne meinte ich das ich das Funktionsprinzip und den Internen Aufbau im allgemeinem verstanden habe. Mit den Feinheiten einzelner Typen kenn ich mich noch nicht aus.

Danke für die Antworten.

Udo Klein

Dann glaub mir, es ist IMMER einfacher nur mit einer Spannung zu arbeiten. Spannungsregler gibt es als fertige Bausteine. 2 Kondensatoren dran und fertig. Kritischer ist, daß Du vermutlich parallel zu einem Motor arbeitest der vieleicht durch Vibrationen auch noch öfters von der Stromversorgung kurz abgeschnitten wird --> vermutlich starke Störungen auf der Spannungsversorgung. Das kann ein ziemliche ätzendes Problem werden.
Ich würde eine kleine 8 MHz Variante nehmen und per extra Schnittstellenkabel programmieren. Das macht die ganze Sache kleiner und leichter.
Check out my experiments http://blog.blinkenlight.net

Udo Klein

Nachtrag: wenn Du einen "nackten" Chip verwenden willst, warum nicht gleich mit 8MHz RC Oszillator arbeiten und den Quarz einfach weglassen. Bei der Modellautosteuerung wird es wohl kauf drauf ankommen ob der Takt mal ein Prozent daneben liegt.
Check out my experiments http://blog.blinkenlight.net

Udo Klein

Noch ein Nachtrag: wenn Du die Kurve an der Querbeschleunigung erkennst, dann bist Du schon in der Kurve. Wenn Du dann bremst geht die Achslast vermehrt auf die Vorderachse und das Heck bricht aus. Dagegen hilft keine Elektronik der Welt. Wie willst Du das verhindern?
Check out my experiments http://blog.blinkenlight.net

koldomon


Noch ein Nachtrag: wenn Du die Kurve an der Querbeschleunigung erkennst, dann bist Du schon in der Kurve. Wenn Du dann bremst geht die Achslast vermehrt auf die Vorderachse und das Heck bricht aus. Dagegen hilft keine Elektronik der Welt. Wie willst Du das verhindern?


]:D also wenn er kein Carrera-fähiges ESP in den Chip programmiert bekommt, dann ist er auf dem Gymi eh falsch ;-);-);-)

Ernsthaft! Ich hab mir das mal grad so überlegt und ich würde mein programm so aufbauen, dass sich das Fahrzeug langsam in der geschwindigkeit steigert und die G-Kräfte jede Runde mitloggen. wenn die Kurven dann noch sauber funktionieren, einfach die Geschwindikeit als MaxCurveSpeed Variable speichern. Am Umkehrpunkt jeder Kuve (und somit auch des G-Kraftmessers) kann er wieder beschleunigen. Sobald der G-Messer auch nur den kleinsten Ausschlag liefert (nächster Kurveneingang) kannst du eine Verzögerung (Gegenteil zu Beschleunigung) zu deiner MaxCurveSpeed-Variable einbauen und schon rollt (und nicht bremst) er auf den Scheitelpunkt zu. Dann die Geschwindigkeit in der Geraden solange steigern, bis am Scheitelpunkt nicht mehr zu seiner MaxCurveSpeed-Variable runtergebremst(rollt) werden kann und schon hast du deine MaxLaneSpeed-Variable.

Optimal wäre ein Code, bei dem der Wert von MaxLaneSpeed "ein wenig schwingt".
Generell hättest du 3 Programmablaufphasen.
1. MaxCurveSpeed ermitteln
2. MaxLaneSpeed ermitteln
3. Kontinuierlicher Regelprozess für MaxLaneSpeed.

Dürften so geschätzte 100 Zeilen gut durchdaten Codes werden. Nur die Logik, keine Commandos für den UNO

bimini


Dann glaub mir, es ist IMMER einfacher nur mit einer Spannung zu arbeiten. Spannungsregler gibt es als fertige Bausteine. 2 Kondensatoren dran und fertig. Kritischer ist, daß Du vermutlich parallel zu einem Motor arbeitest der vieleicht durch Vibrationen auch noch öfters von der Stromversorgung kurz abgeschnitten wird --> vermutlich starke Störungen auf der Spannungsversorgung. Das kann ein ziemliche ätzendes Problem werden.
Ich würde eine kleine 8 MHz Variante nehmen und per extra Schnittstellenkabel programmieren. Das macht die ganze Sache kleiner und leichter.


Ja die Schwankungen des Motors hab ich auch schon dran gedacht. ich wollte durch einen Kondensator bzw Gold-Cap die Spannung glätten und noch mit einer Diode einen Verpolungsschutz einbauen für den Fall das der Motor im Schubbetrieb als Generator fungiert.


Quote

Nachtrag: wenn Du einen "nackten" Chip verwenden willst, warum nicht gleich mit 8MHz RC Oszillator arbeiten und den Quarz einfach weglassen. Bei der Modellautosteuerung wird es wohl kauf drauf ankommen ob der Takt mal ein Prozent daneben liegt.


Die inteligenz in das Auto zu bringen ist Schritt 2. Erstmal will ich das ganze mit dem Controller in der Mitte der Strecke und eine Kabelverbindung zum Auto. Das heißt für den Controler auch eine externe Spannungsversorgung. Wenn das alles funktioniert machen wir uns an die Umsetzung der Integrierten Lösung.

Quote

Noch ein Nachtrag: wenn Du die Kurve an der Querbeschleunigung erkennst, dann bist Du schon in der Kurve. Wenn Du dann bremst geht die Achslast vermehrt auf die Vorderachse und das Heck bricht aus. Dagegen hilft keine Elektronik der Welt. Wie willst Du das verhindern?


Die Autos haben unten einen Magneten der verhindert das das Heck ausbricht. Außerdem ist der Führungsstift der das Auto in der Kurve hält nicht rund sonder hat einen rechteckigen Querschnitt und verhindert so auch schon den Drift.  Außerdem bremse ich ja nicht mit den Vorderrädern sonder Hinten. Wenn es überhaupt notwendig ist zu bremsen. Bei den neuen Digital Bahnen kann man einen Bremsknopf betätigen wodurch der Motor kurzgeschlossen wird.






]:D also wenn er kein Carrera-fähiges ESP in den Chip programmiert bekommt, dann ist er auf dem Gymi eh falsch ;-);-);-)

Ernsthaft! Ich hab mir das mal grad so überlegt und ich würde mein programm so aufbauen, dass sich das Fahrzeug langsam in der geschwindigkeit steigert und die G-Kräfte jede Runde mitloggen. wenn die Kurven dann noch sauber funktionieren, einfach die Geschwindikeit als MaxCurveSpeed Variable speichern. Am Umkehrpunkt jeder Kuve (und somit auch des G-Kraftmessers) kann er wieder beschleunigen. Sobald der G-Messer auch nur den kleinsten Ausschlag liefert (nächster Kurveneingang) kannst du eine Verzögerung (Gegenteil zu Beschleunigung) zu deiner MaxCurveSpeed-Variable einbauen und schon rollt (und nicht bremst) er auf den Scheitelpunkt zu. Dann die Geschwindigkeit in der Geraden solange steigern, bis am Scheitelpunkt nicht mehr zu seiner MaxCurveSpeed-Variable runtergebremst(rollt) werden kann und schon hast du deine MaxLaneSpeed-Variable.

Optimal wäre ein Code, bei dem der Wert von MaxLaneSpeed "ein wenig schwingt".
Generell hättest du 3 Programmablaufphasen.
1. MaxCurveSpeed ermitteln
2. MaxLaneSpeed ermitteln
3. Kontinuierlicher Regelprozess für MaxLaneSpeed.

Dürften so geschätzte 100 Zeilen gut durchdaten Codes werden. Nur die Logik, keine Commandos für den UNO


Hab ich das richtig verstanden das deine Idee ist das Auto im try and error verfahren einen Plan der Strecke erstellen zu lassen. Das hab ich mir auch schon überlegt. Aber müsste man dann noch eine Möglichkeit finden dem Auto im Falle eines Abflugs, der ja zwangsläufig kommen wir, zu sagen wo auf der Strecke es sich befindet. Was mich an der Variante ein bisschen stört ist, dass der Wagen nicht auf Anhieb schnell ist. Wir wollen erst mal versuchen die regelnde Lösung umzusetzen falls das aber nicht möglich sein sollte werden wir die Version machen wie sie auch du vorgeschlagen hast.


Das ist Plan B falls das Auto zu träge ist um schnell genug Geschwindigkeit abzubauen.

uwefed

Quote
Ja die Schwankungen des Motors hab ich auch schon dran gedacht. ich wollte durch einen Kondensator bzw Gold-Cap die Spannung glätten und noch mit einer Diode einen Verpolungsschutz einbauen für den Fall das der Motor im Schubbetrieb als Generator fungiert.

Vergiß die Goldkaps; die haben einen zu großen Innenwiderstand um große Ströme liefern zu können.

Quote
Am Umkehrpunkt jeder Kuve (und somit auch des G-Kraftmessers) kann er wieder beschleunigen.

Dei Kurven der Carrera-Rennbahn haben kein parabolförmige Kurvenführung sondern kreisbogenförmig. somit ist bei konstanter geschwindigkeit die Zentrifugalbeschleunigung konstant und hat keinen Scheitelpunkt.


Ich hab mir mal vor einiger Zeit folgendes überlegt. Steuerung des Modellautos mit möglicher Höchstgeschwindigkeit durch try and error Versuche.
Sensoren: nur eine Strommessung des Motorstroms um zu wissen ob das Auto Fährt oder Herausgeflogen ist und eine Ziellichtschranke.
Die Streke wird im Speicher gemapt und zwar durch das Fahren mit Höchstgeschwindigkeit bis das Auto aus der Kurve fliegt. Dann manuell einsetzen und wieder langsam zum Start und vor besagter stelle wo vorher das Auto in der Kurve einen Abflug machte die Geschwindigkeit drosseln. usw. Nach einigen Lernrunden ist die Strecke gemappt und Arduino weiß nach welcher Zeit weniger Gas zu geben ist.

Grüße Uwe

bimini



Vergiß die Goldkaps; die haben einen zu großen Innenwiderstand um große Ströme liefern zu können.

Um den Arduino zu versorgen müsste das doch reichen. Es geht ja nur darum das die Schleifkontakte unter Umständen kurze Kontaktabbrüche haben und der Gold cap soll verhindern das dann es zum R
Restart des Arduinos kommt. Wobei wahrscheinlich auch ein Elko reichen sollte.
Was hat den ein Uno bzw. Nano so an verbrauch?


Quote

Ich hab mir mal vor einiger Zeit folgendes überlegt. Steuerung des Modellautos mit möglicher Höchstgeschwindigkeit durch try and error Versuche.
Sensoren: nur eine Strommessung des Motorstroms um zu wissen ob das Auto Fährt oder Herausgeflogen ist und eine Ziellichtschranke.
Die Streke wird im Speicher gemapt und zwar durch das Fahren mit Höchstgeschwindigkeit bis das Auto aus der Kurve fliegt. Dann manuell einsetzen und wieder langsam zum Start und vor besagter stelle wo vorher das Auto in der Kurve einen Abflug machte die Geschwindigkeit drosseln. usw. Nach einigen Lernrunden ist die Strecke gemappt und Arduino weiß nach welcher Zeit weniger Gas zu geben ist.

Grüße Uwe



Die Idee ist ganz gut. Wobei das mit der Lichtschranke schwierig wird wenn der Arduino im Auto sitzt aber das könnte man ja dadurch lösen das man einen Kleinen infrarot sensor am auto anbringt und auf der Zielgerade eine LED. Aber wie schon gesagt das ist Plan B

uwefed

#10
Jan 11, 2012, 10:40 pm Last Edit: Jan 11, 2012, 10:42 pm by uwefed Reason: 1
Die Idee ist den Arduino statt der Handsteuerung zu verwenden (den PWM-Leistungstransistor an den 2 poligen Buschsen der Handsteuerung einstecken). So kannst Du jedes Auto ohne Umbau verwenden und der Umbau an der Rennbahn begrenzt sich auf die Montage einer Lichschranke (ein Led und einen Fototransistor die auch so angebracht werden können, daß sie ohne Schäden entfernt werden können (zB auch in 2 Holzklötzen an beiden Seiten der Rennbahn).
Den Arduino würd ich dann extern mit Strom versorgen; zb mit einem 5V Netzteil mit USB-Stecker.

Grüße Uwe

bimini


Die Idee ist den Arduino statt der Handsteuerung zu verwenden (den PWM-Leistungstransistor an den 2 poligen Buschsen der Handsteuerung einstecken). So kannst Du jedes Auto ohne Umbau verwenden und der Umbau an der Rennbahn begrenzt sich auf die Montage einer Lichschranke (ein Led und einen Fototransistor die auch so angebracht werden können, daß sie ohne Schäden entfernt werden können (zB auch in 2 Holzklötzen an beiden Seiten der Rennbahn).
Den Arduino würd ich dann extern mit Strom versorgen; zb mit einem 5V Netzteil mit USB-Stecker.

Grüße Uwe


Die idee ist sehr interresant. Ich werde das morgen mal mit der Gruppe besprechen. 
Wobei es noch zwei kleine probleme gibt. Einmal ist es dann nicht möglich zwei autos auf die bahn zu setze oder man müsste da eine andere lösung finde. Das andere ist das die Controller der Bahn ein Regelbarer Widerstand ist das müsste man dann irgentwie Simulieren. Aber ich denke die Probleme sind alles lösbar.
Da wir 4 Monate zeit für das Projekt haben kann man ja evtl. beide Versionen realisieren und dann schauen welches auto schneller ist.

koldomon

Quote
Hab ich das richtig verstanden das deine Idee ist das Auto im try and error verfahren einen Plan der Strecke erstellen zu lassen. Das hab ich mir auch schon überlegt.


Try & Error | Regelprozess....ok, regelung geht normal nicht in den Error-Zustand.

Quote
Aber müsste man dann noch eine Möglichkeit finden dem Auto im Falle eines Abflugs, der ja zwangsläufig kommen wir, zu sagen wo auf der Strecke es sich befindet. Was mich an der Variante ein bisschen stört ist, dass der Wagen nicht auf Anhieb schnell ist. Wir wollen erst mal versuchen die regelnde Lösung umzusetzen falls das aber nicht möglich sein sollte werden wir die Version machen wie sie auch du vorgeschlagen hast.

Das ist Plan B falls das Auto zu träge ist um schnell genug Geschwindigkeit abzubauen.


plan der Strecke...ja - so wie es ein menschlicher fahrer auch macht. runde um runde um die grenzen auszutesten und am maximum zu bleiben. Abflug findet in deinem fall ja nicht statt, weil du eh eine feste begrenzung der Fliehkraft wolltest. das mit der startgeschwindigkeit kannst du als fixwert vorgeben. braucht ja nicht mit 0,1mm/sec anfangen die g-kräfte auszumessen  :D. wenn du einmal die beiden max-werte hast, kannst ja mit 90% von dem wert anfangen und dich nach 3 runden am maxlanespeed befinden. beschleunigungs- und verzögerungswert als Konstanten definieren, dann tust dir im programm leichter und vereinfachst den regelprozess. bedenke, du hast in deinem Lab andere Umgebungsbedingen als bei einer Vorführung. evtl. ist mal dreck oder "fingerfett" auf der bahn...du musst regeln, ob du willst oder ned ;-)

halt uns auf dem laufenden

bimini

Mit Try an Error meinte ich die geschwindigkeit solange zu erhöhen bis der Wagen abfliegt und dann einen schritt zurück. Aber man muss das ja nur einmal machen und dann weiß man ja ab welcher geschwindigkeit das Auto abfliegt.


Ich halte euch auf jeden fall auf dem Laufenden. Es wird wahrscheinlich noch die ein oder andere Frage auftauchen. Dann werde ich mich nochmal an euch wenden.

uwefed


Die idee ist sehr interresant. Ich werde das morgen mal mit der Gruppe besprechen. 
Wobei es noch zwei kleine probleme gibt. Einmal ist es dann nicht möglich zwei autos auf die bahn zu setze oder man müsste da eine andere lösung finde. Das andere ist das die Controller der Bahn ein Regelbarer Widerstand ist das müsste man dann irgentwie Simulieren. Aber ich denke die Probleme sind alles lösbar.
Da wir 4 Monate zeit für das Projekt haben kann man ja evtl. beide Versionen realisieren und dann schauen welches auto schneller ist.

Der regelbare Vorwiderstand des Controllers wird durch einen Transistor mit PWM - Ansteuerung ersetzt; dazu noch einen kleinen Strommeßwiderstand in Serie um zu sehen ob das Auto aus der Bahn geworfen wurde.

Um 2 Autos auf der Bahn fahren zu lassen, brauchst Du 2 Lichtschranken um jedes Fahzeug eindeutig zu messen. Wenn ein Mensch gegen Arduino fahren sollte, dann genügt das Arduinoauto durch einen erhöten Aufbau (Papierfähnchen) eine höhergestellte Lichtschranke zu unterbrechen und das andere Auto so flach ist daß es nicht die Lichtschranke unterbricht. 

Man könnte auch das Leitschwert mit einer Lichtschranke in der Führungsrille messen, das ist dann aber ein gravierender Einschnitt in die Fahrbahn.

Grüße Uwe 

Go Up