Stepper --> feste Positionen variabel anfahren+Drehrichtungsänderung / Servo

Liebe Forummitglieder,
um meinem ältesten Sohn sarkasmus an die bestmögliche Frühförderung zukommen zu lassen sarkasmus aus und weil vor allem Interesse am Programmieren und Basteln seinerseits besteht, wollen wir – wie so viele andere auch – einen M&M-Sortierer bauen.
Ich hatte mal vor einiger Zeit ein bisschen mit dem Arduino herumgespielt und würde mein Wissenslevel mit „fortgeschrittener Noob“ beschreiben. Also Sensoren, RTCs und Displays anschließen und auslesen, bzw. anzeigen lassen, klappte soweit.

Große Wissenslücke habe ich aber, was Stepper und Servos angeht.
Gerne würde ich die farbliche Trennung der M&Ms mit einem Drehteller realisieren,
der jedoch immer den kürzesten Weg zur neuen Auffangposition nehmen soll (=Drehrrichtungsänderung, wenn nötig).

Nun meine erste Frage:
Ist es mit einem Stepper (oder auch Servo?) möglich immer wieder fest hinterlegte Positionen in variabler Reihenfolge (je nach Farbe des M&Ms) über den kürzesten Weg anzufahren? (siehe Anhang Bild)
Dass dem Motor bei jedem Start eine Nullposition zugeordnet und ab dann irgendwelche Relativberechnungen durchgeführt werden müssen, davon gehe ich aus. :wink:

Frage Nr.2:
Den Transport zum Farbsensor und Auswurf der M&Ms würde ich ebenfalls mit einer Drehscheibe umsetzen wollen. Da hier keine Drehrichtungsänderungen nötig sind, denke ich denke, dass sich ein Continuous Rotation Servo in diesem Fall am besten eigenen würde. Wie kann man es programmiertechnisch aber umsetzen, dass das Servo alle 90° eine kurze Pause einlegt, um die Farbmessung machen zu können? move() --> stop() --> delay() ist bestimmt alles andere als elegant?!

Über Tipps, bzw. Ideen zum Lösen meines Problems würde ich mich sehr freuen.
Vielen Dank und Gruß,
Fabian

Hi,
Ein Schrittmotor kann eigentlich nur Schritte in seiner Auflösung (i.d.R. 200 pro Umdrehung) machen, auf beide Seiten. Durch Tricks kann man auch Zwischenschritte fahren.
Eine Schrittmotortreiberstufe hat meist einen Eingang für Takt und einen für Richtung. Wenn Du also am Takt 200 mal wackelst, dann dreht sich die Achse einmal ganz rum. Wenn Du nur einen Puls gibst, dann bewegt sich die Achse um 1.8°. Du kannst also ausgehend von der aktuellen Position um n * 1.8° nach rechts oder links fahren.
Ein Servo zeichnet sich dadurch aus, dass es "weiss" wo es steht und immer dorthin regelt wohin es stehen soll. Wenn Du die Servo Lib benützt, kannst Du den Winkel angeben, wohin das Servo fahren soll.
Die gängigen Servos haben einen Verfahrweg von 180° und einen Anschlag, der vom internen Poti gegeben ist und noch intern mechanisch vorher abgefangen wird, um das Poti zu schützen.
Wenn Du mehr Drehwinkel willst, brauchst Du ein spezielles Servo. Es gibt auch 360° Servos und Segelwinden oder Fahrwerksservos mit mehr als 180°.

Für Deinen Fall würde ich Dir zu einem Schrittmotor raten und einen Referenzschalter an den Drehteller machen, auf den Du beim Einschalten einmal drauffährst, also eine Referenzfahrt machst.
Ein Getriebe ist kaum nötig, die Auflösung von 1.8° sollte hier mehr als genügen.

Pat

Zur Farbbestimmung würde ich einen Kontakt verwenden, der anzeigt, wann sich die Scheibe an der richtigen Postition befindet. Dann kann diese Scheibe auch mit einem ganz ordinären Motor gedreht werden. Nach meiner Erfahrung ist eine Farbbestimmung nicht ganz einfach. Insbesondere darf da kein Fremdlicht eindringen, also ein mechanisches Problem.

