树莓派4B 更新wiringPi库到2.52的方法

最新发布的树莓派4B在烧录了官方系统buster以后,如果直接使用gpio readall去查看GPIO会出现错误。无法识别的情况,需要根据以下步骤进行wiringPi的更新:

登陆后打开一个终端输入:

cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb

然后再使用

gpio -v

检查版本信息,确保版本为:2.52即可。

然后再执行:gpio readall

这时候就可以继续像往常那样使用GPIO的引脚进行编程了。

我们尝试一下使用gpio 引脚点亮一个LED灯。LED灯接在物理引脚12号,名称GPIO.1 针对WPi 引脚为1, BCM引脚为18号。

编写一个C源码:led.c

调用gcc编译:

gcc -o led -lwiringPi led.c

执行:

./led

终端显示:

由于手头的电阻阻值比较大,效果不明显,所以去掉了电阻,实际上大家应该加个220欧姆的电阻来保护LED。

开源智能家居系统 Home Assistant 从听说到入坑

首先声明一下,感谢来自北京的熊小猫发来的稿件,非常人性化,用了markdown语法,在这里我代表我和52Pi全体编辑向你表示感谢!

和你的座右铭一样,一个脱离了高级趣味的人写的文章一定是有含金量的!!表示1000个赞送给你!

Home Assistant 是什么?

Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. Perfect to run on a Raspberry Pi or a local server.

这是官方的原话,如果你看懂了就懂了,没看懂就听我给你编。说白了就是一款基于 Python3 的开源智能家居系统,非常适合运行在树莓派或本地服务器上。它集成了众多优秀的产品,比如 IFTTT 、 Arduino 、Google Assistant 、 Home Kit 、 MQTT 等。

好了,废话就这么多,让我们动手安装吧。

系统(基于 Python 虚拟环境,硬件 Raspberry Pi )

安装

安装 Python3

sudo apt-get install python3-pip python3-venv

坑:You may also need to install development libraries using 您可能还需要使用安装开发库。在各种文档里,基本都是在说安装Python,几乎没有提及到需要的其他依赖,所以我们需要安装几个依赖包。

sudo apt-get install build-essential libssl-dev libffi-dev python-dev

源替换

由于网络等原因,建议 pip 使用国内镜像,编辑 /etc/pip.conf 文件(据说此文件针对树莓派的)
复制粘贴以下内容并保存:

