Eins der wichtigsten Module eines Roboters, ist ein Motortreiber. Da der Mikrocontroller nur 20mA pro Ausgang liefern kann, benötigt man einen Treiber, der den Strom direkt von den Batterien/Akkus, zum Motor leiten kann.
Ich habe eine Zeit lang, den L293D Motortreiber IC verwendet und seit nicht so langer Zeit, ist der DRV8835 Motortreiber von Polou, ein meiner Favoriten. Den DRV8835 habe ich bereits bei meinen Robotern Follower und 8259 Lego Roboter eingesetzt.
(Bildquelle: http://pololu.com)
Die kleine Platine des Treibers hat 14 Anschlüsse und davon zwei Kanäle (Channels), A und B.
An VCC für die Logik, kann eine Spannung zwischen 2V und 7V angeschlossen werden. An Vin eine Spannung zwischen 2V und 11V.
Ein Motor wird an AOUT1 und AOUT2 angeschlossen und der zweite Motor, wird an BOUT1 und BOUT2 angeschlossen.
Wenn man den MODE unbelegt lässt, wird der Motortreiber im erweiterten Modus betrieben, allerdings ist die Programmierung dann etwas komplizierter. Deswegen wir dieser Anschluß über einen 1kOhm Pull-Up Widerstand, an Vcc angeschlossen.
Jeder Channel hat zwei Steuerpins: ENABLE und PHASE. Je nach Kanal, steht noch ein A oder B davor.
Mit dem Signal an Pin APHASE wird die Drehrichtung des Motors an Kanal A bestimmt. Bei HIGH Signal dreht der Motor in eine Richtung und bei LOW Signal in die andere. Ohne die ENABLE Anschlüsse bzw. Signale, würden die Motoren ständig in die eine oder ander Richtung drehen und der Roboter würde nie stehen bleiben können. Also kann man LOW Pegel an AENABLE den Channel A deaktivieren. So bleibt der Motor stehen.
ENABLE | Phase | Motor |
HIGH | HIGH | Motor dreht in die eine Richtung |
HIGH | LOW | Motor dreht in die andere Richtung |
LOW | HIGH/LOW | Motor bleibt stehen |
Fritzing-Schaltplan
Da Bilder mehr als tausend Worte sagen, habe ich eine Skizze in Fritzing gezeichnet und da es den Motortreiber in der Fritzing’s Bibliothek nicht gab, den Treiber nachträglich in Paint eingezeichnet.
Pinbelegung
VIN | Pluspol der Batterie und Vin am Arduino |
VCC | 5V am Arduino |
VMM | Nicht verbunden |
GND | GND |
AOUT1 | Erster Anschluss Motor A |
AOUT2 | Zweiter Anschluss Motor A |
BOUT1 | Erster Anschluss Motor B |
BOUT2 | Zweiter Anschluss Motor B |
APHASE | Digital Pin 2 am Arduino |
AENABLE | Digital Pin 3 am Arduino |
BPHASE | Digital Pin 4 am Arduino |
BENABLE | Digital Pin 5 am Arduino |
MODE | Über 1k Widerstand an VCC |
Programmierung
Wir fangen ersmal damit an, dass wir ein Motor nur ein und ausschalten, dann nehmen wir den zweiten Motor dazu. Danach werden wir die Drehzahl der Motoren verringern/ehöhen. Es ist empfehlenwert, dass man vorher ein paar kleine Tutorials mit Arduino abgeschlossen hat. Zumindest das Blink-Programmm 😉
Die Beschreibung de Programms bzw. der einzzelnen Anweisungen, kann man den Kommentaren, hinter einzelnen Befehlen entnehmen.
Vor jedem Wechsel der Drehrichtung, wird der Kanal erstmal abgeschaltet. Das zwar nicht bei allen Treibern notwendig, allerdings ist es empfehlenswert, sich diese Abschaltung vor Richtungswechsel und das wieder Einschalten danach, anzugewöhnen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
int aPhase = 2; //Pin APHASE des Motortreibers an digital Pin 2 vom Arduino int aEnable = 3; //Pin AENABLE des Motortreibers an digital Pin 3 vom Arduino // Setup wird nur ein Mal beim Start des Controllers ausgeführt void setup(){ //beiden Pins als Ausgang definieren pinMode(aPhase, OUTPUT); pinMode(aEnable, OUTPUT); } //Endlose Schleife void loop(){ digitalWrite(aEnable, LOW); //Kanal A deaktivieren digitalWrite(aPhase, HIGH); //Richtung A digitalWrite(aEnable, HIGH); //Kanal A aktivieren delay(1000); //1 Sekunde Pause (1000ms) digitalWrite(aEnable, LOW); //Kanal A deaktivieren digitalWrite(aPhase, LOW); //Richtung B digitalWrite(aEnable, HIGH); //Kanal A aktivieren delay(1000); //1 Sekunde Pause (1000ms) } |
Worin liegt der Unterschied zu den Servo/Motor Shields I’m Vergleich zu Motor Treiber? Ich Programmierung ist doch die selbe, also woran dann? Danke vorab
Die Programmierung ist nicht immer dieselbe. Es kommt aber oft vor, dass die Ansteuerung identisch bzw. ähnlich ist.
Andere Unterschiede liegen eigentlich auf der Hand. Z.B. Preis, Leistung, Größe etc.
Hallo,
ich habe diese interessante Schaltung gefunden, war aber eigentlich auf der Suche nach einer Fritzingdatei xxx.fzpz des DRV8835-Motortreibers.
Scheinbar hast du auch keine gefunden und dir selber eine erstellt.
Könntest du mir diese zuschicken, dann könnte ich die auch in meiner Schaltung benutzen.
Wenn ich dann mal eine „richtige“ Datei finde, würde ich dir diese auch schicken.
Vielen Dank im Voraus.
Gruß
Michael
Hi,
Ich habe damals kein neues Bauteil erstellt. Als ich die Zeichnung exportiert habe, war kein Motortreiber auf dem Steckbrett. Das habe ich dann manuell mit Paint oder Inkscape (weiß nicht mehr so genau) nachträglich gezeichnet 😉
Finde Fritzing viel zu umständlich
Hi. Hast du auch ein Beispiel für die Drehzahl der Motoren zum verringern/erhöhen?
Das kannst du machen, indem du den Enable-Pin mit analogWrite ansteuerst
analogWrite(aEnable, 127); //Zum Beispiel, steuert den Motor mit halber Drehzahl.
Schau auch mal hier vorbei: https://5volt-junkie.net/was-ist-pwm-ein-kleines-tutorial/
Hallo,
ich bin auf deinen Beitrag gestoßen und habe anstatt zwei DC Motoren , einen. Stepper Motor angeschlossen , der als Autofokus für eine Kleine USB Kamera Linse dient. Wie muss ich den Code ändern für einen Stepper motor?