如何设置树莓派 VNC 的分辨率

当我们使用 VNC 连接到树莓派时,默认的分辨率非常低。甚至无法显示整个桌面,因此我们需要对分辨率进行设置。

在树莓派上设置 VNC 的分辨率很简单,在终端运行下面指令进入设置界面设置。

sudo raspi-config

按照下面的顺序选择 Advanced Options > Resolution,最后选择一个更合适的分辨率并确认完成即可。

建议在设置完成后重启树莓派或重新启动 VNC 服务让设置生效。

相关阅读:

自定义树莓派的显示分辨率

媒体曝树莓派4不兼容某些USB-C线缆的问题

最近消息,树莓派4B已被证实采用了非标准的 USB-C 实施方案,导致其遇到兼容性问题,大家在选购用于树莓派4B的 USB-C 线缆时请务必留意。

几周前发布的这款新品,首次引入了对 USB-C PD 供电的支持。遗憾的是,对树莓派基金会和早期采用者而言,目前有一个可能在某些情况下阻碍其使用的 bug 。

Ars Technica 援引 Tyler Ward 的话称:USB-C 端口上两个 CC 引脚中的每一个,都应该有自己的电阻器。

但不知道出于什么原因,树莓派基金会竟然让 Raspberry Pi 4 共用了一个电阻器。这样的篡改,直接导致了 USB-C 配件的不兼容。

据悉,兼容性与用户使用的线缆类型有关。尽管大部分线材可以正常工作,但若线缆自带了电子标记(e-mark / 通常用于笔记本充电),就可能无法搭配树莓派 4 使用。

树莓派联合创始人 Eben Upton 在接受 TechRepublic 采访时称,带有电子标记线缆电缆的智能充电器,会错误地将树莓派4 识别为音频适配器附件,并拒绝向其供电。

Upton 补充道,其希望在未来的电路板中修复该问题,但目前用户需要找到一种方法来规避该问题,即使用不带 e-mark 芯片的普通 USB-C 线缆来供电。

Upton 表示,令人惊讶的是,该问题并没有出现在他们相当广泛的现场测试工作中。

需要指出的是,树莓派基金会并不是唯一一个遇到 USB-C 兼容性问题的厂家。因为任天堂的 Switch 游戏机也采用了一个非标准的 USB-C 端口,导致与某些 USB-C 线缆存在兼容性问题。

来源:cnbeta.com

改造你的旧外壳,适配树莓派4

众所周知树莓派4代对前代的接口型号和位置做了一些改变,这让老版本的树莓派外壳无法直接在树莓派4代上使用。下面的视频演示了如何将树莓派3代的外壳通过简单的改造,完美适配树莓派4代。

总结下来有两点,操作非常简单。

1、切去老版本外壳塑料上盖上有线网口一侧的格挡。

2、外壳电源接口侧的塑料侧板扔掉……是的,扔掉就好了。

在树莓派上使用 SSD1306 OLED 屏幕

树莓派在许多使用场景下并不需要接一台专用显示器,如需要查看树莓派上的一些信息可以通过手机、电脑登录到树莓派上操作,但总归不够便利。

下面介绍两款 OLED 小屏(均为 SSD1306 芯片驱动)可以直接插到树莓派 GPIO 上,配有 Python 源码让树莓派玩家可以轻松用它来显示任何图文或动画内容。

1、Pi OLED 128×32 OLED 屏幕扩展(I2C)

Pi OLED 配备 0.9 英寸迷你单色屏,128×32 分辨率,白光像素点。拥有极高的对比度,显示清晰极易辨识。OLED 仅使用树莓派的 I2C 和电源引脚,无需独立供电,即插即用。(查看详情,购买链接)

2、“复古小电视” OLED 屏

带有 3D 打印外壳的 OLED 小屏,分辨率 128×64。通过 I2C 连接到树莓派,无需独立供电。(购买链接)

一、启用树莓派的I2C功能

sudo apt-get install -y python-smbus sudo apt-get install -y i2c-tools sudo raspi-config

按照下面的步骤设置开启 I2C 功能。

重启树莓派。

sudo reboot

二、安装 Adafruit-SSD1306 库

Adafruit-SSD1306 是基于 Python 的 OLED 库,可以用于 128×64、128×32 像素 SSD1306 芯片控制的屏幕。

使用下面的命令安装。

sudo python -m pip install –upgrade pip setuptools wheel

注意,如果这一步出现错误提示“TypeError: unsupported operand type(s) for -=: ‘Retry’ and ‘int’”,可以尝试卸载后重新安装 pip 来解决。

sudo apt-get remove python-pip python3-pip sudo apt-get install python-pip python3-pip

安装 PIL 库,有一些图片处理的程序会用到这个。

sudo apt-get install python-pil python3-pil

使用 pip 安装 Adafruit-SSD1306 库。

sudo pip3 install Adafruit_GPIO sudo pip3 install Adafruit_SSD1306 sudo pip3 install Adafruit_BBIO

再下载一份包含代码示例的库后面要用。

cd ~ git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git

这里顺便提一下,如果上面的 pip 安装 Adafruit-SSD1306 库遇到网络问题,那么也可以在下载完这份代码之后运行下面的命令安装(可选):

cd Adafruit_Python_SSD1306 sudo python setup.py install

进到示例目录,可以看到有一些已经准备好了的代码,后面将屏幕接好之后可以直接运行看效果。

cd ~/Adafruit_Python_SSD1306/examples/

三、连接屏幕

对于 Pi OLED 屏幕扩展,直接安插在 GPIO 如图所示位置(物理引脚编号1-6号)。

对于“小电视”屏幕,根据屏幕 PCB 上引脚的功能标注接到树莓派上对应的 GPIO 上即可。

屏幕 GND 接树莓派 GND

屏幕 VCC 接树莓派 3V3

屏幕 SDA 接树莓派 SDA

屏幕 SCL 接树莓派 SCL

注意一定不要接反 VCC 和 GND,否则会烧坏屏幕。

下面通过命令检测是否识别到 I2C 设备。

sudo i2cdetect -y 1

将显示已连接设备的 I2C 地址,不同的屏幕地址可能会不一样,通过这个步骤可以确认一下。

注意,如果你正在使用的是初代树莓派(256MB的树莓派1代B),那么需要用这个命令:

sudo i2cdetect -y 0

四、编程和运行

为了快速上手,我们可以直接使用示例代码。其中有一个文件名为 stats.py 的程序,用来显示树莓派的 IP、CPU Load、内存和磁盘使用情况。先拿这个来试试看。

将之前下载的源码复制到用户目录,用编辑器打开。

cd ~ sudo cp ~/Adafruit_Python_SSD1306/examples/stats.py ~/ sudo nano stats.py

可以看到这份示例已经包含了多种屏幕参数的初始化方法。

# 128×32 display with hardware I2C: disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST) # 128×64 display with hardware I2C: # disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) # Note you can change the I2C address by passing an i2c_address parameter like: # disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)

你可以根据实际所用的屏幕来修改这些参数,例如 SSD1306_128_32 代表 128×32 分辨率屏幕的初始化方法,适用于本篇介绍的 Pi OLED 128×32 OLED 屏幕扩展,SSD1306_128_64 适用于“复古小电视” OLED 屏。i2c_address 用于配置屏幕的地址,默认为 0x3C。

运行示例代码,可看到运行效果。

sudo python3 stats.py

