树莓派+nodejs打造物联网图传控制履带车

本文来自 float ,介绍了一套基于树莓派平台的遥控小车机器人项目,支持图像传输和远程控制。项目的软件部分是开源的,在这里推荐给趣友和树莓派爱好者。

项目的灵感来自皮克斯动画《机器人总动员》的主角瓦力(wall.e)。一个在末日的废墟中幸存并日复一日清洁着地球的可爱机器人。

这是一个十分有趣的物联网项目!它运行在基于arm架构的raspiberry(树莓派)开发板上。借助性能出色的node和多平台兼容的硬件框架johnny-five,我们创建了这个项目。 ​ 此项目包括了服务端到前端程序,开发语言选用javascript,功能上包括了视频监控,温度数据采集,远程遥控,距离测量,gps定位等功能。 欢迎对物联网感兴趣的开发人员Issues。

技术栈

  • johnny-five
  • vue
  • express
  • chart.js
  • mongoDB

目标功能

  • [x] 支持视频实时监控 (完成)
  • [x] 支持摄像头转动(完成)
  • [x] 支持手动控制电机运行(完成)
  • [x] 支持温度采集(完成)
  • [ ] 支持gps定位
  • [ ] 支持距离探测
  • [ ] 支持循迹功能
  • [ ] 支持自由巡航

环境配置和依赖

  • 树莓派开发板(Raspberry Pi 3 Model B)
  • ubuntu mate16.0.4操作系统
  • node && npm
  • MJPG-streamer

运行项目

项目下载

git clone https://github.com/zexiplus/WALL.E.git
cd WALL.E
npm install

开发模式运行web界面程序

npm run dev
// then open the browser at http://localhost:1234

生产环境运行web界面程序

npm run build
npm run local
//then open the browser at http://localhost:2999

运行服务端程序

npm run board

材料准备

模块 价格 数量
树莓派开发板 ¥200 1
履带底盘 ¥350 1
AD转换器 ¥15 1
红外传感器 ¥3 6
SG90舵机 ¥15 1
树莓派摄像头 ¥80 1
电池 ¥30 1
gps模块 ¥50 1
MPU6050集成传感器模块 ¥20 1

接线说明

接线参考图如下:

目前接入电路的模块有电机驱动模块,mpu6050集成模块,servo伺服电机模块,摄像头模块。
电机驱动模块接收io引脚发出的高低电平,输出12v的电压从而驱动电机。
servo伺服电机模块用来转动摄像头,摄像头固定于伺服电机支撑的转轴上。
mpu6050模块可以感知周边温度,测量加速度等。
由于gps模块的通信信道与wifi冲突,暂时无法引入,gps定位会在之后的版本中完成。
本项目树莓派io引脚采用wiringPi编码,如图:

接线描述:
伺服电机的信号线接树莓派开发板 1引脚(wiringPi编码,下同)。
mpu6050传感器SCL接树莓派开发板 3引脚,SDA接 2引脚。
电机驱动模块四个输入端分别接树莓派 21,22,23,24 引脚。

项目展示

这里有一个项目的Web控制页面 DEMO,以下是视频演示。


小车实物图:

 

 

项目维护人

GitHub | float
Maker 趣无尽项目页面
项目许可协议:GPL

本文来自:树莓派实验室

 

使用 Adafruit 读取 DHT11 温湿度传感器

DHT11 温湿度传感器尽管不是使用效率最高的温湿度传感器,但价格便宜被广泛应用。之前我们介绍了用树莓派从 DHT11 温度湿度传感器读取数据的教程,其原理理解起来较为复杂,下面我们介绍另一种基于Adafruit DHT 库读取 DHT11 数据的方法。

DHT11 规格

DHT11 有四个引脚,但是其中一个没有被使用到。所有有的模块会简化成3个引脚。

  • 湿度检测范围 : 20-80% (5% 精度)
  • 温度检测范围 : 0-50°C (±2°C 精度)

该厂商不建议读取频率小于2秒,如果这么做数据可能会有误。

硬件连接

需要在电源和数据脚之间串联一个上拉电阻(4.7K-10K),通常情况下,购买DHT11模块的话都自带了这个电阻。不同的模块型号引脚位置略有不同,下面以图上模块为说明:

DHT Pin Signal Pi Pin
1 3.3V 1
2 Data/Out 11 (GPIO17)
3 not used
4 Ground 6 or 9

数据引脚可以根据你的需要自行修改。

Python 库

DHT11 的读取需要遵循特定的信号协议完成,为了方便我们使用Adafruit DHT 库。

软件安装

开始之前需要更新软件包:

sudo apt-get update
sudo apt-get install build-essential python-dev

从 GitHub 获取 Adafruit 库:

sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT

给 Python 2 和 Python 3 安装该库:

sudo python setup.py install
sudo python3 setup.py install

示例程序

Adafruit 提供了示例程序,运行下面的命令测试。

cd ~
cd Adafruit_Python_DHT
cd examples
python AdafruitDHT.py 11 17

这两个参数分别表示 DHT11 和数据引脚所接的树莓派 GPIO 编号。成功的话会输出:

Temp=22.0* Humidity=68.0%

如何在其他 Python 程序中使用这个库

参照下面的方法引入 Adafruit 库,然后就可以使用 “read_retry” 方法来读取 DHT11 的数据了:

import Adafruit_DHT
  
# Set sensor type : Options are DHT11,DHT22 or AM2302
sensor=Adafruit_DHT.DHT11
  
# Set GPIO sensor is connected to
gpio=17
  
# Use read_retry method. This will retry up to 15 times to
# get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
  
# Reading the DHT11 is very sensitive to timings and occasionally
# the Pi might fail to get a valid reading. So check if readings are valid.
if humidity is not None and temperature is not None:
  print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
else:
  print('Failed to get reading. Try again!')

另外,温度传感器还有 DS18B20,这个传感器虽然没有湿度数据,但是其易用且稳定。

本文来自:树莓派实验室

树莓派安装 Nginx + PHP7.0 + Pi Dashboard

之前我们介绍过树莓派搭建LNMP环境的方法,以及给树莓派装一个仪表盘来监控树莓派运行状态。
近期有用户反馈树莓派最新版的系统已经无法找到 PHP5 的软件包了,这是因为新版本已经用 PHP7 替代了 PHP5,而 Nginx 下 PHP-FPM 的配置方法和 PHP5 有略有不同。因此我们打算更新这篇《给树莓派安装 Nginx + PHP7.0 + Pi Dashboard》来介绍如何用在树莓派上部署新的 Nginx 和 PHP 环境,并部署好 Pi Dashboard 的方法。下面假设你已经刷好了 Raspbian Stretch 系统。

安装 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 即可,以上步骤在树莓派3B + Raspbian Stretch 系统版本上测试通过。

Pi Dashboard 介绍

Pi Dashboard (Pi 仪表盘) 是树莓派实验室发布的一款开源的 IoT 设备监控工具,目前主要针对树莓派平台,也尽可能兼容其他类树莓派硬件产品。你只需要在树莓派上安装好 PHP 服务器环境,即可方便的部署一个 Pi 仪表盘,通过炫酷的 WebUI 来监控树莓派的状态!

目前已加入的监测项目有:

  • CPU 基本信息、状态和使用率等实时数据
  • 内存、缓存、SWAP分区使用的实时数据
  • SD卡(磁盘)的占用情况
  • 实时负载数据
  • 实施进程数据
  • 网络接口的实时数据
  • 树莓派IP、运行时间、操作系统、HOST 等基础信息

项目主页:http://maker.quwj.com/project/10
GitHub地址:https://github.com/spoonysonny/pi-dashboard

视频预览

部署 Pi Dashboard

