Heute geht es um das Ansteuern eines Schrittmotors über den Arduino mit dem Treiberboard A4988. Das Treiberboard A4988 zählt zu den meist verwendeten Boards, zudem sind Sie auch noch sehr günstig. Das Board hat viele Anschlüsse und ich möchte euch erklären wie man es Richtig anschließt.
Beschaltung
Der Kondensator muss nicht verbaut werden, dient aber zur Sicherheit vor Spannungsspitzen.
1A und 1B = 1. Spule des Motor
2A und 2B = 2. Spule des Motor
Mit den Kontakte MS1-3 kann die Schrittweite eingestellt werden, ob es ein Vollschritt, Halbschritt usw. ist, siehe Tabelle. Die Kontakte können entweder direkt mit 0V oder 5 Volt versorgt werden oder über den Arduino in Programm mit eingebunden werden.
M1 | M2 | M3 | Schrittweite |
---|---|---|---|
0 | 0 | 0 | 1 Vollschritt |
1 | 0 | 0 | 1/2 Halbschritt |
0 | 1 | 0 | 1/4 Viertelschritt |
1 | 1 | 0 | 1/8 Achtelschritt |
1 | 1 | 1 | 1/16 Sechzehntelschritt |
Funktion
Ich habe hier noch das Board MPR121 dazugenommen, dass Board ist ein 12 Tasten Kapazitiver Touchsensor, mit dem man über Berührung das Signal auf High schalten kann.
Ich habe die Sensoren wie folgt belegt:
1 = Schrittmotor 10 Umdrehung vorwärts
2 = Schrittmotor 10 Umdrehung rückwärts
3 = Schrittmotor 100 Umdrehung vorwärts
4 = Schrittmotor 100 Umdrehung rückwärts
5 = Schrittmotor 1000 Umdrehung vorwärts
6 = Schrittmotor 1000 Umdrehung rückwärts
7 = Schrittmotor 10000 Umdrehung vorwärts
8 = Schrittmotor 10000 Umdrehung rückwärts
Programmcode
#include <wire.h> #include "Adafruit_MPR121.h" Adafruit_MPR121 cap = Adafruit_MPR121(); uint16_t lasttouched = 0; uint16_t currtouched = 0; int Index; int touch; void setup() { Serial.begin(9600); if (!cap.begin(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } Serial.println("MPR121 found!"); pinMode(6, OUTPUT); //Enable pinMode(5, OUTPUT); //Step pinMode(4, OUTPUT); //Direction digitalWrite(6, LOW); } void loop() { currtouched = cap.touched(); for (uint8_t i = 0; i < 12; i++) { // it if *is* touched and *wasnt* touched before, alert! if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) { Serial.print(i); Serial.println(" touched"); touch = i; } } if (touch == 1) { digitalWrite(4, HIGH); for (Index = 0; Index < 10; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } if (touch == 2) { digitalWrite(4, LOW); for (Index = 0; Index < 10; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } if (touch == 3) { digitalWrite(4, HIGH); for (Index = 0; Index < 100; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } if (touch == 4) { digitalWrite(4, LOW); for (Index = 0; Index < 100; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } if (touch == 5) { digitalWrite(4, HIGH); for (Index = 0; Index < 1000; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } if (touch == 6) { digitalWrite(4, LOW); for (Index = 0; Index < 1000; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } if (touch == 7) { digitalWrite(4, HIGH); for (Index = 0; Index < 10000; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } if (touch == 8) { digitalWrite(4, LOW); for (Index = 0; Index < 10000; Index++) { digitalWrite(5, HIGH); delayMicroseconds(500); digitalWrite(5, LOW); delayMicroseconds(500); touch = 0; } } delay(100); }
1 Kommentar
Läuft der Programmcode auch über Arduino 1.8.13?