Farbfilter sind nicht ganz einfach in der Anwendung, wenn die Sensoren (Photodioden...) eine maximale Empfindlichkeit bei einer bestimmten Wellenlänge haben. Eventuell ist da ein Fotowiderstand mit einem breiten Spektrum besser geeignet, und als Lichtquelle eine Glühbirne besser als LED. Vielleicht kann man das Verfahren auch umkehren, und mehrere verschiedenfarbige LED oder eine mehrfarbige LED benutzen, und die Reflektion bei unterschiedlichen Beleuchtungsfarben messen.

Hallo Fabian,
Pat hat schon die wichtigen Aspekte genannt, ich versuche es aber nochmal mit meinen Worten:

nescius:
Ist es mit einem Stepper (oder auch Servo?) möglich immer wieder fest hinterlegte Positionen in variabler Reihenfolge (je nach Farbe des M&Ms) über den kürzesten Weg anzufahren?

"fest hinterlegte Positionen" können beide, der Stepper braucht einen Referenzpunkt, der Servo wegen des eingebauten Potis nicht. Der kürzeste Weg, den die Software berechnen muß, kann nur vom Stepper angefahren werden, der Servo wegen der 180° Begrenzung nicht.

nescius:
... Continuous Rotation Servo ...

ist wegen der fehlenden Positionsrückmeldung eigentlich nur ein Schrittmotor-Ersatz. Kann man machen, besser fände ich einen zweiten Schrittmotor.

nescius:
... move() --> stop() --> delay() ...

Hier ruft mein Kohlekranmodell ganz laut "lies mich!". Ich finde die dort gewählte Variante des endlichen Automaten mit switch/case für einen fortgeschrittenen Noob ideal. Der von mir gewählte Motor ist schön preiswert und dank Getriebe (64x64 Schritte pro Umdrehung) auch recht drehmomentstark, aber auch nicht rasant. Es ist ein unipolarer Motor und wird über ein häufig mit angebotenes Verstärker-IC mit vier Leitungen pro Motor angestert. Mein Beispielprogramm enthält auch Beschleunigung und Verzögerung. Das ist aber nur eine Möglichkeit unter vielen!

PatK:
Eine Schrittmotortreiberstufe hat meist einen Eingang für Takt und einen für Richtung.

Beispiele auch mit Microschritten A4988 oder DRV8825

PatK:
Wenn Du mehr Drehwinkel willst, brauchst Du ein spezielles Servo. Es gibt auch 360° Servos und Segelwinden oder Fahrwerksservos mit mehr als 180°.

Soweit mir bekannt, haben Servos mit mehr als 180° kein Poti, also keine Positionsrückmeldung, was eigentlich den Vorteil eines Servos ausmacht. Daher schließe ich mich der Empfehlung von Pat an.

Die Links stellen keine Kaufempfehlung dar!

Ich könnte nie so eine Maschine bauen, da die zu sortierenden Teile viel zu schnell in meinen Magen sortiert würden :grinning:

Erst einmal vielen Dank an alle für die hilfreichen Tipps!

Ich versuche mal eure Hinweise zusammenzufassen:
Zum Anfang wird einmalig mittels Schalters (Hall, mechanisch, irgendetwas anderes) eine 0-Stellung angefahren. Von da ab werden je nach detektierter Farbe die verschiedenen Positionen relativ zueinander angefahren.
Als Farbsensor habe ich den hier ausgesucht. Den versuche ich so gut es geht einzukapseln, um den Einfluss von Fremdlicht gering zu halten.

Ob eine Drehrichtungsänderung nötig ist, bekomme ich wahrscheinlich über eine Subtraktion von ist- und soll-Position heraus --> wenn Vorzeichenänderung, dann Drehrichtungsänderung. Wahrscheinlich gibt es ab auch hier elegantere Lösungen, glaub aber, dass es die ganzen Libraries genauso machen ;).

