PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Motorgeschwindigkeit regulieren in Python programmieren



pinsel120866
02.02.2013, 09:32
Hallo,

mein Pinselbot kennt derzeit nur die Motorgeschwindigkeiten Vollgas und Stop und zwar mit diesem Python Code:


#Get the GPIO module
import RPi.GPIO as GPIO

#Get the time module
import time

#A routine to control a pair of pins
def ControlAPairOfPins(FirstPin,FirstState,SecondPin,S econdState):
if FirstState == "1":
GPIO.output(int(FirstPin),True)
else:
GPIO.output(int(FirstPin),False)

if SecondState == "1":
GPIO.output(int(SecondPin),True)
else:
GPIO.output(int(SecondPin),False)
#Just retur
return

####Main body of code

#Get rid of warnings
GPIO.setwarnings(False)

#Set the GPIO mode
GPIO.setmode(GPIO.BOARD)
#Set the pins to be outputs
GPIO.setup(19,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(23,GPIO.OUT)
GPIO.setup(24,GPIO.OUT)

while True:

ControlAPairOfPins("19","1","21","0")
ControlAPairOfPins("23","1","24","0")
print "Drehung nach rechts"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)

ControlAPairOfPins("19","0","21","1")
ControlAPairOfPins("23","0","24","1")
print "Drehung nach Links"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)

ControlAPairOfPins("19","1","21","0")
ControlAPairOfPins("23","0","24","1")
print "Geradeaus vorwaerts"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)

ControlAPairOfPins("19","0","21","1")
ControlAPairOfPins("23","1","24","0")
print "Geradeaus rueckwaerts"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)

Nun würde ich gerne die Geschwindigkeit regulieren. Meine Programmierkenntnisse reichen hierzu leider nicht mehr aus. Kann mir bitte jemand dabei helfen das in Python zu programmieren?

tucow
02.02.2013, 14:09
Hallo Pinsel,

das ist ganz klar ein Fall für eine PWM, doof nur dass das Pi nur einen nativen hardware PWM Ausgang besitzt, also her mit der software PWM ;)
Ich habe dazu eine ganz einfache Library gefunden: https://github.com/aboudou/pizypwm

Test der Lib mit LED:

http://www.youtube.com/watch?v=1X_FYJ5x6Wo

Test am DSO:

http://www.youtube.com/watch?v=aP1F67PtaVc



Das sollte doch ganz gut in Deinen Code passen :)

pinsel120866
02.02.2013, 17:10
ok,danke vielmals für die lib. reicht es, wenn ich pizypwm.py ins gleiche verzeichnis wie mein pythonprogramm kopiere? und wie binde ich die lib richtig ein?

sorry, das sind vielleicht dumme fragen, aber das ist neuland für mich...

tucow
02.02.2013, 17:13
Schau dir mal die example.py an, dort steht am Anfang was Du alles importieren musst, in der Zeile

from pizypwm import *
steht zu Anfang der Name der Lib (Dateiname wenn man so will) und danach was importiert werden soll, * == alles.

Kurzum, es reicht wenn du das alles importierst und die Lib im selben Ordner liegt.

pinsel120866
02.02.2013, 18:36
ok, danke das ist mir jetzt klar.

noch eine frage: was ist die optimale PWM frequenz für meine motoren?

tucow
02.02.2013, 18:45
Das kann ich Dir nicht sagen, versuch es einfach mal mit der, der LED aus der example.py. Also 100 Hz.
Ich könnte mir vorstellen das sowas im Datenblatt der Motoren stehen könnte, falls nicht einfach probieren. Abrauchen werden sie schon nicht ;)

pinsel120866
02.02.2013, 18:59
100 hz sind zu wenig. ich habe mittlerweile herausgefunden dass der rp6 ( hat dasselbe chassis) eine pwm frequenz von 19048 hz verwendet. das werde ich nehmen.

Kampi
02.02.2013, 19:05
Hey,

