树莓派的简单应用

v1.0 1st Edition

由于觉得在机器之间转移代码比较麻烦,于是终于入手个一个三代B树莓派,也正因为此开始了折腾。

目前最新的系统是官方的基于Debian 8 jessie,目前此系统也比较成熟自带了较多的实用工具,比如已经自带了git,并且同时集成了python2和python3,方便对第三方库进行兼容。同时也有基于BCM2835 CPU的GPIO底层操作库,并且此平台基于arm与一般意义上实用的linux系统有些许的不同。那么接下来正式开始。

TL;DR点击列表跳转

##软件源

使用国内软件源,此时的系统内置vi非常难用,可先使用nano代替

pi@raspberrypi ~ $ sudo nano /etc/apt/sources.list

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib

deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

并开始更新已安装的软件包

##VIM
接下来是替换系统已安装的VI

1
2
sudo apt-get remove vim-common
sudo apt-get install vim

编辑/etc/vim/vimrc文件,在末尾添加以下内容

1
2
3
set nu #显示行号
syntax on #语法高亮
set tabstop=4#tab 退四格

##释放空间
由于在烧录系统时只使用了一部分sd卡分区并将文件系统格式化为fat32,如果使用较大的SD卡,那么会有非常大的闲置空间,这时候需要充分利用整张SD卡空间,那么运行sudo raspi-config

此时选择展开文件系统。

之后将会使用整张SD卡的空间,此时使用df命令看到目前的磁盘使用情况,另外此配置界面可以进行非常多的有用操作。

##挂载远程硬盘

从小米路由器上市我就买了,好歹带了一个1T的硬盘,又听说有各种插件。结果到最后发现其主要功能还是当一个共享盘和通用资源下载工具。从一开始想要的git官方也一直不给支持,看官方的文档也觉得我希望的有的功能依旧非常遥远。就连SSH也必须要dev版固件。作为唯一一个路由器我真的不想去折腾这些。其实小米路由器还有个重要的功能,那就是通过小米的服务器在外网访问路由器的存储空间。其实我想要的是一个远程脚本下发执行功能,和一些网络设备监控功能。

其实网络设备监控功能还是非常有用的,通过制定内网设备的联网断网,甚至可以推断出生活规律,然后根据时间就可以做出非常多的智能化操作。当然这些操作需要树莓派外部元件实现。另外通过小米路由器的后台管理接口实际上理论上是可以实现此功能的,本文先不讨论这些。

那么树莓派如何利用利用小米路由器这一个T的存空间呢?最有效的是挂载其硬盘,这里使用SMB/CIFS协议来实现,各种细节请参见:《学习Linux,302(混合环境):CIFS集成》

1
2
sudo apt-get install cifs-utils
sudo mount -t cifs //192.168.31.1/XiaoMi /mnt/xiaomi -o guest

执行上述命令,将小米路由器硬盘挂载到/mnt/xiaomi目录下,另外比较重要的是在小米路由器后台开启本设备的全盘访问权限。

如上图,由于使用guest访问,如果没有开启全盘访问则会有权限问题,当然也可以增加username和password参数指定用户名和密码。

这是再次查看磁盘信息,就会发现增加了1T的空间。另外此时挂载的空间需要使用sudo前缀。

##版本管理GIT
GIT才是使用树莓派的主要目的,其实就是几条命令是事情

1
adduser --system --shell /bin/bash --gecos 'git version control by pi' --group --home /home/git git

新建一个git用户,并增加到系统 组。将本地一个叫做”TimePlanning”的项目置入版本管理中。

1
2
3
mkdir TimePlanning.git
cd TimePlanning.git
git --bare init

值得注意的是这里因为新建了git用户专门用来管理远程库,所以需要切换到git用户,并在其home下执行上述操作

而客户端使用git init初始化本地库并与远程库关联之后,将本地文件提交到本地库之后,将本地库推送到远程的master分支上。之后就可以在几台机器上共享代码了。

##我的应用
其实这才是我的本质需求,现在终于有了一个低功耗的智能设备,其几乎拥有一台PC的全部功能。那么就制作一个小型的智能管家系统,那么在这个低功耗设备上实时响应请求。

首先这个应用叫做akko,就是现在的某个近战逗逼魔女的名字。

目前仅仅有简单的系统指标监控,和一些常用的功能,也正是如此想弄一个仅仅是为了看板功能的小型显示器,于是就有了下一章节所说的电子屏。

目前这个微型的助理还仅仅是问答式,而非常驻后台实时执行某些功能。很多和生产力相关的功能就不是这么简简单单的实现了,这又将是一条坎坷的路途。很多目标是需要范围和粒度的,否非过于深的投入和过于广泛的开展工作,最后都很难有好的结果。这也是我一开始对此设备指定了尽量单纯的功能,做版本管理服务器。随后在这上面解决一些日常的小问题,接下来的每一步都需要量力而行。

这是一个开始容易过程异常艰难的功能,而之后所说的GPIO相关却完全是开始苦难过程却非常轻松。

