I have recently purchase the Pi2go lite by 4tronix. As part of the provided library, you can move forward and back, but this takes place forever, I want, on a keyboard press for that to happen, then when the button is no longer pressed no action occurs. Having done some research this does not see to be a well known process or can be done at all, however my solution would be on a key press, the operation to only occur for half a second, to imitate the process of holding a key. How could this be achieved? Thank you in advanced. Below is the code supplied by the raspberry Pi Guy in GitHub, however once the 'W' key is pressed it is hard to control as it doesn't stop when you let go of the key.
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()
The easiest way is to make a simple python program with a Gtk gui that detects keypress
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()
我有从同一个站点购买的启动项,您可以在pi2go.py中的pi2go.forward(speed)下方的行上添加time.sleep(0.5)半秒,或者在pi2go.py中添加实际的前进功能
This is my code.
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.