这里介绍两种方法将 Pi Dashboard 部署在 Nginx 上。
SFTP 上传
在 GitHub 下载本项目源码。通过 FileZilla 等 FTP 软件将解压出来的目录上传到树莓派的 /var/www/html目录下。
那么可以通过 http://树莓派IP/pi-dashboard 访问部署好了的 Pi Dashboard。

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

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

GitHub 部署
如果你了解过 GitHub 的基本操作,通过 GitHub 来下载本项目到 Pi 上会相当方便。

#如果已安装过 git 客户端可以跳过下一行
sudo apt-get install git
cd /var/www/html
sudo git clone https://github.com/spoonysonny/pi-dashboard.git

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

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

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

以上步骤在树莓派3B + Raspbian Stretch 系统版本上测试通过。

Pi Dashboard 常见问题

Q:Pi Dashboard 的 WebUI 支持在哪些终端上查看?
A:任何带有浏览器的终端都可以查看,无论是在内网还是外网的电脑、Pad或是智能手机上。Pi Dashboard 对不同的设备做了响应式布局,能很好兼容手机浏览。

Q:我没法通过外网IP访问到怎么办?
A:国内很多地区的ISP都不提供独立的外网IP了,可以通过花生壳等工具实现外网访问。对于已有外网独立IP的用户,可以尝试把 Nginx 服务端口从 80 改成其他端口号,再在 IP 地址后添加端口号访问。这是因为国内ISP普遍禁用了80端口。

Q:我有一个域名,如何将域名绑定到树莓派上?
A:可以参考DNSPod动态IP解析更新程序树莓派搭建LNMP环境。将域名指向树莓派IP后需要修改 Nginx 网站配置的 servername 这项为你的域名即可。

使用条款

本项目是开源项目,NXEZ.com 保留作为发起者的权利。
允许在 GPL v3.0 协议下对项目进行使用。请务必在保证项目的出处、声明、超链接等内容完整。

本文来自:树莓派实验室

 

 

 

Google升级AIY套装:内含树莓派主板 可DIY智能音箱和摄像头

对于普通消费者来说,在智能家电产品上往往会选择成品;但对于拥有娴熟技能或者充足动手能力的人来说,往往希望能够根据自己的需求来定制DIY出想要的产品。搜索巨头Google本月在Target商城上架了AIY最新套件,可以打造处类似于Google Home的智能音箱和能够识别面部和手势的智能摄像头。

2017年年初,Google正式发布了AIY项目(Artificial Intelligence Yourself),目的是鼓励开发者们和爱动手的技术发烧友自己在家搭建AI小硬件,让更多人能学习、探索并体验人工智能。

今天在Target上架的两个新套件分别为AIY Voice和AIY Vision。Google希望通过这两款套件,帮助社区开发者能够让智能音箱和智能摄像头变得更加智能。在本周一的官方博文中宣布了升级版套装,也表达了帮助提高学生计算机科学技能的兴趣。

两款套装中都包含了树莓派的单板计算机(Raspberry Pi Zero WH),而且AIY Vision套装还包含树莓派的摄像头。此外Google还发布了配套的APP以便于更好的组合和配置数码设备,用户也可以前往Google的AIY网站下载相关的文档。

AIY Vision图片:零售价为89.99美元

AIY Voice套装图片:零售价格为49.99美元

本文来自:cnBeta

 

Ngrok和树莓派绕过企业防火墙并访问内网主机实验

绝大多数安全研究人员所面临的一个常见问题,就是如何在目标网络部署了严格的企业级防火墙或路由器时,如何访问目标企业网络内的办公计算机或者本地设备。在很多情况下,我们的办公室电脑会在防火墙的保护下接入互联网。那么问题就来了,在默认情况下,它并不会允许来自外部网络的流量进入内网。这也就意味着,你可以使用办公室电脑与互联网中的外部主机进行通信,但远程设备却无法与你的办公室电脑连接。

PS:本文仅用于技术讨论与分享,严禁用于任何非法用途

如果你想用家里的电脑访问办公室电脑中的文件或其他资料的话,这就非常令人头疼了。那现在该怎么办呢?我们有没有什么办法去访问路由器或防火墙背后的联网设备呢?

我们能想到的有如下四种方法:

1.   添加防火墙规则,并允许指定的远程IP绑定指定端口来访问办公室电脑;

2.   端口转发;

3.   反向SSH;

4.   Ngrok;

Ngrok

Ngrok这种服务允许我们利用外部端口转发并通过任何网络来连接任意设备(LAN/WAN)。Ngrok最大的一个优势就在于,如果你想访问某个网络中的设备时,你并不需要让自己的设备同样处于同一本地网络之中。在Ngrok的帮助下,你可以通过SSH、FTP或Web服务器来访问目标设备。

Ngrok参考资料:【点我获取

既然我们已经了解了Ngrok的功能,那么接下来我们会使用Ngrok来设置办公室电脑来接受远程设备的SSH连接。我们会给大家提供一个简单的Ngrok使用样例,我会在公司内网的办公室电脑中开启一台SSH服务器(端口22),并设置Ngrok,然后使用Ngrok链接从外网访问这台办公室电脑。

第一步:设置账号

点击【这条链接】,然后创建一个Ngrok账号。

完成了账号注册之后,你将会得到一个认证令牌,你需要使用这个令牌来连接你的树莓派和Ngrok账号,这个需要注意。

第二步:下载Ngrok

使用下列命令在你的树莓派上下载Ngrok:

wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip

接下来,使用下列命令提取文件:

unzip ngrok-stable-linux-amd64.zip

如果一切顺利的话,你将会看到一个名叫“ngrok”的文件:

第三步:创建你的账号

使用下列命令来设置你的认证令牌(authtoken):

./ngrok authtoken 4BSL861jeVz9wt7AM91QM_aksO43YvcKgmtC4pxv

第四步:运行Ngrok

现在你可以使用下列命令运行Ngrok(端口22):

./ngrok TCP 22

现在,你将会看到如下所示的信息:

Web Interface http://127.0.0.1:4040
Forwarding tcp://0.tcp.ngrok.io:36428 -> localhost:22

上面的数据表示,任何指向‘0.tcp.ngrok.io’(端口36428)的链接都将被重定向到目标设备(端口22)上。

第五步:使用远程PC访问你的办公室电脑

现在,你可以使用下列命令从远程PC上访问你的办公室设备了:

ssh user@0.tcp.ngrok.io -p 36428

没错,一切就是这么简单,你可以使用这种方法随时访问你的办公室电脑。

本文来自:FreeBuff

Pi-Micro:用树莓派ZeroW制作的掌上电脑

你有没有想过制作一台可以放在手掌上的电脑? 我就很想,所以我制造了这款被我称之为 Pi-Micro 的小型笔记本电脑。 这是 Pi-Micro 的第三版,制作了将近一年的时间,因为它足够精细了,所以来与大家分享。 Pi-Micro 可以运行完整的 Linux 操作系统。能够浏览网页、编辑文档、使用终端、创建自定义编程脚本以及玩游戏。
据我所知,它是使用 Raspberry Pi 制作的最小的电脑,它还拥有全键盘。 使用树莓派 Zero W 制作,内置 WiFi 和蓝牙。

Pi-Micro规格介绍:

512 MB RAM
1GHz处理器
内置WiFi和蓝牙
3.5″触摸屏
1000mAh锂离子内置电池
16GB内部存储
完整的QWERTY键盘 108mmX19.5mmX70mm

自制 Pi-Micro 的心路历程

(如果你想要干货,请直接跳过此部分。)
这款笔记本电脑已经打磨了一年多了,在这一年里,我经历了很多不同版本的设计和原型。我设计的前两款都比较重,并且两种旋转轴的重量都不适合屏幕/主板。