##GPIO
首先使用内置gpio命令查看GPIO物理接口信息,如果使用gpio readall命令出错提示不识别板子的话,去官方下载最新的gpio编译并重启,树莓派系统子自带的似乎是2.31,这里更新到2.38之后顺利读取到gpio物理接口信息。

GPIO的图网络上非常多,而且由于都经过一定的处理所以看起来非常显眼,给人印象非常深刻。其实看这个的目的就是为了接线,目前还没有到针对gpio编程的地步。

###温湿度传感器与电子屏幕
屏幕的问题我从一开始也比较犹豫,其实我最开始的想法是找i一个四寸左右的高分辨率的黑白字符屏幕。但是找了很久也没有合适的选择,后来发现了这款墨水屏,类似于kindle的屏幕显示效果非常好,但是刷新率非常低,而且是全屏刷新,刷一次将近2秒。并且显示图片非常麻烦,但是非常省电,即便断电也能非常好的显示。

如图,功能完整版。随后弹一下串口配置问题。图中红色为电源线插入1号针脚,可以获得3.3伏电压,现在拔掉电源显示效果依旧。

为了便于说明这里上一张GPIO大图,一下说明以此图为例。

DHT22温湿度传感器

由于买显示屏顺带买了个温湿度传感器

如上图设备,其提供3.3伏电压输入,和DOUT接口。VCC电源接PI-01 3.3伏电源接口。GND随便接一个黑色Ground接口,DOUT接PI-07/GPIO-04接口。这里值得说明的是PI-x是物理接口,但是内部接口编号是跳过电源和ground接口的,代码中使用GPIO-04表示。

如上图,这里使用到“Adafruit_DHT”模块,项目地址《Adafruit_Python_DHT》。原项目说明支持到python2.6/2.7,目前读取简单数据功能在Python3依旧可以使用。当然如果对C比较熟悉可以使用“wiringPi”也就是之前使用的gpio read_all命令相关库直接读取DH22设备。在读取参数中的4就是前面说的GPIO-04接口,如果将DOUT针脚插在其它位置,此参数也要进行相应的变化。

ePaper显示屏

由于此款显示屏使用串口通信,目前据说树莓派无法正常使用GPIO中的UART串口(GPIO14&GPIO15),也就是说用户无论是想用串口来调试树莓派,还是想用GPIO中的串口来连接GPS,蓝牙,XBEE等等串口外设目前都是有问题的。

原因是树莓派CPU内部有两个串口,一个是硬件串口(官方称为PL011 UART),一个是迷你串口(官方成为mini-uart)。在树莓派2B/B+这些老版树莓派上,官方设计时都是将“硬件串口”分配给GPIO中的UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式。而树莓派3的设计上,官方在设计时将硬件串口分配给了新增的蓝牙模块上,而将一个没有时钟源,必须由内核提供时钟参考源的“迷你串口”分配给了GPIO的串口,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定,这样就出现了无法正常使用的情况。

目前比较通用的方法是放弃板载蓝牙功能。

那么接下来开始:

  • 1、下载“pi3-miniuart-bt-overlay”文件,解压出pi3-miniuart-bt-overlay.dtb文件,并将dtb文件拷贝到/boot/overlays/目录下
  • 2、 编辑/boot/config.txt
    sudo vi /boot/config.txt
    (shift + g跳到文件末尾)在末尾增加以下两行(如图)
1
2
dtoverlay=pi3-miniuart-bt-overlay
force_turbo=1

  • 3、编辑/boot/cmdline.txt文件
    删除其中的ttyAMA0相关代码结果如下图

第一行为原始版备份文件,第二行为修改之后的文件,如果其中代码是”console=serial1,115200 “,则可以不需要修改。

  • 4、关闭蓝牙
1
sudo systemctl disable hciuart
  • 5、编辑/lib/systemd/system/hciuart.server
1
sudo vi /lib/systemd/system/hciuart.service

将 “ttyAMA0”修改为“ttyS0”,如下图

  • 6、sudo reboot重启

之后使用serial.Serial(port=’/dev/ttyAMA0’, baudrate=115200, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=0.03) 初始化串口就可以使用python对串口进行操作。

##最后
其实还有许多意外发生最开始是在改开机挂载网络硬盘的时候,不知为何导致网络无法连接,这样无法通过ssh进行远程连接。其实最直接的方法是需要一个linux设备挂载树莓派SD卡把文件改回来就好了,但是尴尬的是windows和Mac都无法直接读ext3分区,折腾了半天能读了却写不回去。于是想真的需要一个linux环境才好,没办法买了根双头的HDMI线接现有显示器给改了回来。

第二次是第一次拿到温湿度传感器和显示屏,第一次接触GPIO看说明书上的各种参数,完全不明白。经过慢慢的折腾明白了GPIO接口的大部分作用,然后又发现串口无法使用…,总之使用了一些折中的方案终于完成了基本的功能。之后的主要功能应该是在这个设备上集成一些数据聚合和分析功能,减少每天的知识收集时间,再就是做一些规划督促和帮助自己实现某些中长期目标,以及养成一些好的习惯。