Search code examples
pythonraspberry-pipivotcurses

Why do I have to click the arrow keys 3 times for the the servo to move?


I’m currently using a pivot pi to rotate a servo by clicking either the up or down arrow key but for some reason I have to click the up arrow key three times for it to move (same with the down arrow key) and I don’t know why, I just want to make it so that I have to just click it once for the servo to move.

from pivotpi import *
from time import sleep
import curses
stdscr = curses.initscr()
curses.cbreak()
stdscr.keypad(1)
stdscr.refresh()
key = ""
mp = PivotPi()
a = 0
while key != ord("e"):
    key = stdscr.getch()
    stdscr.refresh()
    mp.angle(SERVO_1, a)
    if key == curses.KEY_UP: #close
        a += 180
        print(a)
    elif key == curses.KEY_DOWN: #open
        a -= 180
        print(a)
curses.endwin()

Solution

  • I'll assume these characteristics from your code are unintentional:

    • mp.angle is always called when any key except [e] is pressed.
    • The value passed to mp.angle is always one keypress behind the printed angle.
      • The initial value of a is only passed after the first keypress.

    These could be fixed as follows:

    from pivotpi import *
    from time import sleep
    import curses
    stdscr = curses.initscr()
    curses.cbreak()
    stdscr.keypad(1)
    stdscr.refresh()
    key = ""
    mp = PivotPi()
    a = 0
    mp.angle(SERVO_1, a) # initialise before listening for keypresses
    while key != ord("e"):
        key = stdscr.getch()
        stdscr.refresh()
        if key == curses.KEY_UP: #close
            a += 180
        elif key == curses.KEY_DOWN: #open
            a -= 180
        else:
            continue
        print('\r\n%d\r' % a) # print to the left side of the terminal
        mp.angle(SERVO_1, a)
    curses.endwin()