Eine Frage habe ich noch:
Muss ich, wenn ich z.B. das Motorshield von Adafruit nehme, zwangsweise die dazugehörige Adafruit-Library nehmen?
Soweit ich es verstanden habe, ist es mit der Adafruit-Library nicht möglich, Positionen mit einem Stepper anzufahren, ohne den ganzen Code zu blockieren (der Code wird erst weiter abgearbeitet, wenn die Position erreicht ist).
In der Library AccelStepper.h hingegen gibt es - in der Hoffnung es richt gedeutet zu haben - mit den Funktion distanceToGo() oder targetPosition() eine Positionsansteuerung ohne den ganzen Code zu blockieren. Oder liege ich da falsch? Der Hintergrund der Frage ist, dass ein Adafruit-Motorshield evtl. umsonst bekommen könnte.
Welches Motorshield wäre denn gegebenenfalls mit der AccelStepper.h kompatibel? (vielleicht ne saublöde Frage :wink: )

Vielen Dank agmue für die Links! Die werde ich mir mal demnächst anschauen.

Ich könnte nie so eine Maschine bauen, da die zu sortierenden Teile viel zu schnell in meinen Magen sortiert würden :grinning:

Mein Sohn freut sich auch schon auf die Testphasen. Vielleicht schwenke ich noch auf einen Heidel- Preiselbeerensortierer um ;).

Achso! Mir ist noch eingefallen, dass fünf Behälter zum Auffangen gar nicht reichen...brauche ja noch einen für Fehlmessungen :wink:

Vielen Dank nochmal und Gruß!

nescius:
Muss ich, wenn ich z.B. das Motorshield von Adafruit nehme, zwangsweise die dazugehörige Adafruit-Library nehmen?

Möglich ist es natürlich, der Schaltplan und die Bauteile sind bekannt, für einen „fortgeschrittener Noob" dürfte es nach meiner Einschätzung aber eine Herausforderung sein. "Papa nerv' nicht, ich kann die M&Ms nicht mehr ausstehen!" wäre blöd.

Alle am Shield angeschlossenen Motoren müssen übrigens mit der selben Spannung arbeiten!

Hallo agmue,
nein, eine Library im schlimmsten Fall anzupassen oder Hardware drumherumzubauen ist mir eindeutig zu hoch.
Erst einmal kleine Brötchen backen und das ganze auf Teilfunktionen mit "vorgefertigten" Komponenten herunterbrechen. Dann wird es eben, wenn wir beim Ansteuern der Stepper angekommen sind, das Shield von Sparkfun werden
Danke auch für den Tipp mit der Spannung!

Damit es zum "Papa nerv nicht" erst kommt, werde ich wohl die einzelnen Basteletappen vorbereiten müssen damit kein Frust entsteht :wink:

Habe mir auch dein Beispiel mit dem Kran angeschaut... Ein bisschen Gehirnschmalz muss ich noch hineinstecken, um ihn komplett zu verstehen :wink: Trotzdem konnte ich schon einiges für mein Vorhaben herausziehen.

Danke nochmal und Gruß!

nescius:
Eine Frage habe ich noch:
Muss ich, wenn ich z.B. das Motorshield von Adafruit nehme, zwangsweise die dazugehörige Adafruit-Library nehmen?
Soweit ich es verstanden habe, ist es mit der Adafruit-Library nicht möglich, Positionen mit einem Stepper anzufahren, ohne den ganzen Code zu blockieren (der Code wird erst weiter abgearbeitet, wenn die Position erreicht ist).
In der Library AccelStepper.h hingegen gibt es - in der Hoffnung es richt gedeutet zu haben - mit den Funktion distanceToGo() oder targetPosition() eine Positionsansteuerung ohne den ganzen Code zu blockieren. Oder liege ich da falsch? Der Hintergrund der Frage ist, dass ein Adafruit-Motorshield evtl. umsonst bekommen könnte.
Welches Motorshield wäre denn gegebenenfalls mit der AccelStepper.h kompatibel? (vielleicht ne saublöde Frage :wink: )

Hi,
ich bastle gerade mit dem Shield und den genannten Libraries rum. AccelStepper ist dein Freund, schau dir einfach mal
die Beispiel-Sketche an, da wird recht gut beschrieben wie man nichtblockierend steppen kann.
Kurz:
Neue Position definieren (move/moveto) dann in einer Schleife (zb loop()) run() so lange aufrufen,
bis distancetogo() == 0 , dann bist du da wo du hinwolltest .... zwischendurch erledigst du andere Dinge .. ;D
Grüße
Harry