a.V1.0(黑色)我的第一版Pi-Micro是2017年5月6日制作的。它使用3D打印的旋转轴,它太松,不能够让屏幕自行站立。但它的键盘是内置在我喜欢的,但是非常厚实和笨重。箱子顶部和底部的边缘也不是圆形的,外壳非常的便宜。

b.V2.0(Blue)我的第二版Pi-Micro是2017年10月左右制作的。我试图用超小的黄铜做的旋转轴,修复这个问题,但它们还是太松了。在这个版本中,我为了让它看起来更漂亮,把所有的边缘都变成圆形,并通过在3D建模程序为树莓派制作接口,代替焊接的铁质接口。关于这个版本的一个独特的地方,就是旋转轴和键盘连接处可以随意上下拆卸。但是,我最终不喜欢它的外观,因为它看起来并不像笔记本电脑。

项目免责声明

最好的项目从来都不容易。为了这台掌上计算机,我花费了一年多的时间,经历了几个版本通过几个版本的改机才获得现在的成品。这个项目有许多困难的焊接/拆焊,以及对Linux和Raspberry Pi的基本了解。如果你自己受伤或其他任何事情,我不负任何责任。请始终佩戴适当的保护装置,不要连接红色和黑色电线,也绝对不要刺破电池。小心!

3D 打印外壳

模型文件可在本项目文件库下载。
http://maker.quwj.com/project/44
打印参数设置如下:
长丝:ESUN PLA +
厚度:0.2MM
外壳:3
填充:80%

组件清单

  • 树莓派 Zero W × 1
  • 3.5 寸触屏显示器 × 1
  • 3D 打印机 × 1
  • 移动电源 × 1
  • 迷你蓝牙键盘 × 1
  • Micro SD 卡 × 1
  • USB 插座 × 1
  • 缝纫针 × 2
  • 电线 × 1
  • 螺丝 × 1
  • 胶水 × 1

拆卸移动电源

拆卸的目的是获得薄型电池/充电器组合,电源开关,5v输出。
第1步,从机箱上卸下螺丝,然后从铝壳上拆下内部组件。
第2步,将电线从太阳能电池板切割到控制器板。
第3步,断开电池,然后把它与控制器板之间的两根3英寸长导线重新连接。
第4步,拆卸USB端口,并将焊线焊接到控制器板的正极和负极输出端。

准备屏幕组件

重要提示:此步骤基于Waveshare 3.5"显示器,如果你使用不同的显示器,请更换焊接电线的引脚以符合你的显示器规格。
更多详细信息查看文章下链接
1.拆除触摸屏上的外壳。就我个人而言,最简单的方法是使用冲洗刀具将其剪下,然后使用烙铁从电路板上单独移除引脚的下半部分。
2.焊接导线到引脚1,2,6,11,18,19,21,22,23,24和26。
3.标记所有电线,以便你分辨清楚,如图所示。
4.仔细检查标签。
5.在3D打印的显示部件中钻孔,以便它们可以组合在一起。
6.再次检查标签。相信我,它会省下很多挫折。
7.将屏幕放置在零件内部,并将其组合在一起。

将USB插座焊接到树莓派

我将USB接口安装在电脑的右下角。
1.首先使用钢丝钳剪下USB插孔两侧的小标签(不是四个引脚中的任何一个),因为不是利用它们将USB固定。
2.将四个引脚以90度角向下弯曲,让它们延伸出背面,但插口并没有伸出底部。
3.将线焊接到每个引脚上,确保它们足够长可以从外壳的一侧延伸到另一侧,如有必要,用热缩管将端口绝缘。提示:使用不同颜色的电线;它有助于分辨哪些是你要将它们连接到Pi。
4.使用上面的电路图,将导线焊接到Pi的焊盘。

将电池焊接到树莓派

1.焊接从电源5V输出Pi 5V引脚的红线。
2.将电源GND输出的黑线焊接到Pi GND引脚。

将屏幕焊接到树莓派

这一步非常的棘手,一定要小心。
1.请尽量缩短电线长度。如果你的电线太长,它们会堆积在底壳内,使其难以关闭。尝试测量每根导线需要的距离,并精确的切割它们,以便在显示器和下半部分布置时,底壳边缘与显示器边缘之间会有2CM的间隙。
2.将带标签的导线连接到Pi上的相应引脚。请一定确认好每根引线。

安装软件

你至少需要8GB大小的Micro SD卡,不过你选择使用的大小将决定Pi-Micro内部存储的容量。
这是一个重要的步骤,因为它也有助于确定屏幕和电池是否已连接正常。
1.将Micro SD格式化为FAT32。
2.在此处下载用于Waveshare显示器的预制系统镜像。
3.使用Etcher,将系统镜像写入到Micro SD上。
4.将卡插入Pi,打开电池然后静待佳音。
5.如果一切顺利进行,说明你的安装没错。如果有问题,请仔细检查所有焊点和接线。
6.将蓝牙键盘与Pi配对。这意味着稍后我们不必访问键盘上的配对按钮,并且每次启动时都会自动连接。

缩小键盘大小,并将其焊接到树莓派

对于Pi-Micro的键盘,我们将使用电池的迷你蓝牙键盘,然后将其焊接到Pi。
1.打开键盘外壳。我发现最简单的方法是弯曲键盘,直到盒子的顶部和底部之间出现裂缝,然后用平头螺丝刀将其撬开。
2.卸下微型USB充电端口。直接加热端口后面,用烙铁完成这一操作,当焊料熔化时,它很容易滑落。
3.拆除电池。
4.将两根电线焊接到电池用于连接的端口上。
5.打开它。 (当我们将它连接到Pi时,务必确保它会同时打开。)
6.将电池正极端子的电线焊接到Pi上的3.3V引脚
7.将电池负极端子上的导线焊接到Pi上的任何GND引脚。

组装所有组件

提示:这是最令人头疼的部分,各位趣友耐心点哦。对于旋转轴部分,我决定使用针作为转轴。如果安装的整个过程中,如有阻力,请勿强行挤压。把壳内的物品整理一下比生拉硬拽好的多。
1.确保一切尺寸合适。把所有组件放入壳内,把盖子放在下半部分,并确保它是齐平的。如果不能,请微调一下。
2.用热胶来固定一切(除了电池,它有可能爆炸)。这样就可以确保当你摇动完成的计算机时不会有任何移位,并且在尝试使用USB和充电端口时不会将其推入计算机。
3.现在所有东西都是安全的,把盖子放在下半部分,用螺丝来固定它。你可能需要预先钻孔,因为可以使用的螺钉厚度不同,所以我没有将这些孔放入设计中。
4.将显示器放在下半部分。确保它可以安装在底部旋转轴上,并且可以旋转。
5.安装针。我建议使用最大直径的针头,由于旋转轴会变硬,你也许需要用一块木头的尖端或其他东西来推动它们。
6.如果需要,请使用烙铁将针头两端的塑料熔化,以免滑出。
7.如有需要,绕过下半部分的底部和盖子的边缘,并使用烙铁焊接任何有间隙的地方。

DONE!完成啦!希望趣友们喜欢这个项目!

本文来自:树莓派实验室

利用树莓派探索以太坊第一部分:环境搭建

在本系列文章的第一部分中,我们将在一台树莓派Pi 3 Model B上安装并运行一个以太坊区块链客户端。

毫无疑问,区块链绝对是当前的热点。之所以会这样,很大程度上是因为比特币以及其他加密货币让很多人一夜暴富。但是,区块链的应用并不仅限于加密货币领域,考虑到其去中心化以及防篡改等特性,区块链技术还可以用到IoT应用中。因此,除了加密货币和安全交易之外,以太坊平台还可以提供一种分布式的计算平台。

