程序完成后继续覆盆子pi python pwm

时间:2015-03-17 00:06:22

标签: python raspberry-pi pwm

我有一个我正在研究的机器人,并用PWM控制它。我控制它的方式是使用脚本设置PWM然后退出。我需要它来设置PWM然后继续运行。我需要它退出的原因是因为每次x和y值改变时我只是通过ssh连接调用这个脚本。程序退出后,正常的数字输出会继续,但PWM不会按照我设置的方式进行。

到目前为止,这是我的代码。它包含许多打印语句,试图帮助我找出问题所在。

#filename: setMotors.py
import RPi.GPIO as GPIO
from sys import argv
from time import sleep

MOTOR_EN_1_PIN = 14
MOTOR_A_1_PIN = 15
MOTOR_B_1_PIN = 18

MOTOR_EN_2_PIN = 23
MOTOR_A_2_PIN = 24
MOTOR_B_2_PIN = 25


def mixXY(x, y):
    """
    mixes x and y from a joystick to values for a 2 motor drive system
    input: x (int or float), y (int or float)
    output: (leftMotor (float), rightMotor (float)) tuple
    """
    leftMotor = y + x
    rightMotor = y - x

    return (leftMotor, rightMotor)

def setMotorPWMS(leftMotor, rightMotor):
    #left motor
    if leftMotor == 0:
        print("left motor 0")
        GPIO.output(MOTOR_EN_1_PIN, 0)
        motor1A.stop()
        motor1B.stop()
    elif leftMotor < 0:
        print("left motor < 0")
        GPIO.output(MOTOR_EN_1_PIN, 1)
        motor1A.stop()
        motor1B.ChangeDutyCycle(abs(leftMotor))
    else:
        print("left motor else")
        GPIO.output(MOTOR_EN_1_PIN, 1)
        motor1A.ChangeDutyCycle(leftMotor)
        motor1B.stop()

    #right motor
    if rightMotor == 0:
        print("right motor 0")
        GPIO.output(MOTOR_EN_2_PIN, 0)
        motor2A.stop()
        motor2B.stop()
    elif rightMotor < 0:
        print("right motor < 0")
        GPIO.output(MOTOR_EN_2_PIN, 1)
        motor2A.stop()
        motor2B.ChangeDutyCycle(abs(rightMotor))
    else:
        print("right motor else")
        GPIO.output(MOTOR_EN_2_PIN, 1)
        motor2A.ChangeDutyCycle(rightMotor)
        motor2B.stop()



GPIO.setwarnings(False)

#setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(MOTOR_EN_1_PIN, GPIO.OUT)
GPIO.setup(MOTOR_A_1_PIN, GPIO.OUT)
GPIO.setup(MOTOR_B_1_PIN, GPIO.OUT)

GPIO.setup(MOTOR_EN_2_PIN, GPIO.OUT)
GPIO.setup(MOTOR_A_2_PIN, GPIO.OUT)
GPIO.setup(MOTOR_B_2_PIN, GPIO.OUT)

motor1A = GPIO.PWM(MOTOR_A_1_PIN, 50)
motor1B = GPIO.PWM(MOTOR_B_1_PIN, 50)
motor2A = GPIO.PWM(MOTOR_A_2_PIN, 50)
motor2B = GPIO.PWM(MOTOR_B_2_PIN, 50)
motor1A.start(0)
motor1B.start(0)
motor2A.start(0)
motor2B.start(0)


if len(argv) <= 2:
    print("Need to call with x and y from commandline")
else:
    motorPWM = mixXY(int(argv[1]), int(argv[2]))
    leftMotorPWM = motorPWM[0]
    rightMotorPWM = motorPWM[1]
    print("left motor:",leftMotorPWM)
    print("right motor:", rightMotorPWM)
    setMotorPWMS(leftMotorPWM, rightMotorPWM)
    sleep(5)
    print("done")

调用它的方式是使用sudo python setMotors.py x y。有没有办法在程序退出后保持PWM运行或更好的方法呢?

1 个答案:

答案 0 :(得分:0)

RaspberryPi不支持硬件PWM,因此使用软件循环进行模拟。基本上,它设置GPIO,睡眠一点,重置GPIO,睡眠一点并循环。这是在a separated thread中完成的,当程序结束时会被终止。

因此,您必须找到一种方法来保持您的程序在后台运行。如果你看一下official example on use of PWM,你会发现无限循环让程序保持活着直到手动杀死。

您还应该添加类似

的内容
try:
    while 1:
        time.sleep(0.5)
except KeyboardInterrupt:
    pass
p.stop()
GPIO.cleanup()

到程序的最后,或使用signal模块构建的更好的东西。

然后,在销毁控制台之前将进程留在后台

sudo python setMotors.py x y &

您也可以让您的计划获得daemonized