Schrittmotor Automationssteuerung

Am Anfang stand ein Schrittmotor, der sich drehen solle – Ein alter Wunsch von mir. Dann kam die Idee, damit eine Linearachse anzutreiben und in regelmäßigen Abständen Bilder mit einer Kamera zu machen, was weniger gut funktioniert hat. Letztlich kamen mir zwischenzeitlich noch etliche andere Ideen, was man damit anstellen kann und könnte.

Das Projekt

Bitte beachten Sie, dass die Redaktion nicht alle hier veröffentlichten Gastbeiträge testen kann, sodass es keinerlei Gewähr gibt. Je nach Projekt und Schwierigkeitsgrad sollten Sie diese nur dann durchführen, wenn Sie über ausreichend Kenntnisse verfügen und sich im Umgang mit elektronischen Projekten sicher fühlen.

 

Geeignet für: Anfänger (Aufbau mit Arduino UNO und Steckbrett) und Fortgeschrittene (Erstellung einer Platine)

Zeitaufwand: je nach Erfahrung, ca. 4-8 Stunden

Das benötigen Sie: diverse Bauteile (siehe Stückliste) ,1x LCD Display 1×24 oder alternativ: 1x 2 x 16 Zeichen LCD Display

Das benötigen Sie außerdem: Für meine Platine habe ich diese Komponenten verwendet

Hinweis: Auf folgende Teile kann verzichtet werden, wenn ein fertiger Arduino UNO verwendet wird:

Der erste Aufbau

gehäuse-automatisierter-schrittmotorAngefangen habe ich mit dem Projekt, indem ich die einzelnen Elemente nach und nach auf einem Steckbrett aufgebaut habe und einen entsprechenden Arduino Code nach und nach erweitert habe. Am Anfang war es nur eine LED, die über Taster ein- und ausgeschaltet wurde.

Dazu muss man an den Pin 10 des Arduino UNO mit einem Vorwiderstand von 220 Ohm die LED anschließen. Andere Ports wären natürlich auch möglich, ich beziehe mich hier auf meine finale Schaltung. Die andere Seite der LED wird polrichtig mit GND verbunden.

Als nächstes wird der Taster mit GND verbunden. Der zweite Anschluss wird einmal über einen 22-KOhm-Widerstand mit 5V verbunden und außerdem über einen 10-KOhm-Widerstand mit dem A0 am Arduino verbunden. Zwischen diesem Eingang und GND wird noch ein 22nF Kondensator eingefügt.

Die Elemente dieser Schaltung haben verschiedene Funktionen. Durch die Verbindung zu 5V wird der Eingang immer zuverlässig auf einem Potential (HIGH) gehalten. Wird der Taster betätigt, ändert sich am Eingang das Potenzial auf LOW und ein Schaltsignal wird erkannt. Der Kondensator erhöht die zuverlässige Erkennung eines Signals – Stichwort Entprellen.

Die Programmierung

Hat man die Hardwareseite verkabelt, muss der sogenannte Sketch in der Arduino IDE geschrieben werden. Wir legen fest: wenn A0=LOW (Taster betätigt), dann leuchtet die LED.

#define InpTaster1 A0

 

Der Taster ist an A0 angeschlossen und heißt InpTaster.

#define OutLED1 10

 

Die LED ist an PIN 10 angeschlossen und heißt OutLED1.

int Taster1Status=1;

 

Der Status des Tasters wird im Vorfeld auf HIGH gesetzt.

void setup() {

 

Das was danach kommt, wird nur einmal beim Programmstart ausgeführt.

pinMode(InpTaster1, INPUT);

 

Der InpTaster wird als Eingang festgelegt.

pinMode(OutLED1, OUTPUT);

 

Die OutLED1 wird als Ausgang festgelegt.

}

 

Ende Setup

void loop( )  {

 

Das was danach kommt, wir ständig wiederholt.

if (digitalRead(InpTaster1)==LOW) {

 

Wenn der Taster Status LOW ist, dann…

digitalWrite(OutLED1,HIGH);

 

… soll die LED an sein

}

 

Die Kriterien der Bedingung werden beendet.

else{

 

Sollten die oberen Kriterien nicht erfüllt sein…

digitalWrite(OutLED1,LOW);

 

… dann soll die LED aus sein.

} }

 

Ende des else und Ende des Loops

Die Erweiterung der Schaltung

Nach demselben Schema habe ich dann noch zwei weitere Taster und eine weitere LED eingefügt. Die Taster habe ich an A1 und A2 angeschlossen die LED an 12. Im Sketch hab ich dann jeweils dasselbe eingefügt, nur eben die Zahlen geändert, also z.B.:

#define OutLED1 10

#define OutLED2 12

 

Anschließend versuchte ich, anstelle der LEDs den unipolaren Schrittmotor mittels Darlington Arrays Schritt für Schritt anzusteuern. Das hat nur teilweise funktioniert: sie hielten nur sehr kleine Sröme, rauchten zum Teil ab und verbrauchten relativ viele Ausgänge. Eine andere Lösung musste her.

