计划做一个浇花系统,树莓派做主控,uno作为节点进行数据采集和控制,两者之间采用nrf24的2.4G来通信。
uno上很快就上手了,推荐TMRh20的RF24.h库,非常完毕,而且例子也不错,可以乒乓发信
树莓派遇到难点,原计划用python来写,这样调用数据库,还有后面用AI库也更方便。
但是网上搜了下教程很少,大多数直接用访问设备文件的方式来做,python即使调用,也肯定要用设备文件,所以先试试C方法。
TMRh20是个好东西,不仅有UNO的,下面的文件夹还有py和C的,核心其实还是C函数。
大神主页地址如下
http://tmrh20.github.io/RF24/index.html
先用wget将项目下下来,git地址
https://github.com/TMRh20/RF24.git
然后cd到RF24文件夹下,使用如下命令进行编译
./configure --driver=SPIDEV
然后安装SPI模块
sudo make install -B
网上有一步修改/etc/modprobe.d/raspi-blacklist.conf,如果其中存在blacklist spi-bcm2708,将其注释。我的没有,我用的4B+,比较新,可能以前老的系统有相应的内容。
修改/etc/modules文件,在其中追加一行,开启SPI。我的里面本身有I2C-dev,本来我改成spi-dev,但是想了下怕源文件调用设备文件如果没有中间的“-”,到时候又报些莫名其妙的错误,所以还是将就原文。
spidev
另外还可以用rasp-config来图形配置,我也配置了,怕一会出错又去解决开机默认启动之类的问题。
最后重启,/dev下会新增spidev0.0和spidev0.1两个设备文件。
这里是分界线,如果没有两个设备文件,则不用进行下面的了,设备文件是调用的关键。
开始准备执行文件。
cd 到RF24的examples_linux文件夹
查看gettingstarted.cpp文件(网上资料是大写,但是目前作者是小写,所以不能光复制,看看真正的文件名)
里面其他都可以不改,下面这两行最关键
RF24 radio(22, 0);
bool radioNumber = 1;
第一行是设置SPI的CE脚,CS脚,22对应的是树莓派管脚的BCM编码,我的接是GPIO.6也就是BCM是25的脚,所以要改这个地方。0对应的是树莓派的CS脚,树莓派只有CS0和CS1两组SPI,而NRF24的CS连到树莓派CS0的话,这里就是0,如果连CS1的话,这里就应该改为1。可以参考大神的解释,要多读几遍就能懂。。
第二行是用来定义收发两端的,作者用0/1来互斥两个地址,所以用树莓派和UNO通信的话,一个为0则另一个代码就得改成1。TMRh20的例子都是1,所以这地方必须改。我改的UNO端,因为树莓派要make编译,所以偷个懒,改UNO更方便。
然后在当前目录下sudo make,如果报红字,则需要改gettingstarted.cpp对应的行,如果不知道make。。。那还是先用UNO耍着,这个坑要填的话要费点神。我用make的时候报gettingstarted_call_response.cpp引用了pi3的处理器没定义,所以改了下makefile,把其他几个例子都注释了,只留一个gettingstarted.cpp来make。
最后以下命令来执行程序
sudo ./gettingstarted
出现命令行,选0/1对应收发,和UNO上R/T是一个道理,都可以试试。
最后UNO上如下图
树莓派上出现如下图
完美
昨天调了arduino的UNO和NANO的通信,大概10包就出现丢包,原因是发送端没发出去。
但是和树莓派就不会,看回环时间差不多,昨天以为是功率问题,还提高了功率,而且让两个nrf24脸对脸都不行。。。现在看来可能是UNO 16M的主频用loop方式发数据,发完等NANO返回回来,NANO的时间也要ms级处理时间,所以RF.avaliable老是占用着,所以发送失败。而4B基础1.5G的主频,完全是秒收秒发,UNO端也不会出现被占用的情况了。
贴个实物接线图
4B+ UNO
补充一个树莓派接线图(借用如有不妥联系撤下),需要说明的是几代树莓派硬件管脚基本兼容,而这个图是面向树莓派,USB口向下,右上方插针对应的管脚图。上面RF的程序里面要设置的引脚号,是BCM编码。而接线用的,是灰色的那两列。这个有必要慢慢接,接完检查下,免得烧机。