Firefly开源社区

打印 上一主题 下一主题

[技术讨论] 【ROC-RK3568-PC开发板试用体验】RS485应用与OLED显示

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

发表于 2022-10-28 14:53:08      浏览:4416 | 回复:0        打印      只看该作者   [复制链接] 楼主
本帖最后由 Firefly搬运工 于 2022-10-28 14:53 编辑

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

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

先来张全家福:

我的RS485设备,是一个读卡器,读到卡以后,会通过RS485发送卡号信息,卡拿开后,也会发送卡离开的信息。
根据官方的介绍,ROC-RK3568-PC开发板的RS485所在控制接口位置如下:

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

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

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

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

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

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

首先,要安装基本的工具和模块:
  1. sudo apt-get install python-is-python3 python3-dev python3-pip libfreetype6-dev libjpeg-dev build-essential
  2. sudo apt-get -y install python3-serial
  3. sudo -H pip install --upgrade luma.oled
  4. sudo apt-get -y install i2c-tools
  5. sudo apt-get -y install minicom
复制代码

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

接好线以后,先检测了一下i2c设备:
  1. i2cdetect -l
  2. i2cdetect -r -y 1
复制代码



从上图中,可以看到,地址为0x3c的设备已经找到,就是OLED了。
然后,再测试一下RS485的数据。

根据官方资料,RS485挂接设备点为/dev/ttyS4:

而我的RS485设备,发送的是16进制的数据,所以使用如下的命令,进行测试:
  1. minicom -b 9600 -D /dev/ttyS4 -H
复制代码

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

具体测试如下:

以上为放上卡,以及拿开卡,所收到的HEX数据。
现在,可以正常收到RS485设备的数据了,也可以找到OLED的I2C设备了,就可以正式编程了。

我的示例程序,使用Python,具体如下:
  1. # -*- coding: UTF-8 -*-
  2. import serial
  3. from luma.core.interface.serial import i2c, spi
  4. from luma.core.render import canvas
  5. from luma.oled.device import ssd1306

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

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

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

  13. RS485 = serial.Serial(
  14.     port='/dev/ttyS4',
  15.     baudrate = 9600,
  16.     parity=serial.PARITY_NONE,
  17.     stopbits=serial.STOPBITS_ONE,
  18.     bytesize=serial.EIGHTBITS,
  19.     timeout=1
  20. )

  21. index =0
  22. index_max = 99
  23. data_type = 9
  24. data = []
  25. while True:
  26.     x = RS485.read()
  27.     if len(x)>0:
  28.         index = index + 1
  29.         data.append(x.hex())

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

  33.     if index>=index_max:
  34.         # print(data)
  35.         print(data[4:-1])
  36.         with canvas(device) as draw:
  37.             draw.rectangle(device.bounding_box, outline="white", fill="black")
  38.             if data_type == 1:
  39.                 card_info = data[7:-1]
  40.                 draw.text((30, 5), "Card Info", fill="white")
  41.                 draw.text((3, 30), "-".join(card_info), fill="white")
  42.             elif data_type == 0:
  43.                 draw.text((30, 5), "Card Status", fill="white")
  44.                 draw.text((50, 30), "Leave", fill="white")
  45.         index = 0
  46.         index_max = 99
  47.         data_type = 9
  48.         data = []
复制代码

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


将代码保存到rs485_oled.py,然后执行:
  1. python rs485_oled.py
复制代码

具体执行结果如下:

实物测试情况,如下:




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表