Au weia, kommt Ostern dieses Jahr plötzlich. Dabei sind die Regale im Supermarkt seit Wochen voll mit Leckereien. Jetzt noch schnell mit einigen Elektronik-Bauteilen und im Haushalt vorhandenen Sachen etwas vorbereiten, damit wir die (Enkel-)Kinder insbesondere bei schlechtem Wetter sinnvoll beschäftigen und diese dabei auch noch kreativ sein können.
Die Idee
Mit einem Steppermotor, z.B. vom Typ 28BYJ-48 (5V), eine kleine Drehscheibe basteln, auf der unsere Frühstückseier zum Bemalen rotieren. Zwei Drehrichtungen, zwei Geschwindigkeiten, auf Knopfdruck jeweils zwei Umdrehungen, damit man genügend Zeit hat, den Pinsel anzusetzen. Los geht’s.
Hardware
1 |
||
1 |
||
1 |
||
oder 1 |
||
4 |
Taster/Buttons, Jumperkabel |
|
1 |
Drehscheibe? |
= Ausrangierte CD/DVD |
Den o.g. Stepper Motor hatte ich noch in meiner Bastlerkiste. Da dieser nicht im Sortiment von AZ-Delivery vertreten ist, verweist der Link auf Amazon. Andere langsam drehende (Getriebe-)Motoren funktionieren sicherlich genauso gut. Die erste Hürde war die Verbindung zwischen der Welle des Motors und der Drehscheibe. Hier habe ich ein kleines Plastikteil gefunden, das ich zunächst zentriert auf die CD geklebt und dann auf die Welle gesteckt habe.
Die Schaltung ist schnell erledigt. Der eigentliche Motor mit seinen fünf Anschlüssen kommt mit einer kleinen Platine, auf der sich ein IC vom Typ ULN2003A sowie vier LEDs und einige Pins befinden. Die mit IN1 bis IN4 bezeichneten Pins schließen wir mit Jumperkabeln (female-male) an die Pins 8 bis 11 des Mikrocontrollers. Die vier Taster schließe ich später an. Zunächst möchte ich einen geeigneten Sketch finden, damit der Motor im Uhrzeigersinn (cw=clockwise) und entgegen dem Uhrzeigersinn (ccw=counter-clockwise) drehen kann. Bei unserem Mikrocontroller können wir ausnahmsweise den Motor an den 5V- und GND-Anschluss direkt anschließen. Normalerweise benötigen Verbraucher wie Motoren, Servos und Relais eine externe Spannungsversorgung.
Die Programmierung
In der Arduino-IDE gibt es eine Programm-Bibliothek mit Namen Stepper.h, die vier Beispiele mitliefert.
Als erstes probiere ich stepper_speedControl aus, bei dem man mit einem Poti an A0 die Drehzahl steuern kann. Die gute Nachricht: Mein Stepper-Motor dreht sich. Die schlechte: Es gibt Drehzahlbereiche, in denen sich der Motor „ungesund“ anhört. Auch die anderen Beispiele funktionieren nur „halb-halb“. Mein Motor dreht immer in die gleiche Richtung, egal welche vorgegeben wurde. Ich wähle die Benutzung der Bibliothek Stepper ab und entscheide mich für die Suche nach einem Sketch in meinem Archiv aus der Zeit, als es die Programmbibliothek noch nicht gab. Denn so ganz schwierig ist das Selberprogrammieren eines Stepper-Motors nicht. Grund genug, sich die Funktionsweise in Erinnerung zu rufen.
Haben Sie bei den fünf Anschlüssen des Motors schon die Stirn gerunzelt? Ein einfacher Gleichstrom-Motor kommt mit zwei Anschlüssen aus. Mit Pulsweitenmodulation (PWM) steuern wir die Drehzahl und mit einer H-Brücke können wir umpolen, um die Drehrichtung zu ändern. Jetzt also fünf Kabel zum IC ULN2003. Der Stepper Motor hat zwei Spulen mit einem fünften Anschluss in der Mitte der beiden Spulen. Je nach Polarität sind so die zwei Drehrichtungen und -geschwindigkeiten möglich. Ein Schrittmotor ist somit ein Synchronmotor, bei dem der Rotor durch ein gesteuertes, schrittweise rotierendes, elektromagnetisches Feld der Spulen um einen kleinen Winkel (Schritt) gedreht werden kann. Es bedarf dazu nur einer gewissen Abfolge beim Ein- und Ausschalten der Spannungen an den Spulen. Anstelle von PWM applizieren wir einzelne Pulse auf die Spulen. Die Abfolge dieser Pulse legen wir in selbstdefinierten Funktionen fest. Bei dem nachfolgenden Beispiel-Sketch dreht der Motor jeweils einen Vollkreis mit drei Sekunden Pause.
/* Step Motor 28BYJ-48 * https://create.arduino.cc/projecthub/debanshudas23/getting-started-with-stepper-motor-28byj-48-3de8c9 */ #define A 8 #define B 9 #define C 10 #define D 11 int DELAY = 2; #define NUMBER_OF_STEPS_PER_REV 512 void setup(){ pinMode(A,OUTPUT); pinMode(B,OUTPUT); pinMode(C,OUTPUT); pinMode(D,OUTPUT); } void write(int a,int b,int c,int d){ digitalWrite(A,a); digitalWrite(B,b); digitalWrite(C,c); digitalWrite(D,d); } void stepcw(){ write(1,0,0,0); delay(DELAY); write(1,1,0,0); delay(DELAY); write(0,1,0,0); delay(DELAY); write(0,1,1,0); delay(DELAY); write(0,0,1,0); delay(DELAY); write(0,0,1,1); delay(DELAY); write(0,0,0,1); delay(DELAY); write(1,0,0,1); delay(DELAY); } void stepccw(){ write(1,0,0,1); delay(DELAY); write(0,0,0,1); delay(DELAY); write(0,0,1,1); delay(DELAY); write(0,0,1,0); delay(DELAY); write(0,1,1,0); delay(DELAY); write(0,1,0,0); delay(DELAY); write(1,1,0,0); delay(DELAY); write(1,0,0,0); delay(DELAY); } void step2cw(){ write(1,0,0,0); delay(DELAY); write(0,1,0,0); delay(DELAY); write(0,0,1,0); delay(DELAY); write(0,0,0,1); delay(DELAY); } void step2ccw(){ write(0,0,0,1); delay(DELAY); write(0,0,1,0); delay(DELAY); write(0,1,0,0); delay(DELAY); write(1,0,0,0); delay(DELAY); } void loop(){ int i; i=0; while(i<NUMBER_OF_STEPS_PER_REV){ stepcw(); i++; } delay(3000); while(i>0){ stepccw(); i--; } delay(3000); }
Nachdem wir mit den selbstdefinierten Funktionen stepcw(), stepccw(), step2cw() und step2ccw() die Grundlagen für unsere Anwendung gefunden haben, bedarf es nur einer Anpassung des Hauptprogramms. Wie oben erwähnt, soll der Motor auf Tastendruck links oder rechts, schnell oder langsam, jeweils zwei voll Umdrehungen machen.
Deshalb ergänzen wir vier Taster in unserer Schaltung, die wir als INPUT_PULLUP definieren und gegen Ground schalten. Pins 4 bis 7 sind noch frei. Wir ergänzen:
#define cw=4 #define cw2=5 #define ccw2=6 #define ccw=7 // Ergänzung void setup() pinMode(cw,INPUT_PULLUP); pinMode(ccw,INPUT_PULLUP); pinMode(cw2,INPUT_PULLUP); pinMode(ccw2,INPUT_PULLUP); // Hauptprogramm void loop(){ if (digitalRead(cw)==LOW) { Serial.println("cw"); i=0; while(i<2*NUMBER_OF_STEPS_PER_REV){ stepcw(); i++; } } else if (digitalRead(ccw)==LOW) { Serial.println("ccw"); i=2*NUMBER_OF_STEPS_PER_REV; while(i>0){ stepccw(); i--; } } else if (digitalRead(cw2)==LOW) { Serial.println("cw2"); i=0; while(i<2*NUMBER_OF_STEPS_PER_REV){ step2cw(); i++; } } else if (digitalRead(ccw2)==LOW) { Serial.println("ccw2"); i=2*NUMBER_OF_STEPS_PER_REV; while(i>0){ step2ccw(); i--; } } }
Hier der vollständige Sketch zum Download und ein Foto des Versuchsaufbaus.
Viel Spaß beim Nachbauen und Bemalen der Ostereier.
Frohe Ostern.
P.S.: schauen Sie auch gern nochmal in das Osterprojekt aus dem vergangenen Jahr
1 commento
Keppler, Thomas
Hallo miteinander,
schönes Beispiel für die Ansteuerung eines Schrittmotores. Mir gefiel nicht, daß nach den (2) Umdrehungen der Motor weiterhin auf einer Phase mit Strom versorgt wurde. Daher habe ich eine kleine Ergänzung des Loop-Teiles vorgenommen. Dadurch wird nach den Umdrehungen der Schrittmotor stromlos geschaltet:
else if (digitalRead(ccw)==LOW) { Serial.println(“ccw”); i=2*NUMBER_OF_STEPS_PER_REV; while(i>0){ stepccw(); i—; } write(0,0,0,0); } else if (digitalRead(cw2)==LOW) { Serial.println(“cw2”); i=0; while(i<2*NUMBER_OF_STEPS_PER_REV){ step2cw(); i++; } write(0,0,0,0); } else if (digitalRead(ccw2)==LOW) { Serial.println(“ccw2”); i=2*NUMBER_OF_STEPS_PER_REV; while(i>0){ step2ccw(); i—; } write(0,0,0,0); }void loop(){
if (digitalRead(cw)==LOW) {
Serial.println(“cw”);
i=0;
while(i<2*NUMBER_OF_STEPS_PER_REV){
stepcw();
i++;
}
write(0,0,0,0);
}
}