PiZyPWM ist nicht schlecht....nur wie beende ich ein Programm mit der PWM? ^.^
Weil Ctrl + C funktioniert nicht und Ctrl + D auch nicht und das Ding blockiert die Konsole.

tucow
02.02.2013, 21:18
Bin gespannt ob's funktioniert, Pinsel :)

Das ist logisch, Kampi. Für jede PWM startet die Lib einen Thread, den musst Du erst stoppen bevor Du das Programm beenden kannst, ansonsten würde der Thread ja in einer Endlosschleife das ganze System blockieren.

Kampi
02.02.2013, 21:54
Ja das ist klar :)
Nur wie beende ich es?

tucow
02.02.2013, 22:02
Steht doch in der ReadMe ;)

pwm.stop()

Kampi
02.02.2013, 22:11
Geht das nur darüber?
Weil die Ausführung eines "normalen" Programms kannst du ja z.B. mit Strg + C beenden :D

tucow
02.02.2013, 22:35
Das ist kein Beenden, das ist ein Unterbrechen wenn man es ganz genau nimmt ;)
Ein "ordentliches" Beenden wäre z.B. os._exit(1) das über eine Benutzereingabe ausgeführt wird.

Ich baue mir z.B. immer ein Menü:

while(True):
user_input = raw_input('Bitte treffen Sie Ihre Wahl: ')
if user_input == "m":
menu()
...
elif user_input == "q":
os._exit(1)

Kampi
02.02.2013, 22:50
Haarspalterei :P
Aber gut danke für die Info :)

pinsel120866
03.02.2013, 10:11
Hallo,

Ich habe mir nun folgendes Programm erstellt:
PWM Frequenz 19048 Hz, 50%



import RPi.GPIO as GPIO

import time
import signal

from pizypwm import *

def endProcess(signalnum = None, handler = None):
first.stop()
second.stop()
third.stop()
fourth.stop()

GPIO.cleanup()
exit(0)

signal.signal(signal.SIGTERM, endProcess)
signal.signal(signal.SIGINT, endProcess)

first = PiZyPwm(19048, 19, GPIO.BOARD)
second = PiZyPwm(19048, 21, GPIO.BOARD)
third = PiZyPwm(19048, 23, GPIO.BOARD)
fourth = PiZyPwm(19048, 24, GPIO.BOARD)

first.start(50)
second.start(50)
third.start(50)
fourth.start(50)

def ControlAPairOfPins(FirstPin,FirstState,SecondPin,S econdState):
if FirstState == "1":
GPIO.output(int(FirstPin),True)
else:
GPIO.output(int(FirstPin),False)

if SecondState == "1":
GPIO.output(int(SecondPin),True)
else:
GPIO.output(int(SecondPin),False)
return

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD)

GPIO.setup(19,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(23,GPIO.OUT)
GPIO.setup(24,GPIO.OUT)

while True:

ControlAPairOfPins("19","1","21","0")
ControlAPairOfPins("23","1","24","0")
print "Drehung nach rechts"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)

ControlAPairOfPins("19","0","21","1")
ControlAPairOfPins("23","0","24","1")
print "Drehung nach Links"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)

ControlAPairOfPins("19","1","21","0")
ControlAPairOfPins("23","0","24","1")
print "Geradeaus vorwaerts"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)

ControlAPairOfPins("19","0","21","1")
ControlAPairOfPins("23","1","24","0")
print "Geradeaus rueckwaerts"
time.sleep(1)

ControlAPairOfPins("19","0","21","0")
ControlAPairOfPins("23","0","24","0")
print "Stop"
time.sleep(1)



Das Programm läuft zwar ab, der Bot zittert aber wie wild.
Ist das Programm so in Ordnung?
Kannst du das bitte überprüfen?

tucow
03.02.2013, 11:45
Naja, oben startest Du direkt die PWM auf allen Pins

first.start(50)second.start(50)
third.start(50)
fourth.start(50)

