Schnelle Ghosts mit Arduino programmieren

  • An alle, die schnelle Ghosts haben wollen:


    Die ersten Schritte von mir zu schnellen Ghosts (ID5 und ID 6) sind in
    Schaltzeiten XP Sensoren
    beschrieben; ich denke es ist jetzt an der Zeit, das Kind mit Namen zu nennen, deshalb mach ich jetzt mal ein neues Thema auf, das in Elektronik besser aufgehoben ist.



    Was gibt es bis jetzt:
    8 IR Sensorenpaare von CXP an nostalgischen Stellen der Bahn
    einen Arduino MEGA (wird ein DUE werden,, wegen der Anzahl der Interrupts) und gelungene Versuche der wichtigsten Features:


    1.) PWM (Pulsweitenmodulation) kann über die Reglereingänge 5 und 6, die Spannung vorgeben, die Weichentaste als digitaler Ausgang geht auch; (wenn PWM zu ungenau: ich krieg am Montag digitale Potis)
    2.) Das Einlesen der ID`s funktioniert (es wird erkannt wenn ein Auto zwischen 1 und 8 über den Sensor fährt und welche ID das hat (Regler1: ID 0 : typisches Programmiererproblem?)


    Damit kann der grobe Programmablauf angedacht werden


    Start Programm: Power on: Reset Knopf Programmieren für Zwischendurch


    Block 1: Codierung Ghost 5; LED gelb blinkend, bis codiert (in einem LOOP)


    Block 2: Codierung Ghost 6; LED gelb blinkend, bis codiert ( in einem LOOP)


    Block 3, ebenfalls LOOP
    Vorbereitung zum fliegenden Start: LED ROT dauernd, dann
    gelb blinkend, wenn Taster Start gedrückt; Überfahrt Sensorgruppe 8 (vor Stert-Ziel): gelb blinkend weg: Ghosts geschwindigkeitsprogrammiert und ab Sensorgruppe 1 ==> Hauptprogramm


    Block 4: Hauptprogramm


    1.) Einlesen aller Sensoren und dementsprechendes Ausgeben an Ghost 5 und 6 (Spannung und Zeit)
    2.)Timerprogrammierung Haarnadel: Überfahrt Sensor R ==> RStop=1 (500ms lang); Überfahrt Sensor L ==>LStop=1 (500ms lang); wenn innerhalb der Zeit an gegenüberliegender Spur ein Auto ==> Wegschalten der Spur (Relais, 2 Geraden lang), dann wieder zuschalten (nach 500ms , einstellbar)


    3.)Taster Start im Hauptprogramm: Virtuel Savety Car: gelb blinkend, v_max reduziert an alle Autos (da ist noch nicht klar, wie ich das lösen werde)


    Berichte folgen
    LG
    Alex

  • ebay Werbung
  • Schnelle Frage an die Experten:


    Macht es Sinn mit 3 Arduinos zu arbeiten:
    1.) Einlesen der 16 IR Sensoren; dafür brauche ich einen DUE, weil nur der 16 Interrupts kann; der kann allerdings nur 3,3V
    Wenn eine ID erkannt ist, könnte ich ja einen 3,3V Ausgang schalten und den im MEGA einlesen (kann der überhaupt 3,3V als Eingang erkennen)
    Die ganze Zeitsteuerung und die PWM für den Ghost könnte dann nur im Mega stattfinden (je einer für die beiden Ghosts)


    Ist das schneller, macht das Sinn?


    LG
    Alex

  • Hallo Alex,


    Mit dem Due kannst du doch alle Tasks erschlagen, du brauchst für das PWM keine 5V (über 50% wirst du aktuell auch nicht ansteuern, das maximale PWM verschiebt sich halt nach oben). Ansonsten gibt’s ja auch noch Pegelwandler.


    Aber: Der Due verwendet einen ARM an Stelle des AVR. Da ist die Architektur deutlich komplexer und verlangt viele intensive Stunden mit dem Datenblatt. Ist für Einsteiger nicht ohne. Hattest du dich mal mit dem Datenblatt des ATmega328 beschäftigt?


    ich überlege gerade auch, wie du mit der Situation umgehen kannst, dass bei 16 Sensoren natürlich auch mehrere Fahrzeuge gleichzeitig über die Sensoren können, das gibt dein Konzept aktuell nicht her.


    Grüße
    Philipp

  • Hallo Alex,


    ein paar Gedanken und Blicke in die Datenblätter des ATmega328 und der SAM3X sehe ich für deinen Plan zwei (bzw. drei) Optionen:


    1. Der DUE sollte es mit deinen 16 Sensoren bei schlanken ISR ohne Probleme hinbekommen, auch wenn alle Fahrzeuge gleichzeitig über Sensoren fahren. Nachteil: ARM ist deutlich anspruchsvoller als AVR und durch die geringe Verbreitung des DUE gibt's auch wenig Vorlagen und Beispiele im Netz


    2. Hol' dir für jedes Sensorpaar einen Nano als "Melder" und vernetze diese per TWI mit einem Master-Arduino, welcher die Fahrzeugsollgeschwindigkeit bestimmt und die Fahrstufen-Ausgabe übernimmt.


    3. Weniger µC, mehr DSP: An jeden Sensor einen diskreten Timer, bei der entsprechenden Flanke den Zählerstand capturen und z.B. per Schieberegister im Arduino einlesen und dort die Daten verarbeiten. Beim Preis eines Nano-Clones wäre mit aber schon das austüfteln und die Konzeptabsicherung zu viel Aufwand, dann lieber mit Kanonen auf Spatzen schießen und ein paar Nanos verbauen.


    Grüße
    Philipp

  • Danke Philipp
    Also vom Regen in die Traufe; der Nano ist relativ teuer, um 2 Interrupts zu lesen, brauche den ja 8x;
    Wenn ichs richtig gelesen habe, dann kann der Mega 6 Interrupts; also sollte ich mit dem DUE nicht zurechtkommen, dann kann ich immer noch 2 Mega dazukaufen.
    Aber schaun wir mal


    Was ist eigentlich die Schaltzeit eines digitalen Ausgangs; hab da nix gefunden; würde einfach die Frequenzeinleser, je nach ID auf einen Ausgang setzen und den als Trigger für den Master und dem Steuerprogramm nehmen, dann hätt ich auch keinerlei Probleme mit den verschiedenen Timern.


    Mir ist schon klar, dass es, wie du ja schreibst, einfacher auch geht, aber, wie gesagt ich muss das Ding selbst programmieren und so tief will ich eigentlich nicht rein


    LG
    Alex

  • Hallo Alex,


    als Klon kriegst du 10 Nanos für 25E mit ein paar Wochen Wartezeit, das geht doch.


    Hast du schon einen Due? Wenn du diese Lösung favorisierst (geht's dir auch um learning-by-doing oder willst du "nur" am Ende ein Ergebnis haben, bei dem du in ein Sketch die Geschwindigkeit der Ghostcars eintippen kannst?), kriegen wir das auch hin.


    Grüße
    Philipp

  • ebay Werbung
  • Hi Philipp


    Mich interessiert nur das Ergebnis; will auf gar keinen Fall das Ding länger programmieren, als es für dieses Projekt sein muss; hab sonnst keinerlei Anwendungen.
    also ich denke das folgendermaßen:
    Der DUE liest mir meine 16 Sensoren ein und gibt je nach Ghost (ID 5 oder6) einen der 16 Ausgänge zu Mega1, oder einen der anderen 16 Ausgänge zu Mega 2
    Damit hab ich das Einlesen der Sensoren abgekoppelt, von der Steuerung der Ghosts.
    Der Mega schickt dann dem CU Eingang (zB 5) das dementsprechende Signal (Geschwindigkeit / Zeit); entweder PWM, oder lieber dig Poti
    Alles ganz easy zum Programmieren; nix gleichzeitig, keine sich überschneidenden Timer; kein großartiges Einlesen in die Tutorials, wo ich das meiste nicht versteh


    Genau richtig für einen Maschinenbauer :D


    LG
    Alex

  • Hallo Alex,


    wenn du den Due verwenden willst, kann der alle Aufgaben übernehmen, du brauchst dann keinen anderen Arduino mehr, auch nicht für die "Ausgabe" der Fahrstufe an die CU.


    Du definierst die 16 von dir gewählten Eingänge als Interrupts (der ARM kann auf jedem IO einen Interrupt setzen) und legst entsprechend 16 Aufrufe in den Interrupt-Routinen auf deine Identifikationsfunktion "infraredDetect()" an - jeder Sensor (= IO-Port) braucht dabei seine eigene Zähl-Variable, sonst gibt's Verwechslungen. Dann erkst du dir im loop(), an welchem Sensor dein GhostCar zuletzt gesehen wurde und gibst dir dazu passende Geschwindigkeit aus.


    Willst du mit dem Due arbeiten? Dann solltest du zuerst dein bestehendes Programm auf dem Due zum laufen bringen - mit einem Sensor. Der Ausbau auf mehrere Sensoren ist dann ein Folgeschritt.


    Grüße
    Philipp


    P.S. Mach uns Maschinenbauer doch nicht so klein...

  • Hallo Philipp


    Bin sicher, dass das der Due kann, aber das Programm wird durchaus groß und lang, mit all den Timern; wenn ich das trenne, dann tue ich mir sicher leichter und wenns geht kann man sich immer noch mit einem Due herumspielen. Zudem kann man dann hradwaremäßig nur mit einem Ghost fahren.
    Außerdem kann ich dann mit Delay arbeiten, weil es ja nur einen Ghost betrift; das mit den Timern ist für mich schon ziemlich heftig


    Aber schaun wir mal, ob ich das Einlesen eines Sensors im Due schaffe


    LG
    Alex

  • Das Programm muss nicht lang werden. Dafür / dagegen gibt es z. B. die objektorientierte Programmierung. Da definiert man sich eine sensor Klasse mit 16 Instanzen.


    Delay kannst du nicht nutzen. Dann ist das mit den 16 Sensoren doch schon wieder quatsch.
    Erkennst du in der isr ein Auto auf das reagiert werden soll, schreibst du einen Status in eine globale variable. Die Main loop guckt nur auf diese variable und wenn da was drin steht, wird der pwm Wert entsprechend gesetzt. Das könntest du theoretisch auch direkt in der isr machen und hast eine komplett leere main. Da braucht man überhaupt kein delay.

  • Das Programm muss nicht lang werden

    Genau so sieht's aus. Wichtig ist die logische Struktur im Programm, da kannst du viel besser deinen Funktionen sortieren, als wenn du auf mehrere Controller gehst. Oder anders gesagt: Die Gesamtfunktion wird nicht kleiner/einfacher, wenn du sie auf verschiedene Hardwarebrocken aufteilst - im Gegenteil.


    Ich habe dir mal ein Sketch für den DUE aufgesetzt, auf Basis des Codes, welchen du zur Identifikation der Fahrzeug-IDs gepostet hattest. Best Case gibt es dir die IDs der Fahrzeuge bereits korrekt aus, wahrscheinlich müssen wir noch ein wenig debuggen. Schau mal rein ...


    Grüße
    Philipp


    P.S. Im Datenblatt habe ich eben gesehen, dass der DUE zwei DAC-Kanäle hat. Damit könntest du zwei GhostCars am Due direkt betreiben, ohne PWM oder Digitalpoti.

  • ebay Werbung
  • Wow
    Da gehts ja voll ins Eingemachte; gefällt mir
    Danke mal ihr beiden; probiere alles aus und dann poste ich wieder die Ergebnisse; wofür hat man denn ein Forum? :thumbsup::thumbsup::thumbsup:
    Krieg den Due allerdings erst morgen, also wirds noch dauern
    Wir hören voneinander


    LG Alex

  • Heute den DUE angeworfen; tut nix, kein PIEPS, kein Blinken, 2 Kabel probiert, dasselbe Im gerätemanager bleibts auch finster
    Kaputt, oder?


    LG

  • Hallo Alex,


    ich nehme mal an, dass du den PC am Programming Port angeschlossen hast. Hast du in der IDE auch das AddOn für den Due installiert? Da kommen die ganzen Treiber etc mit.


    Edit: Hab eben mal einen DUE am Rechner angeschlossen. Die Power-LED muss auf jeden Fall leuchten und bei den Anschlüssen muss ein weiteres Gerät dazu kommen

  • Tja leichtet gar nix, hab einen enuen bestellt und schick den zurück
    LG

  • So hab mal ein Bisschen weitergetan
    Kann jetzt mit dem Nano, das Sensorpaar einlesen und über einen Ausgang, den Mega anwerfen; weiß schon, dass das ein Bisschen umständlich ist, hat aber auch Vorteile bei der Fehlersuche; denke da an einen Nano Gehäusestecker, den man abziehn kann, wenn ein Sensor nicht mehr funktioniert, aber schauen wir mal
    Auich das Codierungsprocedere, sowie der fleigende Start funktioniert; was noch nicht geht ist der digitale Poti, hab mich da aber nur 1h gespielt, heut gehts weiter.


    Der Due kann 2 echte Analogausgänge; kann ich das direkt als Regler benutzen????


    LG
    Alex

  • ebay Werbung
  • So jetzt hab ich mal das Testprogramm für den Dig Poti zum Laufen gebracht und schon das nächste Problem:


    Testprogramm macht folgendes: 2 sec Wert 0 und dann hochschalten auf 2sec Wert 500 und dann wieder runter
    Wert0= 0V, Wert 500= 3,5 V (ungenaues Messgerät, aber die Größenordnung stimmt)


    Der digitale Regler hat 4 Kabel: Schwarz=GND, rot= +4V; grün schaltet den Taster gegen GND und Gelb gibt zu GND zw. 0 und 2,2 V aus (Regler)
    Jetzt hab ich ja 2 Potentiale: einmal den Arduiono mit extern 5V und GND und einmal den Regler mit 4V und GND


    Der Schalter ist kein Thema, der funktioniert mit einem Optokoppler einwandfrei, aber wie schick ich die 2V ins gelbe Kabel
    wenn ichs direkt mache, ohne ein anderes Kabel anzuhängen (also nur Gelb mit 2V), dann macht das Auto ca 1sec Geschw, ca 1 Sec nix, aber nicht Vollgas.


    Hab schon probiert die 4V und GND vom Regler auf mein DigPoti zu hängen und nur die Eingänge mit 5 V vom MEGA (also U/D, INC und CS, aber da macht dann das Programm irgendwas.


    Kann man den Arduiono nicht auf die Bahn hängen? Kommen da irgendwo konstant 5V raus, oder eichen die 4V vom Regler, oder Spannungswandler auf 7-12V???
    Habts eine Idee?


    LG
    Alex

  • Spannung ist eine potentialdifferenz. Relativ zur eigenen Masse gibt der arduino meinetwegen zwei volt aus. Also zwei volt mehr als die Null volt, die die Masse repräsentiert. Damit das beim Regler Anschluss auch als zwei volt interpretiert wird, musst du die Referenz angleichen. Also einfachen die beiden Massen verbinden. Die Masse vom Regler ist bei carrera gleich der Masse am Eingang der Spannungsversorgung der cu.

  • Das ist ja mal ein hyperspannendes Projekt.
    Habe den Thread durchgeackert, auch den "Vorthread", verstehe vom Elektrotechnikkram zwar nur Bahnhof, war trotzdem interessant :)


    Eine Frage vom Unbedarften zwischendurch.
    Wenn ich das alles richtig verstanden habe, simuliert Euer Arduino einen DigitalRegler und verwendet CXP-Sensoren zur Standortbestimmung. Korrekt ?
    Das heisst - alles was geschieht läuft über die CU bzw über CXP, sowohl Arduino Inbound (Sensorik) als auch Arduino Outbound (Steuerung).


    Wäre es nicht mit Hinblick auf die Signallaufzeiten zielführender, den Arduino auf das Slotcar zu packen und dieses autonom fahren zu lassen ?
    Wenn irgendwelche aktiven Komponenten ( Magnet => Reed oder Etiketten a la Slotbär) dem Arduino mitteilen in welchem Streckenblock er gerade ist
    bleibt dann doch "nur" noch das Problem, die Motorspannung passend zu reduzieren ( da vom Gasregler dann natürlich Vollgas kommen muss ).


    ( Ja klar, so ein Arduino eignet sich eher für nen Truck als für nen 908 - ich meine aber eher von der Grundlogik her ).


    Oder ist das komplett Banane was ich mir hier denke ?

  • Der Due kann 2 echte Analogausgänge; kann ich das direkt als Regler benutzen????

    Na er hat zwei 12bit-DAC-Kanäle auf B16&B16, sollte also gehen. Mit 10k zur CU entkoppeln und gut ist es.


    Zu deinem Potentialproblem:
    - GND von Arduino, Poti und CU musst du unbedingt verbinden als gemeinsame Masse
    - Die 5V vom Arduino darfst du nicht mit der CU verbinden, sonst hast du besagtes Problem
    - Zum experimentieren kannst du die VCC vom Digipoti an die 5V vom Arduino anschließen


    Zeichne mal dein Schaltplan von deinem Aufbau inkl. der Bezeichnungen der Bausteine und deren Werte, dann können wir dir leichter helfen.


    Dann könntest du auch noch ergänzen, wie du "500" in das Poti schickst. Und warum. Das Poti hat doch sicherlich 128 oder 256 Stufen.



    @Giftgruen: Klar geht das auch - viele Wege führen nach Rom. Die große Challenge ist die Lokalisierung des Ghostcars. Wenn du dafür eine Lösung hast, ist der Rest auch beherrschbar.



    Grüße
    Philipp

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!