OpenHarmony开源社区
直播中

HonestQiao

8年用户 520经验值
擅长:嵌入式技术
私信 关注
[经验]

【ROC-RK3568-PC开发板试用体验】RS485应用与OLED显示

在ROC-RK3568-PC开发板上,有一个专门的RJ45控制接口,提供一个RS485和两个RS232。
我手头上,刚好有RS485的设备,所以正好可以测试一下。

先来张全家福:image.png

我的RS485设备,是一个读卡器,读到卡以后,会通过RS485发送卡号信息,卡拿开后,也会发送卡离开的信息。

根据官方的接收,ROC-RK3568-PC开发板的RS485所在控制接口位置如下:
image.png

具体的线序,可以参考下图:
image.png

这个RJ45控制接口的连接线和接头,需要在官方购买,所以我专门下单,购买了一个。就是图中,一头为RJ45接口,另一头为黑绿接口的连接线和接头。

为了方便呈现效果,我还连接了一个SSD1306的OLED显示屏,用于读卡信息的呈现。该OLED使用I2C接口,具体接线参考下图:
image.png

旁边还有一个带有小屏幕的黑块块,那是一个数控电源,给读卡器提供5V供电。

本次实验,所使用的操作系统为Ubuntu,根据官方SDK和系统编译指导进行:2. 编译 Ubuntu 固件 — Firefly Wiki (t-firefly.com)

所以以下的操作,均在ROC-RK3568-PC开发板的Ubuntu系统中进行。

首先,要安装基本的工具和模块:

sudo apt-get install python-is-python3 python3-dev python3-pip libfreetype6-dev libjpeg-dev build-essential
sudo apt-get -y install python3-serial
sudo -H pip install --upgrade luma.oled
sudo apt-get -y install i2c-tools
sudo apt-get -y install minicom

其中:

  • python3-serial:python串口模块
  • luma.oled:python操控OLED模块
  • i2c-tools:i2c工具
  • minicom:串口终端工具

接好线以后,先检测了一下i2c设备:

i2cdetect -l
i2cdetect -r -y 1

iShot_2022-10-27_23.10.14.png

从上图中,可以看到,地址为0x3c的设备已经找到,就是OLED了。

然后,再测试一下RS485的数据。
根据官方资料,RS485挂接设备点为/dev/ttyS4:
image.png

而我的RS485设备,发送的是16进制的数据,所以使用如下的命令,进行测试:

minicom -b 9600 -D /dev/ttyS4 -H

上述指令,表示波特率为9600,设备为/dev/ttyS4 ,-H表示打开HEX显示。

具体测试如下:

iShot_2022-10-27_23.33.31.png

以上为放上卡,以及拿开卡,所收到的HEX数据。

现在,可以正常收到RS485设备的数据了,也可以找到OLED的I2C设备了,就可以正式编程了。

我的示例程序,使用Python,具体如下:

# -*- coding: UTF-8 -*-
import serial
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306

# 创建 IIC 设备
oled = i2c(port=1, address=0x3C)

# 创建屏幕的驱动实例
device = ssd1306(oled)

with canvas(device) as draw:
    draw.rectangle(device.bounding_box, outline="white", fill="black")
    draw.text((30, 30), "RS485 Demo", fill="white")

RS485 = serial.Serial(
    port='/dev/ttyS4',
    baudrate = 9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1
)

index =0 
index_max = 99
data_type = 9
data = []
while True:
    x = RS485.read()
    if len(x)>0:
        index = index + 1
        data.append(x.hex())

    if len(data)==4:
        data_type = 1 if x[0] == 0x0b else 0
        index_max = x[0] + 4

    if index>=index_max:
        # print(data)
        print(data[4:-1])
        with canvas(device) as draw:
            draw.rectangle(device.bounding_box, outline="white", fill="black")
            if data_type == 1:
                card_info = data[7:-1]
                draw.text((30, 5), "Card Info", fill="white")
                draw.text((3, 30), "-".join(card_info), fill="white")
            elif data_type == 0:
                draw.text((30, 5), "Card Status", fill="white")
                draw.text((50, 30), "Leave", fill="white")
        index = 0
        index_max = 99
        data_type = 9
        data = []

上述代码的逻辑如下:

  • 初始化OLED
  • 初始化RS485
  • 读取数据,根据第4个字节判断类型:0x0b-放上卡,0x04-离开卡
  • 根据类型,读取所需的数据,然后将对应的状态,显示到OLED上。

将代码保存到rs485_oled.py,然后执行:

python rs485_oled.py

具体执行结果如下:

iShot_2022-10-27_23.09.54.png

实物测试情况,如下:
image.png

image.png

测试过程,可以查看视频:

RS485+OLED实例

更多回帖

发帖
×
20
完善资料,
赚取积分