在这篇文章中,我们将会对以太坊架构进行分析,并了解其核心思想和功能组件,最后在树莓派上安装相应的客户端软件。需要声明的是,我并不打算用它来挖矿,因为挖矿需要强大的GPU支持,但树莓派只能创建一个简单的实验沙箱,而且我们也只是为了验证区块链技术可以应用到嵌入式平台上。

以太坊101

话不多说,下面给出的是一份以太坊智能合约样本的源代码(来自ethereum.org):

contract mortal {
 /* Define variable owner of the typeaddress */
 address owner;
 
 /* This function is executed atinitialization and sets the owner of the contract */
 function mortal() { owner = msg.sender; }
 
 /* Function to recover the funds on thecontract */
 function kill() { if (msg.sender == owner)selfdestruct(owner); }
}
 
contract greeter is mortal {
 /* Define variable greeting of the typestring */
 string greeting;
 
 /* This runs when the contract is executed*/
 function greeter(string _greeting) public {
 greeting = _greeting;
 }
 
 /* Main function */
 function greet() constant returns (string){
 return greeting;
 }
}

区块链是一种分布式的记账系统,一般通过对等网络进行管理,并且随着记录和区块成功添加到区块链网络中,其大小也会不断增长。一个区块通常包含交易数据以及时间戳,并且会通过哈希算法进行安全加密,数据一旦成功提交到区块链中,将无法再被修改。

以太坊平台拥有自己的加密货币,我们称之为以太币。但是它还基于区块链技术创建了一种针对智能合约的去中心化平台,智能合约对象中包含的代码函数可以在区块链中“生存”,并于其他合约进行交互,制定决策,存储数据,或向其他人发送以太币。

智能合约是用一种名叫Solidity(基于JavaScript)的编程语言实现的,Solidity编译器可以将智能合约编译成字节码(跟JavaScript、Python、Java或Android类似),然后通过以太坊虚拟机(EVM)执行。需要注意的是,在智能合约中进行交易是有成本的,这部分内容我们之后会进行讨论。

目前市场上有好几款不同的以太坊客户端(基于Geth,采用Go语言开发),其中的某些能够挖以太币,有些则是单独的挖矿软件。除了主要的以太坊区块链网络和矿池之外,还有很多用于实验和测试的网络,当然了,你也可以创建自己的私有区块链网络。

安装Geth

假设我们现在已经安装好了Raspbian,我们需要将已安装的数据包软件更新至最新版本:

$ sudo apt-get update
$ sudo apt-get dist-upgrade

当我第一次尝试编译以太坊客户端时,出现了内存不足的情况,为了将RAM腾出来给这种内存密集型任务,最好的方法就是减少分配给GPU的内存空间。如果你不需要图形桌面,你可以将系统以命令行界面启动。

$ sudo raspi-config

接下来,安装相应的依赖组件:

 $ sudo apt-get install git golang libgmp3-dev

接下来,从GitHub获取Geth的官方源码(采用Go语言实现的官方以太坊源码),对代码进行编译并将可执行程序拷贝到/usr/local/bin/。

$ mkdir src
$ cdsrc
$ gitclone -b release/1.7 https://github.com/ethereum/go-ethereum.git
$ cdgo-ethereum
$ make
$ sudo cp build/bin/geth /usr/local/bin/

创建账号并进行测试

使用Geth创建一个新的账号:

$ geth account new

接下来程序会创建一套新的加密密钥,并使用了密码来保护私钥的安全。需要注意的是,如果你想用这个账号来挖矿并进行交易的话,你需要确保已经备份了你的密钥并防止你的私钥被他人访问。

现在,我们需要运行节点。

$ geth --syncmode light --cache <span class="hljs-number">64</span> --maxpeers <span class="hljs-number">12</span>

如果我们在不使用任何参数的情况下运行Geth,它将开启一个节点并尝试跟整个公共区块链主网进行数据同步,数据大小在50GB以上,并且还会继续增长,因此不适用于嵌入式计算机。所以说,我们准备以轻量级同步模式运行该节点,这种模式只会获取区块Header信息。

按下CTRL+C后就可以退出节点了,我们可以在设备启动时让它以服务的形式运行:

$ sudo vi /etc/systemd/system/geth@.service

然后添加下列代码:

 [Unit]
Description=Ethereumdaemon
Requires=network.target
 
[Service]
Type=simple
User=%I
ExecStart=/usr/local/bin/geth--syncmode light --cache 64 --maxpeers 12
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

保存文件,下列命令可以让以太坊节点以“pi“用户身份运行:

$ sudo systemctl enable geth@pi.service
$ sudo systemctl start geth@pi.service

接下来,我们可以使用下列命令绑定节点:

$ geth attach

这样我们就能得到一个交互式JavaScript控制台,这里我们可以调用任何函数,比如说:

>eth.accounts

该命令可以输出当前账号列表:

或者获取已连接节点的信息:

>admin.peers

需要注意的是,轻量级客户端协议仍处于开发阶段,因此某些实验性的功能可能还无法完美支持。

总结

现在,我们已经安装好客户端软件了,并成功创建了一个账号,然后开启了一个可通信节点。接下来在本系列文章的第二部分中,我们将组建一个私有区块链网络,并进行实际的交易活动。稍等片刻,我们马上就来!

* 参考来源:rs-online,FB小编Alpha_h4ck编译,转载自FreeBuf.COM

 

 

 

用树莓派实现实时的人脸检测

本文介绍了如何在树莓派上,使用 OpenCV 和 Python 完成人脸检测项目。该项目不仅描述了识别人脸所需要的具体步骤,同时还提供了很多扩展知识。此外,该项目并不需要读者了解详细的人脸识别理论知识,因此初学者也能轻松跟着步骤实现。

项目所需设备

硬件:
树莓派3
树莓派摄像头模块(PiCam)

语言和库:
OpenCV
Python 3

本文主要讲述如何使用 PiCam 实现实时人脸识别,如下图所示:

本教程使用 OpenCV 完成,一个神奇的“开源计算机视觉库”,并主要关注树莓派(因此,操作系统是树莓派系统)和 Python,但是我也在 Mac 电脑上测试了代码,同样运行很好。OpenCV 具备很强的计算效率,且专门用于实时应用。因此,它非常适合使用摄像头的实时人脸识别。要创建完整的人脸识别项目,我们必须完成3个阶段:

1)人脸检测和数据收集;
2)训练识别器;
3)人脸识别。

如下图所示:

第1步:材料清单

主件:
树莓派3
500 万像素 1080p 传感器 OV5647 迷你摄像头模块

第2步:安装OpenCV 3包

我使用的是更新了最新版树莓派系统(Stretch)的树莓派 V3,因此安装 OpenCV 的最佳方式是按照 Adrian Rosebrock 写的教程来进行:《Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi》。经过几次尝试后,我觉得Adrian的教程最好,建议按照该教程一步步来安装。

完成上述教程之后,你应该安装好了 OpenCV 虚拟环境,可用于在树莓派设备上运行本次实验。
我们来到虚拟环境,确认 OpenCV 3 已经正确安装。
Adrian 推荐在每次打开新的终端时都运行命令行“source”,以确保系统变量都得到正确设置。

source ~/.profile

然后,我们进入虚拟环境:

workon cv

如果你看到 (cv) 出现在提示符之前,那么你就进入了 cv 虚拟环境:

Adrian 希望大家注意 cv Python 虚拟环境是完全独立的,且与 Raspbian Stretch 中包含的默认 Python 版本彼此隔绝。因此,全局站点包目录中的任意 Python 包对于 cv 虚拟环境而言都是不可用的。类似地,cv 站点包中的任意 Python 包对于全局 Python 包安装也都是不可用的。

