【问题标题】:Steering a Raspberry Pi Car驾驶 Raspberry Pi 汽车
【发布时间】:2016-10-27 10:01:49
【问题描述】:

我正在使用 Raspberry Pi Zero 构建 PiCar。我正在使用 L293D 芯片组连接两个直流电机,并且按照本指南进行的所有操作:

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

目前我已经编写了一个用于驾驶汽车向前、向后、向左和向右的基本脚本。但是有几个问题。如何在不先向前或向后移动的情况下向左或向右驾驶汽车。另外,我怎样才能使汽车只需按一下 wasd 键就可以转向,并可能使用 cntrl 键加速?转向有点像汽车游戏,你按住加速器移动但如果你松开它就会减速,这有多困难?这是我目前拥有的代码,但您每次都需要按回车键。

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()

【问题讨论】:

    标签: python raspberry-pi


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

      如果模组和 KMOD_CTRL:

    3. 要考虑加速度,您可以保持一个速度变量,并每隔几毫秒用一个加速度值增加该值,只要按下前进键。未按下时,减速至0。

    4. 要同时前进和转弯,您可以将 pwm 值 100 发送到左轮,将 50 发送到右轮。只要按住 A 或 D 键,您就可以执行与上述相同的加速技巧来增加转向增加。

    【讨论】:

    • 你能写一些伪代码来解释如何做到这一点吗?并告诉我需要导入哪些库。 python如何检查一个键是否被按住?
    • 你需要 pygame 库。 Pygame 从字面上检查键盘的扫描码,不考虑任何语言或键盘布局。
    • 你需要 pygame 库。 Pygame 从字面上检查键盘的扫描码,不考虑任何语言或键盘布局。 (为此目的是一件好事)如果您删除 raw_input 行,脚本将继续运行。然后将检查方向值的每一行更改为如下内容:if pygame.get_mods() & KMOD_CTRL: speed=200 forwards() 在 PWM 语句之后,添加一个 elif:stop();,这样当你根本不按任何键时它就会停止。这些只是让你重新开始的一些方向。请随时提出任何具体问题。
    【解决方案2】:

    好吧,在浏览了互联网之后,我在 Robot Car - Python Programs 下找到了一个很好的解决方案。也适用于 L293D。已测试,可以确认。

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

    【讨论】:

    • 酷,我也要去研究一下。
    【解决方案3】:

    汽车左移,可以使用以下代码

    小车左右移动的机构取决于左电机和右电机的输出。左电机高时小车右转,右电机高时小车左转。

    定义左():

    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)
    

    定义权():

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2020-06-10
      • 2018-08-26
      相关资源
      最近更新 更多