Mit einem Schrittmotor-Treiber wurde die Handhabung deutlich einfacher. Wenngleich man auch hier vorsichtig sein muss, um sie nicht zu zerstören. Man sollte nie eine Motorphase während des Betriebs abstöpseln. Ich habe mit dem Alegro4988 Chip einen der typischen 3D-Drucker-Treiber gewählt.

Den Motor-Strom einstellen ist ein wenig fummelig, es gibt aber gute Tutorials dazu.

Diesen Schrittmotortreiber muss man aber mit einer höheren Spannung und mit mehr Leistung versorgen, daher ein 12V-Netzteil mit bis zu 2A Ausgangsstrom. Minus vom Netzteil muss mit GND verbunden werden. Die einzigen beiden Anschlüsse, welche ich mit dem Arduino verbunden habe, sind DIR (an Arduino PIN 7) und STEP (an PIN 8). Alle anderen sind entweder mit 5V, GND, 12V oder dem Schrittmotor verbunden. Wichtig ist es, die empfohlenen Kondensatoren einzubauen.

Nun also über den Taster den Motor linksherum drehen lassen, solange der Taster betätigt wird. Nach demselben Prinzip könnte man über den zweiten Taster den Motor in die andere Richtung drehen lassen. Zunächst müssen stepp und dir analog zur LED definiert und ebenso als OUTPUT festgelegt werden, dann folgen die Bedingungen für die Aktionen:

if (digitalRead(InpTaster1)==LOW) {

 

Wenn Taster 1 betätigt ist…

while (digitalRead(InpTaster1)==LOW) {

 

… solange der Taster 1 betätigt bleibt…

digitalWrite(dir, HIGH) ;

 

… setzt die Dreh-Richtung HIGH/LOW. Was Rechts- und Links-Drehung bedeutet, hängt vom Anschluss des Motors ab.

digitalWrite(stepp, HIGH) ;

digitalWrite(stepp,HIGH);

Triggert einen Schritt bzw. Mikroschritt.

digitalWrite(stepp, LOW) ;

 

Zurücksetzten als Vorbereitung für nächsten Trigger.

delay (1) ;

 

Warte eine Millisekunde.

} } }

Das Ganze wird fortgesetzt, daher dreht der Motor.

Die automatische Steuerung der Drehrichtung

Um noch einen Schritt weiterzugehen, habe ich das Ganze so umprogrammiert, dass der Motor auf Tastendruck eine bestimmte Rotation gemacht hat. Aber jedes mal den Sketch ändern, wenn sich der Drehwinkel ändern soll? Das muss flexibler werden. Also habe ich mich eingelesen, wie man einen Poti-Wert am analogen Eingang ausliest und über den seriellen Monitor zur Kontrolle am Bildschirm ausgibt.

Dazu zunächst drei Potis verkabeln. Der Schleiferkontakt wird jeweils mit einem Analog-Eingang verbunden (A3-A5). Die jeweils verbleibenden Pins werden an GND und 5V angeschlossen.

Im Sketch werden exemplarisch am Abstands-Poti folgende Zeilen eingefügt:

const int AbstandPotiPin = A5 ;

 

Im Anfangsteil wird der entsprechende Pin zugeordnet.

int Abstand=0 ;

 

Abstand festlegen.

int AbstandPoti=0 ;

 

Gelesener Wert des Potis.

int AbstandPotiMap;

 

Mit dem Mapper umgerechneter Wert des Poti zur Festlegung der Abstände.

