Lego Arduino Roboter Encoder

Hallo

Projekt Vorstellung:
Ich habe ein LEGO Roboter nur mit Power Funktions Motoren gebaut.
Diesen Steuere ich seit einiger Zeit schon mit Hilfe von einem Arduino Mega.
Die “manuelle” Steuerung erfolgt über 3 Analoge Joysticks.
Die Auswertung der Position einiger Achsen erfolt über Potentiometer, was absolut zuverlässig funktioniert.
Leider habe ich 2 Achsen die über Rot. Encoder erfasst werden müssen da eine POTI Montage im drehzentrum der Achse nicht möglich ist.
Die Encoder drehen sich ca. 3mal um die eigene Achse .

Jetzt kommen wir zum Problem:

Beide Encoder Funktionieren in dem Encoder Testprogramm Ohne Probleme.
In meinem Sehr Großen Programm habe ich aber das Problem das es natürlich nicht funktioniert weil Impulse ankommen wenn der Ablauf gerade in einem Andern Teil des Programms steckt.

Ich habe Überlegt " Die ganze Schaltung neu zu bauen und die Encoder auf Eingänge mit Interrupts zu legen. Habe aber bedenken das die Encoder Signale zu schnell kommen und dadurch das Programm an eine unglücklichen Stelle unterbrochen wird Motoren dadurch weiter laufen und über die Endlagen hinaus laufen.

Oder ist es Sinnvoller eine NANO zu nehmen der nur die Auswertung der Encoder übernimmt und die Werte dann per I2C Ab zu fragen???

Eine Weiter Idee ist es das Programm so um zu arbeiten das beim Bewegen der Achsen mit Encoder nur die Achsen fahren und ich dann in dem verhältnismäßig kleinen Teil des Programms bleibe bis alle Bewegungen der Achse beendet sind.

Was haltet Ihr für die Bessere alternative?
Eventuell habt ihr noch eine andere Alternative.
Ich kann mich aktuell nicht entscheiden.

Für Alle die es Interessiert hier noch das Aktuelle Programm.

LEGO_Robo_Joystick3.ino (34.5 KB)

Wenn man in der Interrupt-routine nur eine Variable hochzählt geht das so schnell dass der sonstige Ablauf nicht gestört wird. Die Auswertung des Encoderzählers macht man dann im Hauptprogramm.

Und ich würde die Baudrate mal auf 115200 hochsetzen. Dann sind die seriellen Ausgaben sehr viel schneller abgearbeitet.

viele Grüße Stefan

Hallo

Also sollte es ausreichen wenn ich 4 Interrupt fähige Eingänge verwende??
2 Pro Encoder. Pin 20 und 21 Entfällt da I2C. Bleibt 18 und 19 sowie 2 und 3.
oder gibt es noch andere Interrupt fähige Eingänge die ich noch nicht kenne.

Dabei Stelle ich mir gerade eine Andere Frage:
A04 und A05 werden beim UNO und NANO als I2C SDA und SCL verwendet.
Auch beim MEGA??? In meinem PINOUT steht kein SDA und SCL am A04 und A05.

google ist immer eine fünf-minutensuche Wert
https://www.google.de/search?q=arduino+mega+2560+pinout+sda+scl

Wenn man nicht ganz so viele IO-pins braucht dann finde ich ja der ESP32 ist der bessere Arduino
WLAN und RTC onboard und alle IO-pins sind interruptfähig, richtig viel RAM
viel flash-Speicher

vgs

Danke

Genau das Habe ich leider bei meiner Suche nicht gefunden. Hab mich eher an die Deutschen Seiten gehalten.

Du brauchst nicht 4 Interrupt-Eingänge. Es genügen auch 2 Interrupteingänge. Mit 4 kannst Du zwar eine doppelte Genauigkeit der Schritte erreichen weil Du 4 Flanken pro Schritt lesen kannst.
Wenn ein Interrupt kommt mußt Du den anderen Ausgang des Encoders lesen und dementsprechend die Variable in- oder decrementieren.
Grüße Uwe

Funktioniert das auch zuverlässig wenn man die Drehrichtung zu einem beliebigen Zeitpunkt ändert? Mit beliebigem Zeitpunkt meine ich in diesem Fall eine beliebige Zwischenstellung eines Drehencoders mit mechanischen Schaltern. Da habe ich mit der Standard-encoder-lib schlechte Erfahrungen gemacht. Da gab es beim Richtungswechsel permanent Zählfehler.