[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/

创建名为 homeassistant 的用户

sudo useradd -rm homeassistant

创建安装文件夹

cd /srv
sudo mkdir homeassistant
sudo chown homeassistant:homeassistant homeassistant

创建虚拟环境

sudo su -s /bin/bash homeassistant
cd /srv/homeassistant
python3 -m venv .
source bin/activate

安装 Home Assistant

pip3 install homeassistant

初次启动 Home Assistant

hass

等待几分钟让后台下载依赖,之后你便可访问 http://ip:8123,进入 Home Asssitant

自启动

sudo nano -w /etc/systemd/system/home-assistant@homeassistant.service

粘贴一下内容:

[Unit]
Description=Home Assistant
After=network-online.target

[Service]
Type=simple
User=%i
ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"

[Install]
WantedBy=multi-user.target

重新加载进程管理

sudo systemctl --system daemon-reload

启用服务

sudo systemctl enable home-assistant@homeassistant

更新软件版本

进入虚拟环境

sudo su -s /bin/bash homeassistant
cd /srv/homeassistant
source bin/activate

更新

pip3 install --upgrade homeassistant

指定版本

pip3 install homeassistant==X.XX.X

开发版本

pip3 install --upgrade git+git://github.com/home-assistant/home-assistant.git@dev

至此,你的 Home Assistant 系统已经正常的运行起来了,接下来呢?是不是接入硬件或软件了呢?没错!!本节我们从最简单的开始,我们把特斯拉汽车接入进来。首先,我买不起特斯拉,哪位老板可以赞助一台,以便我把这篇文档个写完。言归正传,下一节,我们开始介入各种设备。

编者最后的意思是??特斯拉我们赞助不了,你要不要苏27呢?

USB 接口 GPS 在树莓派上的正确使用姿势~

产品说明:

Gps4.jpg
  • 支持Raspberry Pi型号A,B,A +,B +,Zero,2,3,内置L80-39 GPS芯片。
  • 使用UART或USB通信, 默认波特率 9600bps。
  • USB 接口采用CP2102作为USB转UART桥接芯片,稳定且速度更快。
  • L80-39具有66个搜索通道和22个同步跟踪通道,它可以在室外的最短时间内采集和跟踪卫星。我这里要强烈强调一下, 室内你搜不到星的哦, 一定要在室外,人家手册上这么写,你就去室外操作好吗? 别问为啥, 用脑子想想啊,卫星在天上,你要搜星,你喵在家里搜哪门子的星?

注意 我再次强调该模块适合户外操作。请把Antana(就是传说中的天线)放在露天。


兼容性列表(基本上只要支持串口通信的设备基本上都能支持,例如 各种 MCU, 51 单片机,arduino, 树莓派,香蕉派, Tinker board 等…

  • 兼容性
平台USB端口GPS模块
Raspberry Pi 3型号B Plus
树莓派零
Raspberry Pi零W
Raspberry Pi 3型号B.
Raspberry Pi 2模型B.
Raspberry Pi Model B +

功能

  • -165 dBm灵敏度,1Hz(默认),最高5Hz,66个通道
  • 启动时至少消耗100mA电流。
  • PPS输出可用于与卫星协调时间。
  • 定时精度: 1PPS输出 15ns
  • 内部贴片天线在室外使用时工作良好
  • 金属的SMA连接器用于外部有源天线,可以在室内使用,但是天线必须放置在室外.
  • fix状态LED闪烁,让您知道GPS何时确定当前坐标
  • EASY™,先进的AGPS技术,无需外部存储器
  • 支持时间服务应用程序,可通过PPS同步NMEA功能实现
  • 内置LNA可提高灵敏度
  • RTC电池兼容
  • 1×8公头,USB micro接口
  • 包括CP2102模块串行转换器USB 2.0到TTL UART

参数

类型
卫星66个接受通道,22个跟踪通道
工作电压4.5-5.5V
重量4.35克
最大电流最大100mA
工作温度-40〜+ 85℃
规模16.6x26x18.6(毫米)
全球定位系统L80-M39
贴片天线尺寸15.0 x 15.0 x 4.0mm
位置准确性<2.5M CEP
速度准确度<1.0米/ s的
没有ESEY的暖/冷启动<35S
ESEY热/冷启动<15秒
获取灵敏度-148dBm
跟踪灵敏度-165dBm
更新率1Hz(默认)高达5Hz
波特率4800~115200 bps默认为9600bps
协议NMEA 0183
安装电缆1 * 8堆叠标头USB微数据线
GPS的schama.png

如何连线

第一种方法:


这是使用 usb-to-ttl 的线缆接入 GPS的 Uart 引脚.

Uart风格接法:

由于Raspberry Pi 3,Model B的串口问题,它可能会导致意外问题,我们建议您不要将带有Raspberry Pi的GPS模块直接连接到GPIO引脚。当然,如果你要坚持用,也是可以的,只是需要将树莓派3B 和3B+的蓝牙功能关闭, 然后再将/dev/ttyAMA0设备释放出来,即可用树莓派的 GPIO 引脚和设备通信而不用占用 USB口了,操作步骤我大致讲解一下:

  1. 在树莓派上通过 sudo raspi-config 找到接口设置然后打开串口设备,机器上会出现一个/dev/ttyS0设备.
  2. 在树莓派上编辑/boot/config.txt 配置文件,检查 enable_uart=1 是否存在.
  3. 在树莓派上编辑/boot/cmdline.txt 配置文件,将整行复制后注释掉一行, 并将未注释行的 console=/dev/ttyAMA0, 115200 信息删除.
  4. 重启树莓派并在启动后安装适合自己的串口软件例如 minicom 或者别的.
  • 1.如果是使用一根USB-to-TTL线连接GPS模块和Raspberry Pi,你可以像这张图表一样连线:
GPS模块电线颜色
VCC红线
GND黑丝
TXD绿线
RXD白线
  • 2.重启 Raspberry Pi并登录,如果在桌面环境中使用raspberry Pi,请打开终端并按照后面步骤操作。

USB风格接法:

  • 只需使用microUSB电缆连接Raspberry Pi USB端口和GPS模块,并在Raspberry Pi上供电。
Gps1.jpg

如何使用

1.上电后登录系统。您可以打开终端并输入以下命令来安装GPS模块的包。
sudo apt-get update && sudo apt-get -y install gpsd gpsd-clients python-gps 
2.启动gpsd服务并对其进行控制。
启用它: sudo systemctl enable gpsd.socket 
启动它: sudo systemctl start gpsd.socket 
重新启动它: sudo systemctl restart gpsd.socket 
检查状态: sudo systemctl status gpsd.socket 

4.配置文件是在/ etc / default / gpsd中
修改gpsd的配置文件根据/ dev文件夹中串口的名称修改“DEVICE”参数。
如果通过USB电缆将其连接到Raspberry Pi,通常将其命名为“/ dev / ttyUSB0”。
您可以使用“nano”或“vim.tiny”编辑器来完成它。

我下面是写好的一个例子,我只是用 grep -v “#” /etc/default/gpsd | grep -v “^$” 过滤掉了配置文件中的注释和空行, 你们的配置如果是用 USB 接 micro USB口,然后直接插树莓派的 USB 口的,和我的配置基本是差不多的,除非你树莓派上还接了好多 USB设备,否则默认第一个设备就是/dev/ttyUSB0 , 参数 GPSD_OPTIONS= ” -F /var/run/gpsd.sock” 你这里定义啥名字就用啥名字行么?别乱改..否则找不到文件又是一顿刺挠, 你又要到群里喊叫代码不行,用不了.看仔细了哦~

Gpsconfig4.jpg

重启服务:
sudo systemctl restart gpsd.socket 
最后,使用此命令从GPS模块获取信息。
sudo cgps -s

一般情况下,如果不出幺蛾子,那么你会看到如下的信息,但是如果搜不到卫星的时候也很正常,你以为卫星时时刻刻都在你头顶上呢? 也许它跑开了一会儿,耐心等待, 基本上我们搜星也都是 30 多秒-5 分钟左右很正常, 这是 GPS 不是北斗, 自从美国出了个川普,GPS 就没有好用过….
5. GPS状态如下:

Gpsresult.png

客户端C中的示例代码

#include <gps.h> 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
int main()
{
int rc;
struct timeval tv;
struct gps_data_t gps_data;
if ((rc = gps_open("localhost", "2947", &gps_data)) == -1)
{
printf("code: %d, reason: %s\n", rc, gps_errstr(rc));
return EXIT_FAILURE;
}
gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL);

while (1)
{
/* wait for 2 seconds to receive data */
if (gps_waiting (&gps_data, 2000000))
{
/* read data */
if ((rc = gps_read(&gps_data)) == -1)
{
printf("error occured reading gps data. code: %d, reason: %s\n", rc, gps_errstr(rc));
}
else
{
/* Display data from the GPS receiver. */
if ((gps_data.status == STATUS_FIX) && (gps_data.fix.mode == MODE_2D || gps_data.fix.mode == MODE_3D) && !isnan(gps_data.fix.latitude) && !isnan(gps_data.fix.longitude))
{
/* gettimeofday(&tv, NULL); EDIT: tv.tv_sec isn't actually the timestamp! */

printf("latitude: %f, longitude: %f, speed: %f, timestamp: %lf\n", gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time);
//EDIT: Replaced tv.tv_sec with gps_data.fix.time
}
else
{
printf("no GPS data available\n");
}
}
}
sleep(3);
}
/* When you are done... */
gps_stream(&gps_data, WATCH_DISABLE, NULL);
gps_close (&gps_data);
return EXIT_SUCCESS;
}
  • 编译并运行它。
gcc -o gps gps.c -lm -lgps 
sudo ./gps

GPS客户端的Python解决方案

  • 在Raspberry Pi上用 python 来接受 GPS 数据是最简单的,但是需要你安装一个 pyserial 的模块.

以下是三个如何使用python从连接到Raspberry Pi的GPS接收器获取GPS数据的示例。

思路: 使用GPSD客户端库, 然后手动解析NMEA句子或者使用pynmea2解析NMEA句子,也可以使用GPSD客户端库 

gpsd客户端库基于JSON。JSON对象具有“类”属性(例如TPV,SKY,DEVICE.etc …),可用于过滤不同的信息。
请参阅:[ http://www.catb.org/gpsd/gpsd_json.html | gpsd_json]

  • 本指南介绍了如何在Raspberry Pi上运行gpsd。
  • 下面的示例python脚本在TPV类上过滤,即时间位置速度报告,然后打印出相关信息。
由于 python 代码是需要考虑缩进的.所以我这里就截图给你看了.
下面是另一种方式,需要安装 gps 的库
这个就需要 pyserial 的库, 需要你 pip install pyserial 安装一下.
  • 使用pynmea2解析NMEA句子

下面的python脚本显示了如何通过直接连接到串行接口来访问GPS数据。
它过滤$ GPGGA NMEA句子,然后使用pynmea2来解析数据。
Pynmea2可以安装:

pi@raspberrypi ~ $ pip install pynmea2

这个方法比较简单, 另外还有一种方法就是直接自己解析数据结构,只用一个库,就是 pyserial.
尝试看看,对于其刷新速度,已经在产品特性里面介绍到了很多都是直接来自官方文档的内容,例如串口更新速率从 4800~115200bps ,默认是 9600bps, 更新率 1HZ 默认, 最高到 5Hz, 支持的协议 NMEA 0183 , 你们拿到数据后,如果是要用在一些网站的 api 上,需要转化一下格式的.
这个看 tater.li 之前帖子.

到这里就先告一段落. 下一篇帖子我做一个和高德地图 API 结合的例子.

用树莓派和宜家台灯玩转AR投影黑科技

MAKER:Nord Projects/译:趣无尽 Cherry(转载请注明出处)
这是一款用树莓派(Raspberry Pi)和宜家台灯制作的智能家具,应用 Android Things 系统来实现 AR(增强现实)投影灯。
Nord Projects 表示我们已经制作了一些类似的 AR 智能家具的项目,如:投影给时钟显示约会标记、投影给扬声器显示当前正在播放的歌曲。
在不久的未来,将使用投影来呈现环境信息,以及日常物体中的相关用户界面。与屏幕不同,当台灯的投影不再需要时,它们就会慢慢消失。
这是一个非常明晰的教程,用照片和GIF很好地加以说明。这个项目不需要大量的实践经验,你只需要3D打印出所有组件,将所有的东西组合在一起即可,因为一切都是开源的,感兴趣的趣友们动手试试看吧:)

项目将使用宜家的灯具、激光投影仪和Android things创建一个互联的投影仪。通过配套的应用程序设置迷你的应用程序,在线连接数据反馈并显示预计的用户界面。
改造的核心是Android Things,一款来自Google的新操作系统,专为嵌入式设备和物联网而设计。 Android Things更容易实现软件与设备的连接,尤其是对于已经熟悉Android的移动开发人员!

台灯投影仪使用宜家的Tertial灯现成部件,3D打印附件和我们的开源软件。
如果你以前没有使用过Android的东西也不必担心。 我们将引导你完成这一过程,以便立即启动并运行这个项目。

所需材料

  • 宜家 Tertial 台灯 x1
  • 10mm x 2m编织电缆护套x1
  • 电缆扎带x4
  • M2 x 4mm自攻螺丝钉x6
  • M2.2 x 8mm自攻螺丝钉x3
  • M3 x 20mm自攻螺丝钉x5
  • M48mm翼形螺丝钉x2
  • M410mm螺丝钉x2
  • UO智能光束投影仪x1
  • Raspberry Pi 3 B型x1
  • Raspberry Pi V2相机(可选)x1
  • ADXL345加速传感器x1
  • 母对母跳线(75mm)x4
  • MicroSD卡(大于2GB)x1
  • 直角microHDMI转HDMI高清线 x1
  • 直角(下弯)microUSB延长线x2
  • Micro-USB电源线 6英尺(约183mm)x2
  • 双端口USB电源适配器x1

所需工具

  • 螺丝刀(十字头,型号PH1,PH0)
  • Rasp文件(+副选项)
  • 量角器或数码角度标尺 x1
  • 磨砂纸(80砂砾) x1
  • 烙铁+焊料(刀头可选)
  • 剪切工具(用于切割灯丝,电缆扎带) x1
  • 内六角扳手4(用于灯头平头螺丝+插入尺寸4) x1
  • 类似锥子或螺丝刀这样可以取下灯泡罩的小尖头物品 x1

步骤1:台灯内部的准备工作

1、将电源线从灯中取出
松开灯架侧面的螺丝,然后切断灯头附近的电源线,通过金属手臂将电源线拉出。
2、拆下灯泡附件
使用六角扳手,卸下固定电缆的螺丝。在灯头的侧面插入一把小螺丝刀。 轻轻撬起塑料卡舌以松开插座。 (把它弄松可能有点棘手。)将灯头转过来并取下固定插座的塑料螺丝。 你现在可以取下灯泡附件了。
3、修改灯臂
从手臂上拧下灯头,然后取下塑料夹。将手臂接口的直角磨成到半圆形。
4、夹住灯头
从手臂上拧下灯头。 从金属延伸件上取下所有部件。将金属夹的边缘磨平,使它们均匀平滑。
5、处理塑料垫片
取出从金属附件的塑料垫片。 使用砂纸将其两端磨成约4.5mm厚。处理后的塑料片可以更好地固定金属部件,防止头部随着长时间的使用而滑落。
6、拧紧螺丝
拧紧灯上的所有螺丝钉,使它可以很好地移动。

步骤2:3D打印附件

1、测量灯的角度
每个灯都会不同,所以需要调整CAD模型。 使用量角器或数码角度尺,测量凹槽和灯臂之间的角度。
2、获取CAD
在OnShape中打开CAD模型(开源项目免费使用)。 这是一份公开文件,所以请复印一份供你调整。
3、调整CAD
点击标题为’EDIT THIS – arm pilot holes’的草图。选择上面标有显示的测量值并将数值更改为步骤1中测量的角度。输入后将相应的旋转相关特征。
4、导出你的模型
三个部分中的每一个,右键单击附件名称并导出。 使用以下设置:
格式:STL

  • STL格式:二进制
  • 单位:毫米
  • 分辨率:良好
  • 选项:下载

5、3D打印

使用3D打印机打印文件。我们使用了Ultimaker 2+,但你可以随意使用任何型号的3D打印机。
我们的Ultimaker 2+设置:

  • 材料:PLA
  • 喷嘴:0.4毫米

使用默认设置,微调:

  • 增加10mm的边缘
  • 第一层的喷嘴温度为200°C
  • 剩下部分的喷嘴温度为210°C
  • 打印顶部部件(顶盖和手臂)时,壁厚度设置为3毫米。

步骤3:组装硬件

1、焊接加速度传感器
将一行的9个针头引脚焊接到加速传感器上。确保它们延伸出电路板的正面。
2、嵌入投影机
将投影机按入底座;使它安置妥当。将微型HDMI电缆插入投影机。
3、组装手臂和盖子
使用2 x 20毫米M3螺丝钉将3D打印的手臂连接到配套的盖子上。小心地将手臂的底座与盖子上的定位器对齐。
4、螺纹固定插件
使用六角扳手,将10mm M4螺纹插件拧入臂顶部的两个孔中,直至它们与表面齐平。
5、连接跳线
使用跳线将加速度传感器与Raspberry Pi上的I2C总线连接。务必慢慢来,确保这两个组件安装到的正确引脚上!
6、安装相机(可选)
提起相机连接器上的夹子并插入带状电缆。将夹子向下推,将其固定到位。将相机安装到位。
7、连接树莓派
将Raspberry Pi移动到位并用3个8mm M2.2螺丝固定。
8、连接加速度传感器
使用2个M24毫米螺丝将加速传感器连接到底座。
9、连接盖子和手臂
使用3个20毫米M3螺丝将盖子和手臂连接到底座。
10、HDMI高清线
将HDMI高清线插入Raspberry Pi。

步骤4:接线

1、切割护套
将编织电缆护套切成166CM长。我们建议在烙铁上使用刀具附件以防止电缆护套散开。
2、穿线套
将两根USB电缆穿过编织电缆护套。
3、将电缆传入灯罩内
将Micro-USB电缆的两端插入灯头后部。
4、直角连接器
将电缆穿过3D印刷臂的侧面。 连接直角Micro-USB延长线。 插入USB电源适配器。

步骤5:设置软件

1、 获取Android Things
准备好你的microSD卡,并按照以下步骤操作https://developer.android.com/things/hardware/raspberrypi.html#flashing_the_image 刷新SD卡上的Android Things。
2、启动Android Things
将microSD插入Pi并连接USB电源。
3、设置WiFi
运行“android-things-setup-utility”。出现提示时,选择“2 – 在现有Android Things设备上设置Wifi”,然后选择“1 – Raspberry Pi 3”。接下来,通过网络将Raspberry Pi连接到你的计算机(或路由器),然后按“Enter”键。按照屏幕提示设置WiFi。现在你可以拔掉Raspberry Pi。
4、安装并运行代码

从GitHub下载代码并在Android Studio中打开它。一旦Gradle同步,打开一个终端窗口并输入:
adb连接android.local
然后选择‘things’设置按绿色键为上传并运行代码。
如果获取错误?请查看我们的故障排除指南。

5、给投影机供电
将Micro-USB插入投影机并打开电源。检查显示器,如果以错误的屏幕分辨率启动,灯会自动重启,因此你可能需要等待完成。当你看到启动画面时,你完成了,太棒了!
如遇到问题?请查看我们的故障排除指南

步骤6:组合在一起

1、连接硬件
将组装好的硬件插入灯头。务必检查摄像头和投影机是否垂直对齐。
2、拇指固定螺钉
一旦排好后,用手指固定螺丝。
3、电缆扎带
用小电缆扎带将电缆固定到位。在灯头附近留出足够的余量以便将硬件装入和取出。

步骤7:下一步会是什么?

在手机上安装相应的应用程序(使用Android Studio)并使它与台灯连接。
向下、向前或向上移动台灯,投影画面在默认通道之间切换。
通过点击手机页面上的方向选择来改变频道。
最后下一步
定制你的专属台灯 – 混合搭配宜家灯具部件或喷涂你自己的灯具。按照本指南制作自己的频道。以下是我们想到的一些事情:

  • 桌面上下载你喜欢的新闻软件APP,或者你的WeChat
  • 一个用来逗猫的光点
  • 使用网络摄像头和计算机摄像头用作你的台灯的相机投影系统
  • 尝试处理Android Things

故障排除指南

adb connect android.local返回错误
可能是你的网络无法解析该名称,或者您的设备未连接到WiFi。 打开投影机并查看Android Things Launcher – 它会告诉你本地网络上的IP地址。
如果列出了IP地址,请在终端中输入adb connect <your-device-ip>
如果这不起作用,或者你的设备没有IP地址,那么你的WiFi网络可能不支持此类设备。 尝试再次配置WiFi,如果可能的话,连接到不同的网络。

源代码

所有源码均可在 GitHub 下载,包括用于 Android Things 的源码、运行投影仪和 Android Mobile 相关 APP 源码。
GitHub:https://github.com/nordprojects/lantern
项目主页:http://nordprojects.co/lantern
MAKER 趣无尽页面:http://maker.quwj.com/project/54

使用树莓派构建一个婴儿监视器

香港很湿热,即便是晚上,许多人为了更舒适,在家里也使用空调。当我的大儿子还是一个小婴儿的时候,他卧室的空调还是需要手动控制的,没有温度自动调节的功能。它的控制器只有开或者关,让空调整个晚上持续运行会导致房间过冷,并且也浪费能源和钱。

我决定使用一个基于树莓派的物联网解决方案去修复这个问题。后来我进一步为它添加了一个婴儿监视器插件。在这篇文章中,我将解释我是如何做的,它的代码在 我的 GitHub 页面上。

设计空调控制器

解决我的问题的第一个部分是使用了一个 Orvibo S20 可通过 WiFi 连接的智能插头和智能手机应用程序。虽然这样可以让我通过远程来控制空调,但是它还是手动处理的,而我希望尝试让它自动化。我在 Instructables 上找到了一个满足我的需求的项目:他使用树莓派从一个AM2302 传感器上测量附近的温度和湿度,并将它们记录到一个 MySQL 数据库中。

使用压接头将温度/湿度传感器连接到树莓派的相应 GPIO 针脚上。幸运的是,AM2302 传感器有一个用于读取的 开源软件,并且同时提供了 Python 示例。

与我的项目放在一起的用于 AM2302 传感器 接口的软件已经更新了,并且我使用的原始代码现在应该已经过时了,停止维护了。这个代码是由一个小的二进制组成,用于连接到传感器以及解释读取并返回正确值的 Python 脚本。

将传感器连接到树莓派,这些 Python 代码能够正确地返回温度和湿度读数。将 Python 连接到 MySQL 数据库很简单,并且也有大量的使用 python-mysql 绑定的代码示例。因为我需要持续地监视温度和湿度,所以我写软件来实现这些。

事实上,最终我用了两个解决方案,一是作为一个持续运行的进程,周期性(一般是间隔一分钟)地获取传感器数据,另一种是让 Python 脚本运行一次然后退出。我决定使用第二种方法,并使用 cron 去每分钟调用一次这个脚本。之所以选择这种方法的主要原因是,(通过循环实现的)持续的脚本偶尔会不返回读数,这将导致尝试读取传感器的进程出现堆积,最终可能会导致系统挂起而缺乏可用资源。

我也找到了可以用程序来控制我的智能插头的一个 Perl 脚本。它是解决这种问题所需的一部分,因此当某些温度/湿度达到触发条件,将触发这个 Perl 脚本。在做了一些测试之后,我决定去设计一个独立的 checking 脚本,从 MySQL 去拉取最新的数据,然后根据返回的值去设置智能开关为开或关。将插头控制逻辑与传感器读取脚本分开,意味着它们是各自独立运行的,就算是传感器读取脚本写的有问题也没事。

配置一个打开/关闭空调的温度值是很有意义的,因此,我将这些值转移到控制脚本读取的配置文件中。我也发现,虽然传感器的值一般都很准确,但是,偶尔也会出现返回不正确读数的情况。这个传感器脚本被修改为不向 MySQL 数据库中写入与前值差异非常大的值。同样也在配置文件中写入了连续读取的温度/湿度之间允许的最大差异值,如果读取的值处于这些限制值以外,这些值写不会提交到数据库中。

虽然,做这个自动调节器似乎花费了很多努力,但是,这意味着,记录到 MySQL 数据库的数据是有效的、可用于进一步去分析识别用户使用模式的有用数据。可以用多种图形方式去展示来自 MySQL 数据库中的数据,而我决定使用 Google Chart 在一个 Web 页面上显示数据。

添加一个婴儿监视摄像头

树莓派开放的性能意味着我可以不断地为它增加功能 —— 并且我有大量的未使用的可用 GPIO 针脚。我的下一个创意是去添加一个摄像头模块,将它放在孩子的卧室中,配置它去监视婴儿。

我需要一个能够在黑暗环境中工作的摄像头,而 Pi Noir 摄像头模块是非常适合这种条件的。Pi Noir 除了没有红外过滤之外,同样也是树莓派常用的摄像头模块。这意味着它在白天时的图像可能有点偏紫色,但是它可以在黑暗中借助红外灯来显示图像。

现在我需要一个红外光源。由于树莓派非常流行,并且进入门槛很低,因此它有大量的外围配件和插件。也有适合它的各种红外光源,我注意到的其中一个是 Bright Pi。它可以从树莓派上供电,并且它很适合为树莓派的摄像头模块提供红外光和普通光。它唯一的缺点是太考验我的焊接技能了。

我的焊接技能还是不错的,但是可能花费的时间比其他人更长。我成功地连接了外壳上所有的红外 LEDs,并将它们连接到树莓派的 GPIO 针脚上。这意味着树莓派能够编程控制红外 LED 是否点亮,以及它的亮度。

通过一个 Web 流去公开捕获的视频也很有意义,因为这样我就可以从 Web 页面上查看温度和湿度的读数图表。进一步研究之后,我选择了一个使用 M-JPEG 捕获器的 流软件。通过 Web 页面公开 JPG 源,我可以在我的智能手机上去连接摄像头查看程序,去查看摄像头的输出。

做最后的修饰

没有哪个树莓派项目都已经完成了还没有为它选择一个合适的外壳,并且它有各种零件。在大量搜索和比较之后,有了一个显然的 赢家:SmartPi 的乐高积木式外壳。乐高的兼容性可以让我去安装温度/湿度传感器和摄像头。下面是最终的成果图:

在这以后,我对我的这个作品作了一些改变和更新:

  • 我将它从树莓派 2 Model B 升级到了树莓派 3,这意味着我可以使用 USB WiFi 模块。
  • 我用一个 TP-Link HS110 智能插头替换了 Orvibo S20。
  • 我也将树莓派插到了一个智能插头上,这样我就可以远程重启/重置它了。
  • 我从树莓派上将 MySQL 数据库移走了,它现在运行在一个 NAS 设备上的容器中。
  • 我增加了一个非常 灵活的三角夹,这样我就可以调整到最佳角度。
  • 我重新编译了 USB WiFi 模块,禁用了板载 LED 指示灯,这就是升级到树莓派 3 的其中一个好处。
  • 我因此为我的第二个孩子设计了另外一个监视器。
  • 因为没有时间去折腾,我为我的第三个孩子购买了夜用摄像头。

想学习更多的东西吗?所有的代码都在 我的 GitHub 页面上。

想分享你的树莓派项目吗?将你的故事和创意发送给我们。

via: https://opensource.com/article/18/3/build-baby-monitor-raspberry-pi
作者:Jonathan Ervine 译者:qhwdw 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出

在未经修改的NES主机上玩SNES游戏

模拟器一般是运行在较新的设备上的,用来模拟较旧的设备上的软件。但来自宾夕法尼亚州匹兹堡的计算机科学家Tom Murphy VII通过“逆向模拟”SNES来改变这一过程。他在一个NES设备上成功模拟SNES游戏的运行,其中的关键是通过将树莓派嵌入到NES游戏卡带中来,树莓派模仿SNES游戏,并将图形转换为NES硬件可以显示的形式。至于这么做有什么实际意义?可能并不大,研究纯属好奇和好玩,这就足够了!

汤姆在这个引人入胜的视频中解释了他必须解决的许多技术问题:


该项目需要一个定制的电路板,包括一块树莓派、一个重新编程的NES PPU芯片和一个Nintendo CIC内容保护芯片。

汤姆逆向模拟的关键在于以某种方式欺骗未经修改的NES运行SNES发布冠军超级马里奥世界,他通过将树莓派嵌入到NES游戏卡带中来实现。树莓派模仿SNES游戏,并将图形转换为NES硬件可以显示的形式。

下面的视频制作,更详细地解释了该项目:

 

 

用树莓派自制 MIDI 键盘

MAKER:midiIdentifier/译:趣无尽 Cherry(转载请注明出处)
本教程将手把手教你从零开始自制属于你自己的 MIDI/钢琴/音乐/歌曲键盘。这是一个基于树莓派的开源项目,其中所需的文件在本项目文件库中可以找到。

 

 

如果你是70后、80后,你会认出部分的设计。我们的灵感主要来自Apple II。标志性的特点有底部正面略微向上的角度,以及略微向上倾斜的键盘(如图)。

物件清单

1、树莓派3B型 × 1
2、电容式触摸显示屏7寸× 1(Waveshare 树莓派 3.5英寸触摸屏 TFT LCD(A)320 * 480)
3、扬声器 × 2
4、Midi USB 键盘 × 1
5、胶合板 × 若干(约3mm厚)
6、热熔胶 × 1

软件依赖

在为midiIdentifier安装实际软件之前,首先需要安装许多依赖项。其中大部分都可以使用“apt-get”工具进行安装,该工具预装在每个Raspbian OS发行版上。在下面你可以找到安装相应依赖项所需的特定命令,包括依赖项功能的简要说明。

依赖项说明如下:
1、一个干净的Raspbian OS
2、Fluidsynth合成软件(播放音乐的音频输出和音频生成所需):

sudo apt-get install fluidsynth

从以下URL下载Fluidsynth声音字体:
https://sourceforge.net/p/fluidsynth/wiki/SoundFont/

SOUNDFONT,顾名思义,就是“声音字体”。档案储存为 .SF 或 .SF2。 它是几年前 ( 2000年 & 2001年第二版本 ) 由 新加坡创新公司 Creative Technology 在中档声卡上 (EMU SoundBlaster)使用的音色库技术。它是用字符合成的,一个Sound Fond表现出一组音乐符号。用MIDI键盘输入乐符时,会自动记下MIDI的参数,最后在Sound Fond中查找,当你需要它时,就下载到声卡上。

设置Fluidsynth自动启动:

crontab -e

添加以下行:

@reboot /usr/bin/screen -dm /usr/bin/fluidsynth -a alsa -m alsa_seq -i -s -o "shell.port=9988" -g 2 /FluidR3_GM.sf2

3、安装Py-Audio(各种声音输入和输出功能所需):

sudo apt-get install python3-pyaudio

4、Telnet(需要连接到负责音频输出的Fluidsynth服务器):

sudo apt-get install telnet

5、Screen(作为后台任务所运行的应用程序):

sudo apt-get install screen

6、Git(需要下载midiIdentifier软件/克隆代码库)

sudo apt-get install git

显示设置

需要对 Raspbian OS 初始配置,以便支持触摸屏。具体需要对启动配置文件进行各种更改。请注意,对这些配置文件的随意的更改可能会使树莓派无法正常启动。

1、使用文本编辑器(nano)打开启动配置文件。需要root权限(sudo)才能对文件进行更改。用于打开和编辑文件的命令如下:

sudo nano /boot/config.txt

添加以下行(如果已存在,请删除现有行)

max_usb_current=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0
hdmi_drive=1

请注意不要在“=”符号前后包含任何空格。
保存并关闭文件。如果你使用的是nano,请执行以下操作:

Press CTRL + X
Type “Y” and press Enter

2、将显示器随机连接到HDMI和树莓派的USB端口上。
3、打开背光(开关在显示屏的背面)。
4、重启树莓派。

MidiIdentifier 软件

在下文中,我们假设应用程序将在名为“pi”的用户下运行。如果不是这种情况,则需要相应地调整目录路径(/home/[你的用户名])。
1、使用以下命令从Github克隆midiIdentifier仓库:

2、将仓库添加到Pythonpath。
打开文件~/.bashrc(使用 nano,方法参考上一步)。
添加以下行:
PYTHONPATH="${PYTHONPATH}:/home/pi/workspace/midiIdentifier/src"
保存文件,然后使用以下命令重新加载它:
. ~/.bashrc<br>

注意命令中的空格,重启树莓派。

3、设置应用程序的自动启动。
在主目录中创建一个名为“start_gui.sh”的文件,并添加以下行:

#!/bin/bash
sleep 3
cd /home/pi/workspace/midiIdentifier/src/guiMI
python3 /home/pi/workspace/midiIdentifier/src/guiMI/gui.py
sleep 30

打开文件 ~/.config/lxsession/LXDE-pi/autostart 并添加以下行:

@lxterminal -e /home/pi/start_gui.sh

4、为了让 midiIdentifier 跑起来,需要将一组midi文件手动复制到midi目录中。为避免侵犯版权,我们的git仓库中不包含这些文件。但是,可以通过Google搜索从各种在线资源下载它们。下载文件后,需要将它们复制到以下目录中:

/home/pi/workspace/midiIdentifier/files/new_midi

在此之后,需要使用以下命令解析midi文件:

python3 /home/pi/workspace/midiIdentifier/src/converterMI/midiToText.py

5、重启树莓派。

恭喜你,你做到了!到现在为止,midiIdentifier 应该能正常运行啦!

制作外壳

 

 

 

 

 

切割屏幕框和整个案例所需的所有文件都可以在本项目文件库中下载到。
http://maker.quwj.com/project/67

可选:如果你想修改我们的构建模型或者你只是对设计激光切割机文件的过程感兴趣,请继续阅读:

在纸上绘制基本草图以便了解尺寸,我们使用Adobe Illustrator设计激光切割机的文件(你可以从网站获得1周的测试版本)。然而,我们没有绘制每一个凹槽,这里有一个很棒的免费在线工具可以帮助你,Joinery。我们将AI文件导出为SVG并将其导入Joinery,我们将不同的边缘相互连接。 Joinery允许你定义不同角度的配置文件,以便稍后重复使用,并允许保存项目。
因此,Joinery资料和切割资料如下。如果你想对我们的设计进行微小的更改,这些特别有用,当涉及到切割的公差等时,它们比adobe illustrator文件更容易更改。
midiIdentifier_lasercutter_files.zip
midiIdentifier_joinery_files.zip

将所有一切组合在一起

 

 

安装好树莓派上的软件(并测试它是否正常工作)并切割所有胶合板,你就可以开始组合软件和硬件了。

1、首先,除了背面的板子外,你应该将整个外壳组合在一起。此外,不要连接屏幕盒,这将是最后一步。如果你想用胶水加固,你可以试试。
2、将钢琴键从后面嵌入到外壳,确保将其嵌入成功。将它靠在木头上并测量需要切割的部件的高度以将其固定到位。切割这些碎片(2到3片)并将它们固定在钢琴键和盒子的底座上,将钢琴键保持在应该放置的位置,并确保按下琴键后不会移动。
3、安装完板子后,随后将扬声器的活动铰链放在主箱体内。你可以使用热熔胶或胶水。在下面放一些木块做支撑,这样即使稍后放置盒子,它们也会保持水平。
4、将整个屏幕盒(内部屏幕,通过盒子底部孔突出的电缆)通过活动铰链连接到主体箱上。
5、在主体箱内部添加一个木块,以便在折叠到主体箱时,屏幕盒仍可以保持水平位置(如图)。支撑木块的地方可以用一段铁管支撑屏幕,以便屏幕可以在不同的角度直立。
6、将扬声器安装到木板上(我们使用双面胶)。为了方便运输,屏幕和盒子可以折回到主箱体内!
7、最后,将所有电缆连接到树莓派。

就是这样,完成了!希望你喜欢我们的教程!

 

 

 

 

 

树莓派 VNC Viewer 远程桌面配置教程

树莓派实验室在之前介绍过《直接用Windows远程桌面连接树莓派的方法》,使用的是微软的“远程桌面(Remote Desktop Connection)”作为客户端登录树莓派。下面我们介绍使用树莓派官方认证的 RealVNC 客户端登录树莓派的方法。

在开始之前,你需要已经登录树莓派,进入到树莓派命令窗口,通过接上显示器和键鼠直接操作或通过 SSH 登录都可以。

启用树莓派 VNC 服务

在终端输入以下命令进入配置界面。

sudo raspi-config

依次操作:Interfacing Options -> VNC -> Yes。之后系统会提示你是否要安装 VNC 服务,输入 y 之后回车,等待系统自动下载安装完成,一切顺利的话 VNC 服务就启动了!

 

 

 

安装 VNC 客户端

下面去 RealVNC 官网下载 RealVNC Viewer,它是 RealVNC 的客户端,跨平台。下载你需要的平台的客户端版本即可。

https://www.realvnc.com/en/connect/download/viewer/

登录远程桌面

运行 RealVNC Viewer 之后输入树莓派的 IP 地址,通过 ifconfig 命令可以查看。选择连接之后输入树莓派的登录用户名密码,初始用户名 pi,密码为 raspberry。确认之后即可进入树莓派的远程桌面!

 

 

 

 

本文转载自 树莓派实验室

 

树莓派 Linux 系统命令行快捷键

刚入门树莓派时,在 Linux 下使用命令操作的时候,光标的移动令人头痛。命令输入完了,执行之后发现缺少权限,然后不得不移动光标到行首,而命令又极长……当我学会了命令行相关的快捷键之后,不仅效率提高了,更让我喜欢上了命令行这种操作方式。

常用

  • Ctrl+左右键:在单词之间跳转
  • Ctrl+a:跳到本行的行首
  • Ctrl+e:跳到页尾
  • Ctrl+u:删除当前光标前面的文字 (还有剪切功能)
  • Ctrl+k:删除当前光标后面的文字(还有剪切功能)
  • Ctrl+L:进行清屏操作
  • Ctrl+y:粘贴Ctrl+u或ctrl+k剪切的内容
  • Ctrl+w:删除光标前面的单词的字符
  • Alt – d :由光标位置开始,往右删除单词。往行尾删

说明

  • Ctrl – k: 先按住 Ctrl 键,然后再按 k 键;
  • Alt – k: 先按住 Alt 键,然后再按 k 键;
  • M – k:先单击 Esc 键,然后再按 k 键。

移动光标

  • Ctrl – a :移到行首
  • Ctrl – e :移到行尾
  • Ctrl – b :往回(左)移动一个字符
  • Ctrl – f :往后(右)移动一个字符
  • Alt – b :往回(左)移动一个单词
  • Alt – f :往后(右)移动一个单词
  • Ctrl – xx :在命令行尾和光标之间移动
  • M-b :往回(左)移动一个单词
  • M-f :往后(右)移动一个单词

编辑命令

  • Ctrl – h :删除光标左方位置的字符
  • Ctrl – d :删除光标右方位置的字符(注意:当前命令行没有任何字符时,会注销系统或结束终端)
  • Ctrl – w :由光标位置开始,往左删除单词。往行首删
  • Alt – d :由光标位置开始,往右删除单词。往行尾删
  • M – d :由光标位置开始,删除单词,直到该单词结束。
  • Ctrl – k :由光标所在位置开始,删除右方所有的字符,直到该行结束。
  • Ctrl – u :由光标所在位置开始,删除左方所有的字符,直到该行开始。
  • Ctrl – y :粘贴之前删除的内容到光标后。
  • ctrl – t :交换光标处和之前两个字符的位置。
  • Alt + . :使用上一条命令的最后一个参数。
  • Ctrl – _ :回复之前的状态。撤销操作。

Ctrl -a + Ctrl -k 或 Ctrl -e + Ctrl -u 或 Ctrl -k + Ctrl -u 组合可删除整行。

Bang(!)命令

  • !! :执行上一条命令。
  • ^foo^bar :把上一条命令里的foo替换为bar,并执行。
  • !wget :执行最近的以wget开头的命令。
  • !wget:p :仅打印最近的以wget开头的命令,不执行。
  • !$ :上一条命令的最后一个参数, 与 Alt - . 和 $_ 相同。
  • !* :上一条命令的所有参数
  • !*:p :打印上一条命令是所有参数,也即 !*的内容。
  • ^abc :删除上一条命令中的abc。
  • ^foo^bar :将上一条命令中的 foo 替换为 bar
  • ^foo^bar^ :将上一条命令中的 foo 替换为 bar
  • !-n :执行前n条命令,执行上一条命令: !-1, 执行前5条命令的格式是: !-5

查找历史命令

  • Ctrl – p :显示当前命令的上一条历史命令
  • Ctrl – n :显示当前命令的下一条历史命令
  • Ctrl – r :搜索历史命令,随着输入会显示历史命令中的一条匹配命令,Enter键执行匹配命令;ESC键在命令行显示而不执行匹配命令。
  • Ctrl – g :从历史搜索模式(Ctrl – r)退出。

控制命令

  • Ctrl – l :清除屏幕,然后,在最上面重新显示目前光标所在的这一行的内容。
  • Ctrl – o :执行当前命令,并选择上一条命令。
  • Ctrl – s :阻止屏幕输出
  • Ctrl – q :允许屏幕输出
  • Ctrl – c :终止命令
  • Ctrl – z :挂起命令

重复执行操作动作

  • M – 操作次数 操作动作 : 指定操作次数,重复执行指定的操作。

转载自 树莓派实验室

在树莓派上安装 Mosquitto 实现 MQTT

MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。
若初次接触MQTT协议,可先理解以下概念:
MQTT协议特点——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
MQTT协议角色——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者,代理器(服务器)和订阅者。
MQTT协议消息——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。
MQTT协议主题——MQTT中的主题可理解为相同类型或相似类型的消息集合。

本文说明如何在树莓派上安装Mosquitto。本文通过两个简单的例子说明树莓派中如何使用MQTT协议实现消息订阅,这些例子包括Mosquitto_sub指令实现消息订阅和paho-python扩展库实现GPIO端口的远程控制。本文中使用了两个工具——Mosquitto paho-python,其中Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的消息通信简单易用;另外,paho-python是一个符合MQTT v3.1协议的客户端,paho-python可连接MQTT代理服务器、发布消息、订阅消息和获得推送消息。

1 在树莓派上安装Mosquitto

在树莓派上安装Mosquitto和其他平台类似,如果在树莓派平台直接编译时间可能会稍长些。Mosquitto源代包不大,所以编译时间尚可忍受。

1.1 安装

截止2014年9月,最新版本为mosquitto-1.3.4。在树莓派中新建一个目录,例如software。

# 下载源代码包
wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz
# 解压
tar zxfv mosquitto-1.3.4.tar.gz
# 进入目录
cd mosquitto-1.3.4
# 编译
make
# 安装
sudo make install

1.2 安装注意点

编译找不到openssl/ssl.h
解决方法:安装openssl

sudo apt-get install libssl-dev

编译过程找不到ares.h
解决方法:修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=yes

使用过程中找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory

解决方法:修改libmosquitto.so位置

# 创建链接
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
# 更新动态链接库
sudo ldconfig

make: g++:命令未找到
解决方法:安装g++编译器

2 简单的例子

设计一个简单的测试案例,在PC机上运行MQTT代理服务器,而树莓派订阅主题为gpio的消息,PC机发布同主题消息,消息的内容为JSON数据包,数据包格式为{“index”:17,“value”:0},index代表树莓派GPIO的编号,value代表打开或关闭状态。

 

本例中PC机IP地址为 192.168.1.110,树莓派的IP地址为192.168.1.106

2.1 在PC机中开启MQTT服务

mosquitto -v

2.2 在树莓派中订阅消息

-h指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110

mosquitto_sub -v -t gpio -h 192.168.1.110

2.3 在PC机中发布消息

-h指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110

mosquitto_pub -t gpio -h 192.168.1.110 -m "{\"pin\":17,\"value\":0}"

2.4 消息被推送到树莓派中

最后在树莓派中输出以下内容:

gpio {"index":17,"value":0}

在PC机MQTT服务器控制台中输出

1410600001: mosquitto version 1.3.4 (build date 2014-09-13 15:55:06+0800) starting
1410600001: Using default config.
1410600001: Opening ipv4 listen socket on port 1883.
1410600001: Opening ipv6 listen socket on port 1883.
1410600062: New connection from 192.168.1.106 on port 1883.
1410600062: New client connected from 192.168.1.106 as mosqsub/3063-raspberryp (c1, k60).
1410600062: Sending CONNACK to mosqsub/3063-raspberryp (0)
1410600062: Received SUBSCRIBE from mosqsub/3063-raspberryp
1410600062: gpio (QoS 0)
1410600062: mosqsub/3063-raspberryp 0 gpio
1410600062: Sending SUBACK to mosqsub/3063-raspberryp
1410600122: Received PINGREQ from mosqsub/3063-raspberryp
1410600122: Sending PINGRESP to mosqsub/3063-raspberryp
1410600152: New connection from 192.168.1.110 on port 1883.
1410600152: New client connected from 192.168.1.110 as mosqpub/9793-EasyARM (c1, k60).
1410600152: Sending CONNACK to mosqpub/9793-EasyARM (0)
1410600152: Received PUBLISH from mosqpub/9793-EasyARM (d0, q0, r0, m0, 'gpio', ... (22 bytes))
1410600152: Sending PUBLISH to mosqsub/3063-raspberryp (d0, q0, r0, m0, 'gpio', ... (22 bytes))
1410600152: Received DISCONNECT from mosqpub/9793-EasyARM
1410600182: Received PINGREQ from mosqsub/3063-raspberryp
1410600182: Sending PINGRESP to mosqsub/3063-raspberryp

3 使用MQTT远程控制GPIO

下面借助python-gpio扩展库,通过消息推送的方式实现GPIO端口的远程控制。

3.1 安装paho-mqtt

使用pip工具安装paho-mqtt,输入以下指令即可:

sudo pip install paho-mqtt

3.2 树莓派订阅代码 simple.py

# -*- coding: utf-8 -*-  
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import json
  
# BCM GPIO编号
pins = [17,18,27,22,23,24,25,4]
def gpio_setup():
    # 采用BCM编号
    GPIO.setmode(GPIO.BCM)
    # 设置所有GPIO为输出状态,且输出低电平
    for pin in pins:
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, GPIO.LOW)
         
