Python - 用中断直接驾驶

时间:2018-05-15 21:52:21

标签: python raspberry-pi interrupt driving-directions

现在我正在将Raspberry Pi连接到带有光传感器的两个直流电机上,每当有一个带孔的塑料轮通过它时,它会向Raspberry发送信号。

因为电动机不是同样强大,所以当我将它们都放在全功率状态时它们会产生曲线。我希望机器人能够直线行驶。我想用光传感器和中断来存档。
我打算这样做:两个电机同时启动,一个光传感器被触发后就会发生中断。在这个中断变量里面应该改变。在循环中有一个if问题,当触发中断时电机停止。电机停止,直到另一个车轮触发中断为止。
基本上是这样的:左电机触发中断
右电机触发中断
等等。
如果两者都继续,那么轮子应该停止并在正确的时间开始,这样机器人就会直线行驶。
这是我的Python代码:

def interrupt_routinerechts(callback):
    global zaehler_r
    global zaehler_l
    print "Interrupt Rechts"
    zaehler_r = 1
    zaehler_l = 2

def interrupt_routinelinks(callback):
    global zaehler_l
    global zaehler_r
    print "Interrupt Links"
    zaehler_l = 1
    zaehler_r = 2

GPIO.add_event_detect(4, GPIO.FALLING, callback=interrupt_routinerechts)
GPIO.add_event_detect(6, GPIO.FALLING, callback=interrupt_routinelinks)

print "Los Geht's"

runProgram = True

while runProgram:
    try:
    forward()

    if zaehler_r == 1:
         stoppr()
    elif zaehler_r == 2:
     forwardr()

    if zaehler_l == 1:
     stoppl()
    elif zaehler_l == 2:
     forwardl()

    except KeyboardInterrupt:
        print "Exception thrown -> Abort"
    runProgram = False
    GPIO.cleanup()


GPIO.cleanup()



我的问题是中断不会触发我的想象,所以机器人在曲线上行驶。这就是它们被触发的方式。 “中断链接”表示“中断左”,“中断重置”表示“中断右” enter image description here



如果不够清楚,这就是我对光传感器和塑料轮的意思。 enter image description here

1 个答案:

答案 0 :(得分:0)

您的代码的问题在于您只有2个状态,在一种状态下机器人向左转,在另一种状态下机器人向右转。

您需要重新编写代码才能为每个车轮配备一个计数器。如果任何一个计数器较高,机器人应关闭指定的电机。如果两个计数器相等,机器人应该打开两个电机。

试试这个:

def interrupt_right(callback):
    global right_counter
    print "Interrupt Right"
    right_counter=right_counter+1

def interrupt_left(callback):
    global left_counter
    print "Interrupt left"
    left_counter=left_counter+1

global left_counter=0
global right_counter=0
GPIO.add_event_detect(4, GPIO.FALLING, callback=interrupt_right)
GPIO.add_event_detect(6, GPIO.FALLING, callback=interrupt_left)

print "Los Geht's"

runProgram = True

while runProgram:
    try:
        if right_counter==left_counter:
            forward()
        elif right_counter>left_counter:
            stop_right()
            start_left()
        elif left_counter>right_counter:
            stop_left()
            start_right()

    except KeyboardInterrupt:
        print "Exception thrown -> Abort"
    runProgram = False
    GPIO.cleanup()


GPIO.cleanup()

我希望这会有所帮助。