现在,进入 Python 解释器,确认你正在运行3.5(或以上)版本。

在解释器内部(将出现>>>),导入 OpenCV 库:

import cv2

如果没有错误信息,则 OpenCV 已在你的 Python 虚拟环境中正确安装。

你还可以检查已安装的 OpenCV 版本:

cv2.__version__

上面的终端截图显示了以上步骤。

第3步:测试摄像头

在树莓派上安装 OpenCV 之后,我们测试一下,以确认摄像头正常运转。假设你已经在树莓派上安装了 PiCam。

在 IDE 中输入下列 Python 代码:

import numpy as np
import cv2
 
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
  
while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame, -1) # Flip camera vertically
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     
    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
     
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
 
cap.release()
cv2.destroyAllWindows()

上面的代码可捕捉PiCam生成的视频流,用BGR颜色和灰色模式展示。
注意:我按照组装方式垂直旋转了摄像头。如果你的情况并非如此,那么注释或删除“flip”命令行。
你还可以从我的 GitHub 下载代码:https://github.com/Mjrovai/OpenCV-Object-Face-Tracking/blob/master/simpleCamTest.py

输入下面的命令行,开始执行:

python simpleCamTest.py

要完成该程序,你必须在键盘上按 [ESC] 键。在按 [ESC] 键之前,先鼠标点击视频窗口。

上图展示了结果。

想更多地了解 OpenCV,请查看该教程:https://pythonprogramming.net/loading-video-python-opencv-tutorial/

第4步:人脸检测

人脸识别的最基础任务是“人脸检测”。你必须首先“捕捉”人脸(第 1 阶段)才能在未来与捕捉到的新人脸对比时(第 3 阶段)识别它。

最常见的人脸检测方式是使用“Haar 级联分类器”。使用基于 Haar 特征的级联分类器的目标检测是 Paul Viola 和 Michael Jones 2001 年在论文《Rapid Object Detection using a Boosted Cascade of Simple Features》中提出的一种高效目标检测方法。这种机器学习方法基于大量正面、负面图像训练级联函数,然后用于检测其他图像中的对象。这里,我们将用它进行人脸识别。最初,该算法需要大量正类图像(人脸图像)和负类图像(不带人脸的图像)来训练分类器。然后我们需要从中提取特征。好消息是 OpenCV 具备训练器和检测器。如果你想要训练自己的对象分类器,如汽车、飞机等,你可以使用 OpenCV 创建一个。

详情参见:Cascade Classifier Training

如果不想创建自己的分类器,OpenCV 也包含很多预训练分类器,可用于人脸、眼睛、笑容等的检测。相关的 XML 文件可从该目录下载:haarcascades

下面,我们就开始用 OpenCV 创建人脸检测器吧!

从我的 GitHub 下载文件 faceDetection.py:faceDetection.py

import numpy as np
import cv2
 
faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')
 
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
 
while True:
    ret, img = cap.read()
    img = cv2.flip(img, -1)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(
        gray,    
        scaleFactor=1.2,
        minNeighbors=5,    
        minSize=(20, 20)
    )
 
    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w] 
 
    cv2.imshow('video',img)
 
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
 
cap.release()
cv2.destroyAllWindows()

使用 Python 和 OpenCV 执行人脸检测,上面的几行代码就足够了。注意下面的代码:

faceCascade = cv2.CascadeClassifier(‘Cascades/haarcascade_frontalface_default.xml’)

这行代码可以加载“分类器”(必须在项目文件夹下面的 Cascades/目录中)。然后,我们在在循环内部调用摄像头,并以 grayscale 模式加载我们的输入视频。现在,我们必须调用分类器函数,向其输入一些非常重要的参数,如比例因子、邻近数和人脸检测的最小尺寸。

faces = faceCascade.detectMultiScale(
        gray,    
        scaleFactor=1.2,
        minNeighbors=5,    
        minSize=(20, 20)
    )

其中:
gray 表示输入 grayscale 图像。
scaleFactor 表示每个图像缩减的比例大小。
minNeighbors 表示每个备选矩形框具备的邻近数量。数字越大,假正类越少。
minSize 表示人脸识别的最小矩形大小。

该函数将检测图像中的人脸。接下来,我们必须“标记”图像中的人脸,比如,用蓝色矩形。使用下列代码完成这一步:

for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]

如果已经标记好人脸,则函数将检测到的人脸的位置返回为一个矩形,左上角 (x,y),w 表示宽度,h 表示高度 ==> (x,y,w,h)。详见下图。

得到这些位置信息后,我们可以为人脸创建一个“感兴趣区域”(绘制矩形),用 imshow() 函数呈现结果。使用树莓派终端,在你的 Python 环境中运行上面的 Python 脚本:

python faceDetection.py

你也可以加入诸如“眼睛检测”甚至“微笑检测”这样的检测器。在那些用例中,你需要把分类器函数和矩形框内加入原有的面部识别区域中,因为在区域外进行识别没有意义。
注意,在树莓派上,分类方法(HaarCascades)会消耗大量算力,所以在同一代码中使用多个分类器将会显著减慢处理速度。在台式机上运行这些算法则非常容易。

在我的 GitHub上你可以看到其他的例子:
faceEyeDetection.py
faceSmileDetection.py
faceSmileEyeDetection.py

在下图中,你可以看到我们的结果:

要想深入理解面部识别,可以参考这一教程:Haar Cascade Object Detection Face & Eye OpenCV Python Tutorial

第5步:收集数据

我推荐各位读者可以查看以下两个关于人脸识别的教程:
使用 OpenCV 和 Python 从头实现人脸识别:superdatascience.com
理解人脸识别:thecodacus.com

现在,我们项目的第一步是创建一个简单的数据集,该数据集将储存每张人脸的 ID 和一组用于人脸检测的灰度图。

因此,以下命令行将为我们的项目创建一个目录,目录名可以如以下为 FacialRecognitionProject 或其它:

mkdir FacialRecognitionProject

在该目录中,除了我们为项目创建的 3 个 Python 脚本外,我们还需要储存人脸分类器。我们可以从 GitHub 中下载:haarcascade_frontalface_default.xml

下一步需要创建一个子目录“dtatset”,并用它来储存人脸样本:

mkdir dataset

然后从我的 GitHub 中下载代码 01_face_dataset.py

import cv2
import os
 
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video width
cam.set(4, 480) # set video height
 
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
 
# For each person, enter one numeric face id
face_id = input('\n enter user id end press <return> ==>  ')
 
print("\n [INFO] Initializing face capture. Look the camera and wait ...")
# Initialize individual sampling face count
count = 0
 
while(True):
    ret, img = cam.read()
    img = cv2.flip(img, -1) # flip video image vertically
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(gray, 1.3, 5)
 
    for (x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)    
        count += 1
 
        # Save the captured image into the datasets folder
        cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
 
        cv2.imshow('image', img)
 
    k = cv2.waitKey(100) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
    elif count >= 30: # Take 30 face sample and stop video
         break
 
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

上述的代码和人脸识别的代码非常像,我们只是添加了一个“input command”来捕捉用户 ID(整数)。

face_id = input('\n enter user id end press ==> ')

对于每一个捕捉的帧,我们应该在“dataset”目录中保存为文档:

cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])

对于保存上述文件,我们需要导入“os”库,每一个文件的名字都服从以下结构:

User.face_id.count.jpg

例如,对于 face_id = 1 的用户,dataset/ 目录下的第四个样本文件名可能为:

User.1.4.jpg

在我的树莓派中,该图像可以打开为:

