-
通过数据线进行串口连接
- 用microUSB数据线连接板子和电脑,板子上电,电脑识别出新设备后,打开串口工具,设置波特率为115200,打开串口,即可看到板子的启动信息。
-
nmcli添加添加 802.1x 认证 wifi
# 在板子终端输入 sudo nmcli d wifi # 查看wifi列表 sudo nmcli con add type wifi ifname wlan0 con-name Tsinghua-Secure ssid Tsinghua-Secure sudo nmcli con edit Tsinghua-Secure nmcli> set 802-1x.eap peap nmcli> set 802-1x.phase2-auth mschapv2 nmcli> set 802-1x.identity <your_id> # 校园网账号 nmcli> set 802-1x.password <your_password> # 校园网密码 nmcli> set wifi-sec.key-mgmt wpa-eap nmcli> set connection.autoconnect true nmcli> save nmcli> activate nmcli> quit
-
此时应该可以连接校园网了,在命令行输入
ifconfig
查看ip地址,找到wlan0网卡inet地址xxx.xxx.xxx.xxx
-
通过ssh连接板子
# 在本地终端cmd输入 ssh HwHiAiUser@xxx.xxx.xxx.xxx # 这里的xxx.xxx.xxx.xxx是上一步查到的ip地址
根据提示输入密码即可连接
-
如果设置了自动连接,下次开机后会自动连接校园网,可以在
校园网自助服务平台-首页-在线信息
处查看设备的ip地址
-
准备工作
确保系统中有配置文件
/etc/orangepi-release
:cat /etc/orangepi-release
如果没有返回
BOARD=orangepiaipro
,则需要手动创建配置文件:echo "BOARD=orangepiaipro" | sudo tee /etc/orangepi-release
-
下载 WiringOP 源码
从官方仓库克隆 WiringOP 源码,切换到 next 分支,并安装编译工具:
# 依次执行以下命令 sudo apt-get update sudo apt-get install -y git git clone https://github.com/orangepi-xunlong/wiringOP.git -b next sudo apt-get install -y gcc make build-essential cd wiringOP sudo ./build clean sudo ./build
-
测试安装
gpio readall
如果能够正常显示 GPIO 引脚映射表,说明安装成功。
-
Python 绑定
这里我们使用wiringOP-Python来绑定 Python。
sudo apt-get install swig python3-dev python3-setuptools # 安装依赖 git clone --recursive https://github.com/orangepi-xunlong/wiringOP-Python.git -b next # 克隆仓库,注意:1.这里使用的是 next 分支,否则无法在orangepiaipro上编译 2.要加上 --recursive 参数,否则会缺少子模块 cd wiringOP-Python # 进入目录 python3 generate-bindings.py > bindings.i sudo python3 setup.py install
上述命令运行完毕后,注意查看输出信息,最后三行应该是类似下面的输出:
Installed /usr/local/lib/python3.10/dist-packages/wiringpi-2.60.1-py3.10-linux-aarch64.egg # wiringpi的安装路径 Processing dependencies for wiringpi==2.60.1 Finished processing dependencies for wiringpi==2.60.1
这个路径有可能并不在python的搜索路径中,可以通过以下命令查看 Python 的搜索路径:
python3 -c "import sys; print(sys.path)"
如果没有这个路径,可以通过以下命令添加:
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.10/dist-packages #注意这里的路径要替换成你在上面编译输出中看到的wireingpi的安装路径 # 也可以把这个命令加入到~/.bashrc文件的最后一行,这样每次打开终端都会自动执行,注意添加后要source ~/.bashrc使其生效
可以使用以下命令测试 Python 绑定是否安装成功:
python3 -c "import wiringpi as wp; wp.wiringPiSetup(); print(wp.digitalRead(0))"
如果出现如下错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/HwHiAiUser/wiringOP-Python/wiringpi.py", line 15, in <module> import _wiringpi ModuleNotFoundError: No module named '_wiringpi'
可能是权限问题,尝试用sudo运行python。(即运行
sudo python3 -c "import wiringpi as wp; wp.wiringPiSetup(); print(wp.digitalRead(0))"
)如果能够正常执行,说明 Python 绑定已安装成功。
另一种方法是进行用户级别的安装,但依然需要提升当前用户的权限使之能够访问GPIO,具体方法如下:
cd /home/HwHiAiUser/wiringOP-Python sudo chown -R $USER:$USER . sudo chmod -R u+w . pip install --user .
这样可以将wiringpi安装到用户目录下,不需要提升权限即可访问到wiringpi包。但是,在使用wiringpi时,常常需要访问GPIO,这时依然需要提升权限,可以通过新建一个组,将当前用户加入到这个组,然后将这个组的权限赋予GPIO设备,这样就可以在不提升权限的情况下访问GPIO了。具体方法如下:
sudo groupadd gpio # 新建一个gpio组 sudo usermod -aG gpio $USER # 将当前用户加入到gpio组 sudo chown root:gpio /dev/mem # 将gpiomem和mem的所有者改为root,组改为gpio sudo chmod g+rw /dev/mem # 给gpio组赋予读写权限 sudo chown root:gpio /dev/mem /dev/gpiochip* sudo chmod g+rw /dev/mem /dev/gpiochip* sudo chown root:gpio /sys/class/gpio/export sudo chmod g+rw /sys/class/gpio/export sudo chown -R :gpio /sys/class/gpio sudo chmod -R g+rw /sys/class/gpio sudo chown -R :gpio /sys/devices/platform/820f0000.gpio/gpiochip4/gpio sudo chmod -R g+rw /sys/devices/platform/820f0000.gpio/gpiochip4/gpio
-
补充内容:使用 WiringOP 控制 GPIO
以下是一个简单的 Python 示例,使用 WiringOP 控制 GPIO:
import wiringpi as wp # 初始化 WiringOP wp.wiringPiSetup() # 设置 GPIO0 为输出模式 wp.pinMode(0, wp.OUTPUT) # 设置 GPIO0 为高电平 wp.digitalWrite(0, wp.HIGH) # 读取 GPIO1 的状态 wp.pinMode(1, wp.INPUT) value = wp.digitalRead(1) print("GPIO1 value:", value)
OPI.GPIO是一个兼容RPi.GPIO的库,可以在香橙派上使用RPi.GPIO的代码。一开始尝试使用wiringOP的Python绑定,但是在使用RPi.GPIO的代码时发现有些函数没有实现,所以改用OPI.GPIO。后者的函数实现更加完整,并且基于RPi.GPIO实现,所以可以直接使用RPi.GPIO的代码。但是对OrangePiAiPro的支持并不完善,所以需要进行一些额外的设置。
-
通过pip安装
# 切换到root用户执行以下命令 pip install --upgrade OPi.GPIO
-
测试安装
pip show OPi.GPIO
如果看到安装的信息,说明安装成功。
-
使用示例
import OPi.GPIO as GPIO # 在 MasterPi/HiwonderSDK/Board.py 中把RPi.GPIO改为OPi.GPIO # 注意是OPi不是OPI,,,
-
兼容orangePiAiPro- 在
MasterPi/MasterPi/HiwonderSDK/Board.py
中引入了orangepiaipro的引脚映射表。(这一步已经实现,不需要自己操作)
- 在
-
设置文件权限
进行GPIO操作需要用户对GPIO相关配置文件进行读写,这些文件很多是由内核动态创建的,并且默认权限组是root:root。为了避免直接使用root运行脚本,要增加一个gpio权限组,将当前用户加入权限组,并赋予组相应权限。所需操作如下:
- 在终端依次执行:
sudo groupadd gpio # 新建一个gpio用户组 sudo usermod -aG gpio $USER # 将当前用户加入到gpio组 sudo chown root:gpio /dev/mem /dev/gpiochip* #修改静态文件的权限 sudo chmod g+rw /dev/mem /dev/gpiochip* sudo chown root:gpio /sys/class/gpio/export sudo chmod g+rw /sys/class/gpio/export sudo apt install nano sudo nano /etc/udev/rules.d/99-gpio.rules # 新建规则,使得内核动态创建GPIO文件时实时设置权限 SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'find -L /sys/class/gpio/ -maxdepth 2 -exec chown root:gpio {} \; -exec chmod 770 {} \; || true'" # 在/etc/udev/rules.d/99-gpio.rules写入这一 保存并退出 sudo udevadm control --reload-rules # 应用规则 sudo udevadm trigger --subsystem-match=gpio
- clone源码
git clone git@github.com:rm-hull/OPi.GPIO.git
- 修改部分函数,避免抛出异常
# ~/OPi.GPIO/OPi/GPIO.py line 468,line 469
# 注释掉下面这两行,避免在连续修改同一个端口时抛出异常
if channel in _exports:
raise RuntimeError("Channel {0} is already configured".format(channel))
- 编译
-
从GiHub仓库clone MasterPi SDK源码
git clone https://github.com/HeFeiW/MasterPiSDK.git
补充:远程文件传到本地:
scp filename username@ip_address:/home/username # 这里的filename是源码文件地址,username是香橙派用户名,ip_address是香橙派ip地址 scp username@ip_address:/home/username/filename /local_dir # 这里的filename是源码文件地址,username是香橙派用户名,ip_address是香橙派ip地址,local_dir是本地目标文件夹 # 如果是文件夹,加上-r参数 scp -r username@ip_address:/home/username/foldername /local_dir # 服务器文件夹传到本地 scp -r /local_dir/foldername username@ip_address:/home/username # 本地文件夹传到服务器 unzip filename -d <target_dir> # 这里的filename是源码文件地址,target_dir是解压目标文件夹
-
编译自定义包
cd MasterPi python setup.py install --user # 这里--user参数用于将包安装到用户级目录下,从而无需root权限。
检验是否安装成功
pip show MasterPi
如果看到安装的信息,说明安装成功。
补充:由于MasterPi提供的源码是基于树莓派的,使用的GPIO库是RPi.GPIO,而香橙派使用的是wiringpi,所以这里编译的代码是经过修改的,具体修改内容见
MasterPi/README.md
。 所需的库如果没有安装,在运行setup.py时会提示安装。 -
运行
python MasterPi/main.py
-
gpio权限
-
tty权限
sudo usermod -aG tty $USER
newgrp tty
为了不改变原有的tty用户组的权限,这里要用到acl来进行更细致的权限管理。首先检查文件系统是否支持acl
(base) HwHiAiUser@orangepiaipro:/$ lsblk # 查看系统中可用的磁盘和分区
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk1 179:0 0 119.1G 0 disk
├─mmcblk1p1 179:1 0 1M 0 part
├─mmcblk1p2 179:2 0 118.8G 0 part / # 显然,这是我们使用的文件系统(也可能会是别的名字)
└─mmcblk1p3 179:3 0 50M 0 part /exchange
使用 blkid 命令查看设备的文件系统类型:
sudo tune2fs -l /dev/<disk_name> | grep "Default mount options" # 这里的<disk_name>是上面目标文件系统的名字,例如,在上面的示例中是mmcblk1p2
如果输出中包含acl
,则表示文件系统支持 ACL,可以继续进行下面的步骤。
sudo groupadd tty_r
sudo usermod -aG tty_r $USER
sudo setfacl -m g:tty_r:rw- /dev/tty*
- i2c权限
sudo usermod -aG i2c $USER
newgrp i2c
sudo i2cdetect -y 0
目前遇到的问题:
1. 客服提供的RasAdapter 原理图是v5.3的,端口和手里的v3.6不完全一样,有一些控制模块不能确定其映射关系。已经在技术交流群&某个线上电商尝试索要对应版本的datasheet。
2. i2c设备查找不到,怀疑是由于没有配置gpio为i2c接口。需要修改设备树,详情:
在 Orange Pi 上,使用 smbus
控制 GPIO 接口复用为 I2C 的过程分为两部分:
- 硬件层面:通过设备树(Device Tree)或内核配置将 GPIO 引脚复用为 I2C 功能。
- 软件层面:使用 Python 的
smbus
库与 I2C 设备通信。
以下详细说明如何实现这两部分。
- 查看 Orange Pi 的原理图或手册,确认哪些 GPIO 引脚可以复用为 I2C 功能。
- 例如,Orange Pi Zero 的
PA11
和PA12
可以复用为 I2C0 的SCL
和SDA
。
- 设备树用于配置硬件资源,包括 GPIO 复用功能。
- 找到设备树文件(通常位于
/boot/dtb/
或/boot/
目录下),例如sun8i-h3-orangepi-zero.dtb
。 - 修改设备树文件,将 GPIO 配 806D 为 I2C 功能。
假设需要将 PA11
和 PA12
配置为 I2C0 的 SCL
和 SDA
:
&i2c0 {
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins>;
status = "okay";
};
&pio {
i2c0_pins: i2c0_pins {
pins = "PA11", "PA12";
function = "i2c0";
};
};
- 如果修改了设备树源文件(
.dts
),需要将其编译为二进制文件(.dtb
)。 - 使用
dtc
工具编译:dtc -I dts -O dtb -o sun8i-h3-orangepi-zero.dtb sun8i-h3-orangepi-zero.dts
- 将编译好的设备树文件复制到
/boot/
目录,并更新引导配置。 - 重启系统以应用更改:
sudo reboot
- 使用
i2cdetect
工具检查 I2C 总线是否正常工作:sudo apt install i2c-tools sudo i2cdetect -l sudo i2cdetect -y 0
- 如果看到 I2C 设备地址,说明配置成功。
- 在 Python 中,
smbus
是一个用于与 I2C 设备通信的库。 - 安装
smbus
:sudo apt update sudo apt install python3-smbus
- 使用
smbus
库与 I2C 设备通信。
import smbus
# 初始化 I2C 总线
bus = smbus.SMBus(0) # 0 表示 I2C0 总线
# I2C 设备地址
device_address = 0x50 # 替换为实际的设备地址
# 读取一个字节
def read_byte(register):
return bus.read_byte_data(device_address, register)
# 写入一个字节
def write_byte(register, value):
bus.write_byte_data(device_address, register, value)
# 示例:读取寄存器 0x00 的值
v