Python - движение прямо с прерываниями - PullRequest
0 голосов
/ 16 мая 2018

Прямо сейчас у меня Raspberry Pi, подключенный к двум двигателям постоянного тока с датчиками света, которые посылают сигнал Raspberry каждый раз, когда через них проходит небольшое пластиковое колесо с отверстиями.

Поскольку двигатели неНе одинаково сильны, они повернут изгиб, когда я приведу их обоих в полную силу.Я бы хотел, чтобы робот ехал по прямой.Я хотел заархивировать это с помощью датчиков освещенности и прерываний.
Я планировал сделать это так: Оба двигателя запускаются одновременно, после срабатывания одного датчика освещенности произойдет прерывание.Внутри этого прерывания переменные должны быть изменены.В контуре возникает вопрос, где двигатель останавливается при срабатывании прерывания.Двигатель останавливается до тех пор, пока на другом колесе не сработает прерывание.
По сути, так:
Левый двигатель вызывает прерывание
Правый двигатель вызывает прерывание
и так далее.
Если и то и другое происходит так, что колеса должны останавливаться и запускаться в нужное время, чтобы робот ехал по прямой.
Это мой код 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()



Моя проблема в том, что прерывания не срабатывают так, как я себе это представляю, поэтому робот движется по кривой.Вот как они срабатывают.«Interrupt Links» означает «Interrupt Left», «Interrupt Rechts» означает «Interrupt Right».
enter image description here



Если это было недостаточно ясноЭто то, что я имел в виду с датчиком света и пластиковым колесом.enter image description here

1 Ответ

0 голосов
/ 17 мая 2018

Проблема с вашим кодом состоит в том, что у вас есть только 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()

Надеюсь, это поможет.

...