树莓派部署踩坑记录
- 硬盘扩容
工控机开机,ssh登录成功后,上传JDK安装包,失败,查看硬盘空间:
可用空间没多少了,连装个JDK都不够,然而使用sudo fdisk -l 命令查看磁盘
这还有14.6GB的盘,是磁盘空间没有分配挂载?
那就按照磁盘挂载的套路来一遍,重新分区,格式化,挂载,但是没有成功。
仔细观察,这个空间应该已经分配挂载完成了,但是为什么没有读取出来。
想起来工控机之前重新烧录过,可能导致部分磁盘空间不能读取,需要扩容,参考这个链接:
https://blog.youkuaiyun.com/wy_bk/article/details/86751299
这上面的命令并不能生效,在网上找了一通命令,反复尝试,总算找到能用的了
sudo resize2fs /dev/mmcblk0p2 12G
磁盘扩容成功,多了12G,够用了
2. JDK安装
把之前在Linux上安装的JDK安装包上传,解压,配置环境完成,java命令不能正常执行。。。
检查了环境变量配置都没有问题,这个jdk包在云服务器、自己的PC上使用都没有问题,是不是机器的架构不一样,一查果然是,工控机是arm架构,去oracle下载一个arm版本的jdk
上传解压后,java命令执行正常。
测试了我们的java程序可以在工控机上正常运行。
3. 485串口调试
第一步:测试串口是否正常
先参考工控机软件使用文档,工控机上有2个485串口,把2个串口连接起来互相发送数据,确认串口正常。
分别连接 B1B2、A1A2,对发对收来测试 RS485
接口的收发数据,系统上电后,打开终端,在终端中输入以下命令测试:
打开 B1A1 接口的 485,发送“ttyAMA1 send”:
sudo minicom -8 -b 115200 -D /dev/ttyAMA1
打开 B2A2 接口的 485,发送“ttyAMA2 send”:
sudo minicom -8 -b 115200 -D /dev/ttyAMA2
如下图所示:
2个串口都可以接收到对方发送过来的数据,串口工作正常
(实际使用的时候,发现A1B1口对应/dev/ttyAMA2,A2B2口对应/dev/ttyAMA1,应该是这2个口搞反了,实际使用的时候要进行充分测试,确定实际的串口对应哪个文件)
第二步:准备串口通信测试程序
在Windows(我的工作电脑)上写一个串口测试程序,运行程序和工控机通过485通信,我这里用了一个485转USB的线,长这样
通讯成功,我的测试程序和工控机的485串口能够双向发送数据。
第三步:将485测试程序打包到工控机上运行
这一步按说也并不复杂,将RXTXcomm.jar引入java程序,然后到网上下载librxtxSerial.so动态库文件放入/usr/lib目录下(Windows下就是dll文件),启动程序,报错,java程序不认识这个so文件。。。
应该还是arm架构的问题,到这个链接去下载:
http://users.frii.com/jarvi/rxtx/download.html
这里,下载解压后进入Linux目录,下面有3个目录,对应3种架构的Linux
光看名字,不确定哪个是支持arm架构的,嗯。。,一个一个传上去试吧,也不多。
试完了,没有一个能用的。。。
继续在官网上翻翻,点击ToyBox进去,到了这个目录下
再点击Linux进来,
有这么多,支持arm架构的原来都在这里啊
仍然不确定具体用哪个,不过总有一个是能用的,一个一个来吧。
很快我把所有包含arm的so库文件都尝试完了,依然没有一个能用的。。。
不知道咋搞了。。。
不过除了arm的,还有这么多没试过
虽然名字里没有arm,运气好的话,总有一个能用的吧,硬着头皮继续一个一个下载下来试试。
然后2个多小时过去了,嗯。。。
不要干这种傻事!
只有一条路了,把rxtx的源码下载下来,在工控机上自己编译一个so库文件出来,如果能够编译成功的话,肯定是可以用的。
源码依然是在官网下载,下载解压之后,进入目录:
东西很多,先别慌,先找configure文件,在src目录下
进入src目录,然后闭着眼睛
./configure
make
make install
三连
果然编译失败,不出意外的一堆报错
有错误解决错误吧
错误一:
/tmp/rxtx-2.1-7r2/./src/RS485Imp.c:96:25: error: 'UTS_RELEASE' undeclared (first use in this function)
if(strcmp(name.release,UTS_RELEASE)!=0)
这是由于 version.h 中缺少 UTS_RELEASE 信息,需要手工添加。先获取当前系统的版本信息:
然后在 /usr/include/linux/version.h 中添加
#define UTS_RELEASE "5.4.83-v7l+"
错误二:
libtool: install: armv6l-unknown-linux-gnu/librxtxRS485.la’ is not a directory
这个错误会出现在JDK1.6及以上的运行环境下,需要对configure文件进行修改。在configure文件中找到所有的1.2*|1.3*|1.4*|1.5* ,将现有的JDK版本加入进去即可.如:改成 1.2*|1.3*|1.4*|1.5*|1.6*|1.7*|1.8* 。
解决完这两个错误后,继续
./configure
make
make install
三连
编译成功!
可以看到so文件已经自动打包到jre目录下
怀着喜悦的心情启动串口通信程序,没有报错:
等下,扫描出来的串口,没有485、232的?
看下系统中的串口设备
485串口对应的/dev/ttyAMA1、/dev/ttyAMA2,然而我的程序并没有识别到这几个串口,怎么会识别不了呢,串口明明就在那里啊,咋就没扫描出来 。
为了是不是程序的问题,虽然又纠结了很久,但确实不是程序的问题
解决方法:
进入rxtx源代码的src目录,找到RXTXCommDriver.java这个文件
修改源码
然后再来一次
./configure
make
make install
编译完成后,启动程序
485串口可以被识别出来了,串口通讯测试成功,没有问题了
485调通了之后,232应该就好弄了,套路类似吧。
相关的链接放出来:
https://blog.youkuaiyun.com/xiaolicd/article/details/98114113
https://blog.youkuaiyun.com/qq_42865331/article/details/90264722
4.继电器调试
测试继电器之前,先了解下gpio引脚这些概念(硬件架构不懂,说多了都是泪)
要用java调用继电器,需要先安装WiringPi原生库、pi4j
WiringPi原生库已经在工控机上安装好了,安装pi4j,执行以下命令即可
curl -s get.pi4j.com | sudo bash
安装完成后,库在以下这个目录
/opt/pi4j/lib
库里有大量的java范例程序,在目录下
/opt/pi4j/examples
照着例子折腾吧。
测试继电器的话,一般需要一个led灯,我手头没有,用EIO控制盒的开关量输入来接收继电器信号。
中间亮的绿灯, 就是继电器接通之后会亮,然后用java程序控制继电器信号,进而控制信号灯。查询文档,控制继电器的引脚是gpio22
这里有个坑,java按照gpio22来发送信号,怎么发信号灯都没反应。
我用Python代码发送信号到22,可以实现控制信号灯,然而在java代码中同样控制22确没有任何效果。
是程序有问题,还是gpio的库有问题,继而改代码,换版本,改配置,又是一通不堪回首的折腾。。。
会不会是引脚用的不对,只能用笨方法,把所有的引脚扫描出来,一个一个试哪个能生效:
试到GPIO 3的时候,居然可以了!
用java调用继电器,正确的gpio竟然是3,但是用Python代码,又是22
这么诡异吗?
是因为gpio引脚有两种编码方式
python里设的是用bcm编码,java是用的PI4J库,是依赖wiringpi封装而成的,编码不一样,对应的GPIO引脚也不一样。
好吧,又学习到了。
继电器也可以正常控制了。