Deswegen benutze ich jetzt nur noch die NewEncoder-lib.

vgs

Danke hilft mir extrem weiter.
Das wirft bei mir folgende Frage auf:
Geht das mit der Aktuellen “ENCODER.H” Bibliothek?
oder muss ich da selber was schreiben?

Noch eine Nachfrage haben denn deine Drehenocder mechanische Kontakte oder sind die optisch oder magnetisch?

Mechanische Kontakte machen nur ein paar Zehntausend Schaltspiele mit
Wenn es denn mechanische wären käme es darauf an ob du den Roby nur alle paar Wochen für ein Stündchen am laufen hast oder ob der im Dauerbetrieb ist
vgs

Alles Mechanisch

Das ist kein Projekt was über Jahre hinweg überlebt.
Ist ja aus LEGO und mir geht es nur darum das ich mal so was gebaut und Selber Programmiert habe. Aus Spaß an der Freude.
Der wird wohl am Wochenende mal ein paar Zyklen laufen und wenn ich und die Kinder das Interesse daran verlieren wird er wieder Zerlegt. aber erst nach dem ich restlos zu frieden bin mit dem Ergebnis.

Zum ESP32: ich benötige kein WLAN bzw. noch nicht habe noch keine IDEE wozu eventuell Später

mir fehlen Analoge Eingänge ?
Habe gerade durchgezählt es braucht 24 DIG I/Os und 10 Analoge Eingänge

Der ESP32 lässt sich mit der Arduino-IDE programmieren.
Man trägt in den Einstellungen eine “additional board-url” ein und lässt dann die ESP32-board-unterstützung von der IDE nachinstallieren.
Dann stellt man als Board ESP32 ein und dann kann es losgehen mit dem Programmieren.

vgs

So in der Art habe ich mir das schon gedacht. Aber hat das Board auch Analoge Eingänge?
Und die Anzahl der Eingänge würde nicht reichen.
24 DIG I/O +10 Analoge Eingänge + SDA und SCL.

OK. Also Ausreichend Analoge Eingänge aber so weit ich sehe hat der ESP32
25 GPIOS Teilweise auch Analog verwendbar. Fehlen für meine Verwendung noch 11 Weitere GPIOS.

Aber wir weichen von der Frage ab.
4 Interrupt Pins oder 2, gibt es dafür eine Gescheite Bibliothek die die Richtung richtig erkennt?

Also da die encoder-impulse das Feedback zu einer von deinem Programm ausgelösten Bewegung ist, weiß dein Programm auch in welche Richtung der Motor dreht, von daher wäre eine Drehrichtungserkennung durch den Encoder nicht nötig. Dann genügt ein Interrupteingang. das heißt in deinem Hauptprogramm wird vor jedem Starten des entsprechenden Motors eine Vorzeichenvariable auf plus oder minus gesetzt
und in der Interrupt-routine gibt es dann eine If-bedingung die entscheidet ob counter++ oder counter-- gemacht wird.

Die Vorzeichenvariable muss vor dem Einschalten des Motors gesetzt werden damit die Zählung vom ersten Impuls an in die Richtichte Richtung gemacht wird.

Gibt es einen IO-pin für die Drehrichtung des Motors?
Dann könnte man auch

if (digitalRead(MotorDrehrichtungs_Pin) )

benutzen.
Je nachdem ob das schneller ausgeführt wird als

if ( Drehrichtung )

vgs

Hallo

Das geht. Wirft aber weitere Fragen auf:
Benötige ich dann den 2. Eingang noch?
Benötige ich da die Encoder Bibliothek noch?

Egal die Entscheidung ist gefallen.
Ich werde 4 Interrupt Eingänge benutzen.

Dann wird heut der Tag des Lötkolbens und ich mache noch ein paar andere Optimierungen am Projekt.

Nein dann braucht man die encoder-lib nicht mehr.
Eine ganz kurze selbst geschriebene function die als interruptservice-routine (ISR) arbeitet reicht.
Man muss aber ein paar Dinge beim Programmieren beachten.
Variable als volatile definieren, keinerlei serial.print in der ISR

vgs

Danke für all deine Lösungsvorschläge.
MFG Rocco

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.