RDK-X3
| ||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||
简介
RDK X3 是一款面向生态开发者的嵌入式 AI 开发板,接口兼容树莓派,具有 5 TOPS 端侧推理与 4 核 ARM A53 处理能力。可同时多路 Camera Sensor 的输入并支持 H.264/H.265 编解码。结合D Robotics的高性能 AI 工具链与机器人开发平台,助力开发者快速落地解决方案。
RDK X3提供两种内存版本供用户选择,分别为2GB和4GB。
产品参数
处理器 | 地平线旭日® X3M 芯片 |
---|---|
CPU | 四核 ARM Cortex-A53@1.2GHz |
BPU | 双核 @1GHz,等效算力 5 TOPS |
内存 | 2G/4G Byte LPDDR4 |
存储器 | 外置TF卡 |
摄像头 | MIPI CSI 2lane × 2 |
显示接口 | HDMI × 1 (up to 1920 × 1080); MIPI-DSI × 1 (up to 1920 × 1080); |
USB Host | USB Type-A 3.0 × 1; USB Type-A 2.0 × 2; |
USB Device | Micro USB 2.0 × 1 |
有线网络 | RJ45 千兆以太网 ×1 |
无线网络 | 2.4G Wi-Fi × 1,支持 802.11 b/g/n |
蓝牙 | Bluetooth 4.1 × 1 |
其他接口 | 40PIN × 1; 调试串口 × 1; |
供电 | USB Type-C,5V-2A |
尺寸 | 85 × 56 × 20 mm |
工作温度 | -25°C ~ 95 °C(X3M 芯片温度) |
系统安装
软件资源
- 旭日 X3 派开发板目前支持 Ubuntu 20.04 Server、Desktop 两个系统版本,
镜像下载。
- TF卡插入读卡器,读卡器接入电脑,识别到TF卡后打开balenaEtcher软件
- 点击Flash from file,选择你刚解压的镜像文件 system_sdcard.img
- 点击Select target按钮,选择TF卡对应的磁盘作为目标储存设备
- 点击Flash按钮开始烧录,等到工具提示Flash Comple时,表示TF卡镜像制作完成,关闭balenaEtcher,从电脑上取下读卡器,并取出TF卡
- TF卡插入读卡器,读卡器接入电脑,识别到TF卡后打开rufus软件
- 点击选择按钮,在弹出的文件选择对话框中选择解压出来的 system_sdcard.img 镜像文件
- 点击开始按钮,软件弹出提示框,点击确定开始烧录TF卡镜像,如果弹出以下信息,点击确定。
- 当软件进度条完成并提示准备就绪后,表示TF卡镜像烧录完成,关闭软件,取下读卡器,取出TF卡
- 红色指示灯:点亮代表硬件上电正常
- 绿色指示灯:点亮代表系统启动中,熄灭代表系统启动完成
- PC
- 旭日 X3 派
- 充电线
- 4PIN排线
- 串口模块
如果您手里的是新版本的X3派,请下载2.0.0版本的镜像,与旧版本镜像不互通。
balenaEtcher烧录镜像
-
注意:使用该软件烧录时,尽量直接接在电脑的USB接口上,不要使用外接拓展,可能会导致烧录不成功。
rufus烧写镜像
开机操作
-
主板断电,将TF卡插入卡槽,并将显示器接入HDMI接口,给开发板上电。
开机画面正常显示后,说明系统启动完成,此时可通过串口登录、SSH 登录方式登录开发板,登录用户名:sunrise 密码:sunrise
如果开发板上电后,HDMI 长时间(2 分钟以上)没有显示输出,说明开发板启动异常。此时用户可通过串口登录开发板,查看启动过程中串口的打印,确认开发板启动状态,TF 存储卡镜像异常时 log如下:
此时用户可重新制作TF储存卡进行系统恢复。
远程登陆
使用 VNC、SSH 远程登录时要用到设备 IP,因此用户需要提前获取开发板 IP地址,此时推荐用户使用串口登录开发板并进行网络参数确认,登录用户名:sunrise 密码:sunrise。
串口登录
硬件准备
硬件连接
旭日 X3 派 | 串口模块 |
GND | GND |
TXD | RXD |
RXD | TXD |
再将串口模块连接至电脑。
注意:电源线不接.
软件下载
串口登录操作
方法一:putty串口登录
-
硬件连接好,驱动安装完毕后,打开设备管理器,你会看到以下端口:
打开putty软件,按照下图配置(以实际识别到的端口为准)。
旭日 X3 派上电,pytty窗口便会看到有信息打印,然后登陆即可。
输入命令
ifconfig
获取主板的IP地址
ifconfig eth0 代表以太网络(指网线),刚烧录的系统默认为192.168.1.10 ifconfig wlan0 代表WiFi网络
方法二:MobaXterm串口登录
SSH登录
-
SSH登陆前我们需要配置电脑IP
- 开发板、PC 机 IP 地址前三段相同,例如开发板:192.168.1.10 PC 机:192.168.1.100
- 开发板、PC 机的子网掩码、网关保持一致
- PC 机网络防火墙处于关闭状态
从串口登录我们已经获取到了 主板 的 IP 地址 (192.168.1.10)
为了使电脑与 sunrise x3 pi 进行通信需要进行以下操作:
-
配置电脑 IP 主要进行如下几步:
- 在网络连接中找到对应的以太网设备并右击选择属性
- 找到 Internet 协议版本 4 选项并双击打开
- 在下图红框位置填入对应的网络参数,然后点击确定
MobaXterm登录
注意:开机输入用户名和密码必须在60S内完成,没完成的重新在60S内再输入一次即可。
VNC 登录
打开VNC软件,在地址栏输入旭日 X3 派的IP地址,回车,按照以下图片配置即可
命令行登录
ubuntu虚拟机打开终端输入:
ssh sunrise@192.168.1.10
系统配置
系统更新
出于系统安全、稳定性的考虑,推荐用户安装完系统后,通过 APT 命令对系统进行更新。
在/etc/apt/source.list 文件中,保存了 APT 命令的软件源列表,在安装软件前,需要先通过apt 命令更新 package 列表。
首先打开终端命令行,并输入如下命令:
sudo apt update
其次,升级所有已安装的软件包到最新版本,命令如下:
sudo apt full-upgrade
注意:推荐使用 full-upgrade 而不是简单的 upgrade 命令,这样当相关依赖发生变动时,也会同步更新依赖包。
当运行 sudo apt full-upgrade 命令时,系统会提示数据下载和磁盘占用大小,但是 apt 不会检查磁盘空间是否充足,推荐用户通过
df -h
命令手动检查。此外,升级过程中下载的 deb 文件会保存在/var/cache/apt/archives 目录中,用户可以通过
sudo apt clean
命令删除缓存文件以释放磁盘空间。
执行 full-upgrade 之后,可能会重新安装驱动和升级旭日 X3 派的内核,所以建议都重启一下设备,命令如下:
sudo reboot
- 安装 hostapd 和 isc-dhcp-server
sudo apt update sudo apt install hostapd sudo apt install isc-dhcp-server
配置 hostapd,打开
sudo vim /etc/hostapd.conf
无密码的热点配置请添加以下内容:
interface=wlan0 driver=nl80211 ctrl_interface=/var/run/hostapd ssid=Sunrise channel=6 ieee80211n=1 hw_mode=g ignore_broadcast_ssid=0
有密码的热点配置请添加以下内容
interface=wlan0 driver=nl80211 ctrl_interface=/var/run/hostapd ssid=Sunrise channel=6 ieee80211n=1 hw_mode=gignore_broadcast_ssid=0 wpa=2 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP wpa_passphrase=12345678
- 配置 isc-dhcp-server
终端输入
sudo vim /etc/default/isc-dhcp-server
如下定义使用的网络接口,保存并退出:INTERFACESv4="wlan0"
终端输入:
sudo vim /etc/dhcp/dhcpd.conf
取消以下字段的注释:
authoritative;
然后输入:sudo vim /etc/dhcp/dhcpd.conf
在文件的末尾增加以下配置:
subnet 10.5.5.0 netmask 255.255.255.0 { range 10.5.5.100 10.5.5.254; option subnet-mask 255.255.255.0; option routers 10.5.5.1; option broadcast-address 10.5.5.31; default-lease-time 600; max-lease-time 7200;}
- 停止 wpa_supplicant 服务,并重启 wlan0
注意:从这一步开始最好进入超级用户的模式
第一次进入超级用户,请按照下面进行操作
设置进入 root 用户的密码:sudo passwd root
然后输入 3 次密码,设置密码、确认密码、第二次确认
进入 root 用户:su root / sudo su
然后输入密码
退出 root 用户:su sunrise
输入下面的命令停止 wpa_supplicant 服务,并重启 wlan0
systemctl stop wpa_supplicant
- 启动 hostapd 服务
sudo hostapd -B /etc/hostapd.conf
会打印以下信息:
root@ubuntu:~# sudo hostapd -B /etc/hostapd.conf Configuration file: /etc/hostapd.conf Using interface wlan0 with hwaddr 08:e9:f6:af:18:26 and ssid "sunrise" wlan0: interface state UNINITIALIZED->ENABLED wlan0: AP-ENABLED
- 配置无线接口 wlan0 的 IP 和网段
注意要跟上面的配置一致。
sudo ifconfig wlan0 10.5.5.1 netmask 255.255.255.0
- 开启 dhcp 服务器,连上热点会从 10.5.5.100 到 10.5.5.255 之间分配一个 ip 地址给客户端。
sudo systemctl start isc-dhcp-server sudo systemctl enable isc-dhcp-server
打开手机连接 Sunrise 这个热点名 - 切换回 Station 模式
# 停止 hostapd killall5 -9 hostapd # 清除 wlan0 的地址 ip addr flush dev wlan0 sleep 0.5 ifconfig wlan0 down sleep 1 ifconfig wlan0 up # 重启 wpa_supplicant systemctl restart wpa_supplicant # 连接热点, 具体操作可以查看上一章节 “无线网络” wifi_connect "JSBPI" "waveshare0755"
- 修改/etc/systemd/resolved.conf 文件:
sudo vim /etc/systemd/resolved.conf
添加 DNS 服务器地址:
DNS=8.8.8.8 114.114.114.114
- 使能新的 DNS 配置:
sudo systemctl restart systemd-resolved sudo systemctl enable systemd-resolved sudo mv /etc/resolv.conf /etc/resolv.conf.bak sudo ln -s /run/systemd/resolve/resolv.conf /etc/
网线网络配置
开发板网络配置保存在/etc/network/interfaces 文件中
在使用 vim 编辑器时保存时请先按下Esc键,再输入
:wq!
推荐使用 nano 编辑器,安装命令如下:
sudo apt update sudo apt-get install nano
静态 IP 修改
通过修改 address、netmask、gateway 等字段,可完成对静态 IP 配置的修改
例如:
sudo vim /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8) # Include files from/etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto eth0 iface eth0 inet static address 192.168.1.10 netmask 255.255.255.0 gateway 192.168.1.1 metric 700
修改完成后,命令行输入
sudo systemctl restart NetworkManager
让配置生效。
重启更新网络频段:
sudo reboot
修改 DHCP 配置
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配 IP 地址,使网络环境中的主机动态的获得 IP 地址、Gateway 地址、DNS 服务器地址等信息,并能够提升地址的使用率。开发板的 DHCP 网络配置保存在/etc/network/interfaces 文件,通过修改 eth0 相关配置,可完成对 DHCP 模式的修改,例如终端输入:
sudo vim /etc/network/interfaces
修改以下内容:
source-directory /etc/network/interfaces.d auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp metric 700修改完成后,命令行输入
sudo systemctl restart NetworkManager
命令让配置生效。
重启更新网络频段:
sudo reboot
修改 MAC 地址配置
如需修改开发板默认 MAC 地址,可通过在/etc/network/interfaces 文件中增加 pre-up 配置信息,指定用户需要的 MAC 地址,例如:
sudo vim /etc/network/interfaces
修改以下内容:
# interfaces(5) file used by ifup(8) and ifdown(8)# Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto eth0 iface eth0 inet static address 192.168.1.10 netmask 255.255.255.0 gateway 192.168.1.1 pre-up ifconfig eth0 hw ether 00:11:22:9f:51:27
修改完成后,命令行输入
sudo systemctl restart NetworkManager
使配置生效。
重启更新网络频段
sudo reboot
无线网络配置
Ubuntu Server 版本系统
输入 WiFi 扫描命令:
sudo nmcli device wifi rescan
如果出现 Error: Scanning not allowed immediately following previous scan.的提示,表示扫描太频繁,请等一会后再扫描
显示扫描到的 WiFi:
sudo nmcli device wifi list
使用命令连接 WiFi:
sudo wifi_connect "SSID" "PASSWD" sudo wifi_connect "JSBPI" "waveshare0755"
返回以下命令表示成功,出现其他问题按照错误提示进行修改即可
Device 'wlan0' successfully activated with '********-****-****-****-************'
如果提示 Error: No network with SSID 'WiFi-Test' found.,说明是热点还没有刷新出来,可以执行
sudo nmcli device wifi rescan
命令重新扫描即可。
无线网络软AP
-
无线网络软 AP 可以理解为手机上的 WiFi 热点。
AP6212 的 wifi 支持软 AP 和 Station 两种模式,默认运行在 Station 模式下,如果要使用软 AP 功能请按照以下步骤进行配置。
DNS 服务
-
DNS(Domain Name Server)是进行域名(domain name)和与之相对应的 IP 地址转换的服务器。开发板 DNS 配置过/etc/systemd/resolved.conf 文件管理,用户可通过修改该文件完成 DNS 相关配置, 在其中取消 #DNS 前面的 # 号:
CPU 调频策略
-
开发板在 Linux 内核中采用 CPUFreq 驱动对 CPU 工作状态进行管理,默认状态为 ondemand 模式,此时 CPU 会根据负载动态调节频率,以达到降功耗目的,用户可通过如下命令将 CPU 强制工作在 1.2GHz 最高频率下:
sudo bash -c 'echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor'
开发板在系统中提供了超频功能,可将CPU最高频率从1.2GHz提升到1.5GHz,配置命令如下:
sudo bash -c 'echo 1 > /sys/devices/system/cpu/cpufreq/boost'
注意,CPU 超频可能会造成系统稳定性问题,如遇稳定性问题,需要关闭超频功能,命令如下:
sudo bash -c 'echo 0 > /sys/devices/system/cpu/cpufreq/boost'
特别声明: CPU 超频仅限于开发者 Geek 尝试使用,在做超频处理前,需要保证给芯片做好扇热措施,保证 CPU 长时间运行下,芯片结温能够保持在 95 摄氏度以下,避免因芯片在高温情况下长时间运行导致芯片故障。CPU 超频同时会导致一些目前还无法预知的芯片可靠性问题,请开发者谨慎操作。查看芯片当前的结温温度、CPU 运行频率、BPU 运行频率和 BPU 使用率的命令如下:
sudo hrut_somstat
自启动配置
通过在 sudo vim /etc/rc.local 文件末尾添加命令,可实现开机自启动运行命令的功能。
蓝牙
-
调用脚本完成初始化
- 复位蓝牙
- 创建 messagebus 用户和用户组,dbus-daemon 程序运行时需要使用该用户
- 运行 brcm_patchram_plus 完成蓝牙的驱动加载和固件加载
- 循环检查 /sys/class/bluetooth/hci0 目录是否存在,确认蓝牙驱动已经正常运行
- 出现 Done setting line discpline 表示蓝牙启用成功
- 执行 hciconfig hci0 up 完成蓝牙的 Link Up
- 执行 hciconfig hci0 piscan 进行蓝牙扫描,本步骤可以根据情况去掉
- 如下图:
- 执行成功后,确认以下进程是否正常运行:
- exit :退出 bluetoothctl 交互界面
- help :获取 bluetoothctl 支持的命令表
- Connect :连接 BLE 设备,输入 connect BLE MAC 连接指定 BLE 设备,连接成功会提示 connect successfully, 第一次连接成功后,会把该 BLE 设备支持的属性都显示出来;无法搜索到指定设备,会提示 not available
- disconnect :断开设备连接
sudo startbt6212.sh
脚本调用初始化完成了以下工作:
cd /usr/bin *ls #查看是否有dbus-daemon和brcm_patchram_plus文件 *cd ..#返回上一级 *cd lib/bluetooth #进入目录 *ls #查看是否有bluetooth文件
命令行操作
进入交互模式下的蓝牙配置界面
sudo bluetoothctl
表示蓝牙已被识别
输入show查看蓝牙详细信息
注意蓝牙的Powered(上电)、Discovera(可被搜索到)的状态
power on 使能蓝牙 power off 关闭蓝牙 discoverable on 使设备可以被检测到 discoverable off 使设备无法被检测到 scan on 开始扫描附近的蓝牙设备 scan off 关闭扫描
配对对应的蓝牙设备,注意根据提示输入 yes
pair [targetMAC] 比如:pair 9C:5A:81:3E:97:4C
配对成功后,使用指令下次自动连接
trust [targetMAC] 比如:trust 9C:5A:81:3E:97:4C
Bluetoothctl 命令扩展
更多操作请访问 BlueZ 官网 :
http://www.bluez.org/ https://blog.csdn.net/zhuo_lee_new/article/details/106626680
桌面软件操作
选择右上角的图标或菜单栏对蓝牙进行操作
或者点击Application。
Bluetooth Adapters :用来配置本机蓝牙设置
tooth Manager :用来扫描蓝牙设备并连接
拓展
查看是否识别蓝牙模块: hciconfig -a 查看蓝牙模块的地址: hcitool dev 激活蓝牙: sudo hciconfig hci0 up 此次测试设置蓝牙模块为服务端且不需要配对码: hciconfig hci0 noauth
编辑文件,开启蓝牙设备:
sudo vi /etc/systemd/system/dbus-org.bluez.service
找到ExecStart=/usr/lib/bluetooth/bluetoothd,更改并添加为:
ExecStart=/usr/lib/bluetooth/bluetoothd -C ExecStartPost=/usr/bin/sdptool add SP
CSI摄像头使用
硬件连接
要测试摄像头,需要给X3派接入HDMI屏幕
- 将排线的金属面朝下,接入摄像头接口。
测试摄像头
X3派的摄像头接口默认是开启的,上电即可用。系统自带的AI demo可以用来测试摄像头,请确保已经连接HDMI屏幕,可以显示预览画面。
树莓派或者Jetson系列的摄像头,接入X3 PI需要另外购买转接板
打开终端,输入以下指令:
- 如果你是通过SSH登录的,需要现指定输出为屏幕
export DISPLAY=:0
- 使用AI例程测试
cd /app/ai_inference/03_mipi_camera_sample sudo python3 mipi_camera.py
摄像头正常情况下会开启预览,并显示图像和对应的物体识别结果。
GPIO的基本使用
开启 40Pin 引脚上的外设(SPI2、I2C0、I2S0、I2S1、UART3)
输入
sudo srpi-config
Disabled 表示关闭这个功能(配置成普通 GPIO)
okay 表示开启这个功能(使用专用功能)
板载绿色 LED 灯的引脚为 GPIO26
使用 shell 命令控制GPIO(文件IO)
- gpio_operation 通过/sys/文件接口操作 IO 端口 GPIO 到文件系统的映射
- 控制 GPIO 的目录位于/sys/class/gpio
- /sys/class/gpio/export 文件用于通知系统需要导出控制的 GPIO 引脚编号
- /sys/class/gpio/unexport 用于通知系统取消导出
- /sys/class/gpio/gpiochipX 目录保存系统中 GPIO 寄存器的信息,包括每个寄存器控制引脚的起始 编号 base,寄存器名称,引脚总数
- 导出一个引脚的操作步骤:向/sys/class/gpio/export 写入此编号,比如 12 号引脚,echo 12 > /sys/class/gpio/export,命令成功后生成/sys/class/gpio/gpio12 目录,如果没有出现相应的目录,说明此引脚不可导出
- direction 文件,定义输入输入方向,可以通过下面命令定义为输出,direction 接受的参数:in, out, high, low。high/low 同时设置方向为输出
- value 文件是端口的数值,为 1 或 0
- 使 GPIO105(BCM26 脚)从内核空间导出到用户空间中
sudo echo 105 > /sys/class/gpio/export
- 查看 GPIO18 引脚
cd /sys/class/gpio/gpio105
- 设置 GPIO18 的模式
sudo echo out > direction #设置为输出模式 sudo echo in > direction #设置为输入模式
- 设置引脚状态
sudo echo 1 > value 设置为高电平 sudo echo 0 > value #设置为低电平
- 读取引脚状态
sudo cat value #返回值为 0 表示为低状态,1 为高状态
- 读取引脚模式
sudo cat direction # 返回值为 in 表示为输入,out 为输出
- 取消导出
cd sudo echo 105 > /sys/class/gpio/unexport
该目录下各个目录和文件的功能
cd sys/class/gpio
实际操作
Python示例
-
旭日 X3 派默认已经安装了 Python 和 Hobot.GPIO,可以通过导入模块,并且查看其版本信息。
禁用警告信息
您尝试使用的 GPIO 可能已在当前应用程序外部使用。在这种情况下,GPIO 库将向您发出警告。如果您在设置模式和频道之前尝试清理,它也会警告您。要禁用警告,请调用:
GPIO.setwarnings(False)
设置引脚编号方式
GPIO.setmode(GPIO.BOARD)
BOARD(the pin number of the 40 pin GPIO header):物理引脚序号,在硬件上丝印上可以直接看到的序号,物理上正好一一对应。
BCM(the Broadcom SoC GPIO numbers):BCM 是根据博通 SoC 的 GPIO 规则命名的。
CVM 使用字符串代替数字,对应于 CVM / CVB 连接器的信号名称。
SOC 对应的编号是旭日 X3M 芯片的 GPIO 管脚序号,与芯片数据手册一一对应.
设置管脚
GPIO 通道必须在用作输入或输出之前进行设置。要将通道配置为输入,请调用:
# (其中通道基于上面讨论的引脚编号模式) GPIO.setup(channel, GPIO.IN)
设置输出:
GPIO.setup(channel, GPIO.OUT)
也可以为输出通道指定一个初始值:
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
将通道设置为输出时,也可以同时设置多个通道:
# 根据需要添加尽可能多的通道。您还可以使用元组: (18,12,13) channels = [18, 12, 13] GPIO.setup(channels, GPIO)
配置输出引脚状态
GPIO.output(channel, state)
其中 state 可以是 GPIO.LOW 或 GPIO.HIGH。
获取输入引脚的状态
GPIO.input(channel)
将返回 0 或者 1。 0 代表 GPIO.LOW, 1 代表 GPIO.HIGH。
清理管脚占用
释放所有的引脚
GPIO.cleanup()
只清理特定通道
# 清除单个通道 GPIO.cleanup(channel) # 清除一组通道 GPIO.cleanup( (channel1, channel2) ) GPIO.cleanup( [channel1, channel2] )
查看引脚状态
GPIO.gpio_function(channel) 该函数返回 IN 或 OUT。
边沿检测与中断
边缘检测函数
此函数阻塞调用线程,直到检测到提供的边缘。
GPIO.wait_for_edge(channel, GPIO.RISING)
此函数调用之后,直接掠过,需要搭配其他函数使用
GPIO.add_event_detect(channel, GPIO.RISING) GPIO.RISING :上升沿 GPIO.FALLING :下降沿 GPIO.BOTH :边沿(上升 + 下降)
设置等待超时时间
# 超时以毫秒为单位 GPIO.wait_for_edge(channel, GPIO.RISING, timeout=500)
该函数返回检测到边缘的通道,如果发生超时,则返回 None。
event_detected() 函数
此函数可用于定期检查自上次调用以来是否发生了事件。
GPIO.add_event_detect(channel, GPIO.RISING) if GPIO.event_detected(channel): print("Rising edge event detected")
检测到边沿函数时调用回调函数
此功能可用于为回调函数运行第二个线程。因此,回调函数可以与您的主程序 并发运行以响应边沿事件。
# 定义回调函数 def callback_fn(channel): print("Callback called from channel %s" % channel) # 添加上升沿检测 GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn)
如果需要,也可以添加多个回调,注意两个回调函数时按顺序运行的
def callback_one(channel): print("First Callback") def callback_two(channel): print("Second Callback") GPIO.add_event_detect(channel, GPIO.RISING) GPIO.add_event_callback(channel, callback_one) GPIO.add_event_callback(channel, callback_two)
为了防止误操作的去抖时间
# 以毫秒为单位设置的去抖时间 GPIO.add_event_detect(channel, GPIO.RISING, callback=callback_fn, bouncetime=200)
关闭中断
如果不再需要边沿检测,可以将其删除
GPIO.remove_event_detect(channel)
PWM
Sunrise x3 pi 的 40 Pin 有两个 PWM 输出脚:
PWM0 :33(BOARD),13(BCM),4(x3 管脚号)
PWM1 :32(BOARD),12(BCM),25(x3 管脚号)
shell命令控制
PWM0
导出 PWM0 到用户空间
echo 0 > /sys/class/pwm/pwmchip0/export
设置 PWM 一个周期的时间(ns)
注意 :PWM 波的这个时间的范围建议 50 ~ 21000
echo 20000 > /sys/class/pwm/pwmchip0/pwm0/period
占空比设置,这里设置的是 PWM 开启状态的时间(默认为高电平)
echo 10000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
# pwm 信号中以低电平为开启状态,还是以高电平为开启状态,这里设置为普通极性,也就 是高电平为开启状态 # echo 'normal' > /sys/class/pwm/pwmchip0/pwm0/polarity
使能 PWM 波输出
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
失能 PWM 波输出
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
取消导出
echo 0 > /sys/class/pwm/pwmchip0/unexpor
PWM4
与PWM0类似
pwmchip3 + PWM1 = PWM4 echo 1 > /sys/class/pwm/pwmchip3/export echo 20000 > /sys/class/pwm/pwmchip3/pwm1/period echo 10000 > /sys/class/pwm/pwmchip3/pwm1/duty_cycle echo 1 > /sys/class/pwm/pwmchip3/pwm1/enable echo 0 > /sys/class/pwm/pwmchip3/pwm1/enable echo 1 > /sys/class/pwm/pwmchip3/unexport
扩展
pwmchip0/3 目录下属性
device export:导出 pwm 通道,使用前必须导出 npwm:PWM 控制器下共有几路 PWM 输出 power subsystem uevent unexport:取消导出 PWM 通道
pwm* 目录下属性
周期 period 占空比 duty_cycle 极性 polarity 周期:单位为纳秒,1000000000 ns = 1s 占空比:高低电平的占比 极性:以低电平为开启状态,还是以高电平为开启状态,一般为 normal,也就是高电平为开启状态 (inversed、normal)
python示例
Hobot.GPIO 库仅在带有附加硬件 PWM 控制器的引脚上支持 PWM,与 RPi.GPIO 库不同,Hobot.GPIO 库不实现软件模拟 PWM,旭日X3派支持 2 个 PWM 通道。
导入Hotbot.GPIO
sunrise@ubuntu:~$ sudo python3 Python 3.8.10 (default, Mar 15 2022, 12:22:08) Type "help", "copyright", "credits" or "license" for more information. >>> import Hobot.GPIO as GPIO >>> GPIO.VERSION '0.0.2' >>> GPIO.model 'X3PI'
配置:
配置引脚编号方式 : GPIO.setmode(GPIO.BOARD) 配置输出引脚和输出 PWM 的频率(48KHz ~ 192MHz) p = GPIO.PWM(output_pin, 48000) 配置初始占空比(0 - 100) p.start(val) 动态调节占空比(0 - 100) p.ChangeDutyCycle(val) 停止输出 PWM 波 p.stop() 清理管脚占用 GPIO.cleanup()
实例展示
运行指令:
sudo python3 test_PWM.py
测试说明: 打开 output_pin 指定的PWM通道,初始占空比 25%, 先每0.25秒增加5%占空比,达到100%之后再每0.25秒减少5%占空比,在正常输出波形时,可以通过示波器或者逻辑分析仪测量输出信号,观察波形。
串口
旭日X3派在40PIN上默认使能 UART3,物理管脚号 8 和 10,IO电压 3.3V。
注意:在 40Pin 接口上存在的只有串口 3(/dev/ttyS3);串口 1(/dev/ttyS0)是系统调试口,在未明白它的作用前,不建议对它进行测试。
Shell 命令控制
基本指令
查看串口属性 :
sudo stty -F /dev/ttyS3
查看全部参数
sudo stty -F /dev/ttyS3 -a
设置串口波特率(默认为 9600) :
sudo stty -F /dev/ttyS3 speed 115200
115200 波特率 8 数据位 1 停止位 无校验位
sudo stty -F /dev/ttyS3 speed 115200 cs8 -parenb -cstopb
串口发送数据 :
sudo echo "afafsadf" > /dev/ttyS3
串口接收数据(会将接收到的数据添加两个字符后发送回去):
sudo cat /dev/ttyS3
扩展: 读取数据并保存到 txt 文本文件中:
sudo cat /dev/ttyS3 > ttyS3_output.txt
发送数据,后开始接收数据
sudo echo "asdasdasdas" > /dev/ttyS3 | cat /dev/ttyS3
去除串口回显:
stty -F /dev/ttyS3 -ech0
执行该条命令后,串口只有检测到换行后才会打印出来 读取串口数据时指定读取行数。比如指定前 5 列数据。
cat /dev/ttyS3 |head -n 5
Python示例程序
回环测试:
把TXD和RXD在硬件上进行连接,也就是连接8和10引脚,然后运行测试程序,进行写和读操作,预期结果是读出的数据要完全等于写入的数据。
运行示例程序:
sudo python3 test_serial.py
SPI
旭日X3派在40Pin上物理管脚 19, 21, 23, 24引出了旭日X3芯片的 SPI2 总线,支持一个片选,IO电压3.3V。
Python
- 下载库:
sudo apt-get update sudo apt-get install python-pip pip install spidev
#导入spidev模块 import spidev #创建spidev类的对象以访问基于spidev的Python函数 spi=spidev.SpiDev() #打开spi总线句柄 spi.open(int(spi_bus), int(spi_device)) #int(spi_bus) :设置spi的bus号(0, 1, 2) #int(spi_device) :设置片选(0, 1) #设置spi频率为12MHz spi.max_speed_hz = 12000000 # 发送几个数据读回来也是几个数据 resp = spi.xfer2([0x55, 0xAA]) # 释放对应的 SPI spi.close() spi.readbytes(n) #从 spi 设备读取 n 个字节 spi.writebytes(list of values) #将数据列表写入 spi 设备 spi.writebytes2(list of values) #接受大型列表,支持 numpy 字节数组 spi.xfer(send_list) #传输数据 spi.xfer2(send_list) #传输数据,列表数据不能超过 4096 bytes spi.xfer3(send_list) #接受大型列表,支持 numpy 字节数组
配置
max_speed_hz #通信时钟最大频率 mode #spi mode 0b00~0b11 no_cs #设置 SPI_NO_CS 标志是否使用 CS threewire #共享 SI/SO 信号 lsbfirst #猜测 低位优先 loop cshigh #猜测 CS 为高有效 bits_per_word
I2C
检测I2C设备
sudo i2cdetect -y -r 1 sudo i2cdetect -y -r 0
该指令会启动I2C检测电路,电路上实际连接的设备会显示,没有链接在电路上的设备是不会显示的,检测到的是7位I2C地址。
sudo ls /dev/i2c-*
列出所有已开启的I2C。旭日 X3 派只有两个I2C硬件
/dev/i2c-0 /dev/i2c-1
I2C的波特率
-
查看I2C的传输速率
sudo cat /sys/module/i2c_bcm2708/parameters/baudrate
修改波特率
sudo nano /boot/config.txt 添加一行dtparam=i2c1_baudrate=50000(假设我们将其设置为50khz). sudo reboot
获取当前波特率: sudo cat /sys/module/i2c_bcm2708/parameters/baudrate
设置波特率:
sudo emacs /etc/modprobe.d/custom.conf 添加一行设置: options i2c_bcm2708 baudrate=100000 设置后需要重启才能生效。
树莓派库
import smbus 用来确认使用何种总线:使用IIC总线1 self.i2c = smbus.SMBus(1)
Python示例
-
pip install smbus2
https://pypi.org/project/smbus2/
调用 :import smbus 调用树莓派的 IIC1 self.i2c = smbus.SMBus(1) 设置树莓派的地址 self.address = address 从设备读取单个字节。 read_byte(i2c_addr,force=None) 从指定寄存器读取单个字节。 read_byte_data(i2c_addr,register,force=None) 从指定寄存器中读取最多 32 字节的块。 read_block_data(i2c_addr,register,force=None) 从指定寄存器读取字节数据块 read_i2c_block_data(i2c_addr,register,length,force=None) 从指定寄存器中读取单个字(2 个字节) read_word_data(i2c_addr,register,force=None) 将单个字节写入设备。 write_byte(i2c_addr,value,force=None) 将一个字节写入指定的寄存器。 write_byte_data(i2c_addr,register,value,force=None) 将字节数据块写入指定寄存器。 write_block_data(i2c_addr,register,data,force=None) 发送的数据格式如下: 地址,寄存器编号,数据数量,数据 将字节数据块写入指定寄存器。 write_i2c_block_data(i2c_addr,register,data,force=None) 将一个字节写入指定的寄存器。 write_word_data(i2c_addr,register,value,force=None) 执行快速事务。如果不成功,抛出 IOError。 write_quick(i2c_addr,force=None) 取消IIC的使用/占用 close()
使用 SMBus 库访问 I2C 设备
在旭日X3PI上可以使用 SMBus 库在 Python 脚本中访问 I2C 总线。SMBus 是 I2C 接口的子集。SMBus 的 Python 库可用于与基于 I2C 的设备进行通信。
运行以下命令可以在旭日X3PI上安装 SMBus 库:
sudo apt-get install python-smbus
在 Python 脚本中,可以使用以下语句导入 SMBus 库:
import smbus
导入 SMBus 库后,必须使用 SMBus() 方法创建 SMBus 类的对象。SMBus() 方法将 I2C 端口号作为参数,必须在赋值语句中使用才能创建 SMBus 对象。它具有以下语法:
<Object_name> = smbus.SMBus(I2C_Port_Number)
以下是创建 SMBus 对象的有效示例:
i2c-bus = smbus.SMBus(1)
请注意:要使用最新的 SMBus2 库,可以通过运行以下命令使用 pip 安装它:
pip install smbus2
在 Python 脚本中,可以使用以下语句导入 SMBus2 库:
from smbus2 import SMBus, i2c_msg
可以使用 smbus2.SMBus() 方法创建 SMBus 类的对象,如下所示:
i2c-bus = smbus2.SMBus(1)
smBus2 库有两个类——SMBus 和 i2c_msg。SMBus 类支持以下方法:
smbus.SMBus()/smbus2.SMBus() – 在 Python 脚本中创建 SMBus 对象。 open(bus) – 打开给定的 i2c 总线。 close() – 关闭 I2C 连接。
来自 I2C 从机的串行数据可以字节、字或字节块读取。在某些 I2C 从设备中,主设备需要从特定寄存器访问串行数据。SMBus2 库中提供了以下用于从从设备读取串行 I2C 数据的方法:
read_byte(i2c_addr,force=None) – 从设备读取单个字节。 read_byte_data(i2c_addr,register,force=None) – 从指定寄存器读取单个字节。 read_block_data(i2c_addr,register,force=None) – 从给定寄存器中读取最多 32 字节的块。 read_i2c_block_data(i2c_addr,register,length,force=None) – 从给定寄存器读取字节数据块。 read_word_data(i2c_addr,register,force=None)– 从给定寄存器中读取单个字(2 个字节)。
类似地,数据可以字节、字或字节块写入 I2C 从机。在某些 I2C 从设备中,数据必须写入特定的寄存器。SMBus2 库中提供了以下用于从从设备写入串行 I2C 数据的方法:
write_byte(i2c_addr,value,force=None) – 将单个字节写入设备。 write_byte_data(i2c_addr,register,value,force=None) – 将一个字节写入给定的寄存器。 write_block_data(i2c_addr,register,data,force=None) – 将字节数据块写入给定寄存器。 write_i2c_block_data(i2c_addr,register,data,force=None) – 将字节数据块写入给定寄存器。 write_word_data(i2c_addr,register,value,force=None)– 将一个字节写入给定的寄存器。 write_quick(i2c_addr,force=None) – 执行快速事务。如果不成功,抛出 IOError。
以下方法可用于管理 SMBus 进程和组合 I2C 总线读/写操作:
process_call(i2c_addr,register,value,force=None) – 执行 SMBus 进程调用,发送 16 位值并接收 16- bit response block_process_call(i2c_addr,register,data,force=None) – 发送一个可变大小的数据块并接收另一个可变大小的响应。 i2c_rdwr(*i2c_msgs) – 在单个事务中组合一系列 i2c 读写操作。
USB使用
USB接口说明
Sunrise x3 Pi 提供一路 USB 接口,通过 USB HUB、硬件开关电路,扩展了一路 USB3.0 Type A(接口 6),2 路 USB3.0 Type A(接口 5),一路 Micro USB 2.0(接口 4)。
接口类型 | 接口序号 | 接口数量 | 接口描述 |
Micro USB2.0 | 接口4 | 1路 | USB Device 模式,用于连接主机实现 ADB、Fastboot、UVC 等功能 |
USB 2.0 Type A | 接口5 | 2路 | USB Host 模式,用于接入 USB 2.0 外设 |
USB 3.0 Type A | 接口6 | 1路 | USB Host 模式,用于接入 USB 3.0 外设 |
开发板通过硬件电路实现 USB 主从模式自动切换,用户无需关心 USB 主从模式,只需按照上表的逻辑连接设备即可。
需要注意的是,开发板禁止同时使用 USB Host、Device 接口,否则会造成功能异常。
U盘挂载
U 盘挂载目录为 /media
sda1 :第一个 U 盘挂载路径
sdb1 :第二个 U 盘挂载路径
sdcard1 :sunrise x3 pi 本身系统盘路径
USB串口转接板
开发板 USB 2.0/3.0 Type A 接口支持 USB 串口转接板功能,可自动检测 USB串口转接板接入并创建设备节点/dev/ttyUSB* 或者 /dev/ttyACM*(星号代表 0 开始的数字)。用户可参考使用串口章节对串口进行使用
USB摄像头
终端输入,查看插入前与插入后的变化,检测摄像头是否被识别到
ls /dev/video*
终端输入,查询摄像头是否工作正常
sudo v4l2-ctl -d /dev/video8 --all
Ubuntu Server 镜像操作
先进行桌面VNC 安装
通过如下命令安装 xfce4 桌面:
sudo apt update sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils
通过以下命令安装 VNC 服务端
sudo apt install tightvncserver
安装完成后,使用如下命令查看 vnc 服务是否已经启动:
ps -ef | grep vnc
正常启动的话,可以看到监听了 5900 端口
通用操作
登陆 VNC 主机,安装 ffmpeg
sudo apt install ffmpeg
连接 USB 摄像头前后,使用以下命令查看当前的 video 设备,确定摄像头的设备号:
ls /dev/video*
输入指令启动摄像
sudo ffplay /dev/video8
资料
官方资料
适用的外围模块
USB扩展模块
SIM/GPS模块
显示屏
- 5inch HDMI LCD (H)
- 7inch HDMI LCD (H)
- 7HP-CAPQLED
- 10.1inch HDMI LCD (E)
- 10.1HP-CAPQLED
- 11.6inch HDMI LCD (H)
- 13.3inch HDMI LCD (H)
- 15.6inch HDMI LCD
- 15.6inch HDMI LCD (H)
- 15.6HP-CAPQLED
摄像头模块
USB接口
CSI接口
500 万像素 OV5647 模组摄像头
- RPi Camera (B)
- RPi Camera (D)
- RPi Camera (E)
- RPi Camera (F)
- RPi Camera (G)
- RPi Camera (H)
- RPi Camera (I)
- RPi Camera (M)
- RPi FPC Camera
- RPi FPC Camera (B)
- RPi IR-CUT Camera
- RPi IR-CUT Camera (B)
- OV5647-70 5MP OIS Camera
800 万像素 IMX219 模组摄像头
- IMX219-77 Camera
- IMX219-77IR Camera
- IMX219-120 Camera
- IMX219-160 Camera
- IMX219-160IR Camera
- IMX219-160 IR-CUT Camera
- IMX219-170 Camera
- IMX219-200 Camera
1230 万像素 IMX477 模组摄像头
epaper模块
目前地平线官方正在对C语言的各种库进行开发、适配,所以目前只支持python程序
使用方法
支持的模块
- 1.54inch e-Paper Module
- 1.54inch e-Paper Module (B)
- 1.54inch e-Paper Module (C)
- 1.64inch e-Paper Module (G)
- 2.13inch e-Paper HAT
- 2.13inch e-Paper HAT (B)
- 2.13inch e-Paper HAT (C)
- 2.13inch e-Paper HAT (D)
- 2.66inch e-Paper Module
- 2.66inch e-Paper Module (B)
- 2.7inch e-Paper HAT
- 2.7inch e-Paper HAT (B)
- 2.9inch e-Paper Module
- 2.9inch e-Paper Module (B)
- 2.9inch e-Paper Module (C)
- 2.9inch e-Paper HAT (D)
- 3inch e-Paper Module (G)
- 3.52inch e-Paper HAT
- 3.7inch e-Paper HAT
- 4.01inch e-Paper HAT (F)
- 4.2inch e-Paper Module
- 4.2inch e-Paper Module (B)
- 4.2inch e-Paper Module (C)
- 5.65inch e-Paper Module (F)
- 5.83inch e-Paper HAT
- 5.83inch e-Paper HAT (B)
- 5.83inch e-Paper HAT (C)
- 7.3inch e-Paper HAT (G)
- 7.5inch e-Paper HAT
- 7.5inch e-Paper HAT (B)
- 7.5inch e-Paper HAT (C)
- 7.5inch HD e-Paper HAT
- 7.5inch HD e-Paper HAT (B)
- 13.3inch e-Paper HAT (K)
电机、继电器与传感器
目前地平线官方正在对C语言的各种库进行开发、适配,所以目前只支持python程序
使用方法
支持的模块
音频模块
软件
示例程序
FAQ
- -25°C ~ 95°C (X3M 芯片温度)。
- sunrise。
- 支持做目标跟踪, yolov5支持。 deepsort需要跟地平线官方确认。
- 支持pytorch,跑模型要做转换的,具体转换操作,可以参考地平线官方的文档。
- UPS的插针的可以,其他不行。
- 支持多人,30FPS。
- 没固态接口,不能接固态。
- 没有的,目前主板没有引出PoE接口,不适用PoE模块。
技术支持
联系人:张工
邮箱:3004637648@qq.com
QQ:3004637648
微信:扫下方二维码添加