官網地址:https://gpiozero.readthedocs.io/en/stable/recipes_advanced.htmlhtml
環境:UbuntuMeta-16.04python
樹莓派:3代B型網絡
如下方法演示了GPIO Zero庫的一些功能。 須要注意的是全部方法都是在 Python 3 的狀況下編寫的。方法可能在 Python 2 沒有用 !app
3.1. LEDBoardpost
你能夠循環LEDBoard的對象,LEDBoard的對象爲LED集合:學習
from gpiozero import LEDBoard from time import sleep leds = LEDBoard(5, 6, 13, 19, 26) for led in leds: led.on() sleep(1) led.off()
LEDBoard一樣支持索引。 這意味着可使用 leds [i] 訪問各個LED對象,其中 i 是從0到LED集合的數量:測試
from gpiozero import LEDBoard from time import sleep leds = LEDBoard(2, 3, 4, 5, 6, 7, 8, 9) leds[0].on() # first led on sleep(1) leds[7].on() # last led on sleep(1) leds[-1].off() # last led off sleep(1)
這也意味着你可使用切片來訪問LED的子集:ui
from gpiozero import LEDBoard from time import sleep leds = LEDBoard(2, 3, 4, 5, 6, 7, 8, 9) for led in leds[3:]: # leds 3 and onward led.on() sleep(1) leds.off() for led in leds[:2]: # leds 0 and 1 led.on() sleep(1) leds.off() for led in leds[::2]: # even leds (0, 2, 4...) led.on() sleep(1) leds.off() for led in leds[1::2]: # odd leds (1, 3, 5...) led.on() sleep(1) leds.off()
LEDBoard對象能夠在構造時命名其LED對象。 這意味着能夠經過名稱訪問各個LED:url
from gpiozero import LEDBoard from time import sleep leds = LEDBoard(red=2, green=3, blue=4) leds.red.on() sleep(1) leds.green.on() sleep(1) leds.blue.on() sleep(1)
LEDBoard對象也能夠嵌套在其餘LEDBoard對象中:spa
from gpiozero import LEDBoard from time import sleep leds = LEDBoard(red=LEDBoard(top=2, bottom=3), green=LEDBoard(top=4, bottom=5)) leds.red.on() ## both reds on sleep(1) leds.green.on() # both greens on sleep(1) leds.off() # all off sleep(1) leds.red.top.on() # top red on sleep(1) leds.green.bottom.on() # bottom green on sleep(1)
3.2. Who’s home indicator
使用多組綠 - 紅LED燈對,你能夠經過哪些能夠成功ping通的IP地址來判斷誰家的網絡狀態。 須要注意的是,這是假設每一個人的移動電話在家庭路由器上都有一個保留的IP地址。
from gpiozero import PingServer, LEDBoard from gpiozero.tools import negated from signal import pause status = LEDBoard( mum=LEDBoard(red=14, green=15), dad=LEDBoard(red=17, green=18), alice=LEDBoard(red=21, green=22) ) statuses = { PingServer('192.168.1.5'): status.mum, PingServer('192.168.1.6'): status.dad, PingServer('192.168.1.7'): status.alice, } for server, leds in statuses.items(): leds.green.source = server.values leds.green.source_delay = 60 leds.red.source = negated(leds.green.values) pause()
或者,使用STATUS Zero board:
from gpiozero import PingServer, StatusZero from gpiozero.tools import negated from signal import pause status = StatusZero('mum', 'dad', 'alice') statuses = { PingServer('192.168.1.5'): status.mum, PingServer('192.168.1.6'): status.dad, PingServer('192.168.1.7'): status.alice, } for server, leds in statuses.items(): leds.green.source = server.values leds.green.source_delay = 60 leds.red.source = negated(leds.green.values) pause()
3.3. Travis build LED indicator(使用Travis構建LED指示燈)
使用LED組合展現Travis構建的狀態。 綠燈表示測試正在經過,紅燈表示構建已損壞:
from travispy import TravisPy from gpiozero import LED from gpiozero.tools import negated from time import sleep from signal import pause def build_passed(repo): t = TravisPy() r = t.repo(repo) while True: yield r.last_build_state == 'passed' red = LED(12) green = LED(16) green.source = build_passed('RPi-Distro/python-gpiozero') green.source_delay = 60 * 5 # check every 5 minutes red.source = negated(green.values) pause()
注意:這個方法須要travispy。 使用sudo pip3 install travispy安裝。
3.4. Button controlled robot(按鈕控制機器人)
除了簡單方法中的示例以外,你還可使用四個按鈕指定機器人方向,並添加第五個按鈕來依次讓他們運行,如Bee-Bot或Turtle robot。
from gpiozero import Button, Robot from time import sleep from signal import pause robot = Robot((17, 18), (22, 23)) left = Button(2) right = Button(3) forward = Button(4) backward = Button(5) go = Button(6) instructions = [] def add_instruction(btn): instructions.append({ left: (-1, 1), right: (1, -1), forward: (1, 1), backward: (-1, -1), }[btn]) def do_instructions(): instructions.append((0, 0)) robot.source_delay = 0.5 robot.source = instructions sleep(robot.source_delay * len(instructions)) del instructions[:] go.when_pressed = do_instructions for button in (left, right, forward, backward): button.when_pressed = add_instruction pause()
3.5. Robot controlled by 2 potentiometers(由2個電位器控制機器人)
使用兩個電位計來控制機器人的左右電機速度:
from gpiozero import Robot, MCP3008 from signal import pause robot = Robot(left=(4, 14), right=(17, 18)) left = MCP3008(0) right = MCP3008(1) robot.source = zip(left.values, right.values) pause()
注意:上面的示例須要在 Python 3 環境中運行。在Python 2中,zip()不支持延遲反饋,所以腳本將掛起。
要包括反方向,請將電位計值從 0-1擴展到 -1-1:
from gpiozero import Robot, MCP3008 from gpiozero.tools import scaled from signal import pause robot = Robot(left=(4, 14), right=(17, 18)) left = MCP3008(0) right = MCP3008(1) robot.source = zip(scaled(left.values, -1, 1), scaled(right.values, -1, 1)) pause()
3.6. BlueDot LED
BlueDot是一個Python應用程序,它容許你輕鬆地將藍牙控件添加到你的 Raspberry Pi 項目中。
使用BlueDot應用程序控制LED的簡單示例:
from bluedot import BlueDot from gpiozero import LED bd = BlueDot() led = LED(17) while True: bd.wait_for_press() led.on() bd.wait_for_release() led.off()
注意:此方法須要bluedot和相關的Android應用程序。 有關安裝說明,請參閱BlueDot文檔。
3.7. BlueDot robot(BlueDot機器人)
你能夠建立一個藍牙控制的機器人,當按下該按鈕時它向前移動並在釋放時中止:
from bluedot import BlueDot from gpiozero import Robot from signal import pause bd = BlueDot() robot = Robot(left=(4, 14), right=(17, 18)) def move(pos): if pos.top: robot.forward(pos.distance) elif pos.bottom: robot.backward(pos.distance) elif pos.left: robot.left(pos.distance) elif pos.right: robot.right(pos.distance) bd.when_pressed = move bd.when_moved = move bd.when_released = robot.stop pause()
或者更高級的例子,包括控制機器人的速度和精確的方向:
from gpiozero import Robot from bluedot import BlueDot from signal import pause def pos_to_values(x, y): left = y if x > 0 else y + x right = y if x < 0 else y - x return (clamped(left), clamped(right)) def clamped(v): return max(-1, min(1, v)) def drive(): while True: if bd.is_pressed: x, y = bd.position.x, bd.position.y yield pos_to_values(x, y) else: yield (0, 0) robot = Robot(left=(4, 14), right=(17, 18)) bd = BlueDot() robot.source = drive() pause()
3.8. Controlling the Pi’s own LEDs(控制 Pi 本身的LED組)
在 Pi 的某些型號(特別是型號A +,B +和2B)上,能夠控制 Pi 的功率和活動LED組。 這對於測試GPIO功能很是有用,無需鏈接本身的LED組(也頗有用,由於電源和活動的LED是「已知良好」)。
首先,你須要禁用內置LED組的經常使用觸發器。 這能夠經過如下命令在終端完成:
$ echo none | sudo tee /sys/class/leds/led0/trigger $ echo gpio | sudo tee /sys/class/leds/led1/trigger
如今你可使用 gpiozero 控制LED組,以下所示:
from gpiozero import LED from signal import pause power = LED(35) # /sys/class/leds/led1 activity = LED(47) # /sys/class/leds/led0 activity.blink() power.blink() pause()
要將LED組恢復到正常狀況,你能夠從新啓動Pi或運行如下命令:
$ echo mmc0 | sudo tee /sys/class/leds/led0/trigger $ echo input | sudo tee /sys/class/leds/led1/trigger
注意:
在Pi Zero上,你可使用此方控制活動的LED組,但沒有單獨的電源LED可供控制(還值得注意的是活動的LED組處於低電平狀態有效,所以在構建本身的LED組時設置active_high = False)。
在原始Pi 1(型號A或B)上,可使用GPIO16控制活動的LED組(在如上所述禁用其觸發後),但電源的LED是經過硬接線實現的。
在Pi 3B上,LED組由GPIO擴展器控制,該擴展器沒法從gpiozero(還沒有)訪問。