操纵覆盆子Pi车

时间:2016-10-27 10:01:50

标签: python raspberry-pi

我正在使用Raspberry Pi Zero构建PiCar。我正在使用L293D芯片组连接两个直流电机,我按照本指南完成了所有工作:

https://business.tutsplus.com/tutorials/controlling-dc-motors-using-python-with-a-raspberry-pi--cms-20051

目前我已经写了一个基本的脚本,用于向前,向后,向左和向右驾驶汽车。但是有一些问题。如何在不向前或向后移动的情况下向左或向右转向汽车。另外,如何只需按一下按下按钮即可使汽车转向,也许可以使用cntrl键加速?如果让你按下加速器移动,那么转向有点像汽车游戏是多么困难但是如果你释放那么它会慢下来?以下是我目前使用的代码,但每次都需要按Enter键。

PiCar.py

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

#left motor
in2 = 10    
in1 = 9     
en1 = 11    

#right motor
in3 = 24    
in4 = 23    
en2 = 25    

#setup motors 
GPIO.setup(in2,GPIO.OUT)
GPIO.setup(in1,GPIO.OUT)
GPIO.setup(en1,GPIO.OUT)

GPIO.setup(in3,GPIO.OUT)
GPIO.setup(in4,GPIO.OUT)
GPIO.setup(en2,GPIO.OUT)

def forwards():
    GPIO.output(in2,GPIO.HIGH)
    GPIO.output(in1,GPIO.LOW)
    GPIO.output(en1,GPIO.HIGH)

    GPIO.output(in3,GPIO.HIGH)
    GPIO.output(in4,GPIO.LOW)
    GPIO.output(en2,GPIO.HIGH)

def backwards():
    GPIO.output(in2,GPIO.LOW)
    GPIO.output(in1,GPIO.HIGH)
    GPIO.output(en1,GPIO.HIGH)

    GPIO.output(in3,GPIO.LOW)
    GPIO.output(in4,GPIO.HIGH)
    GPIO.output(en2,GPIO.HIGH)

def left():
    GPIO.output(in2, GPIO.LOW)
    GPIO.output(in1, GPIO.LOW)
    GPIO.output(en1, GPIO.LOW)

def right():
    GPIO.output(in3, GPIO.LOW)
    GPIO.output(in4, GPIO.LOW)
    GPIO.output(en2, GPIO.LOW)

def stop():
    GPIO.output(en1,GPIO.LOW)
    GPIO.output(en2,GPIO.LOW)

#setup pwm
pwm_right = GPIO.PWM(en2, 100)
pwm_left = GPIO.PWM(en1, 100)

while True:
    cmd = raw_input("Command, w = forward / s = backward / x = stop (add a number between 0..9 for speed eg f6):")
    if len(cmd) > 0:
        direction = cmd[0]
    if direction == "w":
        forwards()
    elif direction == "s":
        backwards()
    elif direction == "a":
        left()
    elif direction == "d":
        right()
    elif direction == "x":
        stop()
    else:
        stop();

    speed = int(cmd[1]) * 11
    pwm_left.start(speed)
    pwm_right.start(speed)

GPIO.cleanup()

3 个答案:

答案 0 :(得分:1)

  1. 要让应用程序继续运行,即使您没有按任何内容,也可以使用Pygame。它读取低级键值,get_pressed()函数返回当时按下的键数组。
  2. get_mods()函数将返回CTRL键状态,如下所示:

    如果mods& KMOD_CTRL:

  3. 要考虑加速度,只要按下前进键,就可以保持速度变量并每隔几毫秒用加速度值增加该值。未按下时,降低速度直到为0.

  4. 要向前移动并同时转弯,您可以将pwm值100发送到左侧车轮,将50度发送到右侧车轮。您可以执行与上述相同的加速技巧,以便在按住A或D键时增加转向。

答案 1 :(得分:0)

在浏览互联网之后,我发现了一个很棒的解决方案,在Robot Car - Python程序下。也适用于L293D。已经过测试并可以确认。

http://custom-build-robots.com/ebook-download

答案 2 :(得分:0)

对于汽车的左侧移动,您可以使用以下代码

左右方向移动车辆的机制取决于左侧电机和右侧电机的输出。如果左侧电机处于高位,则汽车将向右移动;如果右侧电机处于高位,则汽车将向左移动。

def left():

GPIO.output(in2, GPIO.HIGH)
GPIO.output(in1, GPIO.HIGH)
GPIO.output(en1, GPIO.HIGH)
GPIO.output(in3, GPIO.LOW)
GPIO.output(in4, GPIO.LOW)
GPIO.output(en2, GPIO.LOW)

def right():

GPIO.output(in3, GPIO.HIGH)
GPIO.output(in4, GPIO.HIGH)
GPIO.output(en2, GPIO.HIGH)
GPIO.output(in2, GPIO.LOW)
GPIO.output(in1, GPIO.LOW)
GPIO.output(en1, GPIO.LOW)