同样的方法再试试 image.py 这个示例效果如下。

通过修改 image.py 中的初始化参数,调整为 128×64 分辨率之后。

disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

屏幕上的图片、形状、文本和字体都是由 PIL(Python Imaging Library)的模块 Image, ImageDraw, and ImageFont 来实现的。如有兴趣可以试试其他代码示例,并学习自己设计图文来显示。

五、设置开机运行

为了让 stats.py 能够开机自动运行,我们可以做下面的配置,这样我们就可以不用通过工具或路由器去查找树莓派的 IP 地址等信息了。

修改 /etc/rc.local 文件。

sudo nano /etc/rc.local

在 exit 0 前面增加一行:

sudo python3 /home/pi/stats.py &

编辑好之后按下 Ctrl+O 保存,再按下 Ctrl+X 退出。重启树莓派验证一下是否生效吧!

sudo reboot

六、提高显示速率(可选,不推荐)

为了更好的显示性能,例如显示动画时如对帧率有要求,可以通过修改下面的参数将 I2C 频率从默认的 100KHz 或 400KHz 提升到 1MHz。

sudo nano /boot/config.txt

在文件末添加一行:

dtparam=i2c_baudrate=1000000

– 全文完 –

Pi Dashboard DAQ 框架的介绍和使用

此前,树莓派实验室发布过一个开源项目 Pi Dashboard,该项目可以很直观地展示树莓派系统运行的各种实时数据,包括CPU、内存、磁盘占用、网络使用等数据。

这些主要是综合了树莓派本身的信息进行展示,对于外部数据,例如通过外接传感器获取被监测点的环境数据是否能有一个框架,只需要修改少量代码甚至无需修改就能马上用起来呢?

下面要介绍的是“Pi Dashboard DAQ 框架”,这套方案就能实现这个需求。

本项目分为几个部分

1、数据采集程序(后端采集部分,基于 MCC 的 daqhats 库)

2、仪表盘WebUI(前端展现部分,PHP 程序)

文中用到的传感器均使用模拟信号输出,经由 MCC118 扩展板采集得到电信号

为什么使用 MCC118 扩展板呢?我可以选择不使用它吗?

我们选择 MCC118 扩展板是权衡了通用与专业性、易用性和性价比三方面因素的。这款扩展板支持 -10V ~ +10V 电信号采集,支持12位分辨率8通道采集,单片总吞吐量100KS/s,能对接常用的各类传感器。官方还专门为树莓派提供了一套程序库大大提高了二次开发效率和易用性。在满足前两方面的同级别产品中,其价格也具有一定优势。

因项目属于程序框架性质,我们鼓励大家通过修改将它应用在各种实际的项目中,例如你仅仅只需要用到某些数字输出的传感器,那么当然可以自行编写数据采集程序直接,从传感器获取数据、再将结果以符合框架所用的 JSON 格式输出即可。同样,如果你对所用传感器的模拟输出实时性要求并不高,也可以采用更低成本的 ADC 模块来读取传感器信号。

数据采集程序

这部分主要功能是读取传感器的电压或数值,并用 JSON 格式输出。使用了 web.py 框架,因为用到了 MCC118 读取模拟信号,所以用到了 daqhats 库。

#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import web import json from time import sleep from sys import stdout from daqhats_utils import select_hat_device, enum_mask_to_string from daqhats import mcc118, OptionFlags, HatIDs, HatError # Constants CURSOR_BACK_2 = ‘\x1b[2D’ ERASE_TO_END_OF_LINE = ‘\x1b[0K’ urls = ( ‘/(.*)’, ‘hello’ ) app = web.application(urls, globals()) options = OptionFlags.DEFAULT low_chan = 0 high_chan = 7 mcc_118_num_channels = mcc118.info().NUM_AI_CHANNELS # Get an instance of the selected hat device object. address = select_hat_device(HatIDs.MCC_118) hat = mcc118(address) class hello: def GET(self, name): pyDict = {0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0} global hat try: # Read a single value from each selected channel. for chan in range(low_chan, high_chan + 1): value = hat.a_in_read(chan, options) print(‘{:12.5} V’.format(value), end=”) pyDict[chan] = value except KeyboardInterrupt: # Clear the ‘^C’ from the display. print(CURSOR_BACK_2, ERASE_TO_END_OF_LINE, ‘

‘) web.header(‘Content-Type’, ‘application/json’) web.header(“Access-Control-Allow-Origin”, “*”) return json.dumps(pyDict) if __name__ == “__main__”: try: # Get an instance of the selected hat device object. global address global hat print(‘ Function demonstrated: mcc118.a_in_read’) print(‘ Channels: {0:d} – {1:d}’.format(low_chan, high_chan)) print(‘ Options:’, enum_mask_to_string(OptionFlags, options)) try: input(”

Press ‘Enter’ to continue”) except (NameError, SyntaxError): pass print(‘

Acquiring data … Press Ctrl-C to abort’) except (HatError, ValueError) as error: print(‘

‘, error) app.run()

仪表盘 WebUI

1、安装 DAQ 依赖

安装 DAQHATs 库以及 Webserver 所依赖的组件。

sudo apt-get update #如果已安装过 git 客户端可以跳过下一行 sudo apt-get install git cd ~ git clone https://github.com/mccdaq/daqhats.git cd ~/daqhats sudo ./install.sh pip install dash dash-renderer dash-html-components dash-core-components

安装 web 框架,命令如下:

pip install web.py

2、安装 Nginx 和 PHP7

在 Pi 的终端运行以下命令。

sudo apt-get update sudo apt-get install nginx php7.0-fpm php7.0-cli php7.0-curl php7.0-gd php7.0-mcrypt php7.0-cgi sudo service nginx start sudo service php7.0-fpm restart

如果安装成功,可通过 http://树莓派IP 访问到 Nginx 的默认页。Nginx 的根目录在 /var/www/html 。

进行以下操作来让 Nginx 能处理 PHP。

sudo nano /etc/nginx/sites-available/default

将其中的如下内容

location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }

替换为

