让电机向前移动一段时间? Raspberry Pi
Getting a motor to move forward for a time duration? Raspberry Pi
我最近购买了 4tronix 的 Pi2go lite。作为提供的库的一部分,您可以向前和向后移动,但我希望这种情况永远发生在按下键盘时发生,然后当不再按下按钮时不会发生任何动作。做了一些研究后,这看起来不是一个众所周知的过程,或者根本无法完成,但是我的解决方案是按键,操作只发生半秒钟,以模仿按住键的过程。这是如何实现的?提前谢谢你。以下是 GitHub 中的 raspberry Pi Guy 提供的代码,但是一旦按下 'W' 键就很难控制,因为它不会在您放开按键时停止。
import pi2go, time
# Reading a button press from your keyboard, don't worry about this too much!
import sys
import tty
import termios
UP = 0
DOWN = 1
RIGHT = 2
LEFT = 3
def readchar():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
if ch == '0x03':
raise KeyboardInterrupt
return ch
def readkey(getchar_fn=None):
getchar = getchar_fn or readchar
c1 = getchar()
if ord(c1) != 0x1b:
return c1
c2 = getchar()
if ord(c2) != 0x5b:
return c1
c3 = getchar()
return ord(c3) - 65 # 0=Up, 1=Down, 2=Right, 3=Left arrows
speed = 30
pi2go.init()
try:
while True:
keyp = readkey()
if keyp == 'w' or keyp == UP:
pi2go.forward(speed)
print 'Forward', speed
elif keyp == 's' or keyp == DOWN:
pi2go.reverse(speed)
print 'Backward', speed
elif keyp == 'd' or keyp == RIGHT:
pi2go.spinRight(speed)
print 'Spin Right', speed
elif keyp == 'a' or keyp == LEFT:
pi2go.spinLeft(speed)
print 'Spin Left', speed
elif keyp == '.' or keyp == '>':
speed = min(100, speed+10)
print 'Speed+', speed
elif keyp == ',' or keyp == '<':
speed = max (0, speed-10)
print 'Speed-', speed
elif keyp == ' ':
pi2go.stop()
print 'Stop'
elif ord(keyp) == 3:
break
except KeyboardInterrupt:
pi2go.cleanup()
最简单的方法是制作一个简单的 python 程序,带有检测按键的 Gtk gui
import gtk
class DK:
def __init__(self):
window = gtk.Window()
window.add_events(gtk.gdk.KEY_PRESS_MASK)
window.connect("key-press-event", self.forward)
window.show()
def forward(self, widget, event):
if event.keyval == 119: #W key
print "do what you want with this"
forward(100)
else:
stop()
DK()
gtk.main()
我有我从同一个网站购买的 initio 你可以在 pi2go.forward(speed) 下面的行上添加一个 time.sleep(0.5) 半秒,无论是在按键中还是在实际的前进功能中在 pi2go.py
这是我的代码。
elif key == 'w':
speed = min(100, speed+10)
pi2go.forward(speed)
print 'Forward', speed
time.sleep(.100)
pi2go.stop()
elif key == 's':
speed = min(100, speed+10)
pi2go.reverse(speed)
print 'Reverse', speed
time.sleep(.100)
pi2go.stop()
elif key == 'd':
speed = min(100, speed+10)
pi2go.spinRight(speed)
print 'Spin Right', speed
time.sleep(.100)
pi2go.stop()
elif key == 'a':
speed = min(100, speed+10)
pi2go.spinLeft(speed)
print 'Spin Left', speed
time.sleep(.100)
pi2go.stop()
elif key == 'b':
speed = min(100, speed+10)
print 'Speed+', speed
elif key == 'v':
speed = max (0, speed-10)
print 'Speed-', speed
elif key == ' ':
pi2go.stop()
print 'Stop'
elif ord(key) == 3:
break
我最近购买了 4tronix 的 Pi2go lite。作为提供的库的一部分,您可以向前和向后移动,但我希望这种情况永远发生在按下键盘时发生,然后当不再按下按钮时不会发生任何动作。做了一些研究后,这看起来不是一个众所周知的过程,或者根本无法完成,但是我的解决方案是按键,操作只发生半秒钟,以模仿按住键的过程。这是如何实现的?提前谢谢你。以下是 GitHub 中的 raspberry Pi Guy 提供的代码,但是一旦按下 'W' 键就很难控制,因为它不会在您放开按键时停止。
import pi2go, time
# Reading a button press from your keyboard, don't worry about this too much!
import sys
import tty
import termios
UP = 0
DOWN = 1
RIGHT = 2
LEFT = 3
def readchar():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
if ch == '0x03':
raise KeyboardInterrupt
return ch
def readkey(getchar_fn=None):
getchar = getchar_fn or readchar
c1 = getchar()
if ord(c1) != 0x1b:
return c1
c2 = getchar()
if ord(c2) != 0x5b:
return c1
c3 = getchar()
return ord(c3) - 65 # 0=Up, 1=Down, 2=Right, 3=Left arrows
speed = 30
pi2go.init()
try:
while True:
keyp = readkey()
if keyp == 'w' or keyp == UP:
pi2go.forward(speed)
print 'Forward', speed
elif keyp == 's' or keyp == DOWN:
pi2go.reverse(speed)
print 'Backward', speed
elif keyp == 'd' or keyp == RIGHT:
pi2go.spinRight(speed)
print 'Spin Right', speed
elif keyp == 'a' or keyp == LEFT:
pi2go.spinLeft(speed)
print 'Spin Left', speed
elif keyp == '.' or keyp == '>':
speed = min(100, speed+10)
print 'Speed+', speed
elif keyp == ',' or keyp == '<':
speed = max (0, speed-10)
print 'Speed-', speed
elif keyp == ' ':
pi2go.stop()
print 'Stop'
elif ord(keyp) == 3:
break
except KeyboardInterrupt:
pi2go.cleanup()
最简单的方法是制作一个简单的 python 程序,带有检测按键的 Gtk gui
import gtk
class DK:
def __init__(self):
window = gtk.Window()
window.add_events(gtk.gdk.KEY_PRESS_MASK)
window.connect("key-press-event", self.forward)
window.show()
def forward(self, widget, event):
if event.keyval == 119: #W key
print "do what you want with this"
forward(100)
else:
stop()
DK()
gtk.main()
我有我从同一个网站购买的 initio 你可以在 pi2go.forward(speed) 下面的行上添加一个 time.sleep(0.5) 半秒,无论是在按键中还是在实际的前进功能中在 pi2go.py
这是我的代码。
elif key == 'w':
speed = min(100, speed+10)
pi2go.forward(speed)
print 'Forward', speed
time.sleep(.100)
pi2go.stop()
elif key == 's':
speed = min(100, speed+10)
pi2go.reverse(speed)
print 'Reverse', speed
time.sleep(.100)
pi2go.stop()
elif key == 'd':
speed = min(100, speed+10)
pi2go.spinRight(speed)
print 'Spin Right', speed
time.sleep(.100)
pi2go.stop()
elif key == 'a':
speed = min(100, speed+10)
pi2go.spinLeft(speed)
print 'Spin Left', speed
time.sleep(.100)
pi2go.stop()
elif key == 'b':
speed = min(100, speed+10)
print 'Speed+', speed
elif key == 'v':
speed = max (0, speed-10)
print 'Speed-', speed
elif key == ' ':
pi2go.stop()
print 'Stop'
elif ord(key) == 3:
break