Arduino – Boards, Treiber und Bibliotheken
Eingesetzte Boards, Vref am A4988 richtig einstellen, Schrittmotor-Testsketch und die offiziellen Nachschlagewerke
In mehreren Projekten steckt ein Arduino – als Uhrwerk, als Messstation, als Ansteuerung eines Schrittmotors. Hier stehen die Dinge, die ich beim nächsten Projekt wieder brauche.
Eingesetzte Boards
| Board | Wofür bei mir | Besonderheit |
|---|---|---|
| Mega 2560 Rev3 | Magnetuhr | 54 digitale Anschlüsse und vier serielle Schnittstellen – reichlich Reserve, dafür ohne Netzwerk |
| MKR WiFi 1010 | Cowa und ArduinoDashboard | WLAN an Bord und Anbindung an die Arduino IoT Cloud, klein genug für ein gedrucktes Gehäuse |
| GIGA R1 WiFi | Versuche | deutlich mehr Rechenleistung, zwei Kerne, für anspruchsvollere Aufgaben |
Schrittmotortreiber: den Strom einstellen
Der häufigste Anfängerfehler mit einem A4988 oder DRV8825 ist der Strom. Wird er zu hoch eingestellt, werden Treiber und Motor heiss; zu niedrig, und der Motor verliert unter Last Schritte – was man erst am verzogenen Werkstück bemerkt.
Eingestellt wird er nicht in Ampere, sondern als Spannung am kleinen Poti auf dem Board, gemessen zwischen Poti und Masse. Die Umrechnung:
Vref = 8 × I × Rsense| Grösse | Wert im Beispiel | Anmerkung |
|---|---|---|
| Motorstrom I | 0,5 A | Nennstrom des Motors, hier ein flacher Nema-Motor |
| Rsense | 0,068 Ω | Messwiderstand auf dem Treiberboard – je nach Hersteller unterschiedlich |
| Vref | 0,272 V | 8 × 0,5 × 0,068 |
Der Wert von Rsense ist der Haken. Verbreitet sind 0,05 Ω, 0,068 Ω und 0,1 Ω – man muss auf dem konkreten Board nachsehen, welche Widerstände verbaut sind. Wer die Formel mit dem falschen Wert rechnet, liegt um bis zu Faktor zwei daneben.
Gemessen wird bei eingeschalteter Logikspannung, aber stehendem Motor. Und ein Hinweis aus eigener Erfahrung: Den Treiber niemals bei anliegender Spannung vom Motor trennen – das quittieren die meisten Treiberbausteine dauerhaft.
Minimal-Sketch zum Testen
Bevor irgendeine Mechanik daran hängt, prüft dieser Sketch, ob Verkabelung und Stromeinstellung stimmen: 2000 Schritte in die eine Richtung, kurze Pause, 2000 zurück. Läuft der Motor ruhig und bleibt handwarm, passt es.
int stepCounter;
int steps = 2000;
void setup() {
pinMode(6, OUTPUT); // Enable
pinMode(5, OUTPUT); // Step
pinMode(4, OUTPUT); // Richtung
digitalWrite(6, LOW); // Treiber aktivieren
}
void loop() {
digitalWrite(4, HIGH); // im Uhrzeigersinn
for (stepCounter = 0; stepCounter < steps; stepCounter++) {
digitalWrite(5, HIGH);
delayMicroseconds(500);
digitalWrite(5, LOW);
delayMicroseconds(500);
}
delay(1000);
digitalWrite(4, LOW); // gegen den Uhrzeigersinn
for (stepCounter = 0; stepCounter < steps; stepCounter++) {
digitalWrite(5, HIGH);
delayMicroseconds(500);
digitalWrite(5, LOW);
delayMicroseconds(500);
}
delay(1000);
}Die drei Anschlüsse sind Enable, Step und Richtung. Enable ist invertiert: Ein niedriger Pegel schaltet den Treiber ein. Genau dieses Muster steckt auch in der Magnetuhr – dort wird der Treiber allerdings nur für die Dauer der Bewegung freigegeben und danach wieder abgeschaltet, damit der Motor im Wohnraum nicht dauerhaft sirrt.
Echtzeituhr DS3231
Ein Arduino allein weiss nicht, wie spät es ist, und seine Zeitmessung driftet spürbar. Das DS3231-Modul löst beides: Es hat einen temperaturkompensierten Quarz und eine Knopfzelle, läuft also auch ohne Versorgung weiter und behält die Zeit über Monate genau.
Angebunden wird es über I²C, also zwei Leitungen. Der übliche Ablauf: Uhrzeit einmalig setzen, danach nur noch auslesen – der Setzvorgang gehört auskommentiert, sonst stellt sich die Uhr bei jedem Neustart auf die einprogrammierte Zeit zurück.
Ein vollständiges Beispiel steht im Sketch der Magnetuhr, der genau so aufgebaut ist: Minute auslesen, mit der zuletzt gemerkten vergleichen, bei Änderung den Motor weiterdrehen.