在我的代码中,我从每一个 ID 捕捉 30 个样本,我们能在最后一个条件语句中修改抽取的样本数。如果我们希望识别新的用户或修改已存在用户的相片,我们就必须以上脚本。

第六步:训练

在第二阶段中,我们需要从数据集中抽取所有的用户数据,并训练 OpenCV 识别器,这一过程可由特定的 OpenCV 函数直接完成。这一步将在“trainer/”目录中保存为.yml 文件。

所以,下面开始创建子目录以储存训练数据:

mkdir trainer

从我的 GitHub 中下载第二个 Python 脚本:02_face_training.py

import numpy as np
from PIL import Image
import os
 
# Path for face image database
path = 'dataset'
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
 
# function to get the images and label data
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]    
    faceSamples=[]
    ids = []
    for imagePath in imagePaths:
        PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale
        img_numpy = np.array(PIL_img,'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])
        faces = detector.detectMultiScale(img_numpy)
        for (x,y,w,h) in faces:
            faceSamples.append(img_numpy[y:y+h,x:x+w])
            ids.append(id)
    return faceSamples,ids
 
print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
 
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi
 
# Print the numer of faces trained and end program
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))

确定在 Rpi 中已经安装了 PIL 库,如果没有的话,在终端运行以下命令:

pip install pillow

我们将使用 LBPH(LOCAL BINARY PATTERNS HISTOGRAMS)人脸识别器,它由 OpenCV 提供:

 recognizer = cv2.face.LBPHFaceRecognizer_create()

函数“getImagesAndLabels (path)”将抽取所有在目录“dataset/”中的照片,并返回 2 个数组:“Ids”和“faces”。通过将这些数组作为输入,我们就可以训练识别器。

recognizer.train(faces, ids)

在训练过后,文件“trainer.yml”将保存在我们前面定义的 trainer 目录下。此外,我们还在最后使用了 print 函数以确认已经训练的用户面部数量。

第7步:识别器

这是该项目的最后阶段。这里,我们将通过摄像头捕捉一个新人脸,如果这个人的面孔之前被捕捉和训练过,我们的识别器将会返回其预测的 id 和索引,并展示识别器对于该判断有多大的信心。

让我们从 GitHub 03_face_recognition.py 上下载第三阶段的 python 脚本。

import cv2
import numpy as np
import os
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
 
font = cv2.FONT_HERSHEY_SIMPLEX
 
#iniciate id counter
id = 0
 
# names related to ids: example ==> Marcelo: id=1,  etc
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']
 
# Initialize and start realtime video capture
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
 
# Define min window size to be recognized as a face
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
 
while True:
    ret, img =cam.read()
    img = cv2.flip(img, -1) # Flip vertically
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
     
    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5,
        minSize = (int(minW), int(minH)),
       )
 
    for(x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
 
        # Check if confidence is less them 100 ==> "0" is perfect match
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))
        else:
            id = "unknown"
            confidence = "  {0}%".format(round(100 - confidence))
         
        cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
        cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1) 
     
    cv2.imshow('camera',img)
 
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
 
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

这里我们包含了一个新数组,因此我们将会展示“名称”,而不是编号的 id:

names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

所以,如上所示的列表,Marcelo 的 ID 或索引为 1,Paula 的 ID 等于 2。

下一步,我们将检测一张人脸,正如我们在之前的 haasCascade 分类器中所做的那样。

id, confidence = recognizer.predict(gray portion of the face)

recognizer.predict () 将把待分析人脸的已捕捉部分作为一个参数,并返回其可能的所有者,指示其 id 以及识别器与这一匹配相关的置信度。
注意,如果匹配是完美的,置信度指数将返回“零”。

最后,如果识别器可以预测人脸,我们将在图像上放置一个文本,带有可能的 id,以及匹配是否正确的概率(概率=100 – 置信度指数)。如果没有,则把“未知”的标签放在人脸上。

在这张图像上,我展示了一些由该项目完成的测试,其中我也使用图像验证识别器是否有效。

第 8 步:结语

我希望该项目能帮助其他人发现更好玩的项目,也希望有助于各位读者实现自己的人脸识别应用。

更多详细的代码请查看 GitHub 地址:https://github.com/Mjrovai/OpenCV-Face-Recognition
(原文来自hackster,由机器之心编译)

本文来自:树莓派实验室

PiSwitch:用树莓派制作 Switch 游戏机

这是一件用树莓派制作的形似 Switch 的游戏机,作者 cfoote7 写道:
感谢树莓派基金会富有创意的开发人员、RetroPie 同样重要的Kodi。最后,我要感谢 Nintendo 让我做这个逆向工程,我可不太愿意玩它家的 Switch 主机。

这款主机将集复古游戏模拟器、媒体中心、微型电脑等多种用途于一身的,制作过程比较复杂,还是让我们看一组制成品的视频先睹为快吧!

使用预览

游戏视频运行 Debain 系统变身微型电脑

运行 Kodi 系统变身媒体中心

游戏视频

第1步:采购准备工作

你将需要以下工具:

  • 烙铁+焊料+助焊剂
  • 热熔胶枪
  • 3D打印机或借助3D打印服务商
  • 一套完整的微型螺丝刀套件
  • 精密钻头工具或带3/16钻头的钻头套件

耐心点,下面才是重点!

部件包括:

  • 树莓派官方7寸屏幕
  • Kingwin 80 件什锦笔记本更换螺丝套件或(各种大小和类型的螺丝)
  • 26 awg 电线
  • 1/8英寸大小立体声插孔带开关
  • 迷你金属音箱
  • 微型电源开关
  • 充满电的6600毫瓦电池
  • Joy-Con控制器(推荐使用充电器)
  • 树莓派3B(内置蓝牙和WiFi)
  • PAM8302 2.5W 音频功放
  • PowerBoost 1000C

3d打印的外壳(所需文件在这里下载)
Pi3SuperAwesomePortable_brackets.stl
SwitchPiScreen_v2.stl
Pi3SuperAwesomePortable_Case_2mm.stl

可选项:

  • 树莓派官方摄像头二代

第2步:将音频接口焊接到树莓派上

首先从树莓派开始,将26 awg 电线与树莓派焊接:
我会在音频接口附近将红色的左声道焊接到pp26(感谢树莓派基金会标记的焊盘)将黑色焊接到pp24。
右声道是黄色导线,并将其焊接到音频接口的左上角引脚。
我建议留下额外的8-10厘米长的电线,你可以将它们剪下来,或者卷起来留用。因为我的项目经常被拆开并重建或重新使用。我非常喜欢这个特殊的1/8插孔。我之所以选择它,是因为能清晰的从顶部看到并彻底的了解它的工作原理。

焊接音频接口(引脚见上图):
从树莓派上取下红色导线并将其焊接到1/8插孔上的针脚2上。
从树莓派上取下黄色导线,并将其焊接到1/8插孔上的针脚5上。
取下黑色导线,再拧8-10厘米长的黑色导线,然后在1/8插孔上焊接到针脚1上。
将8-10厘米长的红色导线焊接到1/8插孔上的针脚3上。
你现在应该有一个音频接口连接到树莓派,如果你播放声音,然后插入耳,就会很清晰地听见声音。我建议将导线用热熔胶粘合在树莓派的底部,同时底部的接口能固定细线,并保护它们免受损坏和短路。

第3步:焊接电源板和开关

PowerBoost 1000C 满足您所有的锂充电需求。

然而不幸的是,这个小东西虽然非常棒,但并不能输出足够的电力来运行Pi-Switch。但它的确是非常不错的充电电池,这个电池能为树莓派提供足够多的电量,使屏幕和音频供电大约2-3个小时。我会将电源保持开启,以便耗尽电池电量,这就意味着您需要直接插入电源。我仍在努力寻找更好的解决方案。

