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

在未经修改的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、最后,将所有电缆连接到树莓派。

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

 

 

 

 

 

在树莓派3B 上安装 Windows 10 ARM 版的方法

早先关注我们的朋友可能对《国外开发者尝试在树莓派3上运行Windows 10桌面版》有印象。本文转自 amatfan.com,文末视频来自 daveb778(感谢柠栀和刺分享),给出了如何在树莓派3B上安装Windows10 ARM版,是的,这次并非IoT版,而是功能与PC一致的ARM版。需要注意的是,这个方法并非官方提供的,可用性上会有一些坑,热衷于尝试的玩家可以一试!

准备项目:树莓派3B以上型号,16G以上SD卡,显示器,键盘鼠标,电源。

1.格式化SD卡

2.使用DiskGenius,打开

格式化为2个分区,第一个100MB,格式为FAT32,第二个为NTFS,大小是剩余的全部容量。

下载镜像链接: https://pan.baidu.com/s/11Pwk1QwgNvr8mh_p6y-VpA 密码: tfyp

右键用Windows资源管理器打开

下载软件:DISM++,百度网盘链接: https://pan.baidu.com/s/1Bkq20DWnf7QPs_qMTAw8yg 密码: dgp4

选择:恢复功能:系统还原

目标映像打开刚才打开的ISO文件中的sources\install.wim文件

写入位置选择刚才格式化的大分区

点击确定开始恢复

等待恢复期间,下载UEFI与驱动:

UEFI:下载

驱动:下载

下载后解压打开,找到UEFI中的RaspberryPiPkg\Binary\prebuilt\2018May22-GCC49\RELEASE

将里面全部文件复制进入SD卡小的分区

等待恢复完毕,我们需要手动创建引导文件。请以管理员身份打开cmd
依次输入以下命令:(2,3条顺序可以颠倒。)

bcdboot X:\Windows /s Y: /f UEFI /l zh-cn
bcdedit /store Y:\efi\microsoft\boot\bcd /set {Default} testsigning on
bcdedit /store Y:\efi\microsoft\boot\bcd /set {Default} nointegritychecks on

其中,X是你的NTFS分区,Y是你的FAT分区
以我的电脑为例,我的sd卡的FAT分区是D:,NTFS分区是F:
则我需要输入如下命令:

bcdboot F:\Windows /s D: /f UEFI /l zh-cn
bcdedit /store D:\efi\microsoft\boot\bcd /set {Default} testsigning on
bcdedit /store D:\efi\microsoft\boot\bcd /set {Default} nointegritychecks on

然后安装驱动(更新驱动也是一样的)

其中F是刚才大的NTFS分区,C:\Users\gloom\Downloads\rpi是驱动下载保存的位置

dism /image:F: /add-driver /driver:C:\Users\gloom\Downloads\rpi /forceunsigned

插入树莓派,开机。然后按esc键来到Uefi设置页面

选择 Device Manager

进入Raspberry pi configeration

选择第一个

更改为EL1

退出重启,去除连接树莓派上的键盘,鼠标,等待系统设置完成(插键盘会蓝屏)

接下来设置与普通Windows一样,设置完成就可以使用了!

以下是 daveb778 提供的视频教程:


 

本文来自:树莓派实验室

 

 

 

树莓派+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

本文来自:树莓派实验室

 

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,由机器之心编译)

本文来自:树莓派实验室