1. 简介
这是一款专为树莓派设计的双通道RS485接口扩展板,可以实现RS485数据同时收发的操作。采用隔离收发模块实现485信号隔离,增强单路485数据传输的可靠性和抗干扰性。具有防雷防浪涌、抗瞬态电压冲击和电源隔离的电路设计特性,可以有效保护树莓派主板。扩展板使用配套的铜柱与螺丝可以非常牢固的固定在树莓派上。
2. 产品特点
- 双通道RS485
- TX、RX数据收发指示灯
- 防雷击、防浪涌
- 电源隔离
3. 产品参数
- 工作电压: 3.3V
- 485收发器: TP75176E
- 串口芯片:CH432T
- RS485通信接口:× 2
- 120欧终端电阻:× 2
- PWR电源指示灯:红色
- TX信号指示灯:蓝色
- RX信号指示灯:绿色
- RS485接线方式: 3Pin 5.08插拔式接线端子
- 可支持树莓派型号:3B+、4B
- 固定通孔孔径: 2.5mm
- 产品尺寸: 65mmx56mm
4. 产品尺寸图
5. 引脚说明
标号 | 名称 | 功能描述 |
---|---|---|
1 | 树莓派40 Pin 引脚插座 | 直插树莓派40 Pin引脚插针 |
2 | RS485接口 | 485接口,GND、A1、B1、A2、B2分别连接其他485接口的对应端口 |
3 | TX、RX指示灯 | 进行485通讯时对应端口的接收发送指示灯闪烁,TX为蓝色,RX为绿色 |
4 | 120Ω终端电阻 | 在远距离485通信中可能会存在信号乱码,此时需要连通120Ω电阻,正常情况连接NC即可 |
6.通信协议简介
6.1 RS485
典型的串行通信标准之一。
RS485 接口具有良好的抗噪声干扰性,较长的传输距离、多站能力和布线简单等优点,因而在工业上被广泛使用。
RS485 通信协议只定义了传输的电压,阻抗等电气特性,但不对软件协议给予定义。数据信号采用差分传输方式,因此具有抑制共模干扰的能力。总线收发器具有高灵敏度,能检测低至200mV的电压。RS-485用于多点互连时非常方便,可以省掉许多信号线。它使用一对双绞线,将其中一线定义为A,另一线定义为B。通常情况下,A、B之间的正电平在+2~+6V,是逻辑1
状态,负电平在-2V~6V,是逻辑0
状态。其最大传输距离约为1200米,传输速率与传输距离成反比,只有在很短的距离下才能获得最高速率传输。为了消除长距离通信产生的信号反射RS485需要2个终端电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω),终端电阻需接在传输总线的两端。
6.2 ModBus
Modbus 协议是一个 master/slave 架构的协议。除 master 节点外,其他使用 Modbus 协议参与通信的节点都是 slave 节点。每一个 slave 设备都有一个唯一的 485 地址,通过该地址来识别执行命令的设备。Master发送命令时所有Slave设备都会收到命令,但只有485地址与命令中地址一致的Slave设备才会执行和回应指令(地址0例外,指定地址0的指令是广播指令,所有收到指令的设备都会运行,但不回应指令)。所有的 Modbus 命令都包含了校验码,用以确定Master发出、Slave接收到的命令没有被损坏或者丢失。ModBus 命令能指令一个终端设备改变它寄存器的某个值、控制或者读取一个 I/O 端口,以及指挥设备回送一个或者多个其寄存器中的数据。
modbus消息帧组成:
以本教程中使用的RS485激光测距传感器为例进行说明
从机地址 | 功能码 | 寄存器地址高位 | 寄存器地址低位 | 读取长度高位 | 读取长度低位 | CRC校验高位 | CRC校验低位 |
---|---|---|---|---|---|---|---|
0x50 | 0x03 | RegH | RegL | LenH | LenL | CRCH | CRCL |
传感器地址:0x50(默认);
读保持寄存器:0x03;
测量距离的寄存器地址:0x34;
读取长度:1 位;
保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量,并且是可读写的。传感器测量的距离数据就存放在此寄存器中。
7. 前期配置
7.1 安装库
在安装相关库之前,先使用如下命令查看python的版本号
pip -version
- python3以下搭建环境命令如下
sudo pip install pyserial
sudo pip install modbus_tk
- python3搭建环境命令如下
sudo pip3 install pyserial
sudo pip3 install modbus_tk
7.2 开启Uart接口
打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config
选择Interfacing Options -> Serial Port,关闭shell访问,打开硬件串口
然后重启树莓派:
sudo reboot
找到config.txt文件的所在位置
cd /boot
打开/boot/config.txt文件,找到如下语句,如果没有,可手动添加在文件最后。
enable_uart=1
然后输入以下指令保存并退出文件
:wq
对于树莓派3B用户,串口用于蓝牙,需要注释掉:
#dtoverlay=pi3-miniuart-bt
然后重启树莓派:
sudo reboot
将树莓派配置完善后,按照端口说明对设备进行连线即可。
8. 例程演示
硬件准备
- RS485激光测距传感器 x1
- Raspberry Pi 4 Model B - 8GB x1
- 5V电源
连接示意图:
8.1 下载例程
在树莓派终端运行以下两条语句下载例程到树莓派桌面:
cd Desktop
git clone https://gitee.com/DFRobot/DFRobot_CH432T_raspberrypi
在树莓派中输入以下语句找到ch432t_demo.py后双击打开,根据上面提到的modbus消息帧组成修改程序适配本次使用的485激光测距传感器:
cd /home/pi/Desktop/DFRobot_CH432T_raspberrypi/examples/
8.2 修改说明
1.
2.
3.
8.3 修改例程
修改后例程为:
from __future__ import print_function
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
import time
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
from DFRobot_CH432T import * # Import DFRobot_CH432T replace importing serial library
addr_sensor = 0x50
sensor_baudrate = 115200
PORT="CH432T_PORT_2"
ser = DFRobot_CH432T(port=PORT, baudrate=115200, bytesize=8, parity='N', stopbits=1)
def main():
print("This is a demo of how to use a Modbus sensor.")
print("If you want it to work, make sure you have connected your Modbus device and changed the relevant parameters in the demo to those of your device!\r\n")
master = modbus_rtu.RtuMaster(ser)
master.set_timeout(5.0)
master.set_verbose(True)
print("ser.name = ", ser.name)
try:
while True:
ser.baudrate = sensor_baudrate
data = master.execute(addr_sensor, cst.READ_HOLDING_REGISTERS, 0x34, 1)
distance = data[0]/10
print("distance = ", distance)
time.sleep(3)
#ser.baudrate = relay_baudrate
except Exception as err:
print(str(err))
if __name__ == "__main_
修改完成后保存退出,输入以下指令进入配置界面
sudo raspi-config
选择Interface Options -> Serial Port->SPI,启用SPI接口
然后重启树莓派
sudo reboot
在树莓派中输入以下语句找到ch432t_demo.py
cd /home/pi/Desktop/DFRobot_CH432T_raspberrypi/examples/
然后输入以下语句运行程序得到数据
python ch432t_demo.py
运行结果如下图所示:
打印出RS485激光测距传感器读取到的距离,RS485通信成功。
疑难解答
更多问题及有趣的应用,请访问论坛