电源线:
首先看上图,你会注意到3个黑色圆圈和3个红色圆圈。
你猜到了!焊接3个25厘米的黑色导线和3个25厘米的红色导线到PowerBoost上标记的相应位置。

开关(电源开关,不是 Nintendo):
将一根右边或左边的腿从开关上切下,然后用5厘米的电线焊接到残缺的电源开关的备用引脚上。
焊接其中一条电线,切换至PowerBoost,剩下的电线连接至PowerBoost板。
热熔胶便宜,快捷,简单。我建议将连接到Power Boosted Board的每根电线上涂上热熔胶。

第4步:扬声器和音频板以及耳机插孔(将它们连接在一起)

这一步我们将这些组件组合在一起。

焊接扬声器:
如图所示,将每一根导线焊接到扬声器上的每个垫上。热收缩太方便了,如果你像我一样喜欢使用热熔胶!

焊接音频板:
拿起你的PAM8302,看看它的说明。如图所示,在电路板4-8欧姆的一侧,将扬声器电线焊接到两个中心垫上。

焊接音频的电源:
从PowerBoost板上取下其中一根红色电源线和一块接地板,并将红色电线焊接到PAM8302上的vin上,将黑色电线焊接到PAM8302上的gnd上。

焊接耳机至PAM8302:
从耳机插孔取出红线,并将其焊接到PAM8302的A+上。
从耳机插孔取出黑色线,并将其焊接到PAM8302的A-上。

焊接树莓派:
这有一张树莓派的图片。从PowerBoost上取出一根黑线将其焊接到树莓派图片上的黑点。
从PowerBoost上取出一根红线将其焊接到树莓派图片上的红点。

测试:
请小心确保剩余的黑线来自PowerBoost,和来自PowerBoost的红线不会触及任何东西。然后装上电池并翻转开关。如果所有部件都正确连接,则应在充电板上的指示灯上点亮指示灯,如果扬声器噪音太大,可能会听到扬声器发出轻微的嗡嗡声,以至于可能出现焊接问题。

第5步:组装

除了LCD和可选的PI相机之外,我们现在应该已经安装了所有东西。在之前的图片中,你会看到如何嵌入树莓派本身。这非常简单,现在你可以拿出那个80件什锦笔记本更换螺丝套件,找到一些比树莓派厚一到两毫米的螺丝,然后将它们拧入软印刷塑料中。推荐使用PLA。应该有两个合适的夹子来安置树莓派,并且在相反的角落有可以穿线的孔。电源板也是如此。上面的图片展示了电源板的组装。

现在将开关穿过电源板上方的小孔。用镊子或手指从外面抓住开关。如图所示,轻轻地拉开开关以防止其掉入箱内,在开关背面放置一些热熔胶。一旦胶水冷却,请检查开关是否便于使用。如果粘胶不好,请再试一次。在树莓派和PowerBoost之间钻一个3/16英寸的孔,也可以只是钻出一个孔。它应该在树莓派的usb端口的一侧。将耳机插孔穿入孔中并粘合到位。
最后,将扬声器电池和音频板粘合到位,如上图所示。我将扬声器放在电池下面的塑料下面,我把它直接塞在PowerBoost板后面。然后,我将电池粘在3D打印机箱的两侧。最后,我把扬声器放大器粘在电池的顶部。

所以,如果你已经做好了这一切,那么你现在应该已经将树莓派、PowerBoost、PAM8302、扬声器、电源开关和电池都安装在树莓派盒的背面。另外应该还有一个25厘米的黑线和一个25厘米的红线留下。

第6步:添加屏幕和配件

你几乎已经完成了这个相当复杂的组装。现在拿出一些6毫米长的螺丝和螺纹侧杆, 如上图所示,将它们拧入屏幕上的螺丝孔。如果屏幕不是连成一排的,为了更适合使用,可能会需要颠倒过来。看看图片,你可能会注意到我的成型线连接到了我的屏幕上。实际上,我将pin header放在我的PowerBoost上,而不是直接焊接。如果你没有提前看这些步骤的话,你可能正在焊接电线。如果我不特意提醒的话。我更喜欢pin header,因为它可以迅速、简单的修改,而我的创作始终处于不断变化的状态。

使用剩余的电线:
将剩余的红线从PowerBoost焊接到屏幕上的vin引脚。
将剩余的黑线从PowerBoost焊接到屏幕上的gnd引脚。

连接相机(可选):
将相机电缆插入相机板。
如图所示将电缆插入树莓派中。
通过以太网插孔翻转相机。
使电缆平整并粘合到位。

附加屏幕宽带线:
如图所示将带状电缆插入树莓派。
如果您看上图,它会显示我在连接带状电缆后如何将背面板向下翻转到位。
最后,将后面板上的四颗螺丝拧入屏幕背面的支架中,然后完全组装。

第7步:制作树莓派软件镜像

步骤 1)
给树莓派接上键盘,通电。
转到此网站并按照安装步骤操作:(仅将您的键盘设置为临时控制器)
https://github.com/RetroPie/RetroPie-Setup/wiki/First-Installation

步骤 2)
您可能会听到恼人的嗡嗡声(现在可以忽略,我们很快就会修复)
按照以下步骤通过ReroPie菜单设置wifi:
RetroPie / settings> raspi-config> interfacing options >SSH > Yes > Ok > Finish > Retropie Setup > Configuration Tools > wifi>(设置你的wifi)> exit>

步骤 3)
安装 Pixel:
raspbiantools > Install Pixel Desktop Environment > yes > (等一会) > ok (to flash player) > (稍等时间久一点) > ok > cancel > back >

步骤 4)
安装 Kodi:
Manage Packages > Manage Optional Packages > Kodi > Install from binary > (wait a while) > back > back > back>

步骤 5)
注册并连接您的 JoyCons 手柄:

Configuration /Tools > bluetooth > Register and Connect (同时按下右侧joy-con上L和R之间的小按钮) > choose Joy-Con (R) > NoInputNoOutput > (wait) > ok > ok

步骤 6)
用Joy-Con(L)重复步骤5。

步骤 7)
cancel > back > exit > (start button) > quit > quit emulation station> yes

步骤 8)
运行以下命令:

sudo apt-get update && sudo apt-get upgrade && sudo rpi-update
sudo reboot

步骤 9)
输入以下内容:

wget https://raw.githubusercontent.com/cfoote7/PiSwitch/master/setup.sh
sudo chmod 777 setup.sh && sudo chmod a+x setup.sh
./setup.sh

更新:
我已经添加了一个控制器连接菜单,屏幕上会显示是否连接到两个joy-cons。还增加了单人/双人玩家模式选择菜单。在完成第一boot时,你将可以用“+”和“-”按钮连接你的控制器,点击下一步,点击RetroPie,然后选择单人玩家模式。

备注:
pywx.py 是我的触摸屏启动的选择菜单,实际上它并不是启动选项,所有这些选项都储存在raspbian jessie下。我计划添加一个更简单的方式将控制器在启动时与此菜单配对。请您随时查看更新信息。如果您进行了任何改进,请特别注意是否可以构建此功能并告知我。我非常乐意为此提供合作服务。请检查我的存储库,我会更新在 https://github.com/cfoote7/PiSwitch

via Cherry 译。

本文来自:树莓派实验室

 

 

树莓派超频全攻略

树莓派超频,基本上说,就是调整几个设备参数,然后让树莓派硬件“加满油”工作,而这个过程则需要一定的硬件知识以及特殊技能。不过有一点你需要注意,超频对硬件来说是存在一定风险的,但是本文也会告诉你如何去避免这些风险。

超频风险和警告提示

