开发板:orange pi zero3
镜像:ubuntu-jammy
Q:解决异常重启造成Linux系统损坏的问题
A:将/etc/fstab中,根文件系统的载入方式改为只读,如下:
UUID=097c0934-864c-4961-9bf6-4ab53f3c5f5a / ext4 ro,defaults,noatime,commit=600,errors=remount-ro 0 1
tmpfs /tmp tmpfs defaults,nosuid 0 0
默认情况下,重启后会自动进入orangepi用户,因此,将要执行的程序放到~/.profile里,即可实现开机自动执行。这样异常重启后,不会对根文件系统造成任何伤害。
如果要改为rw模式,只需要mount -o rw,remount / 即可。
Q:等待网络完全联通,否则持续循环
rtn=5
while [ $rtn -ne 0 ]; do
ping -c 1 www.baidu.com > /dev/null 2>&1
rtn=$?
done
Q:GPIO手工操作
gpio readall
GPIO列:GPIO编号
WPI: 当使用wiringpi进行编程时,使用的编号
Mode: IN/OUT
V: value, 高低电平指示(1-高 0-低)
手工操作GPIO电平:
查看结果:注意26针角的value变为了1
清楚操作:
echo 74 > unexport,完成后,gpio74目录将消失
Q: 利用wirringpi操作GPIO
orangepi zero3自带wiringpi,不需要安装
cd /usr/src/wiringOP/examples/ 这里是各种例程
以下是示例代码(GPIO部分主要参考blink相关例程)
include <wiringPi.h> int main() { wiringPiSetup(); //初始化 pinMode (16, OUTPUT) ; //设置wpi编号16的针角为OUTPUT模式 digitalWrite (16, HIGH); //设置为高电平 digitalWrite (16, LOW); //设置为低电平 }
gitee/github的使用:
git config --global user.name 'peterhu318'
git config --global user.email 'peterhu318@126.com
clone iot项目:git clone https://gitee.com/peterhu318/iot.git
push iot项目:
cd ./iot
git add .
git commit -m "describe"
git push
串口通讯(serial)测试:
机器1:win11 + sscom5
机器2:orangepi zero3 + jammy + minicom 串口pin: 8,10
先打开urlt 5,重启,在/dev/下能看到 ttyAS5,说明配置没问题了
执行minicom会说找不到/dev/modem,只要链接一下设备即可。
进入minicom设置:minicom -s进入设置:9600N8,1 一定不要设置硬件流控,否则会出现无法向win11发送情况。
总结来说:双方的参数设置一定要匹配,否则会出现一发能发,一方不能发。有一方发送乱码等各种情况。
当以上测试没有问题后,就可以上程序了。
wiringpi在/usr/src下有一个example的示例,里面有两个: serialRead及serialTest。只要改一下里面的设备名及波特率,就可以用make进行编译并测试了。
关于某些i2c设备(流量传感器)无法识别的问题:
posifa pmf83020流量传感器,用香橙派无法识别,但换成悟空派就能识别。
发现香橙派用的是5.x的内核版本,将其换成6.x的内核版本,就能够正确识别了。
关于香橙派启动慢的问题
启动下面时,总是要等大约20s左右,造成启动缓慢
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... Scanning for Btrfs filesystems
解决办法:将内核版本从5.x换成6.x就没有这个问题了
DWIN屏(迪文屏)入门:
屏:DMG100600Y070两块。
第一个要注意的是:这个串口屏有个RS232与TTL的开关,在排线前方芯片组的前方。短接为TTL,不短接为RS232串口模式。
测试串口通讯情况:TTL那块屏串口通讯有问题。要么无回显,要么接收与发送一致,最终未定位出原因。最后重新购买了基于RS232的串口模块后,成功。
串口模块:在win11安装驱动,在硬件驱动处,将波特率改为115200;
然后用sscom串口软件,发送AA 00 CC 33 C3 3C握手信号,设备返回AA 00 4F 4B 5F 56 31 2E 36 00 00 00 00 00 CC 33 C3 3C,应该说明是成功了。
附常用指令:
修改注释:双击那些十六进制框,就可以更改注释。
framebuffer总是存在光标的解决办法:
在/etc/profile里,加入:tput civis,就不会在framebuffer上出现光标及黑块了
要重新打开光标,tput cnorm
负作用:连同其它终端一同禁止了。暂时没有好的办法!
关于hdmi闪烁的问题:
如果连接串口至笔记本,一切正常。但当拔掉串口,HDMI屏总是闪烁,且不能进入ubuntu系统。
解决办法:将板子的串口线与usb转串口的小板子的连接线拆掉,就正常了
如何开机自动执行脚本的问题(关键词:rc.local rc-local)
================================================
要想开机后,自动执行某个脚本,经常在centos下用的rc.local。但是ubuntu系统“暂停”了这个功能。下面是恢复方法
在/lib/systemd/system下面,有一个rc-local.service文件,打开这个文件并在末尾增加如下:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
接下来就是创建/etc/rc.local,该文件的第一行必须是#!/bin/bash,最后一行exit 0,且chmod +x rc.local
然后将需要执行的脚本或程序放到rc.local里。
一切完成后,systemctl reload-daemon ; systemctl start rc-local.service
如果rc.local格式不对(如第一行不是shebong),则服务启动会失败
实践反馈:orangepi好象不需要改任何东西,只要将脚本插入/etc/rc.local即可。ubuntu按照以上做法是可以的。
增加新的分区:
===================================================================
查看新增加的分区的UUID:
dumpe2fs -h /dev/mmclk0p2:查看第二分区情况,里面会显示出uuid。如果用dev设备号,有时会出现设备号变化的问题。
UUID=5aecfb3c-5169-4c34-ba4d-9643daa69085 /data ext4 defaults,noatime,commit=0 0 0
静态编译问题:
===========================================================
在makefile文件的lib变量里,增加-static,则可进行静态编译。但可能会报很多关于libsqlite3的错误,这实际是由于math库造成。需要把 -lm参数做为最后一个库文件,即可解决。在实际应用中,依然会有两个warning,但不影响使用。
DS3231 RTC模块:
调试这个模块前,选关闭chrony服务,避免造成影响。
要在orangepi下使用,可以按照如下方法:
首先看看i2cdetect -y 3,是否能看到68的DS3231模块。
如果能看到,那么执行下面的语句:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-3/new_device
再执行i2cdetect,此时发现标识变成了UU(代表Linux驱动接管了)。
此时,再ls /dev/rtc*,会发现多了一个rtc1,这个就是ds3231。我们会发现/dev/rtc链接到了rtc0,那是一个orangepi自带的、无法掉电保存的一个rtc。
我们执行timedatectl,会发现rtc时间是指的/dev/rtc的时间。
要想将当前时间保存到ds3231,用hwclock -w -f /dev/rtc1即可。 -w代表将系统时间写入rtc,-f指明rtc设备。如果不加-f,那么就写到默认的/dev/rtc里面了,也就是rtc0里了。
如果要想用ds3231的rtc1做为默认的rtc,只要简单的将/dev/rtc链接到rtc1即可。ln -f -s /dev/rtc1 /dev/rtc
要想设备启动时,自动读取ds3231的时间,可以将以上命令放置到/etc/rc.local里,示例 如下:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-3/new_device
sleep 3 #必须进行延迟,否则下面的命令可能不能正常执行
hwclock -s -f /dev/rtc1 #将rtc时间读入成系统时间
#可选:将ds3231做为各种时间命令的默认rtc
ln -f -s /dev/rtc1 /dev/rtc
踩坑:chat-gpt曾建议修改设备树的方法,最终没能成功。不过,这应该是一个最终极的、完美的解决办法,留待以后处理吧。2024.12.14