Hallo Harry,
das von Fabian verlinkte "Adafruit Motor/Stepper/Servo Shield for Arduino v2 Kit - v2.3" verwendet den I2C-Bus zur Kommunikation. Nach meiner Einschätzung kann AccelStepper das nicht, oder?

Meinst Du "Adafruit Motor/Stepper/Servo Shield for Arduino kit - v1.2"?

agmue:
Hallo Harry,
das von Fabian verlinkte "Adafruit Motor/Stepper/Servo Shield for Arduino v2 Kit - v2.3" verwendet den I2C-Bus zur Kommunikation. Nach meiner Einschätzung kann AccelStepper das nicht, oder?

Meinst Du "Adafruit Motor/Stepper/Servo Shield for Arduino kit - v1.2"?

Ich habe v2, bei mir geht es ;D.

Schau dir "Accel_MultiStepper" bei den "Adafruit Library v2" - Beispielen an.

Gekauft habe ich das Shield genau wegen dem I2C-Bus.

Grüße

Harry

HarryR:
Schau dir "Accel_MultiStepper" bei den "Adafruit Library v2" - Beispielen an.

#include <AccelStepper.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"

Das sieht gut aus! Danke, habe was gelernt :slight_smile:

Fabian, wenn die gleiche Spannung kein Problem ist, greif zu!

agmue:

#include <AccelStepper.h>

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"



Das sieht gut aus! Danke, habe was gelernt :) 

Fabian, wenn die gleiche Spannung kein Problem ist, greif zu!

Was meinst du mit "gleiche Spannung" ?

Krieg' ich jetzt einen Karmapunkt :grin:

Mal nebenbei, werden die Karmapunkte hier sehr ernst genommen ?

Grüßle

Harry

HarryR:
Krieg' ich jetzt einen Karmapunkt :grin:

Na klar!

HarryR:
Was meinst du mit "gleiche Spannung" ?

Beide Stepper müssen mit derselben Spannung angesteuert werden. Zumindest sehe ich nur eine Spannungsversorgung auf dem Shield. Oder?

PS.: Wir hatten gerade Spannungsausfall ...

agmue:
Na klar!
Beide Stepper müssen mit derselben Spannung angesteuert werden. Zumindest sehe ich nur eine Spannungsversorgung auf dem Shield. Oder?

PS.: Wir hatten gerade Spannungsausfall ...

Stimmt, eine Spannungsversorgung für das Shield, das Shield kann aber auch den Arduino mitversorgen.
Ich betreibe einen 12V-Motor und einen 5V Stepper. Der Stepper hat Vorwiderstände bekommen die auf 5V runterteilen und die Wohnung ein wenig beheizen ...

Ich hatte das so verstanden, daß der Themensteller noch keine Stepper gekauft hat. Dann sollte er zwei Motoren mit gleicher Spannung erwerben, damit die M&Ms nicht schmelzen. Wobei die Spannung im Bereich der für das Shield zulässigen Spannung sein muß: "Can run motors on 4.5VDC to 13.5VDC"

agmue:
Ich hatte das so verstanden, daß der Themensteller noch keine Stepper gekauft hat. Dann sollte er zwei Motoren mit gleicher Spannung erwerben, damit die M&Ms nicht schmelzen. Wobei die Spannung im Bereich der für das Shield zulässigen Spannung sein muß: "Can run motors on 4.5VDC to 13.5VDC"

Hi again,

ja klar, das mit der Spannung sollte jedem potentiellem Käufer bewusst sein.

Mein Widerstands-Workaround geht auch nur deshalb, weil ich den Stepper maximal 20 Min am Stück
arbeiten lassen, danach kann sowohl der Stepper als auch die (Last-)Widerstände erst mal auskühlen,
denn beides wird reichlich warm.

Grüßle

PS. Die M&M's werden nur innerlich schmelzen ich denke die Zuckerumhüllung wird
die Betriebswärme überstehen :smiling_imp:

Hallo in die Runde,
sorry, dass ich mich so spät bei euch für die guten Hinweise und Tipps bedanke.
Ich bin momentan "außer Gefecht" :wink:

Das von euch Geschriebene hat mir sehr geholfen und hoffe nun, dass beim Inbetriebnehmen der Steppers die Anzahl an Programmier- und Verständniskatastrophen nicht mehr allzu hoch ausfällt :wink:

Vielen Dank und Gruß,
Fabian