location / { index index.html index.htm index.php default.html default.htm default.php; } location ~\.php$ { fastcgi_pass unix:/run/php/php7.0-fpm.sock; #fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

Ctrl + O 保存再 Ctrl + X 退出。

sudo service nginx restart

最后重启 Nginx 即可。

通过 GitHub 来下载 Pi Dashboard DAQ 到 Pi 上会相当方便。

cd /var/www/html sudo git clone https://github.com/spoonysonny/pi-dashboard-daq.git

即可通过 http://树莓派IP/pi-dashboard-daq 访问部署好了的 Pi Dashboard DAQ。

同样如果页面无法显示,可以尝试在树莓派终端给源码添加运行权限,例如你上传之后的路径是 /var/www/html/pi-dashboard-daq ,则运行。

cd /var/www/html sudo chown -R www-data pi-dashboard-daq

注意,到这一步只能显示树莓派基本信息,通过数据采集到的传感器数据还不会更新。请继续阅读下面步骤进一步了解如何启动数据采集功能。

3、配置

修改 /var/www/html/pi-dashboard-daq/config.php 中 SENSOR_API_URL 常量的值,将树莓派的IP地址替换其中 IP。

define(‘SENSOR_API_URL’, ‘http://192.168.1.42:8080/?ajax=true’);

Web 仪表盘将获取到的 JSON 中解析出 0-6 这7个数值,默认情况下,分别对应于仪表盘上的土壤湿度、雨水、火焰、霍尔、光线、温度、声音传感器。这里可根据自己的实际需要增减和调整,修改 assets/js/dashboard.js 中相应的部分即可。

$(“#sensor-sound”).text(window.dashboard_sensor[6]); $(“#sensor-temp”).text(window.dashboard_sensor[5]); $(“#sensor-light”).text(window.dashboard_sensor[4]); $(“#sensor-hall”).text(window.dashboard_sensor[3]); $(“#sensor-fire”).text(window.dashboard_sensor[2]); $(“#sensor-rain”).text(window.dashboard_sensor[1]); $(“#sensor-soil-humidity”).text(window.dashboard_sensor[0]);

传感器连接

作为实验项目,我们用面包板和跳线把传感器和DAQ连接起来。

所有传感器和树莓派共地、VCC 均与树莓派的 3V3 引脚相连。

每个传感器的 AO 模拟输出端接到 MCC118 HAT 上的 CH0 ~ CH6。

运行

首先运行安装目录下 api/main.py 启动数据采集主程序。

sudo python /var/www/html/pi-dashboard-daq/api/main.py &

然后就可以在PC浏览器打开 http://树莓派IP地址/pi-dashboard-daq/ 查看仪表盘了。

传感器数值说明

目前仪表盘没有对传感器数据做转换,直接从 JSON 获得电压数值,并通过简单的处理将数值转换成 0-330 之间的值,程序逻辑如下。

for(i=0;i<8;i++){ data[i] = Math.round(330-(data[i])*100,0); } 你可以针对特定传感器修改这里的数值转换逻辑,将电压数值转换成所希望的物理量单位来显示。 购买 这里提供了包含树莓派和 MCC118 扩展板在内的全套实验材料: 树莓派3B+一块 MCC118 扩展板一块 5V/3A电源适配器一个 16G microSD卡一张 实验面包板一块 实验跳线一扎 土壤湿度、雨水、火焰、霍尔、光线、温度、声音传感器包 来搭建自己的环境数据监控站吧,猛击购买。 GitHub: https://github.com/spoonysonny/pi-dashboard-daq

树莓派下 DS3231 时钟模块的配置(I2C接口)

下面介绍基于DS3231的RTC时钟模块的使用,这个模块自带纽扣电池,可以在树莓派掉电后系统时间能继续保持。

一、启用树莓派的I2C功能

sudo apt-get install -y python-smbus sudo apt-get install -y i2c-tools sudo raspi-config

按照下面的步骤设置开启 I2C 功能。

重启树莓派。

sudo reboot

添加 I2C 模块

sudo nano /etc/modules

添加以下两行内容:

i2c-bcm2708 i2c-dev

将DS3231的RTC时钟模块通过GPIO连接到树莓派。

二、安装 I2C 工具

sudo apt-get update

sudo apt-get install i2c-tools python-smbus

sudo reboot

重启后通过刚才安装的i2c-tools对 I2C 设备进行探测,输入以下命令,得到如下结果,说明检测到一个地址为0x68的I2C设备就是板上的DS3231。

sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: — — — — — — — — — — — — — 10: — — — — — — — — — — — — — — — — 20: — — — — — — — — — — — — — — — — 30: — — — — — — — — — — — — — — — — 40: — — — — — — — — — — — — — — — — 50: — — — — — — — — — — — — — — — — 60: — — — — — — — — 68 — — — — — — — 70: — — — — — — — —

三、测试时钟模块

下面我们通过i2c-tools来测试下DS3231的功能,并将DS3231这个掉电不丢失的时钟用于树莓派系统的时钟。

下面的测试必须在root权限下测试。

=== 如何启用 root 账户的分割线 开始===

debian里root账户默认没有密码,但账户锁定。

当需要root权限时,由默认账户经由sudo执行,Raspberry pi 系统中的Raspbian

默认用户是pi 密码为raspberry

重新开启root账号,可由pi用户登录后,在命令行下执行

sudo passwd root

执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后执行

sudo passwd –unlock root

这样就可以解锁root账户了。

现在就有两个账户 pi@raspberrypi 和 root@raspberrypi 两个账户可以来回切换:

在pi@raspberrypi 输入 su 然后输入刚才设置的密码进入 root 账户

在root@raspberrypi 输入su pi 进入 pi 账户

=== 如何启用 root 账户的分割线 结束===

su Password: modprobe i2c-dev echo ds3231 0x68 > sudo tee /sys/class/i2c-adapter/i2c-1/new_device hwclock -r Sat Jan 1 00:00:12 2000 -0.120717 seconds

将系统时钟设定为当前时间,然后将系统时钟写入到DS3231硬件时钟里面

date 062120352014.00 备注:6月21日 20点35分 2014年 Sat Jun 21 20:35:00 UTC 2014 hwclock -w date Sat Jun 21 20:35:21 UTC 2014

四、设置开机自动读取时间

编辑启动文件

sudo nano /etc/rc.local

将以下内容加入“exit 0”行之前

sudo modprobe i2c-dev echo ds3231 0x68 > sudo tee /sys/class/i2c-adapter/i2c-1/new_device hwclock -r hwclock -s

ctrl+x退出

过几分钟拔掉网线,重启树莓派,输入“date”看看时间是否正确。

树莓派上 Docker 的安装和使用

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,容器性能开销极低。这对树莓派非常有用,本教程将介绍 Docker 这个工具以及如何在 Raspbian 上安装 Docker。

Docker 的应用场景

Web 应用的自动化打包和发布。

自动化测试和持续集成、发布。

在服务型环境中部署和调整数据库或其他的后台应用。

从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 的优点

Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。方便快捷已经是 Docker 的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。

这里介绍两种安装 Docker 的方法,最简单的是直接从 get.docker.com 下载安装脚本并开始安装。仅需执行下面一行命令即可。经测试,树莓派3B、3A+、3B+ 均可支持 Docker,树莓派 Zero 虽然可以安装成功,但无法启动 Docker 服务。

安装方法一(脚本安装)

脚本安装是最推荐的方式,只需要输入下面的命令,等待自动安装好即可。

sudo curl -sSL https://get.docker.com | sh

如果采用这一步安装成功,可直接跳到下文的图形界面安装那里继续阅读。

安装方法二(apt 安装)

由于 Raspbian 基于 Debian,我们还可以使用 apt 来安装 Docker,首先需要更新一下软件包的索引。

sudo apt-get update

安装 HTTPS 所依赖的包

sudo apt-get install apt-transport-https \ ca-certificates \ software-properties-common

添加 Docker 的 GPG key

curl -fsSL https://yum.dockerproject.org/gpg | sudo apt-key add –

验证 key id:

apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

设置稳定的 repository:

sudo add-apt-repository \ “deb https://apt.dockerproject.org/repo/ \ raspbian-$(lsb_release -cs) \ main”

注意:如果 add-apt-repository 命令遇到问题,可以尝试将下面这行添加到树莓派软件源 sources.list,操作如下:

sudo nano /etc/apt/sources.list

添加一行:

deb https://apt.dockerproject.org/repo/ raspbian-RELEASE main

根据自己系统版本调整上面的 RELEASE。通过下面的命令可以查看发行版。

lsb_release -cs

安装 Docker

sudo apt-get update sudo apt-get -y install docker-engine

测试 Docker

运行 hello-world 镜像来做一个测试。

sudo docker run hello-world

如果 Docker 安装成功,你会看到一条消息:“Hello from Docker!”。

常用配置和工具命令

#查看 Docker 版本 docker -v sudo docker pull 仓库/镜像:版本(留空的话默认为 latest) sudo docker run 加参数,用来创建容器 #查看运行容器 sudo docker ps #查看所有下载的镜像 sudo docker images #进入容器终端 sudo docker exec -i -t ha /bin/bash #实时查看10行的 ha 日志 sudo docker logs -f -t –tail 10 ha #重启 systemctl 守护进程 sudo systemctl daemon-reload #设置 Docker 开机启动 sudo systemctl enable docker #开启 Docker 服务 sudo systemctl start docker #下载 Docker 图形化界面 portainer sudo docker pull portainer/portainer #创建 portainer 容器 sudo docker volume create portainer_data #运行 portainer sudo docker run -d -p 9000:9000 –name portainer –restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

在图形化界面中操作更加便利。运行之后在浏览器中输入树莓派IP:9000 进入界面。

首次访问需要设定登录密码。

对于树莓派上的应用,选择 Local 就好。

在控制台可以看到 Docker 的各种资源信息。

相关链接

Docker 官网:http://www.docker.com

Github Docker 源码:https://github.com/docker/docker

Docker 商店:https://store.docker.com

Docker 文档:https://docs.docker.com

让树莓派“说”出自己的IP地址

树莓派实验室之前已经介绍了多种方法,来获得树莓派的IP地址。有的利用局域网工具或登录路由器查询、有的通过OLED小屏幕自动显示、还有的利用DDNS做域名解析。下面我们再来多介绍一种,让树莓派在启动之后“说”出自己的IP地址。

这里用到了下面这些东西:

树莓派主板

USB 声卡

音箱或耳机一副

mplayer 播放器

数字语音包,含一组录制好了的 MP3 音频

Python 主程序

注意,USB声卡不是必须的,但因无法忍受树莓派板载3.5MM的电流声,这里加装了一个USB声卡。软件部分是在 GitHub @ma6174 的开源项目基础上修改而来。

https://github.com/spoonysonny/speak_raspi_ip

一、下载主程序和软件

运行下面的命令。

cd ~ sudo git clone https://github.com/spoonysonny/speak_raspi_ip.git sudo apt-get install mplayer sudo apt-get install -y mpg123

二、设置输出声卡

如果你使用树莓派板载的声卡,那么可以跳过这一步。下面的介绍用于在使用其他声卡的情况下参考(以USB声卡为例)。

笔者所用的这个USB声卡免驱,即插即用。所以直接进行切换声卡的设定就行。

运行 alsamixer 命令进入 alsamixer 画面。

按 F2 查看系统信息,选择 /proc/asound/cards 查看可用的声卡设备。

可以看到设备名和对应的编号,记下USB声卡的编号(为1)下面会用到。

alsamixer 的其他功能如果有兴趣可以顺便试试,这里暂不深入。如果只需要列出声卡信息,还可以使用 aplay -l 命令。

编辑文件 /etc/asound.conf。

sudo nano /etc/asound.conf

填入如下内容,请先确保这个文件之前是空白的再填入:

pcm.!default { type hw card 1 } ctl.!default { type hw card 1 }

上面的数字 1 代表声卡的设备编号。

按下 Ctrl+O 保存,按下 Ctrl+X 退出。并重启系统。

sudo reboot

三、测试运行

首先需要确认一下声卡和 mplayer 是否正常工作。

cd ~/speak_raspi_ip sudo mplayer voice/1.mp3

如果顺利的话,接上音箱会听到报数“一”。

下面就可以测试主程序了。

sudo python speak_ip.py

现在树莓派应该会“说”出IP地址。

四、设置开机运行

编辑 rc.local 文件。

sudo nano /etc/rc.local

在 exit 0 之前添加一行:

sudo /usr/bin/python /home/pi/speak_raspi_ip/speak_ip.py &

按下 Ctrl+O 保存,按下 Ctrl+X 退出。

完成之后,下次重启的时候就可以听到树莓派的IP地址了。

最后,附上主程序代码

#!/usr/bin/env python # coding=utf-8 import os import sys import time import socket import subprocess voice_path = os.path.join(sys.path[0], ‘voice’) player = [“mplayer”] def getLocalIP(): ip = None try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect((‘114.114.114.114’, 0)) ip = s.getsockname()[0] except: name = socket.gethostname() ip = socket.gethostbyname(name) if ip.startswith(“127.”): cmd = ”’/sbin/ifconfig | grep “inet ” | cut -d: -f2 | awk ‘{print $1}’ | grep -v “^127.””’ a = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) a.wait() out = a.communicate() ip = out[0].strip().split(”

“) # 所有的列表 if len(ip) == 1 and ip[0] == “” or len(ip) == 0: return False ip = “over”.join(ip) return ip def getFilePath(filename): return os.path.join(voice_path, “%s.mp3” % filename) def play(voice): for i in player: cmd = “%s %s” % (i, getFilePath(voice)) a = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) a.wait() if a.returncode == 0: break def speak(ip): for i in ip: if i == “.”: play(“dot”) else: play(i) play(“over”) if __name__ == ‘__main__’: count = 0 while True: ip = getLocalIP() print ip if ip == False: play(“fetching”) else: count += 1 speak(ip) if count == 10: break time.sleep(1)

用树莓派制造一支敲击乐队

MAKER:banjowise/译:趣无尽 Cherry(转载请注明出处)

每当夜深人静孤枕难眠的时候你想干些啥?不妨和我一样制造一支敲击乐队,抄起尘封多年的尤克里里,来给楼上玩皮球的熊孩子助助兴吧!

大家可以先看一段视频:

下面的教程中我将详细讲解它是如何运转的。这里使用很多生活用品,比如:罐头、木勺子、钢琴锤、瓶盖和鱼网等。互动性很强。当然,你在搭建自己的项目时,你可以随意发挥。

这里有两种办法来控制:

1、基于浏览器的步骤序列,被我称为:PiBeat。它可以让你可以通过树莓派或同一网络上的任何其他设备(手机,平板或计算机)以交互方式控制你的机器鼓。稍后我会在树莓派上安装它。在这里可以预览:

http://pibeat.banjowise.com/

代码在 GitHub 提供下载:

https://github.com/mnkii/pibeat

2、编码击鼓模式的 Python 脚本。你可以创作自己的乐谱,甚至来配合你的吉他。多才多艺的你还不快来组建自己的敲击乐队?

材料清单

树莓派(Raspberry Pi)x1

5V 八路继电器x1

母对母跳线x10

3 AMP 接线端子x2

12V 10A 电源x1

12V 2A 电磁阀x8

1N5401 整流二极管x8

0.5mm 宽 50cm 长电缆×1

剥线钳×1

老虎钳×1

3mm 平头螺丝刀×1

十字头螺丝刀×1

将树莓派连接到继电器

1、树莓派上引脚提供的最大电压为 5v。树莓派直接为 5v 电磁阀供电,不会影响机器鼓的效果。因此安装继电器的作用是以 GPIO 较低电压驱动更高电压的电路(本项目中包含一个 12v 电磁阀的电路)。

2、继电器有八个通道,可以独立的开、关八个电磁阀。每个通道包含四个连接器,其中三个在高压电路中使用,稍后会看到。剩下一个连接到低压电路的 IN 引脚上。当树莓派的 GPIO 引脚发送 5V 到给定通道 IN 引脚上时,继电器将连接到相应的 12v 电路。

3、在继电器的低压侧,还有一个 GND(接地)引脚,需要与树莓派共地,以及一个 VCC 引脚相连,电源连接到树莓派的 5v 电源。

4、关闭树莓派后,按照图表用跳线将继电器与树莓派相连。

让它鼓动起来

在本步骤中,虽然它还不是一个成品,但可以通过继电器的控制尝试让鼓发出声音。

随后将介绍编写击鼓模式的 python 脚本,同时可以测试一下项目目前的状态。

请点击此处查看脚本要点。

启动你的树莓派,在树莓派上打开一个终端并运行下载的脚本:

wget https://gist.githubusercontent.com/mnkii/8ab0d749c26379936c14e96cfaa92f7e/raw/array-sequencer.py

你也许想看看代码到底能达到什么效果,不如直接运行它:

python3 array-sequencer.py

如果一切运行正常,你可以听到继电器打开和关闭触点的声音以及相应通道上指示灯的闪烁。看一下脚本中的序列变量,了解是否一切正常。所有通道将会一起触发,然后每个通道将被单独触发。它会一直运行,直到你按 Ctrl+C 键后退出脚本。

在接下来步骤里,你最好关闭树莓派接线,避免发生短路。

准备正极端子电路

本项目要为八个电磁阀供电,我将创建一个并联电路。如图,你可以看到一个完整的 12v 电路图。

1、使用接线端子固定电线,你可以选择使用面包板或洞洞板。

2、将所有电磁阀和每个电磁阀的二极管(后面的二极管会更多)连接到电源的一根正极线上。

3、使用切割器,切割一对八块的接线端子,切割将两块连接在一起的塑料。但请注意不要切到任何金属。

4、将所有终端连接到端子的一侧。切割七根约 35mm 长的红线,然后每根线的两端剔除约 5mm 的绝缘线皮。

5、以菊花链连接的方式将所有端子沿着端子的一侧连接在一起,使用螺钉将电线固定到位。第一个和最后一个螺丝只有一根电线,其余的则有两根电线。

安装电磁阀和二极管

由于电磁阀带有电磁铁,建议使用二极管来保护电路以免受到反激(请点击此处查看详情)。因此每个电磁阀都配有二极管,用于保护继电器。

在上个步骤中所有端子都连接到端子的一侧,现在从第一个孔开始。插入电磁阀的一根电线,再将二极管的一端添加到同一个孔中。

由于二极管只能单向电流流动,因此请确保二极管上的银条朝向端子。 用螺丝固定到位。剩余的七个孔做同样的处理。

将负极端子连接电磁阀和二极管

与准备正极端子一样,在这个步骤中将制作一条负极端子,同样也是八对端子。如图所示,将二极管和电磁阀连接到端子,与正极对齐。

创建继电器电路

1、准备八根约 70mm 长的黑线,每根电线末端剥离约 5mm。

2、将每根电线连接到负极端子上剩下的八个连接器上。

串接继电器的 COM 端

1、用跳线将继电器与树莓派连接到一侧。每个通道有三个触点,从左到右分别称为常开 NO,公共端 COM 和常闭 NC。

2、电磁阀在通道 IN 引脚上有高电压时打开,因此要使用常开触点。如果是相反的情况就使用常闭触点,电磁阀将一直打开,直到 IN 引脚上发出高电压。最后,还将使用公共触点来完成电路。

3、由于这是一个并联电路,使用菊花链连接的方式连接继电器上的所有常见触点。切割七条约为 60mm 长的黑线,每个电线末端剥离约 5mm。

4、将继电器上所有 COM 触点(每三个为一组,中间的点为 COM 触点)连接在一起。第一个和最后一个将只有一根电线,其余有两根电线。

完成继电器剩余部分的连接

现在将继电器连接到电路的其他部分。将负极端子黑线的未端连接到继电器上的第一个或最后一个常开 NO 触点。其他七根做同样的处理,再将每根导线连接到下一根 NO 触点。

连接 12v 电源适配器

1、为避免任何电路问题,请关闭电源并拔下电源插头。

如图所示,本项目的电源 12v 插头已拔下。

假如你的电源有插头,你可以购买与之相匹配的母头直流连接器,或者切断插头并剥离出两根电线,红色为正极,白色为负极。

2、将电源的正极线连接到正极端子上的第一个触点,将负极连接到继电器上的第一个公共触点。我使用大约长为 150mm 的红线和黑线并剥除末端的电线皮,使用端子连接起来。

动起来

1、关闭电源,快速检查一下所有的连接。一切准备就绪后再次启动树莓派。再次运行脚本:

python3 array-sequencer.py

2、如果电磁阀没有移动,但是可以听到继电器的点击,和前面步骤中一样的亮灯。终止脚本 Ctrl+C,然后等待。

3、打开电源供,再次运行脚本,所有的电磁阀都动起来了。

编辑 array-sequencer.py

花一些时间编辑 array-sequencer.py 文件。 尝试执行以下操作,每次更改后重新运行脚本并查看效果:

1、将 bpm 变量从 120 替换成其他数值,例如 200,以增加速度。

2、在序列变量中,将某些 0 替换成 1,以增加敲击的物品。

3、复制序列变量中右方括号之前的最后三行,以循环添加更多节拍。

安装鼓的音序器

下面是非常有趣的艺术创作部分。

1、将 sequencer 连接到树莓上。这里有一个 Web 界面,让 Python 通过 web sockets 去触发 GPIO 引脚。

2、源代码在项目文件库中可下载到。

https://make.quwj.com/project/122

假如你按照教程中的连线方式进行操作,就可以下载并运行预编译版本。打开树莓派上的终端,然后运行以下命令:

# Create and navigate into a directory for our project mkdir pibeat cd pibeat # Download the source code wget http://pibeat.banjowise.com/release/pibeat.tar.gz # Extract the files tar -zxf pibeat.tar.gz # Install the python requirements pip3 install -r requirements.txt # Run the web server python3 server.py

3、在输出中,如果一切正常,你可以看到以下输出:

======== Running on http://0.0.0.0:8080 ======== (Press CTRL+C to quit)

4、找到树莓派的 IP 地址。打开 Web 浏览器,然后在地址栏中输入http://树莓派IP:8080/index.html

此时 sequencer 将会出现。

5、点击播放按钮,你的机器鼓应该开始播放。调试音序器直到达到你的标准。

只要你的树莓派有网络,你就可以从任何设备访问树莓派的网络界面。可以在手机或平板电脑上尝试。

制作机器鼓及底部盒子

这一步才是该项目的灵魂部分,也是机器鼓是否有趣的关键所在。你可以赋予它不一样的意义。

我使用了许多的生活用品,比如啤酒瓶,罐头,摇瓶,瓶盖,渔网,台钟,鳄鱼响板和勺子等。我使用木制的龙头将台钟固定到位,我的金属杆可以转动并将勺子固定到位。

每个鼓都是一个独立的组件,如果不喜欢可以随时的替换。

电磁阀带有螺栓孔,需要 M3 螺栓固定。提前做好钻孔标记,确保固定到位。

我使用 6mm 的中密度纤维板制作鼓,然后用胶水或螺丝固定在一起。

罐头和啤酒瓶上的锤子是用来烘托气氛的,其实电磁阀的敲击声已经足够了,这些是在视觉上增添乐趣。

底部盒子部分

底部盒子部分非常的简单,由 3.6mm 的胶合板、18mm 的中密度纤维板和一些木条制成。底座的前面使用的是薄的胶合板,当勺子敲打时就会产生共鸣。底座部分不仅可以容纳所有的电子设备还可以作为鼓的平台。制作步骤如下:

1、切割两块相同尺寸的中密度纤维板制作顶部和底部。

2、切割四块 34mmx12mm 的木板,要短于盒子的宽度。

3、将四块切割好的木板与两块中密度纤维板形成盒子的形状。将木块放在距离盒子顶部和底部约 1cm 处。

4、再切割两块胶合板,使其与盒子的宽度和高度相匹配。将其固定到到盒子的正面和背面。

5、切割一块胶合板放入盒内,放在底部可以固定电子元件。

6、切割另一块胶合板将鼓连起来。这是一块平台顶部的木板。

7、在底部平台附近钻一个孔,将电源线穿过。

最后使用丙烯酸底漆涂上自己喜欢的颜色。一切完工后就可以开心的玩耍了。

用树莓派制造一支敲击乐队

via

基于树莓派的热电偶测量模块 MCC 134

MCC 134是一款24位,用于测量热电偶的4通道HAT附加模块,可提供专业级精度,是同类产品中的最佳选择。用户最多可连接4路差分热电偶(TC)到MCC 134的输入通道。每通道的TC型号可通过软件选择。热电偶输入与Raspberry Pi电气隔离,可最大限度地降低噪声并提供在恶劣电气环境下电气保护。

MCC 134上搭载3个高分辨率冷端补偿(CJC)传感器。MCC 134配备了一个用于所有TC输入通道的开路热电偶检测(OTD),因此用户可以监控电路板是否有损坏或断开的热电偶。

特点

4路隔离功能的热电偶输入

24-bit A/D 转换器

1秒更新间隔,最小

支持 J, K, R, S, T, N, E, 和 B型热电偶

冷端补偿(CJC)

线性化

螺丝端子连接

软件

MCC DAQ HAT函数库; GitHub可查看

操作系统

Linux®

API编程

C, C++, Python

MCC DAQ HATs系列模块

MCC DAQ HATs系列模块,基于无处不在的低成本计算机树莓派®,为您带来高质量的测试测量方案。MCC DAQ HATs的推出,为树莓派®平台带来专业的高质量数据采集和数据记录功能。

MCC 118 电压测试 HAT 模块(税后售价999元)

8通道单端电压输入

采样率可达100KS/s

外部时钟扫描I/O

外部数字信号触发

支持多板卡扩展

EEPROM支持高速率数据转换

MCC 152 电压信号输出和数字IO HAT 模块(税后售价999元)

2路同步12-bit电压输出

5mA输出驱动电源

摆率 0.8V/µs

8路双向数字位

5V / 3.3V工作; CMOS输入阈值

可编程输入极性

螺丝端子连接

一个树莓派®上最多可安装8个MCC DAQ HATs模块。结合已有的MCC 118,8路通道电压测量HAT和MCC 152电压输出及数字I/O HAT,用户可配置具有模拟输入,输出和数字I/O的多功能,基于树莓派的解决方案。多重HAT可以使用外部时钟和触发作为输入选项,进行同步采集。用户可以混合和搭配堆栈中的MCC HAT。

基于C / C ++®和Python™的MCC DAQ HATs开源命令库可以让用户在Linux系统上开发应用程序。该库可从GitHub下载。同时还提供了全面的API和硬件文档。

https://china.mccdaq.com/press_releases/pr_163.aspx

猫咪走开!计算机视觉喷水驱猫装备

MAKER:CatawayCV/译:趣无尽 Cherry(转载请注明出处)

不得不承认,Maker 撩猫那可是一把好手。咱们的撩猫系列教程,前有《用 Arduino DIY 镭射激光逗猫神器》,后有《Petoi Nybble:树莓派猫奴玩家的福音》。

下面要介绍的这个用来为你看家护院,驱赶外来的随地大小便的入侵猫!

虽然本教程没有对计算机视觉的工作原理作特别详细的介绍,但会将项目构建的过程和代码分享给大家。

首先,这个喷水驱猫装备是一个低压的喷头,而且转动的速度比猫的反应要快。但请放心,它不会把猫咪喷成落汤猫,只是产生威慑效果,打消它们在后院大小便的念头。

来看一段简单视频:

材料清单

树莓派 Zero(Raspberry Pi Zero)×1

SD卡×1

树莓派摄像头×1

继电器×1

555定时器×1(可以用 Arduino 和一个继电器代替)

电磁阀×1

喷水头×1

电子产品的外壳×1

锤子×1

低分辨率的摄像头×1

系统介绍

1、树莓派摄像头检测到类似一只猫大小的物体的移动了数帧(下一步会说明)。

2、树莓派引爆喷水头。

3、猫落荒而逃。

4、视频自动上传到 Youtube 供大家伙儿围观。

编程

使用 openCV 的帧减法,你可以找到随时间变化的帧的区域,使用一些实用的函数,确定物体的大小以及其变化,最重要的是确实物体是否是猫。

你也可以自己在网上搜索有关帧减法的详细教程。

代码工作原理

1、摄像头要保持拍摄并将画面进行比较。检测到猫大小的物体将引起注意。

2、猫大小的物体变化持续超过 4 帧,树莓派将用 GPIO 为继电器供电并启动 Arduino。

3、Arduino 发送信号给第二个继电器供电五秒钟并激活电磁阀。电磁阀在通电时启动喷水头。

4、当喷水头启动时,摄像头会停止检测并记录视频。

5、将视频上传到你的 Youtube,同时上传到 Dropbox 进行微调系统。

使用两个继电器和一个 Arduino 来打开电磁阀的原因如下

1、录制视频时树莓派不能开关电磁阀,python 脚本直到视频结束后才能停止。因此当视频还在录制时,需要 Arduino 或555定时器作为独立的脚本来关闭电磁阀。

2、第一个继电器和 Arduino 可以用 555 定时器替换,它可以节省大量的时间和金钱。

3、树莓派不能直接触发电磁阀,因为树莓派的 GPIO 工作在 3.3v 和 51mA (最大值)上,而电磁阀需要 5V 并且大于 51mA 才触发。

4、可以裁剪每个画面的大小,除去不需要检测的区域,例如隔壁家的花园。

5、可能会错过一些画面,浪费时间来设置它。

代码如下

import cv2 import numpy as np import argparse #cat import time import RPi.GPIO as GPIO import os import dropbox from picamera.array import PiRGBArray from picamera import PiCamera #————————————————Upload to youtube————————————— def HDtoYoutube(): ctime = time.strftime(“_%H-%M-%S”) cdate = time.strftime(“_%d-%m-%Y”) vidname = ctime + cdate #Trigger relay GPIO.output(11,True) time.sleep(.5) GPIO.output(11,False) print(“Taking Video”) try: #Take Video os.system(‘raspivid -w 1640 -h 922 -o vid{0}.h264 -t 15000’.format(vidname)) #Upload to youtube print(“Uploading to YouTube”) os.system(‘sudo youtube-upload –title=”Cat Got Wet {0}” –client-secrets=client_secret.json vid{0}.h264’.format(vidname)) #Remove video file when done os.remove(‘vid{0}.h264’.format(vidname)) print(“Video uploaded and removed from Pi”) except: pass #————————————————Stills to dropbox————————————— def StillsToDropbox(): print(“Uploading Still To Dropbox Function”) access_token = ‘Ah ah ah, you didn’t say the magic word…Ah ah ah, you didn’t say the magic word’ ctime = time.strftime(“%H:%M:%S”) cdate = time.strftime(“%d-%m-%Y”) try: filename = “/Motion/{0}/DetectedAt_{1}.jpg”.format(cdate, ctime) print(filename) client = dropbox.client.DropboxClient(access_token) image = open(“ToDropbox.jpg”, ‘rb’) client.put_file(filename, image) image.close() os.remove(“ToDropbox.jpg”) except: pass #————————————————Detect motion—————————————– def DetectMotion(): #Define vars min_area = 400 tolarance = 25 #change in pixel bluramount = 21 timetoforget = 0.5 kernel = np.ones((5,5),np.uint8) #used for dialate MotionCounter = 0 MinTargetArea = 600 #smallest size to detect MaxTargetArea = 5000 #Largest size to detect now = time.time() then = time.time() #initialise camera camera = PiCamera() camera.resolution = (640,480) camera.framerate = 10 rawCapture = PiRGBArray(camera, size=(640,480)) #warmup camera time.sleep(1) #Grab first frame & prep it to go into cv2.acumulate weight camera.capture(rawCapture, format=”bgr”) avg = rawCapture.array #Crop out unwanted region PolyCrop = np.array( [[[362,480],[613,365],[628,161],[498,0],[640,0],[640,480]]], dtype=np.int32 ) cv2.fillPoly(avg, PolyCrop, 0,0,0) #Process image avg = cv2.cvtColor(avg, cv2.COLOR_BGR2GRAY) avg = cv2.GaussianBlur(avg, (bluramount, bluramount), 0) avg = avg.copy().astype(“float”) rawCapture.truncate(0) print(“Ready to detect”) #capture frames for frame in camera.capture_continuous(rawCapture, format=”bgr”, use_video_port=True): #Pause Switch loopgo = GPIO.input(PauseNow) #print(loopgo) while loopgo == 0: #print(loopgo) loopgo = GPIO.input(PauseNow) time.sleep(1) #grabs raw numpy array currentframe = frame.array key = cv2.waitKey(1) & 0xFF #Crop out unwanted region cv2.fillPoly(currentframe, PolyCrop, 0,0,0) rawCapture.truncate(0) #Clear frame buffer for next loop currentgray = cv2.cvtColor(currentframe, cv2.COLOR_BGR2GRAY) currentgray = cv2.GaussianBlur(currentgray, (bluramount, bluramount), 0) #make time average frame cv2.accumulateWeighted(currentgray, avg, timetoforget) #get difference in frame frameDelta = cv2.absdiff(currentgray, cv2.convertScaleAbs(avg)) thresh = cv2.threshold(frameDelta, tolarance, 255, cv2.THRESH_BINARY)[1] #Turn to blob thresh = cv2.dilate(thresh, kernel, iterations = 10) #dilate thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) #close holes thresh = cv2.erode(thresh, kernel, iterations = 5) #erode #contours _, cnts, _= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # loop over the contours for c in cnts: # if the contour is too small, ignore it if cv2.contourArea(c) < min_area: continue # compute the bounding box for the contour, draw it on the frame, # and update the textq (x, y, w, h) = cv2.boundingRect(c) #Too small : Red Box if cv2.contourArea(c) < MinTargetArea: cv2.rectangle(currentframe, (x, y), (x + w, y + h), (0, 0, 255), 2) #MotionCounter = MotionCounter + 1 #Debug take all the pictures print("MotionDetected") #Just right : Green Box if cv2.contourArea(c) >= MinTargetArea and cv2.contourArea(c) <= MaxTargetArea: cv2.rectangle(currentframe, (x, y), (x + w, y + h), (0, 255, 0), 2) MotionCounter = MotionCounter + 1 #Debug take all the pictures print("MotionDetected") #Too big : Blue Box if cv2.contourArea(c) > MaxTargetArea: cv2.rectangle(currentframe, (x, y), (x + w, y + h), (255, 0, 0), 2) #MotionCounter = MotionCounter + 1 #Debug take all the pictures print(“MotionDetected”) #Keep now up to date now = time.time() #MotionCounterTimer if (MotionCounter > 0): if (now – then > 10): MotionCounter = 0 then = time.time() #Break loop on pressing Q if key == ord(“q”): break #If motion persists save current frame and activate countermeasures if MotionCounter >= 4: MotionCounter = 0 cv2.imwrite(‘ToDropbox.jpg’, currentframe) camera.close() return True #————————————————Main————————————— try: #Set Pins GPIO.setmode(GPIO.BOARD) PauseNow=12 GPIO.setup(11,GPIO.OUT) GPIO.setup(PauseNow,GPIO.IN,pull_up_down=GPIO.PUD_UP) while True: MotionDetected = False MotionDetected = DetectMotion() if MotionDetected == True: HDtoYoutube() StillsToDropbox() except KeyboardInterrupt: print(“Keyboard Interupt”) except: print(“Other Error”) finally: GPIO.cleanup()

组装

1、将所有电器安装防水外壳,并使用胶带和热熔胶固定到位。

2、开始投入运转。

误报的情况

设备也会存在误报的情况,也许它也会喷到你的家人或朋友。因此提供一个专业的意见——在门上安装一个关闭设备的开关。

教程中如有误的地方请多多包涵与指教。希望你喜欢这个项目。

https://make.quwj.com/project/124

via

自行设计树莓派CM(计算模块)的扩展板

大家好,一直以来树莓派计算模块(Compute Module)的开发和应用资料相对其他版本来说较少,现在我们为大家介绍一个有关它的项目,一款树莓派CM的典型扩展板。

这个扩展板并没有在官方的基础上扩展出更多的功能(甚至去掉了很多已有的功能),但是,了解这个项目的原理,将对自行设计树莓派CM扩展板有极大的借鉴意义。

已经测试通过的部分:

eMMC 和 SD-Card 方式启动

GPIO

USB (以太网,SFTP 最大速度 820KB/s)

未测试的部分:

DSI 显示器接口

下面是该项目的电路原理图和PCB文件,供大家研究。

http://downloads.nxez.com/nxez/201903/RPi-CM-Breakout.sch

http://downloads.nxez.com/nxez/201903/RPi-CM-Breakout.brd

我们知道树莓派CM以更小尺寸、更强性能被定位在工业控制领域使用,也有一些朋友对树莓派接口方面有定制化的需求,那么这份资料对于研究是比较有帮助的了。

via

树莓派的工作温度测试

以下内容由 raspberrypi.com.tw 翻译自 geektopia 和 RPi FAQ。测试所用的是初代树莓派(和目前的ZERO版本性能相当),而后面的树莓派版本在性能上更强,功耗方面也有所提高。文中的测试数据对于对比处理不同工作时主板温度的差异有一定参考作用。

使用 BCM2835 的 Raspberry Pi Model B,热的来源主要从以下三个元件而来:

1. 电源输入的稳压器(voltage regulator)。

2. SoC BCM2835,包含了 ARM11 CPU、GPU 和 RAM。

3. LAN9512,是 USB 和 Ethernet 的控制器。

我们可以比较几个情境。

* 闲置状态(仅通电开机,没有连接 Ethernet)

图片来源:geektopia

BCM2835 平均温度在 48.7°C。Voltage regulator 平均温度在 49.9°C。LAN9512 温度是三者最高的,平均温度在 53.0°C。

* 网路传输状态(Ethernet 以平均 40MBits/s 速度传输 20 分钟后)

图片来源:geektopia

LAN9512 温度仍然是三者最高的,平均温度在 59.2°C。

* 忙碌状态(以 stress 程式对 CPU 进行压力测试,使用率达 100%)

图片来源:geektopia

LAN9512 温度仍然是三者最高的,平均温度在 60.6°C。

* 影片播放状态(从随身碟播放以 x264 视讯格式和 AC3 音讯格的 1080p 影片为例)

图片来源:geektopia

LAN9512 温度仍然是三者最高的,平均温度在 58.5°C。

结论:

1. LAN9512 温度会比 voltage regulator 和 SoC 来的高。

2. 从以上几张图片的条件,我们可以知道 CPU 满载或是档案传输最容易让温度升高。并且在正常使用情况下(未超频),各元件的最高温度会是在 65°C 以下。

3. 而根据 RPi FAQ,LAN9512 的工作温度范围在 0°C 到 70°C,BCM2835 的工作温度范围在 -40°C 到 85°C。

The Raspberry Pi is built from commercial chips which are qualified to different temperature ranges; the LAN9512 is specified by the manufacturers being qualified from 0°C to 70°C, while the AP is qualified from -40°C to 85°C. You may well find that the board will work outside those temperatures, but we’re not qualifying the board itself to these extremes.

4. 根据实测,在 -78°C 的低温下,Raspberry Pi 会停止反应。

图片来源:geek

5. 除了使用红外线测温外,我们还可以使用 /opt/vc/bin/vcgencmd measure_temp 指令来查看 CPU 的温度。

参考资料:

* Does the computer Raspberry Pi is heated? Study their operating temperatures

* RPi FAQ

* Raspberry Pi proven to be stable when submerged in liquid nitrogen

* Raspberry Pi model B Thermal Tests

via raspberrypi.com.tw

树莓派出官方键盘鼠标了

近期,树莓派官方推出了一套非常可爱树莓派官方键盘和鼠标。

树莓派官方鼠标为三键滚轮光电鼠标,底座上有树莓派 Logo,颜色与官方外壳相匹配。

树莓派官方键盘为78键,和笔记本电脑的键盘类似。键盘目前有六种布局 – 英语(英国)、英语(美国)、西班牙语、法语、德语和意大利语。这款键盘还内置了USB集线器。

目前已开放的购买渠道是英国剑桥的线下商店,以及少数国家的经销商电商平台。

用树莓派或 Arduino 制造 LED 矩阵彩灯

MAKER:maketvee/译:趣无尽 Cherry(转载请注明出处)

之前我们介绍过一款非常炫酷的《熔岩特效灯》。这期教程中我将为大家介绍一款更易上手的灯。

这款 LED 矩阵彩灯使用标准的 WS2812b LED 灯,构成一个圆柱形的灯体,最后由木制边框组合而成。效果相当棒!

先看下面的视频。

材料清单

790×384 纸板×若干(这里用的是 1.5mm 椴木板)

WS2812b LED×100(30个/米)

树莓派(Raspberry Pi)或 Arduino ×1

木制贴片或其他柔韧行强的材料×若干

电线×若干

外形设计和激光切割

主要的设计参数就是所使用材料的厚度。

1、该版本使用了 1.5 毫米的纸板,不仅容易切割而且非常便宜。如果改变厚度, CAD 数据也要随之更改。

2、3D 设计有助于避免在组装过程中的出现问题。

3、激光切割,部件的摆放方式必须方便激光机切割,纸板使用的大小为 790×384 厘米。

4、推荐使用 Inkscape 这个工具。附带的 SVG 文件包含了项目所有部件的信息。

注意:我通过用户参数规定的厚度修改了 Fusion360 的型号,你也可调整材料的厚度并生成自己的激光切割文件。

模型的链接为:https://a360.co/2OC2kvZ

激光切割的 SVG 文件请在项目文件库中下载。

激光切割、局部组装

激光切割出以下部件:

C形的水平部件×12

竖形的卡槽×18

垂直连接部件×2

LED 承载部件×20

8个C形,9个卡槽和1个连接部件可以组合成一个半圆形的造型。

在此步骤中,所有部件用卡槽连接起来,不使用胶水。

LED 接线

每一个 LED 灯条上有五个 LED 灯,并用胶水粘到载体上。

1、灯带的 DI(数据输入)和 DO(数据输出)引脚以Z字形的方式连接在一起,将第一条带的 DO 与下一条纹的 DI 连接,依此类推。

2、每个半圆形的需要 10 条灯带。5V 和 GND 仅在条带的一侧连接。电线的长度与矩阵的条带所需布线的长度相匹配。

3、将 LED 灯条安装到位之前,必须将所有结点用胶固定好。

4、将十个灯条用胶水固定到每半个圆柱体上。一个半圆的 DO 连接到另一半圆的 DI。第一个半圆的DI 将是 Raspberry Pi 或 Arduino 的输入。

第一次测试

为确保一切正常,将对 LED 彩灯进行第一次测试。使用 Arduino 和 Neopixel 应该是最简单的方法。

木质装饰

测量圆柱体的直径和高度后,将木质饰面安装到位。

Raspberry Pi、Arduino 以及电源

为了在 Python 中编写漂亮的矩阵效果,可以使用 Raspberry Pi。Raspberry Pi Zero 就可以,它通过 GPIO 引脚 18 连接到矩阵,并通过 74HCT245 电平转换器,使树莓派的 3.3V 适应 WS2812 的 5V。当使用更多的 Neopixel / WS2812 LED 灯时,将会使用更大的电容(2200 uF)和串联电阻(470 欧姆)。

电源

100个 WS2812b LED 的最大功率为 100x60mA = 6A。当然,如果降低亮度,功率损耗也会大大降低。5V 电源能够达到你想要的亮度。

Arduino

该矩阵可直接在 Arduino 设备上使用 Adafruit 的 NeoPixel 库和 NeoMatrix 库。如果你使用下面的用例,则必须修改 PIN 并初始化:

NeoMatrix:

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(20, 5, PIN,NEO_MATRIX_TOP + NEO_MATRIX_LEFT+ NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);

你可以使用 Adafruit 的 GFX 库,可以下载高度为5像素的不同的点阵字体。请使用附带的 Arduino sketch 作为起点(使用 PIN 4 作为矩阵的起点)。它是 Neomatrix 示例草图的改编版本。

NeoPixel:

Adafruit_NeoPixel strip = Adafruit_NeoPixel(100, PIN, NEO_GRB + NEO_KHZ800);

所需文件请在项目文件库中下载。

模拟

Python 源代码可在 Github 库下载到。

编程

这里设置了两种模式。在 cylinder.py 的开头定义了 PI 变量。

1、PI=False,是模拟模式,将启动一个 Python 程序用来测试所有的动画效果。需要先安装程序依赖的所有库(如 pygame,numpy 等)。在模拟模式下,圆柱体显示为 5×20 像素矩阵。

2、PI=True,这将驱动树莓派的 GPIO 18# 引脚。你可以使用参数自由添加其他效果。

文本使用了3×5像素的字体,由于高度有限,不是所有字母都可以完整的显示。

希望你喜欢这个项目。

via