2016-10-27 6 views
2

私は、ラズベリーパイゼロとPiCarを構築しています。私は2つのDCモータを接続するためにL293Dチップセットを使用していると私はすべてが、このガイドに従って作業してい:ラズベリーパイ車ステアリング

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

現在、私は、後方左右、前方の車を駆動するための初歩的なスクリプトを書かれています。しかし、いくつかの問題があります。前方または後方に最初に移動することなく、車を左右に操縦するにはどうすればいいですか?また、どうやってキーを押して車を操縦し、おそらく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

[OK]を私はここでロボットの車 - Pythonプログラムの下で素晴らしい解決策を見つけたインターネットをトローリング。 L293Dでも動作します。テストして確認することができます。

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

+0

クール、私もそれを調べるつもりです。 – Hacky

1
  1. PiCar.pyはあなたがpygameのを使用することができ、何も押さない場合でも、アプリケーションは継続しています。低レベルのキー値を読み込み、get_pressed()関数はその時点で押されているキーの配列を返します。

  2. get_mods()のようにCTRLキーの状態を返す関数:

    改造& KMOD_CTRL場合:

  3. は、アカウントに加速を取るためにあなたはスピード変数を保持し、加速してその値を増やすことができます前方キーが押されている間、数ミリ秒ごとに値を入力します。それが押されていないときは、0になるまで速度を下げてください。

  4. 同時に進むと、左の車輪に100の値、右の車輪に50の値を送ることができます。 AまたはDキーを長押しすると、ステアリングが長くなるように、上記と同じ加速トリックを行うことができます。
+0

は、あなたがこれを行う方法を説明するいくつかの擬似コードを書くことができますか?どのライブラリをインポートする必要があるか教えてください。キーが押されているかどうかをPythonがどのようにチェックしますか? – Magearlik

+0

ライブラリのpygameが必要です。 Pygameはキーボードのスキャンコードを文字通りチェックし、言語やキーボードレイアウトは考慮しません。 – Hacky

+0

ライブラリのpygameが必要です。 Pygameはキーボードのスキャンコードを文字通りチェックし、言語やキーボードレイアウトは考慮しません。(この目的のために良いことです) raw_input行を削除すると、スクリプトは継続して実行されます。 elifを追加し、PWM文の後 \tスピード= 200 \t転送() ' : '場合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) 
関連する問題