目前树莓派3官方还不支持超频,所以你的树莓派设备可能会有损坏的风险,这一点我们可不负责,所以你需要考虑清楚,“盈亏自负”。

超频可能会让硬件温度超过90摄氏度,情况好一点的话,就是系统或软件崩溃,情况不好的话,可能会损坏CPU或内存芯片。所以树莓派上的重要芯片都需要安装散热器,强烈建议大家安装高功率散热风扇。

再次提示:如果没有安装有效的散热设备,请千万不要按照本文所介绍的方法超频。

硬件要求

如果你想超频树莓派,你至少需要下列三种关键硬件:

1.   树莓派:本文将使用Raspberry Pi 3 Model B V1.2,运行Raspbian GNU/Linux8(jessie).

2.   供电电源:强烈建议大家使用稳定的电源,超频后的树莓派3大概需要至少1.5A,所以电源至少要能够提供2A电流。

3.   散热设备:为了防止树莓派硬件(主要是芯片)被烧坏,我们必须安装散热风扇;

重要提示-开始之前请使用下列命令更新系统:

$sudo apt-get update && sudo apt-get dist-upgrade

安装“sysbench“工具之后,你就可以随时查看系统性能了。安装命令如下:

$sudo apt-get install sysbench

下图中包含了超频所需的全部组件:

硬件清单:

1.   RaspberryPi 3;

2.   5V/2.5A的供电电源;

3.   散热风扇;

4.   三个散热片;

5.   底座;

安装完成后的情况如下:

超频前的检查工作

在开始超频之前,我们一定要检查设备状态。

监控CPU频率

为了了解CPU的当前运行频率,我们需要读取出从/sys/devices/system/cpu/cpu0/cpufreq/目录中读取出cpuinfo_min_freq、 cpuinfo_max_freq和cpuinfo_cur_freq这三个文件:

cpuinfo_min_freq– 空闲模式下的最小频率

cpuinfo_max_freq– 最大工作频率

cpuinfo_cur_freq– 树莓派当前的运行频率

监控CPU温度

我们可以运行vcgencmd measure_temp命令以及while循环来监控CPU每秒钟的温度变化:

$while true ; do vcgencmd measure_temp ; sleep 1 ; done

循环会一直运行下去,直到我们按下 CTRL+C。

设置默认速度

树莓派的CPU配置在空闲模式下的默认速度为:

arm_freq=600MHz
core_freq=250MHz

如果进程在运行的话,频率就会变成:

arm_freq=1200MHz

为了防止空闲模式被破坏,我们还需要修改/boot/config.txt

force_turbo=1(警告!修改该参数将会失去保修)
boot_delay=1

重启设备,再次检查当前的运行频率,现在应该是1200000 KHz了。

性能测试(未超频)

首次进行性能测试的命令如下:

$sysbench --test=memory --cpu-max-prime=2000 --num-threads=4 run

输出结果如下所示:

待会儿超频之后我们再对比一下性能情况。

树莓派3超频攻略

超频选项

需要设置的超频参数都在/boot/config.txt文件中,选项如下:

1.   CPU超频:修改“arm_freq”参数-ARM频率,单位为MHz。

2.   GPU超频:修改“core_freq”参数-GPU处理器核心频率,单位为MHz。

3.   内存超频:修改“sdram_freq”参数-SDRAM频率,单位为MHz。

4.   内存扩展:使用ZRAM。

5.   额外超频参数“Over_voltage”:调整ARM/GPU核心电压,只有指定了“force_turbo” 或“current_limit_override”参数之后,才可以将电压调整为6V以上。

6.   额外超频参数“Force_turbo”:这个参数可以禁用动态cpufreq驱动器。

修改参数之前,别忘了备份/boot/config.txt。

不同型号的树莓派在制作过程中可能会有一定的参数偏差,所以我们需要进行多次测试才能确定自己设备的最佳值。

遇到问题怎么办?

如果发现超频参数修改之后设备无法启动,你可以重启时按住“shift“键,这样就可以暂时禁用所有的超频参数了,并允许你在启动之后重新修改设置。

超频算法

这份算法可以调整CPU、GPU和内存的频率,以实现更好的性能。

树莓派3的默认值如下:

arm_freq=1200
gpu_freq=400
core_freq=400
sdram_freq=450
over_voltage_sdram=0

接下来,将下列参数写入到/boot/config.txt文件,然后重启设备:

arm_freq=1300 
gpu_freq=500 
sdram_freq=500 
over_voltage_sdram=0

如果设备运行正常的话,我们就可以尝试下一个配置:逐渐增加arm_freq的值,到1500为止。保存,然后重启。

如果设备无法运行或运行不稳定的话,你可以逐渐调高over_voltage_sdram的值,直到设备能够稳定运行为止。如果调整over_voltage_sdram参数救不了你的话,你可以尝试调低arm_freq的值,每次修改之后别忘了重启设备。

使用ZRAM超频

这种方法涉及到设备内部内存的扩展,这里需要使用到ZRAM以及内部内存压缩。ZRAM使用了LZ4以及LZO压缩算法,LZO是默认的,它可以创建一个块设备,并当作通用RAM磁盘来使用。

如何加载ZRAM?由于ZRAM已经整合进Linux内核了,我们只需要使用命令“sudo modprobe zram“来加载该模块即可。我们可以使用命令”sudolsmod | grep zram“来查看ZRAM模块的运行情况:

如果我们想用ZRAM来优化树莓派的话,我们可以从这个【GitHub】库中获取zram.sh脚本。该脚本可以给每一个CPU核心创建一个额外的压缩RAM交换磁盘并激活,除此之外不需要任何其他的配置操作了。

你可以使用下列命令下载脚本:

sudo wget -O /usr/bin/zram.sh https://raw.githubusercontent.com/novaspirit/rpi_zram/master/\zram.sh

然后制作可执行文件:

在激活ZRAM之前先查看内存信息,“free -h“和”swap -s“命令表明我们树莓派已激活的交换空间仅有100MB。

接下来,使用下列命令运行ZRAM:

sudo zram.sh

该脚本将为每一个CPU核心创建大小为232MB的交换空间,总共大小约为1GB。再次运行“free -h“和”swap-s“命令后,我们看到总的交换空间(4个分区)已经增加到了1GBRAM:

为了让树莓派在启动之后自动运行ZRAM,我们还需要修改/etc/rc.local文件(添加红圈中的代码:/usr/bin/zram.sh &):

重启设备以确认修改成功。

性能测试(已超频)

设置完成之后,运行下列命令进行性能测试:

sysbench--test=memory --cpu-max-prime=2000 --num-threads=4 run

结果如下:

大家可以看到,超频之后所有的性能参数值都有所提升,大家可以跟之前的测试结果对比一下。

如何恢复原状?

如果你不想超频的话,你只需要把之前备份的/boot/config.txt文件重新复制到/boot目录中,并重写config.txt文件即可。当然了,你还需要把“/usr/bin/zram.sh&”从 /etc/rc.local文件中删除。重启之后,一切就恢复原样了。

参考资料

1.   https://eltechs.com/run-plex-media-server-on-raspberry-pi/

2.   https://eltechs.com/run-spotify-on-raspberry-pi/

3.   https://eltechs.com/run-dropbox-on-raspberry-pi/

4.   https://eltechs.com/run-teamspeak-3-server-on-raspberry-pi/

5.   https://eltechs.com/run-google-chrome-on-raspberry-pi/

6.   https://eltechs.com/netflix-raspberry-pi/

7.   https://eltechs.com/retropie-raspberry-pi-retro-gaming-machine/

* 参考来源:eltechs,FB小编Alpha_h4ck编译,转载来自FreeBuf.COM