Blackpicker: Pick&Place-Automat aus Maker-Komponenten (Teil1)
Seite 4: Schrittmotorsteuerung
Die Idee war gut: Man nehme einen Arduino Mega mit CNC-Shield und benutze die berühmte Accelstepper-Lib. Es stellte sich aber schnell heraus, dass die geforderte Geschwindigkeit und der ruhige Lauf mit mind. Viertel-Microstepping den Mega schnell an den Anschlag bringt – zumal auch häufig mehrere Achsen gleichzeitig bewegt werden müssen. Mit einem Takt von 16Mhz kann er mit der Library nur ca. 4000 Steps/sek fahren, mit Tricks auch wenig mehr. Was dann in einer Verfahrgeschwindigkeit von ca. 10 cm/s endete. Die daraus resultierende Geschwindigkeit war nicht geeignet für die Sortieraufgabe. Ein Upgrade auf den Arduino Due versprach eine Leistungssteigerung um ca. 60% – das dann aber leider nur für eine Achse auf einmal. Daher musste etwas Schnelles her.
Leider hatte die Arduino Familie nicht viel im Angebot, so dass auf die ebenfalls günstigen Teensies ausgewichen werden musste. Beim ersten Test musste ich aber feststellen, dass die Accelstepper-Library auf dem Teensy nicht läuft. Der erste Schock stellte sich als ungerechtfertigt heraus, da "luni64" seine superschnelle TeensyStep-Library auf Github zur Verfügung stellt. Diese lief nach erfolglosen Versuchen auf dem Teensy 4.2 erst auf dem Teensy 3.6. Auch die TeensyStep-Lib hat ein objektorientiertes Interface und lässt sich leicht verwenden. Einzig bei der Implementierung einer Initialisierung mit Anfahren der Endschalter musste ein wenig nachgeforscht werden.
void init_XMotor(){
motor_X.setAcceleration(maxAccX); // steps/s^2
// XXXX
motor_X.setMaxSpeed(1500) ; // steps/s
motor_X.setTargetRel(-50000); // Set target position to 1000 steps from current position
controller.moveAsync(motor_X); // This will start the movement and return immediately
while(controller.isRunning()){ // wait until the movement is finished
if (digitalRead(EndSwitchPin_X) == HIGH){
controller.emergencyStop(); // stops the movement immediately
motor_X.setPosition(0);
}
}
motor_X.setMaxSpeed(maxSpeedX);
}
Arduino Code Listing zur Initialisierung der Endposition der X-Achse. Der Notfallstop ist ein bisschen hart, aber erfüllt die Anforderungen an Genauigkeit. Normalerweise würde man hier nochmals vor- und zurückfahren, um den genauen Nullpunkt zu finden.
Mit einer Taktfrequenz von 180 MHz konnte der Teensy 3.6 die Freunde der Geschwindigkeit ansprechen! Natürlich mussten auch die richtigen Motor-Treiber her, die die hohen Taktzahlen auch verarbeiten können. Mit dem TB6600 wurde ein einfach zu verwendender und günstiger Treiber gefunden. Die Treiber können maximal 20 kHz am Eingang verarbeiten und verarbeiten die 3.3V Signale des Teensy dank eingebauten Optokopplern wunderbar. Um eine weitere Steigerung der Geschwindigkeit zu erreichen, müsste nun neben dem Treiber wohl auch die Spannung von 24V erhöht werden und stärkere Motoren als die NEMA 17 eingesetzt werden, die die Leistung auch auf die Schiene bringen. Hier wäre ein Upgrade zu mindestens NEMA 23 angebracht gewesen. Für den Moment war das aber gut so. Nebenbei erwähnt wäre auch die Umsetzung mit einem Odrive und mit Encodern ausgestatteten BLDC-Motoren spannend gewesen, hätte aber auch eine ganz neue Welt mit vielen neuen Herausforderungen aufgetan und den zeitlichen Rahmen weiter gesprengt. Die Verdrahtung der Motoren und Treiber ist im Bild ersichtlich und folgt den gängigen Standards aus dem Internet.