zoukankan      html  css  js  c++  java
  • 3、高级方法(Advanced Recipes)

    学习目录:树莓派学习之路-GPIO Zero

    官网地址:https://gpiozero.readthedocs.io/en/stable/recipes_advanced.html

    环境:UbuntuMeta-16.04

    树莓派:3代B型

    以下方法演示了GPIO Zero库的一些功能。 需要注意的是所有方法都是在 Python 3 的情况下编写的。方法可能在 Python 2 没有用 !

    3.1. LEDBoard

    你可以循环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的子集:

    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:

    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对象中:

    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(尚未)访问。

  • 相关阅读:
    hanoi(老汉诺塔问题新思维)
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    ABP文档
    ABP框架
  • 原文地址:https://www.cnblogs.com/little-kwy/p/9490188.html
Copyright © 2011-2022 走看看