Chris1803
06.12.2017, 21:58
Hallo zusammen
Ich habe folgende Anordnung:
Computer A mit eingabegeräten und Computer B (Raspberry Pi) für die Motorensteuerung meines Modelllasters.
Computer A schickt an B einen Wert zwischen 0 und 10'000 für die Richtungs- und Geschwindigkeitsangabe.
Das funktioniert.
Ist der Wert zwischen 0 und 4750, dreht der Motor vorwärts, ist der Wert grösser als 5250, dreht er rückwärts. Die 10% Spatzung habe ich mir für kleinste, ungewollte Bewegungen am Joystick gelassen, wird vielleicht kleiner.
Das funktioniert.
An einem freien Pin ist eine Kontroll-LED angebracht, damit ich sehen kann, ob der Motor ein Signal bekommt, falls er stottert.
Das funktioniert.
Was nicht funktioniert ist die Änderung der Geschwindigkeit und dass die LED ihre Helligkeit an die Signalgeschwindigkeit des Motors anpasst.
Unten im Code ist das Modul Umstellen(intSpeed), durch das die Richtgung geregelt wird und wodurch das PWM-Signal erhöht oder gesenkt werden soll.
Hat jemand einen Tipp, woran es liegen könnte, dass der Motor nicht schneller oder langsamer dreht?
Was ich schon getestet habe: Die Verkabelung passt. Die Pins habe ich mit einem ähnlichen Code (war meine Vorlage) bereits angesteuert und wenn ich darüber die Drehzahl ändere, dreht der Motor schneller oder langsamer.
import sys
import time
import socket
import RPi.GPIO as gpio
#define all variables
HOST = ''
TCP_PORT = 10001
intStringStart = 0
intStringEnd = 0
intStringLen = 0
intXaxis = 0
intYaxis = 0
intBA = 0
intBB = 0
intBC = 0
intBD = 0
intBE = 0
intBF = 0
intBG = 0
intBH = 0
intBI = 0
intBJ = 0
intBK = 0
intBL = 0
intDirection = 0
fltCycle = 100
gpio.setmode(gpio.BCM)
gpio.setup(18, gpio.OUT)
gpio.setup(23, gpio.OUT)
gpio.setup(24, gpio.OUT)
pwm = gpio.PWM(23, 100)
pwmLED = gpio.PWM(18, 100)
#************************************************* ***********************************************
#Ein
def Ein():
print "Ein"
pwm.start(0)
pwmLED.start(0)
gpio.output(18, False)
gpio.output(23, False)
gpio.output(24, False)
#************************************************* ***********************************************
def Pruefer():
print "Pruefer called " + str(intYaxis)
#************************************************* ***********************************************
def Beender():
print "Shutting down GPIO"
Aus()
print "Closing socket"
connection.close()
print "Shutting down"
#************************************************* ***********************************************
def Umstellen(intSpeed):
if intSpeed < 4750:
fltCycle = float(intSpeed / 50)
gpio.output(18, True)
gpio.output(23, True)
gpio.output(24, False)
pwm.ChangeDutyCycle(fltCycle)
pwmLED.ChangeDutyCycle(fltCycle)
print str(fltCycle)
elif intSpeed > 5250:
fltCycle = float((intSpeed / 50) - 100)
gpio.output(18, True)
gpio.output(23, False)
gpio.output(24, True)
pwm.ChangeDutyCycle(fltCycle)
pwmLED.ChangeDutyCycle(fltCycle)
else:
gpio.output(18, False)
gpio.output(23, False)
gpio.output(24, False)
pwm.stop()
pwmLED.stop()
#************************************************* ***********************************************
#Aus
def Aus():
print "Aus"
gpio.output(18, False)
gpio.output(23, False)
gpio.output(24, False)
pwm.stop()
pwmLED.stop()
gpio.cleanup()
#************************************************* ***********************************************
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, TCP_PORT))
sock.listen(1)
Ein()
while True:
#Accept the connection and create new socket connection1
try:
connection, strClientAddress = sock.accept()
boConnected = True
#loop while connected
while True:
strData = connection.recv(100)
intStringStart = 0
intStringEnd = 0
intStringLen = 0
intXaxis = 0
intYaxis = 0
intBA = 0
intBB = 0
intBC = 0
intBD = 0
intBE = 0
intBF = 0
intBG = 0
intBH = 0
intBI = 0
intBJ = 0
intBK = 0
intBL = 0
#Check if strData <> null, else break loop
if strData:
#Extract X axis
try:
intStringEnd = strData.find("X:")
intStringStart = intStringEnd + 2
intStringEnd = strData.find(";", intStringStart)
intXaxis = int(strData[intStringStart:intStringEnd])
except:
intXaxis = 0
#Extract Y axis
try:
intStringEnd = strData.find("Y:")
intStringStart = intStringEnd + 2
intStringEnd = strData.find(";", intStringStart)
intYaxis = int(strData[intStringStart:intStringEnd])
except:
intYaxis = 0
#Extract Button A
try:
intStringEnd = strData.find("BA:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBA = int(strData[intStringStart:intStringEnd])
except:
intBA = 0
#Extract Button B
try:
intStringEnd = strData.find("BB:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBB = int(strData[intStringStart:intStringEnd])
except:
intBB = 0
#Extract Button C
try:
intStringEnd = strData.find("BC:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBC = int(strData[intStringStart:intStringEnd])
except:
intBC = 0
#Extract Button D
try:
intStringEnd = strData.find("BD:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBD = int(strData[intStringStart:intStringEnd])
except:
intBD = 0
#Extract Button E
try:
intStringEnd = strData.find("BE:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBE = int(strData[intStringStart:intStringEnd])
except:
intBE = 0
#Extract Button F
try:
intStringEnd = strData.find("BF:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBF = int(strData[intStringStart:intStringEnd])
except:
intBF = 0
#Extract Button G
try:
intStringEnd = strData.find("BG:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBG = int(strData[intStringStart:intStringEnd])
except:
intBG = 0
#Extract Button H
try:
intStringEnd = strData.find("BH:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBH = int(strData[intStringStart:intStringEnd])
except:
intBH = 0
#Extract Button I
try:
intStringEnd = strData.find("BI:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBI = int(strData[intStringStart:intStringEnd])
except:
intBI = 0
#Extract Button J
try:
intStringEnd = strData.find("BJ:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBJ = int(strData[intStringStart:intStringEnd])
except:
intBJ = 0
#Extract Button K
try:
intStringEnd = strData.find("BK:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBK = int(strData[intStringStart:intStringEnd])
except:
intBK = 0
#Extract Button L
try:
intStringEnd = strData.find("BL:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBL = int(strData[intStringStart:intStringEnd])
except:
intBL = 0
Umstellen(intYaxis)
#close connection if Button BF (6) is pressed
if intBF == 1:
Beender()
sys.exit(0)
else:
print "Connection lost"
break
#Clean up after error or at termination
finally:
connection.close()
Ich habe folgende Anordnung:
Computer A mit eingabegeräten und Computer B (Raspberry Pi) für die Motorensteuerung meines Modelllasters.
Computer A schickt an B einen Wert zwischen 0 und 10'000 für die Richtungs- und Geschwindigkeitsangabe.
Das funktioniert.
Ist der Wert zwischen 0 und 4750, dreht der Motor vorwärts, ist der Wert grösser als 5250, dreht er rückwärts. Die 10% Spatzung habe ich mir für kleinste, ungewollte Bewegungen am Joystick gelassen, wird vielleicht kleiner.
Das funktioniert.
An einem freien Pin ist eine Kontroll-LED angebracht, damit ich sehen kann, ob der Motor ein Signal bekommt, falls er stottert.
Das funktioniert.
Was nicht funktioniert ist die Änderung der Geschwindigkeit und dass die LED ihre Helligkeit an die Signalgeschwindigkeit des Motors anpasst.
Unten im Code ist das Modul Umstellen(intSpeed), durch das die Richtgung geregelt wird und wodurch das PWM-Signal erhöht oder gesenkt werden soll.
Hat jemand einen Tipp, woran es liegen könnte, dass der Motor nicht schneller oder langsamer dreht?
Was ich schon getestet habe: Die Verkabelung passt. Die Pins habe ich mit einem ähnlichen Code (war meine Vorlage) bereits angesteuert und wenn ich darüber die Drehzahl ändere, dreht der Motor schneller oder langsamer.
import sys
import time
import socket
import RPi.GPIO as gpio
#define all variables
HOST = ''
TCP_PORT = 10001
intStringStart = 0
intStringEnd = 0
intStringLen = 0
intXaxis = 0
intYaxis = 0
intBA = 0
intBB = 0
intBC = 0
intBD = 0
intBE = 0
intBF = 0
intBG = 0
intBH = 0
intBI = 0
intBJ = 0
intBK = 0
intBL = 0
intDirection = 0
fltCycle = 100
gpio.setmode(gpio.BCM)
gpio.setup(18, gpio.OUT)
gpio.setup(23, gpio.OUT)
gpio.setup(24, gpio.OUT)
pwm = gpio.PWM(23, 100)
pwmLED = gpio.PWM(18, 100)
#************************************************* ***********************************************
#Ein
def Ein():
print "Ein"
pwm.start(0)
pwmLED.start(0)
gpio.output(18, False)
gpio.output(23, False)
gpio.output(24, False)
#************************************************* ***********************************************
def Pruefer():
print "Pruefer called " + str(intYaxis)
#************************************************* ***********************************************
def Beender():
print "Shutting down GPIO"
Aus()
print "Closing socket"
connection.close()
print "Shutting down"
#************************************************* ***********************************************
def Umstellen(intSpeed):
if intSpeed < 4750:
fltCycle = float(intSpeed / 50)
gpio.output(18, True)
gpio.output(23, True)
gpio.output(24, False)
pwm.ChangeDutyCycle(fltCycle)
pwmLED.ChangeDutyCycle(fltCycle)
print str(fltCycle)
elif intSpeed > 5250:
fltCycle = float((intSpeed / 50) - 100)
gpio.output(18, True)
gpio.output(23, False)
gpio.output(24, True)
pwm.ChangeDutyCycle(fltCycle)
pwmLED.ChangeDutyCycle(fltCycle)
else:
gpio.output(18, False)
gpio.output(23, False)
gpio.output(24, False)
pwm.stop()
pwmLED.stop()
#************************************************* ***********************************************
#Aus
def Aus():
print "Aus"
gpio.output(18, False)
gpio.output(23, False)
gpio.output(24, False)
pwm.stop()
pwmLED.stop()
gpio.cleanup()
#************************************************* ***********************************************
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, TCP_PORT))
sock.listen(1)
Ein()
while True:
#Accept the connection and create new socket connection1
try:
connection, strClientAddress = sock.accept()
boConnected = True
#loop while connected
while True:
strData = connection.recv(100)
intStringStart = 0
intStringEnd = 0
intStringLen = 0
intXaxis = 0
intYaxis = 0
intBA = 0
intBB = 0
intBC = 0
intBD = 0
intBE = 0
intBF = 0
intBG = 0
intBH = 0
intBI = 0
intBJ = 0
intBK = 0
intBL = 0
#Check if strData <> null, else break loop
if strData:
#Extract X axis
try:
intStringEnd = strData.find("X:")
intStringStart = intStringEnd + 2
intStringEnd = strData.find(";", intStringStart)
intXaxis = int(strData[intStringStart:intStringEnd])
except:
intXaxis = 0
#Extract Y axis
try:
intStringEnd = strData.find("Y:")
intStringStart = intStringEnd + 2
intStringEnd = strData.find(";", intStringStart)
intYaxis = int(strData[intStringStart:intStringEnd])
except:
intYaxis = 0
#Extract Button A
try:
intStringEnd = strData.find("BA:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBA = int(strData[intStringStart:intStringEnd])
except:
intBA = 0
#Extract Button B
try:
intStringEnd = strData.find("BB:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBB = int(strData[intStringStart:intStringEnd])
except:
intBB = 0
#Extract Button C
try:
intStringEnd = strData.find("BC:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBC = int(strData[intStringStart:intStringEnd])
except:
intBC = 0
#Extract Button D
try:
intStringEnd = strData.find("BD:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBD = int(strData[intStringStart:intStringEnd])
except:
intBD = 0
#Extract Button E
try:
intStringEnd = strData.find("BE:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBE = int(strData[intStringStart:intStringEnd])
except:
intBE = 0
#Extract Button F
try:
intStringEnd = strData.find("BF:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBF = int(strData[intStringStart:intStringEnd])
except:
intBF = 0
#Extract Button G
try:
intStringEnd = strData.find("BG:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBG = int(strData[intStringStart:intStringEnd])
except:
intBG = 0
#Extract Button H
try:
intStringEnd = strData.find("BH:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBH = int(strData[intStringStart:intStringEnd])
except:
intBH = 0
#Extract Button I
try:
intStringEnd = strData.find("BI:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBI = int(strData[intStringStart:intStringEnd])
except:
intBI = 0
#Extract Button J
try:
intStringEnd = strData.find("BJ:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBJ = int(strData[intStringStart:intStringEnd])
except:
intBJ = 0
#Extract Button K
try:
intStringEnd = strData.find("BK:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBK = int(strData[intStringStart:intStringEnd])
except:
intBK = 0
#Extract Button L
try:
intStringEnd = strData.find("BL:")
intStringStart = intStringEnd + 3
intStringEnd = strData.find(";", intStringStart)
intBL = int(strData[intStringStart:intStringEnd])
except:
intBL = 0
Umstellen(intYaxis)
#close connection if Button BF (6) is pressed
if intBF == 1:
Beender()
sys.exit(0)
else:
print "Connection lost"
break
#Clean up after error or at termination
finally:
connection.close()