学习目录:树莓派学习之路-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(, , , , ) for led in leds:
led.on()
sleep()
led.off()

LEDBoard同样支持索引。 这意味着可以使用 leds [i] 访问各个LED对象,其中 i 是从0到LED集合的数量:

from gpiozero import LEDBoard
from time import sleep leds = LEDBoard(, , , , , , , ) leds[].on() # first led on
sleep()
leds[].on() # last led on
sleep()
leds[-].off() # last led off
sleep()

这也意味着你可以使用切片来访问LED的子集:

from gpiozero import LEDBoard
from time import sleep leds = LEDBoard(, , , , , , , ) for led in leds[:]: # leds and onward
led.on()
sleep()
leds.off() for led in leds[:]: # leds and
led.on()
sleep()
leds.off() for led in leds[::]: # even leds (, , ...)
led.on()
sleep()
leds.off() for led in leds[::]: # odd leds (, , ...)
led.on()
sleep()
leds.off()

LEDBoard对象可以在构造时命名其LED对象。 这意味着可以通过名称访问各个LED:

from gpiozero import LEDBoard
from time import sleep leds = LEDBoard(red=, green=, blue=) leds.red.on()
sleep()
leds.green.on()
sleep()
leds.blue.on()
sleep()

LEDBoard对象也可以嵌套在其他LEDBoard对象中:

from gpiozero import LEDBoard
from time import sleep leds = LEDBoard(red=LEDBoard(top=, bottom=), green=LEDBoard(top=, bottom=)) leds.red.on() ## both reds on
sleep()
leds.green.on() # both greens on
sleep()
leds.off() # all off
sleep()
leds.red.top.on() # top red on
sleep()
leds.green.bottom.on() # bottom green on
sleep()

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=, green=),
dad=LEDBoard(red=, green=),
alice=LEDBoard(red=, green=)
) 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 =
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 =
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()
green = LED() green.source = build_passed('RPi-Distro/python-gpiozero')
green.source_delay = * # check every 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((, ), (, )) left = Button()
right = Button()
forward = Button()
backward = Button()
go = Button() instructions = [] def add_instruction(btn):
instructions.append({
left: (-, ),
right: (, -),
forward: (, ),
backward: (-, -),
}[btn]) def do_instructions():
instructions.append((, ))
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=(, ), right=(, )) left = MCP3008()
right = MCP3008() 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=(, ), right=(, )) left = MCP3008()
right = MCP3008() robot.source = zip(scaled(left.values, -, ), scaled(right.values, -, )) pause()

3.6. BlueDot LED

BlueDot是一个Python应用程序,它允许你轻松地将蓝牙控件添加到你的 Raspberry Pi 项目中。

使用BlueDot应用程序控制LED的简单示例:

from bluedot import BlueDot
from gpiozero import LED bd = BlueDot()
led = LED() 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=(, ), right=(, )) 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 > else y + x
right = y if x < else y - x
return (clamped(left), clamped(right)) def clamped(v):
return max(-, min(, 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 (, ) robot = Robot(left=(, ), right=(, ))
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() # /sys/class/leds/led1
activity = LED() # /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(尚未)访问。

3、高级方法(Advanced Recipes)的更多相关文章

  1. R语言实战(十)处理缺失数据的高级方法

    本文对应<R语言实战>第15章:处理缺失数据的高级方法 本文仅在书的基础上进行简单阐述,更加详细的缺失数据问题研究将会单独写一篇文章. 处理缺失值的一般步骤: 识别缺失数据: 检查导致数据 ...

  2. R in action读书笔记(20)第十五章 处理缺失数据的高级方法

    处理缺失数据的高级方法 15.1 处理缺失值的步骤 一个完整的处理方法通常包含以下几个步骤: (1) 识别缺失数据: (2) 检查导致数据缺失的原因: (3) 删除包含缺失值的实例或用合理的数值代替( ...

  3. Welcome-to-Swift-24高级运算符(Advanced Operators)

    除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会 ...

  4. C# - 高级方法参数

    可选参数 -必须有个默认值,默认值必须是字面值,常量值,新对象实例或者默认值类型值. public List<string> GetWords( string sentence, bool ...

  5. 05JS高级 方法没有块级作用域

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. sublime 快速安装多个插件的两种方法[Advanced Install Package]与[Package Control.sublime-settings]

    环境 sublime 3,目前官网下载的sublime3 已经支持自动安装 Package Control . 第一种: ctrl+shift+p 调出命令面板以后 以前都是使用 Package Co ...

  7. jQuery笔记之工具方法—高级方法Ajax

    $.ajxa() ——基本使用 前提:先了解js的执行机制 $.Callbacks()——回调 $.Deferred()——异步 $.when() 网络服务器链接由<渡一教育>提供 --- ...

  8. (数据科学学习手札58)在R中处理有缺失值数据的高级方法

    一.简介 在实际工作中,遇到数据中带有缺失值是非常常见的现象,简单粗暴的做法如直接删除包含缺失值的记录.删除缺失值比例过大的变量.用0填充缺失值等,但这些做法会很大程度上影响原始数据的分布或者浪费来之 ...

  9. 吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法(续一)

    #-----------------------------------# # R in Action (2nd ed): Chapter 18 # # Advanced methods for mi ...

随机推荐

  1. wamp 增加mongodb拓展 安装

    安装环境: windows 7 64bit php 5.5.12 确认环境参数: 1.在phpinfo() 中查看compiler 2.在phpinfo() 中查看thread safety,线程是否 ...

  2. (转)Hadoop Combiner

    转自:http://blog.csdn.net/jokes000/article/details/7072963 众所周知,Hadoop框架使用Mapper将数据处理成一个<key,value& ...

  3. codeforces 1283D. Christmas Trees(bfs)

    链接: https://codeforces.com/contest/1283/problem/D 题意:给定n个不同的整数点,让你找m个不同的整数点,使得这m个点到到这n个点最小距离之和最小. 思路 ...

  4. 第五篇,理解JS模块化编程思想

    模块化编程 ·模块化编程是一种处理复杂系统分解成更好的可管理模块的方式,它可以把系统代码划分为职责单一高度解耦切可替代的模块. ·系统中某一部分的变化将如何影响其他部分就会变得显而易见,系统的可维护性 ...

  5. WEB-INF目录与META-INF目录的作用(转载)

    /WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/包含了站点所有用的 class 文件,包括 ser ...

  6. PHP 源码 — intval 函数源码分析

    PHP 源码 - intval 函数源码分析 文章来源: https://github.com/suhanyujie/learn-computer/ 作者:suhanyujie 基于PHP 7.3.3 ...

  7. AcWing 338. 计数问题

    #include <iostream> #include <algorithm> #include <vector> using namespace std; ; ...

  8. php设计模式之责任链模式实现举报功能实例代码

    html <html> <head> <meta charset="UTF-8"> <title>责任链模式</title&g ...

  9. 题解【洛谷P2668】[NOIP2015]斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...

  10. GoAhead WebServer 架构

    https://blog.csdn.net/jungsagacity/article/details/7307012