结合重复的用户输入来控制while循环

2024-09-29 21:39:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我是编程新手,正在使用Python/pyfirmata通过我的arduino控制一个小伺服电机。我让马达按我想要的方式工作:它每3秒钟旋转x度。问题是,我希望它一直这样做,直到用户输入告诉它停止

下面的代码将持续请求用户输入,这(如果按下1+ENTER)会导致电机转动3次,然后再次请求用户输入。我想不出一个办法,让电机在这些位置连续运行,同时能够采取用户输入停止电机

换一种方式说,这就是我想做的: 电机关闭,请求用户输入。 用户按下1+回车键,电机开始在各个位置循环。如果用户按下2+回车键,电机停止。如果用户再次按1+回车键,电机将再次开始循环。看起来很简单,希望如此

我的当前代码:

from pyfirmata import SERVO
from pyfirmata import Arduino

board = Arduino("COM4")
board.digital[10].mode = SERVO
servo1 = board.get_pin('d:10:0')

while True:
  user_control = input('Enter 1 to start motor and 2 to stop motor \n')
  if user_control == '1':
    servo1.write(45)
    time.sleep(3)
    servo1.write(90)
    time.sleep(3)
    servo1.write(180)
    time.sleep(3)
  elif user_control == '2':
    servo1.write(45)
    print('motor paused')

Tags: 代码用户fromboardtime方式sleepcontrol
1条回答
网友
1楼 · 发布于 2024-09-29 21:39:06

感谢大家的投入。我现在已经按我想要的方式工作了。最后,我创建了一个线程来运行user_input函数,并threading.Timer使其循环,以便每1秒提供一次新的输入。该线程的输出在arduino上设置一个pin值,该值确定控制电机的while loop是否运行,从而使电机转动。再次感谢!我的代码在下面

from pyfirmata import SERVO
from pyfirmata import Arduino, util
import threading
import time

board = Arduino("COM4")
board.digital[10].mode = SERVO
servo1 = board.get_pin('d:10:o')
LED = board.get_pin('d:8:o')
servo1.write(15)


def user_input():
    userinput = input('Press 1 or 2\n')
    if userinput == '1':
        return board.digital[7].write(1)
    elif userinput == '2':
        return board.digital[7].write(0)
    elif userinput != "1" or "2":
        input('Press 1 or 2\n')

t1 = threading.Thread(user_input())
threading.Timer(1,user_input).start()

def autorun():
    while board.digital[7].read() == 1:
        servo1.write(45)
        time.sleep(2)
        servo1.write(90)
        time.sleep(2)
        servo1.write(180)
        time.sleep(2)
    if board.digital[7].read() == 0:
        print('automatic run stopped')

autorun()

相关问题 更多 >

    热门问题