2016-10-27 5 views
2

나는 라즈베리 파이 제로가있는 PiCar를 제작 중입니다. 나는 두 개의 DC 모터를 연결하는 L293D 칩셋을 사용하고 난 모든이 가이드에 따라 작업이 있습니다 라스베리 파이 카 스티어링

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

은 현재 내가 왼쪽과 오른쪽, 뒤로, 앞으로 자동차를 구동하는 기본적인 스크립트를 작성했습니다. 그러나 몇 가지 문제가 있습니다. 먼저 전진 또는 후진하지 않고 차를 좌우로 조종 할 수 있습니까? 또한 내가 어떻게 wasd의 주요 보도와 함께 자동차를 조종하고 cntrl 키를 사용하여 가속시킬 수 있습니까? 액셀러레이터를 움직이는 자동차 게임과 같이 조종하는 것이 얼마나 힘들겠습니까?하지만 풀어 놓으면 속도가 느려 집니까? 여기에 내가 현재 가지고있는 코드가 있지만 매번 Enter를 눌러야합니다.

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

답변

0

인터넷을 트롤링 한 후 Robot Car - Python 프로그램에서 훌륭한 해결책을 찾았습니다. L293D에서도 작동합니다. 테스트를 거쳐 확인할 수 있습니다.

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

+0

멋지다. 나는 그것에 대해서도 살펴볼 것이다. – Hacky

1
  1. PiCar.py 당신이 파이 게임을 사용할 수 있습니다 아무것도 누르지 않은 경우에도 응용 프로그램이 계속해야합니다. 저수준 키 값을 읽고 get_pressed() 함수는 그 순간에 눌려진 키 배열을 반환합니다.

  2. get_mods()이 같은 CTRL 키 상태를 반환합니다 기능 :

    개조 & KMOD_CTRL 경우 :

  3. 계정에 가속을 위해 당신이 속도 조절을 유지하고 가속도와 그 값을 증가시킬 수있다 값은 수 밀리 초마다 정방향 키가 눌러져있는 동안 유지됩니다. 누르지 않은 상태에서 속도가 0이 될 때까지 속도를 내립니다.

  4. 앞으로 이동하고 동시에 돌리면 왼쪽 휠에 100, 오른쪽 휠에 50을 보낼 수 있습니다. A 또는 D 키를 길게 누르면 조종간이 길어 지도록 위와 같은 가속 트릭을 할 수 있습니다.
+0

당신은이 작업을 수행하는 방법을 설명하는 몇 가지 psuedocode을 쓸 수 있습니까? 가져올 라이브러리를 알려주십시오. 키가 눌려져 있는지 파이썬이 어떻게 확인합니까? – Magearlik

+0

라이브러리 파이 게임이 필요합니다. 파이 게임은 글자 그대로 키보드의 스캔 코드를 검사하며 어떤 언어 나 키보드 레이아웃도 고려하지 않습니다. – Hacky

+0

라이브러리 파이 게임이 필요합니다. 파이 게임은 글자 그대로 키보드의 스캔 코드를 검사하며 어떤 언어 나 키보드 레이아웃도 고려하지 않습니다.(이 목적을 위해 좋은 점) raw_input 행을 제거하면 스크립트가 계속 실행됩니다.() 중지 : \t 속도 = 200 개 \t 전달()'는 PWM 문 후 , ELIF를 추가 pygame.get_mods() KMOD_CTRL이 경우 가': 그럼 당신은 이런 일에 방향 값을 확인 모든 라인을 변경 ; 키를 누르지 않으면 멈추게됩니다. 이것들은 당신을 다시 가게하는 방향입니다. 언제든지 구체적으로 물어보십시오. – Hacky

0

자동차의 왼쪽 운동의 경우,

좌우 방향으로 차를 이동하는 메커니즘은 왼쪽 metor과 오른쪽 모터의 출력의 따라 다음과 같은 코드를 사용할 수 있습니다. 왼쪽 모터가 높으면 자동차가 오른쪽 방향으로 움직이고 오른쪽 모터가 높으면 자동차가 왼쪽 방향으로 움직입니다.

데프() 왼쪽 :

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) 
관련 문제