Wenn ich das richtig interpretiere wollen Deine Motoren nun gleichzeitig nach vorne und nach hinten drehen => geht nicht => Zittern.
Und unten in der while Schleife sagst Du den Motoren das sie voll aufdrehen sollen, oder? Das führt zu noch heftigerem Zittern weil es die PWM beeinträchtigt.

pinsel120866
03.02.2013, 12:58
Vielen herzlichen Dank, tucow - nun habe ich es:



import RPi.GPIO as GPIO

import time
import signal

from pizypwm import *

def endProcess(signalnum = None, handler = None):
first.stop()
second.stop()
third.stop()
fourth.stop()

GPIO.cleanup()
exit(0)

signal.signal(signal.SIGTERM, endProcess)
signal.signal(signal.SIGINT, endProcess)

first = PiZyPwm(20000, 19, GPIO.BOARD)
second = PiZyPwm(20000, 21, GPIO.BOARD)
third = PiZyPwm(20000, 23, GPIO.BOARD)
fourth = PiZyPwm(20000, 24, GPIO.BOARD)

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD)

GPIO.setup(19,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(23,GPIO.OUT)
GPIO.setup(24,GPIO.OUT)

while True:

first.start(50)
second.start(0)
third.start(50)
fourth.start(0)
print "Drehung nach rechts"
time.sleep(1)

first.start(0)
second.start(0)
third.start(0)
fourth.start(0)
print "Stop"
time.sleep(1)

first.start(0)
second.start(50)
third.start(0)
fourth.start(50)
print "Drehung nach Links"
time.sleep(1)

first.start(0)
second.start(0)
third.start(0)
fourth.start(0)
print "Stop"
time.sleep(1)

first.start(50)
second.start(0)
third.start(0)
fourth.start(50)
print "Geradeaus vorwaerts"
time.sleep(1)

first.start(0)
second.start(0)
third.start(0)
fourth.start(0)
print "Stop"
time.sleep(1)

first.start(0)
second.start(50)
third.start(50)
fourth.start(0)
print "Geradeaus rueckwaerts"
time.sleep(1)

first.start(0)
second.start(0)
third.start(0)
fourth.start(0)
print "Stop"
time.sleep(1)


Damit drehen die Motoren nur mit 50% Leistung, dank Software - PWM
:cool:

tucow
03.02.2013, 15:19
Ah, sehr schön!
Kannst Du davon mal ein Video machen? Mich würde interessieren wie gut die Software PWM in Python funktioniert :)

pinsel120866
03.02.2013, 17:21
Video ist online: http://youtu.be/DBvoxG8FZBo

Im 1. Durchgang 50% PWM, im 2. Durchgang 100% PWM

Kampi
03.02.2013, 17:37
Sieht (wiedermal) klasse aus :)
Ich warte noch immer auf meinen Motortreiber für meinen Bot.
Hoffe der kommt bald, da ich jetzt Semesterferien habe und nächste Woche die Klausur geschrieben ist, wollte ich endlich mal bisl anfangen selber einen Bot zusammen zu bauen.
Die USB Kabel für mein mobiles Ladegerät habe ich schon gefunden (totaler Krampf USB Kabel mit Mini-USB und einer normalen USB-Buchse zu finden -.-)

pinsel120866
03.02.2013, 18:18
Danke Kampi,

Jaja, das Kabel hatte ich zufällig von meinem (alten) Samsung Handy.

Es wäre cool, wenn du meinen Pinselbot ein bisschen als Vorlage nimmst. Dann fliesst sicher ordentlich Innovation ein ;-)

Kampi
03.02.2013, 18:36
Hey,

ja den Bot wollte ich auch ein wenig als Vorlage nehmen :)
Hab noch eine Panzerwanne hier rumliegen, welche ich verwenden möchte.

tucow
03.02.2013, 19:14
Ah, sehr schön!

Ich muss auch noch einen fahrenden Bot bauen, habe bisher nur welche gebaut die gehen ;) Aber ich denke da ehr an eine Art Rover mit 6 Rädern etc.. aber ich denke da wird auch wieder ein RPi reinkommen.