之前的版本是使用pygame的函式去控制的,缺點是需要視窗化界面的環境.
有人會問說,那為啥在shell mode下執行是可行的.
這需要解釋一下,因為目前Raspberry Pi所提供的OS,看是文字模式,但左上角有出現四顆樹莓吧.且畫面解析度跟螢幕有關.其實這是圖形化界面的sheel mode.也就是俗稱的Frame Buffer.因此上一版的程式會在Frame Buffer下建立一個視窗,但沒有寫結束關閉視窗的控制,所以會有無法離開程式的窘境.這部分未來是可以優化的.
不過當使用putty進行telent 登入後.這時就很殘酷了.那美美的字型跟樹莓圖案都看不到了.
那之前寫的code怎麼辦.的確.在純文字介面下.pygame會無用武之地
因此需要使用curses的函式來取代pygame
定義上 前後左右方向的設定是一樣的 但停車就需要定義按鍵了 在此定義為p
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import curses
# Use physical pin numbers
GPIO.cleanup()
GPIO.setmode(GPIO.BOARD)
# Set up header 4 GPIO pin as an input
PinIN1 = 31 # GPIO6 as IN1
PinIN2 = 33 # GPIO13 as IN2
PinIN3 = 35 # GPIO19 as IN3
PinIN4 = 37 # GPIO26 as IN4
GPIO.setup(PinIN1, GPIO.OUT)
GPIO.setup(PinIN2, GPIO.OUT)
GPIO.setup(PinIN3, GPIO.OUT)
GPIO.setup(PinIN4, GPIO.OUT)
def InitialMoto():
GPIO.output(PinIN1, False)
GPIO.output(PinIN2, False)
GPIO.output(PinIN3, False)
GPIO.output(PinIN4, False)
def TurnRight():
GPIO.output(PinIN1, False)
GPIO.output(PinIN2, True)
GPIO.output(PinIN3, False)
GPIO.output(PinIN4, True)
def TurnLeft():
GPIO.output(PinIN1, True)
GPIO.output(PinIN2, False)
GPIO.output(PinIN3, True)
GPIO.output(PinIN4, False)
def Backward():
GPIO.output(PinIN1, False)
GPIO.output(PinIN2, True)
GPIO.output(PinIN3, True)
GPIO.output(PinIN4, False)
def Fordward():
GPIO.output(PinIN1, True)
GPIO.output(PinIN2, False)
GPIO.output(PinIN3, False)
GPIO.output(PinIN4, True)
def StopMoving():
GPIO.output(PinIN1, False)
GPIO.output(PinIN2, False)
GPIO.output(PinIN3, False)
GPIO.output(PinIN4, False)
print('Start Test')
stdscr = curses.initscr()
stdscr.keypad(1)
stdscr.addstr(0,10,"Hit 'q' to quit")
stdscr.refresh()
key = ''
InitialMoto()
while key != ord('q'):
key = stdscr.getch()
stdscr.addch(20,25,key)
stdscr.refresh()
if key == curses.KEY_DOWN: # Backward
stdscr.addstr(3, 20, "Down")
Backward()
print('Down')
elif key == curses.KEY_UP: # Fordward
stdscr.addstr(2, 20, "Up")
Fordward()
print('Up')
elif key == curses.KEY_RIGHT: # Turn Right
stdscr.addstr(3, 25, "Right")
TurnRight()
print('Right')
elif key == curses.KEY_LEFT: # Turn Left
stdscr.addstr(3, 15, "Left")
TurnLeft()
print('Left')
elif key == ord('p'):
StopMoving()
curses.endwin()
# clock.tick(20)