树莓派笔记

文章目录

前言

最近入手了树莓派zero w来做数据地磁场数据采集,加上去年部署的网关,到现在共经手过4种树莓派。其中三种是树莓派3B的不同型号,包括Compute Module 3,定制版以及普通型号,而手上保留的只有三代普通型号和zero w,之前的设备都没留下照片,但这次在文章最后会贴上两台设备,还有和硬件工程师一起做的感应器(其实就是连接串口和GPIO)以及采购的升压模块。

这篇文章就是做一个小结,梳理脑内知识,也为之后需要查看参数或者配置新设备时提供参考。

正文

设备参数

这里贴一张从微雪电子抠过来的图表

电源输入不变,通过Micro USB口输入的电源带保护,并且可以通过GPIO为外部设备供电,直接通过GPIO引脚供电时,不带电源保护,也无法再通过其他引脚为外部设备供电。

CPU频率与核心数不断增加,zero w还是使用老款CPU,ARMv6架构,也是Golang支持的最低ARM版本,频率提升到1GHz。

3B使用四核处理器,频率达到1.2GHz,处理器性能得到巨大提升,但还需要认清楚一个现实,树莓派的处理器性能非常弱,不适合计算密集和高负载的应用,适合作为控制器和数据采集中转。

功耗逐步递增,zero w在运行数据采集程序时,电流保持在100~110mA,发热量在接受范围,而3B的发热量有点过大。

引脚除一代B型外都是40个,保持着相同的构造,在使用地磁感应器时只用到GPIO和串口,而LoraWAN网关似乎使用SPI接口连接SX1301模块,都使用到板载的引脚供电。

CSI接口目前还没使用过,如果外接摄像头大概会用来做视频采集,功耗也会飙升。

截止目前有zero wh、3B、3B+内建Wi-Fi和蓝牙,不用再外置接收器,这次采集数据时也是通过将树莓派设置为热点,安卓平板与树莓派间使用HTTP协议通信来实时读取数据和下发指令。

略微麻烦的是这些内置蓝牙的型号使用 /dev/ttyAMA0 进行蓝牙读写,PL011 UART默认连接到蓝牙模块,而终端输出使用mini UART(/dev/ttyS0),官方的资料里提到PL011有独立的硬件控制,而mini UART的波特率与VC4 GPU上的VPU保持一致,性能相对较低,在高负载情况下还会影响到串口通信,具体可以查看下面的文章。

THE RASPBERRY PI UARTS

Configuring The GPIO Serial Port On Raspbian Jessie and Stretch Including Pi 3

在当前版本的系统中,没有直接使用这些设备路径,而是将 /dev/serial0/dev/serial1 链接到 /dev/ttyS0/dev/ttyAMA0 使用,终端输出设备默认使用 /dev/serial0。

为了使用性能稳定的PL0 UART,需要解除蓝牙对 /dev/ttyAMA0 的占用。

编辑 /boot/config.txt,找dtoverlay标志

1dtoverlay=pi3-disable-bt
2//关闭,/dev/ttyAMA0与GPIO的14、15引脚恢复关联
3dtoverlay=pi3-miniuart-bt
4//保留,但通过/dev/ttyS0读写蓝牙设备
5enable_uart=1 
6//启用GPIO串口

要完全关闭蓝牙时,还需要关闭掉启用蓝牙设备的服务

1sudo systemctl disable hciuart

最后还关闭终端输出,可以通过raspi-configintefcae option关闭通过串口使用shell的选项,也可以手动编辑 /boot/cmdline.txt,删除掉 console=serial0,115200,否则终端输出会占用已经被链接到seria0的ttyAMA0。

操作系统

树莓派搭载了伟大的Linux操作系统,这意味着所有在PC上的操作,都可能在树莓派上实现。

截止目前,官方Raspbian系统基于Debian stretch,提供两个镜像,分别是带桌面环境的Desktop版本及字符界面的Lite版本。树莓派的桌面系统还处在无法流畅使用阶段,只能留给有耐心的人,而同等配置的安卓手机可以拥有相对流畅的体验,原因还是ARM处理器性能不足,难以运行庞大臃肿的PC桌面环境,但字符界面相对轻巧很多,也是长期使用下来唯一的选择,其他linux桌面定制版、Windows 10 IoT Core等,能给人留下的体验基本只有卡、卡、卡、卡......

Raspbian Lite目前最新内核版本为Linux raspberrypi 4.14.52+ #1123 Wed Jun 27 17:05:32 BST 2018 armv6l GNU/Linux,在zero w上,原始镜像自带的内核一直难以编译出go可执行程序,升级内核后编译的速度才有了很大的提升。

编程

面对有限的存储、计算资源,C语言是执行效率最高的选择,资源占用低,性能高,开发难度大。如果要同时实现GPIO和串口读写,同时发起HTTP请求和提供REST接口,即使使用第三方库,工作量也不少,另外还有调试和开发的问题。

但C与Python结合后,牛人编写底层C代码,提供Python调用接口,而普通程序员编写功能代码,让这套总体性能比较弱的设备有了很多的玩法。使用Python封装C代码也带来一个问题,跨平台开发的环境配置变得比较困难,除非第三方库友好地在底层用C实现了跨平台接口,不然总会遇到编译出错的问题。最开始尝试使用RPi.GPIO调用GPIO,它的底层使用epoll监听引脚电平变化,依赖的C头文件只在Linux上存在,导致不断地编译失败。

切换到熟悉的Golang后,由于它在语言层级封装了底层系统调用,可以很方便地进行跨平台适配开发,最后干脆在树莓派上搭建好了Golang开发环境,在macOS上编写测试过后,将源文件拷贝到树莓派上编译运行,一些小改动也可以直接在树莓派上操作。

总结

这里就只放图了

树莓派 zero wh,带排针的zero w,自己加了散热片和16G内存卡,总计95+3+10+33=141,含设备,散热片,邮费及内存卡

树莓派 3B,卸下了原来的LoraWAN开发板,自己加了内存卡

传感器,这次通过串口和引脚直连,用了很粗的电线作为延长线

升压模块,3.7V转5V,支持充电和USB口输出,用来连接18650并联电池组