三、高級方法(Advanced Recipes)

學習目錄:樹莓派學習之路-GPIO Zero

官網地址: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(還沒有)訪問。

相關文章
相關標籤/搜索