L293D – Geschwindigkeit und Richtung von DC Motoren steuern

Wie im letzten Eintrag angesprochen, muss ich für die vier Motoren des RaspberryCars verschiedene Geschwindigkeiten ermöglichen, um z.B. Kurven zu fahren.

Als Steuerung nehme ich hierfür den L293D Controller. Dieser ermöglicht es mir, mit zwei Input Pins an den Raspberry die Richtung der Drehung zu bestimmen. Mit einem dritten Pin, den ich ein PWM Signal ausgeben lasse, kann ich dann die Geschwindigkeit regeln.

Schaltbild L293DZwei Ausgänge gehen hier zu einem Motor (Grün & Gelb).

Zwei Eingänge werden mit dem Raspberry Pi verbunden (Braun). Sie sind für IN/OUT (Vorwärts/Rückwärts) zuständig.

Ein Eingang wird mit einem weiteren Pin des Raspberry Pis verbunden (Cyan). Dieser wird der PWM Pin (Geschwindigkeit).

Nun fehlt noch Ground, 5V Eingang vom Raspberry aus und die Grundspannung für die Motoren (Rot & Blau). Diese sollten unbedingt durch eine andere Quelle als den Raspberry betrieben werden. Der Rasbperry kann nicht alles versorgen und ist dann schnell überlastet.

Wenn man alles richtig verbunden hat, kann folgendes Skript den Motor vorwärts und rückwärts drehen lassen, sowie die Geschwindigkeit verändern. Mit „f“ oder „r“ kann vor und zurück gesteuert werden. Mit 0-9 die Geschwindigkeit. Mit x wird das Skript abgebrochen und die GPIOs zurückgesetzt.

Der Code kann auch in meinem GitHub Repo gefunden werden. Dort werde ich auch alle Änderungen ergänzen.

Das Skript stammt ursprünglich von Adafruit. Ich habe es als Grundlage für dieses Skript benutzt. Mit einem Motor funktioniert das ursprüngliche Skript sehr gut. Allerdings hat es den nachteil, dass nur ein PWM Pin definiert werden kann. Hierzu ist auch zwingend das Betriebssystem Occidentalis von Adafruit notwendig. In meiner Lösung benutzt ich Raspbian.

Achtung! Mit Occidentalis ist es nicht möglich, dieses Skript korrekt auszuführen!

Schaut man sich die L293D genau an, sieht man, dass sie symmetrisch aufgebaut ist:
L293DEN1 und EN2 sind für die jeweilige Seite die PWM Steuerung.

IN1/IN2 und IN3/IN4 sind die Pins, die an den Raspberry führen und zum steuern der Richtung der jeweiligen Seite verantwortlich sind.

OUT1/OUT2 und OUT3/OUT4 sind die Pins, die an die Motoren führen.

+V ist die Versorgungsspannung über den Raspberry Pi.

+Vmotor ist die Spannung, die für die Motoren benutzt wird.

0V ist Ground. Es ist egal, an welchen der vier Pins angelegt wird.

 

 

Ich habe das ganze mit zwei Motoren getestet und werde meinen Aufbau hier einstellen, sobald ich alles verlötet und die Platine auf die Chassis montiert habe.

4 Kommentare

  1. alex Mai 27, 2015 5:55 pm  Antworten

    Servus,

    wenn ich das Programm starten möchte kommt die Meldung: NameError: Name ’self‘ is not defined

    Was kann ich da machen?
    Gruß Alex

    • Johannes Mai 27, 2015 7:13 pm  Antworten

      Hi Alex,

      ich stelle mal eine Spekulation an. Vielleicht kannst du noch den gesamten Fehler posten. Damit könnte ich mehr anfangen.
      Zur Spekulation:
      Der Fehler liegt, glaube ich in Zeile 14. Hier heist es:
      # Pulse Weite
      motor = io.PWM(self.pwmPin, 100)

      Das ist wohl mein Fehler. ^^
      Du kannst ihn lösen indem du Zeile 14 wie folgt austauscht:
      motor = io.PWM(pwm_pin, 100)
      Ich werde das im obrigen Code kurz vermerken. Sobald sich die Gelegenheit bietet werde ich es testen und dementsprechend korrigieren oder weiter beschreiben.

      Über eine positive Rückmeldung würde ich mich freuen 😉

      Viele Grüße

  2. Thorsten Januar 27, 2016 1:48 pm  Antworten

    Hallo Johannes,

    ich versuche das Prinzip der PWM/L293D gerade anhand mehrerer Tutorials theoretisch zu verstehen.
    Muss es beim Setup nicht heissen:

    in1_pin = 8
    in2_pin = 7
    pwm_pin = 14

    7 und 8 sind klar, müssten aber m.E. 8/IN1 und 7/IN2
    des L293 gehen, damit die Drehrichtung stimmt. GPIO4 benutzt Du gar nicht in Deinem Wiring (sondern GPIO14) und der geht korrekt zum EN1 des L293D.
    Oder versteh ich es falsch?

    Viele Grüße
    Thorsten

  3. Peter Mai 25, 2016 8:51 pm  Antworten

    Hallo Thorsten!
    Kannst du mir bitte nochmal die Einträge erklären

    motor = io.PWM(self.pwmPin, 100)
    # Start des Pulses
    motor.start(0)
    # Stillstand vorgeben
    motor.ChangeDutyCycle(0)

Schreibe einen Kommentar