def gpio_destroy():
    for pin in pins:
        GPIO.output(pin, GPIO.LOW)
        GPIO.setup(pin, GPIO.IN)
         
# 连接成功回调函数
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    # 连接完成之后订阅gpio主题
    client.subscribe("gpio")
  
# 消息推送回调函数
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    # 获得负载中的pin 和 value
    gpio = json.loads(str(msg.payload))
  
    if gpio['pin'] in pins:
        if gpio['value'] == 0:
            GPIO.output(gpio['pin'], GPIO.LOW)
        else:
            GPIO.output(gpio['pin'], GPIO.HIGH)
  
if __name__ == '__main__':
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    gpio_setup()
     
    try:
        # 请根据实际情况改变MQTT代理服务器的IP地址
        client.connect("192.168.1.110", 1883, 60)
        client.loop_forever()
    except KeyboardInterrupt:
        client.disconnect()
        gpio_destroy()

3.3 启动服务并发布消息

在PC机中启动MQTT代理服务

mosquitto -v

在树莓派中运行脚本

sudo python simple.py

在PC机中发布消息

# 打开GPIO17
mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":1}"
# 关闭GPIO17
mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":0}"

运行结果
树莓派GPIO17根据PC机推送的消息点亮或熄灭。

4 总结

本文说明了如何在树莓派中使用MQTT客户端,通过paho-mqtt实现GPIO的远程控制。本例在局域网中运行并能不能体现出MQTT协议在远程控制中的优越性。后期还将花更多的时间实践和分析MQTT协议。

转自:https://blog.csdn.net/xukai871105/article/details/39255089

相关资料:
1、https://blog.csdn.net/xukai871105/article/details/39252653
2、http://blog.csdn.net/shagoo/article/details/7910598
3、https://www.jianshu.com/p/f8d824afbe3d