void setup( )  {

   Serial.begin (9600);

 

Initialisieren der seriellen Komunikation mit 9600 bps.

void loop ( ) {

 

AbstandPoti= analogRead(AbstandPotiPin) ;

 

Zunächst ermittelt der Mikrocontroller die Spannung welche am Analogen Eingang anliegt. Dabei wird die Spannung zwischen 0 und ca. 5V in Werten von 0-1023 eingeteilt.

AbstandPotiMap=map(AbstandPoti,0,1023,0,99) ;

 

Diese Werte werden jetzt umgerechnet auf Werte von 0-99, wobei 99 eben immer noch ca. 5V entspricht. Vorteil des Ganzen ist, dass der ermittelte Wert deutlich stabiler und einfacher mit dem Poti einstellbar ist.

Serial.print(„Abstand = „) ;

Serial.print(AbstandPotiMap) ;

 

Auf dem Seriellen Monitor wird „Abstand =“ angezeigt. Dahinter wird der aktuelle Potiwert als Zahl zwischen 0 und 99 ausgegeben.

Die Einträge mit Serial… ermöglichen es, über den seriellen Monitor in der Arduino IDE die aktuellen Poti-Werte auszulesen. Im nächsten Schritt soll sich der Motor entsprechend des Poti-Wertes drehen.

if (digitalRead(InpTaster1)==LOW)  {

 

Wenn der Taster1 betätigt wird, dann dreht der Motor so lange, bis der Abstand erreicht ist.

while(Abstand<AbstandPotiMap*16)  {

 

Über den Faktor (hier 16) werden die Schritte in den entsprechenden Vortrieb umgerechnet.

digitalWrite(dir, LOW) ;

 

Vorgabe der Drehrichtung.

digitalWrite(stepp,HIGH) ;

 

Triggert einen Schritt bzw. Mikroschritt.

delay(1) ;

 

Warte eine Millisekunde.

digitalWrite(stepp, LOW) ;

 

Zurücksetzten als Vorbereitung für den nächsten Trigger.

delay(1) ;

 

Warte eine Millisekunde.

Bildabstand++;

}}

 

Die Variable Bildabstand wird um einen Punkt erhöht, bis der Potiwert *16 erreicht ist, dann stoppt der Motor. Die geschwungenen Klammern definieren die Zugehörigkeiten der Programmteile und sind sehr wichtig.

Funktioniert der Programmteil richtig hat der  Motor die gewünschte Strecke zurückgelegt.

Die beiden anderen Potis werden nach demselben Schema hinzufügt. Einen für die Anzahl der Wiederholungen der Rotation und einen für die Pausenzeit zwischen den Bewegungen. Durch den Poti für die Pausezeiten bekommt man flexibel Zeit für eine Aktion zwischen den Bewegungen. Das war bei mir nötig. Ich hatte eine Infrarot-LED hinzugefügt, welche meine Kamera in den Bewegungspausen ausgelöst hat. Dabei hatte ich festgestellt, dass je nachdem wie viele Bilder die Kamera hinter einander machte, sie entsprechend längere Pausen zum Speichern brauchte.

Anschluss eines LCD-Displays

Kann man statt dem Monitor auch was anderes zur Anzeige der Werte nehmen? Ich kramte ein altes LCD Display hervor. Mit etwas herumprobieren, Datenblatt des Chips lesen und unter Zuhilfenahme der guten Internetseite ließ sich die Pinbelegung herausfinden und die Ansteuerung gelang nach und nach.

Hat man ein Display mit Datenblatt, ist das erheblich einfacher. Zur einfacheren Einbindung des Display habe ich im Sketch eine „Library“ verwendet die sich um die Ansteuerung kümmert:

#include <LiquidCrystal.h>

 

Damit wird die Library am Programm Anfang eingefügt.

LiquidCrystal lcd(2,9,11,13,3,4) ;

 

Initialisiert die Library mit den Anschluss-Pins, welche ich verwendet habe.

Beispiele für die Programmierung finden sich zwischenzeitlich in der Arduino IDE ab spätestens 1.8.2. oder z.B. hier.

Bau der Platine

Endlich funktionierte das Ganze mittels Arduino UNO und Steckbrett so, wie ich mir das vorstellte. Da kam die Überlegung auf, das Ganze auf einer Platine zu vereinigen und diese selbst zu fräsen. Zumal so ein Aufbau bestehend aus einem Arduino und Steckbrett relativ unhandlich und wenig mobil ist.

Den Schaltplan für die Platine hatte ich zunächst mit Eagle begonnen und dann mit Target3001! fertig gestellt. Letzteres passte besser zu meiner Fräsmaschine. Das Layout ist sicherlich nicht besonders toll und mitunter dem Ehrgeiz geschuldet, die Platine mit meiner Fräse (ziemlich klein) zu erstellen.

Leider hat nach dem Bestücken zunächst nichts funktioniert. Den Bootloader hatte ich zuvor auf dem Steckbrett auf den Atmega gebrannt. Atmega auf die Platine und dann das Programm drauf, aber das ging schon nicht mehr.

Was nun? Der erste Aufbau auf dem Steckbrett war längst nicht mehr da. Ich habe die Platine nochmal gründlich unter die Lupe genommen, durchgemessen und diverse Schaltpläne im Internet studiert und mit meinem verglichen. Ein paar Fehler hatte ich gefunden, aber noch immer nicht alle.

Auch wenn es wieder einiges an Zeit braucht, die Mühe die Kernelemente nochmals auf das Steckbrett zu bringen, hat sich letztlich gelohnt. Nach und nach ließen sich so die Fehler finden. Zum Teil waren Leiterbahnen falsch oder ein Widerstand drin, der da nichts zu suchen hatte. Oder es hatte schlicht damit zu tun, dass ich beim Erstellen der Platine die Pinbelegung verändert hatte, um Platz zu sparen. Gleichzeitig war aber der Code noch für die alte Belegung geschrieben.

Ich schreibe das hier so ausführlich, um eine kleine Anregungen für Fehlersuchen zu geben. Ein hilfreiches Utensil beim Fehlersuchen war der USB-to-Seriell-Adapter. Mittels diesem und der Arduino IDE konnte ich den seriellen Monitor aufrufen und war etwas mehr im Bilde, was da ablief. So konnte ich feststellen, dass die Analogwerte der Potis richtig waren, aber in der Weiterverarbeitung sich ein Fehler eingeschlichen hat.

Man muss aber, um den seriellen Monitor verwenden zu können, keinen speziellen seriellen Adapter verwenden. Man kann auch aus einem Arduino UNO den Atmega herauslösen und nun den Arduino zum Programmieren der Platine und Auslesen der seriellen Schnittstelle verwenden. Wie das geht, wird auf der bereits erwähnten arduino.cc Seite beschrieben.

Titelbild: Autor

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.