RP2350-ETH-8DI-8RO 使用教程

说明


产品概述

RP2350-ETH-8DI-8RO 是一款基于 RP2350B 主控,支持 RS485、以太网口等外设接口的工业级 8 路网络继电器。内置电源隔离、光耦隔离等保护电路,安全稳定更可靠。

产品特性

  • 采用 Raspberry Pi 设计的 RP2350B 微控制器芯片
  • 独特的双核、双架构,搭载了双核 ARM Cortex-M33 处理器和双核 Hazard3 RISC-V 处理器,时钟运行频率均高达 150MHz,支持用户在两种架构间灵活切换
  • 内置 520KB 的 SRAM 和 16MB 的片上 Flash
  • 采用 Type-C 接口,无需纠结正反插
  • 采用优质继电器,允许接入负载:≤10A 250V AC 或 ≤10A 30V DC
  • 开关量输入带双向光耦隔离,支持无源和有源开关量输入,继电器支持开关输入联动模式控制
  • 板载隔离型 RS485 接口,方便外扩接入各种 RS485 Modbus 工业扩展模块或传感器
  • 板载排针接口,允许接入其他设备
  • 板载有接线端子供电接口,支持 7~36V 宽电压范围供电,方便工业供电使用
  • 板载 RTC 时钟芯片,支持定时任务
  • 板载 W5500 以太网芯片,通过 SPI 接口扩展 10/100Mbps 网络连接
  • PoE 网口版本支持外接 PoE 模块,实现以太网供电功能 (符合 IEEE 802.3af 标准)
  • 板载光耦隔离,避免继电器外接高压电路干扰控制芯片
  • 板载数字隔离,避免外部信号干扰控制芯片
  • 板载一体式电源隔离,可提供稳定的隔离电压,隔离端无须额外供电
  • 板载 Micro SD 卡槽,可外接 SD 卡存储图片或文件
  • 板载蜂鸣器,RGB 彩灯,以及电源和 RS485 收发指示灯,方便感知设备的运行工作状态
  • 导轨式 ABS 保护外壳,方便安装使用,带外壳更安全
  • USB1.1 主机和从设备支持
  • 支持低功耗睡眠和休眠模式
  • 可通过 USB 识别为大容量存储器进行拖放式下载程序
  • 引出 15 个多功能的 GPIO 引脚
  • 2 个 SPI,2 个 I2C,2 个 UART,8 个 12 位 ADC,以及 12 个可控 PWM 通道
  • 精确的片上时钟和定时器
  • 温度传感器
  • 片上加速浮点库
  • 12 个可编程 I/O (PIO) 状态机,用于自定义外设支持

引脚分布


尺寸图


用电安全注意事项

  • 本产品须由专业的电工或技术人员作业使用,使用过程中请做好用电安全,防漏电和绝缘等保护措施。
  • 在安装、维护或更换继电器设备之前,请务必关闭电源并拔下插头。
  • 请勿试图拆卸继电器设备,以免损坏设备或导致电击危险。
  • 请妥善安装放置继电器设备产品,请勿在潮湿、过热、易燃坏境中使用,避免因安装或使用不慎,引发安全事故。

Pico快速上手

固件下载


MicroPython固件下载



C_Blink固件下载


基础介绍

Raspberry Pi Pico的基础介绍

MicroPython系列

安装Thonny IDE

为了方便在电脑上使用MicroPython开发Pico/Pico2板,建议下载Thonny IDE


  • 配置Micrpython环境及选择Pico/Pico2端口
    • 先将Pico/Pico2接入电脑,左键点击Thonny右下角的配置环境选项--》选择configture interpreter
    • 在弹出的窗口栏中选择MicroPython(Raspberry Pi Pico),同时选择对应的端口



烧录固件

  • 点击ok后返回到Thonny主界面,下载对应的固件库并烧录到设备中,然后点击停止按钮,在Shell窗口中即可显示当前使用到的环境
  • 注意:烧录Micropython官方提供的Pico2固件可能导致无法识别设备,请使用下方或程序包中的固件
  • Pico/Pico2在windows下载固件库方法: 按住BOOT键后连接电脑后,松开BOOT键,电脑会出现一个可移动磁盘,将固件库复制进去即可
  • RP2040/RP2350在windows下载固件库方法: 连接电脑后,同时按下BOOT键跟RESET键,先松开RESET键再松开BOOT键,电脑会出现一个可移动磁盘,将固件库复制进去即可(用Pico/Pico2的方式也可以)


讲解视频

【MicroPython】machine.Pin类函数详解
【MicroPython】machine.PWM类函数详解
【MicroPython】machine.ADC类函数详解
【MicroPython】machine.UART类函数详解
【MicroPython】machine.I2C类函数详解
【MicroPython】machine.SPI类函数详解
【MicroPython】rp2.StateMachine类函数详解

C/C++系列

对于 C/C++,建议使用 Pico VSCode 进行开发,这是一款 Microsoft Visual Studio Code 扩展,旨在让您在为 Raspberry Pi Pico 系列开发板创建、开发和调试项目时更加轻松。无论您是初学者还是经验丰富的专业人士,此工具都可以帮助您自信而轻松地进行 Pico 开发。下面我们介绍如何安装该扩展并使用。

安装VSCode

  1. 首先,点击下载 pico-vscode 程序包,解压并打开程序包,双击安装 VSCode

    注意:如果已安装 vscode 注意检查版本是否为 v1.87.0 或更高版本


安装扩展

  1. 点击扩展,选择从 VSIX 安装

  2. 选择 vsix 后缀的软件包,点击安装

  3. 随后 vscode 会自动安装 raspberry-pi-pico 及其依赖扩展,可以点击刷新查看安装进度

  4. 右下角显示完成安装,关闭 vscode

配置扩展

  1. 打开目录 C:\Users\用户名,将整个 .pico-sdk 拷贝至该目录

  2. 拷贝完成

  3. 打开 vscode,对 Raspberry Pi Pico 扩展中各个路径进行配置

    配置如下:
    Cmake Path:
    ${HOME}/.pico-sdk/cmake/v3.28.6/bin/cmake.exe
    
    Git Path:
    ${HOME}/.pico-sdk/git/cmd/git.exe    
    
    Ninja Path:
    ${HOME}/.pico-sdk/ninja/v1.12.1/ninja.exe
    
    Python3 Path:
    ${HOME}/.pico-sdk/python/3.12.1/python.exe             
    

新建工程

  1. 配置完成,测试新建工程,输入工程名、选择路径后点击 Creat 创建工程
    测试官方示例,可以点击工程名旁的 Example 进行选择

  2. 创建工程成功

编译工程

  1. 选择SDK版本

  2. 选择 Yes 进行高级配置

  3. 选择交叉编译链,13.2.Rel1 适用 ARM 核,RISCV.13.3 适用 RISCV 核,这里根据您的需求任意选择其中一个即可

  4. CMake 版本选择 Default(前面配置的路径)

  5. Ninja 版本选择 Default

  6. 选择开发板

  7. 点击 Complie 进行编译

  8. 成功编译出 uf2 格式文件即可

烧录固件

这里提供两种方法烧录固件

  1. 使用pico-vscode插件烧录固件
    将开发板连接到电脑上,点击Run直接烧录固件

  2. 手动烧录固件
    1.按住Boot按键
    2.将开发板连接到电脑上     
    3.然后会电脑会将开发板识别成一个U盘设备
    4.将.uf2文件复制到U盘中,设备就会自动重启,程序烧录成功
    

导入工程

  1. 选择工程目录,导入工程

  2. 导入工程的 Cmake 文件不能有中文(包括注释),否则可能导致导入失败
  3. 导入自己的工程需要在 Cmake 文件中加一行代码,才能正常切换 pico 和 pico2,否则即使选择 pico2,编译得到的固件仍是适用于 pico 的

    set(PICO_BOARD pico CACHE STRING "Board type")
    

更新扩展

  1. 离线包中的扩展版本为0.15.2,安装完成后,您也可以选择更新至最新版本

Arduino IDE 系列

安装Arduino IDE

  1. 首先到Arduino官网下载Arduino IDE的安装包。

  2. 这里选择仅下载就可以了。

  3. 下载完成后,点击安装。

    注意:安装过程中会提示你安装驱动,我们点击安装即可

Arduino IDE中文界面

  1. 第一次安装完成后,打开Arduino IDE全是英文界面,我们可以在File>Preferences切换成简体中文。

  2. 在Language里面选择简体中文,点击OK。

在Arduino IDE中安装Arduino-Pico Core

  1. 打开Arduino IDE,点击左上角的文件,选择首选项

  2. 在附加开发板管理器网址中添加如下链接,然后点击OK
    该链接已包含RP2040、RP2350等版型,最新版型文件请访问arduino-pico获取
    https://github.com/earlephilhower/arduino-pico/releases/download/4.5.2/package_rp2040_index.json


    注意:如果您已经有ESP32板URL,您可以使用逗号分隔 URL,如下所示:

    https://dl.espressif.com/dl/package_esp32_index.json,https://github.com/earlephilhower/arduino-pico/releases/download/4.5.2/package_rp2040_index.json
  3. 点击工具>开发板>开发板管理器>搜索pico,由于我的电脑已经安装过了,所以显示已安装


国内用户
  • 因为网络原因,国内用户连接github并不稳定,我们另外提供了一份安装包,可以跳过在线的过程
  • 安装包适用于RP2040、RP2350
  • 若已经成功配置了pico环境,可以直接跳过本章
  1. 下载rp2040压缩包,将解压的rp2040文件夹复制到如下路径下
    C:\Users\[username]\AppData\Local\Arduino15\packages


    注意:将里面用户名:[username]替换成自己的用户名

第一次上传程序

  1. 按住Pico板上的BOOTSET按键,将pico通过Micro USB线接到电脑的USB接口,待电脑识别出一个可移动硬盘(RPI-RP2)后,松开按键。

  2. 下载程序,打开arduino\PWM\D1-LED路径下的D1-LED.ino
  3. 点击工具>端口,记住已有的COM,不需要点击这个COM(不同电脑显示的COM不一样,记住自己电脑上已有的COM)

  4. 用USB线将驱动板和计算机连接起来,再点击工具>端口,第一次连接选择uf2 Board,上传完成后,再次连接就会多出一个COM口

  5. 点击工具>开发板>Raspberry Pi Pico>对应版型(Raspberry Pi Pico、Raspberry Pi Pico 2等)


  6. 设置完成后,点击向右箭头将上传程序

  • 如果期间遇到了问题,需要重新安装或者更换Arduino IDE版本时,卸载Arduino IDE需要卸载干净,卸载软件后需要手动删除C:\Users\[name]\AppData\Local\Arduino15这个文件夹内的所有内容(需要显示隐藏文件才能看到) 再重新安装

开源例程

MircoPython视频例程(github)
MicroPython固件/Blink例程(C)
树莓派官方C/C++示例程序 (github)
树莓派官方micropython示例程序 (github)
Arduino官方C/C++示例程序 (github)


示例程序

C/C++例程

01_RS485

【程序说明】


  • 本示例实现了通过 RS485 和 8DI数字输入口控制 8 个继电器的开关

【代码分析】


  • Relay_Control():该函数主要根据通过参数传递的数组下标,执行相应的继电器控制操作以及输出相应的状态提示信息
    • 参数分析
      • uint8_t index:在main函数中,程序会解析接收到 RS485 数据,并与预设的控制命令数组进行匹配。当找到匹配项时,会调用Relay_Control函数,并通过index参数传递匹配命令在数组中的下标位置
    • 逻辑流程
      • 通过if else语句根据index的值来执行不同的操作:
        • 对于index < 8的情况,即对于CH1~CH6指令,通过DEV_Digital_Write函数来切换对应的 GPIO 引脚(如RELAY1_PIN等)的电平状态,同时更新对应的relay_status数组元素来记录继电器状态的改变,并且根据继电器的最终状态输出相应的开启或关闭提示信息,最后在main函数中调用Beep函数控制蜂鸣器。
        • 对于index = 8的情况,即对于ALL_ON指令,将所有的 GPIO 引脚(对应 8 个通道继电器)设置为高电平(开启状态),通过memset函数将relay_status数组所有元素设置为 1,表示全部继电器开启,输出全部继电器开启提示信息,最后在main函数中调用Beep函数控制蜂鸣器。
        • 对于index = 9的情况,即对于ALL_OFF指令,将所有的 GPIO 引脚(对应 8 个通道继电器)设置为低电平(关闭状态),通过memset函数将relay_status数组所有元素设置为 0,表示全部继电器关闭,输出全部继电器关闭提示信息,最后在main函数中调用Beep函数控制蜂鸣器。
        • 如果index 的值不属于上述指令情况,则输出接收到非指令数据的提示信息
  • gpio_irq_handler():该函数通过IO中断方式,实现控制继电器开关,数字接口DI1~DI8对应继电器CH1~CH8。例如,当数字接口DI1为低电平时,继电器CH1打开,当数字接口DI1为高电平时,对应继电器CH1关闭

02_MQTT

【程序说明】


  • 本示例通过以太网接口实现网络连接,并通过 MQTT 通信协议实现远程控制 8 个继电器

【注意事项】


  • 需在 Waveshare 云中创建设备
  • 需修改程序中的 MQTT 相关参数

【代码分析】


  • 函数说明
    • ConnectNetwork():通过以太网口连接网络
    • MQTTClientInit():MQTT 初始化
    • MQTTConnect():连接 MQTT 服务器
    • MQTTSubscribe():订阅 MQTT 主题
    • MQTTPublish():发布 MQTT 消息
  • 参数说明
    • MQTT参数
      • MQTT_CLIENT_ID:客户端 ID
      • MQTT_USERNAME:用户名
      • MQTT_PASSWORD:密码
      • MQTT_SUBSCRIBE_TOPIC:订阅主题名称
      • MQTT_PUBLISH_TOPIC:发布主题名称
    • 网络连接参数
      • g_net_info.mac:MAC 地址
      • g_net_info.ip:IP地址
      • g_net_info.sn:子网掩码
      • g_net_info.gw:网关
      • g_net_info.dns:DNS 服务器
  • 逻辑流程
    • 设备初始化:初始化 MQTT 和以太网口的 SPI 接口,调用ConnectNetwork()MQTTConnect()连接网络和 MQTT 服务器,调用MQTTSubscribe()订阅 MQTT 主题
    • 控制继电器开关:在主循环中等待 MQTT 消息,当判断接收的 MQTT 消息g_mqtt_client.msg.payload不为空时,解析 MQTT 消息并控制相应继电器开关
    • 发送继电器状态:为了从服务端判断继电器开关操作是否成功,开发板在控制继电器开关后,会调用MQTTPublish()向服务端发送继电器最新状态

【Waveshare云控制】


MicroPython例程

01_RS485

【程序说明】


  • 本示例实现了通过 RS485 和 8DI数字输入口控制 8 个继电器的开关

【代码分析】


  • relay_control():该函数主要根据通过参数传递的数组下标,执行相应的继电器控制操作以及输出相应的状态提示信息
    • 参数分析
      • index:在main函数中,程序会解析接收到 RS485 数据,并与预设的控制命令数组进行匹配。当找到匹配项时,会调用relay_control函数,并通过index参数传递匹配命令在数组中的下标位置
    • 逻辑流程
      • 通过if else语句根据index的值来执行不同的操作:
        • 对于index < 8的情况,即对于CH1~CH6指令,通过relays[index].value函数来切换对应的 GPIO 引脚的电平状态,同时更新对应的relay_status数组元素来记录继电器状态的改变,并且根据继电器的最终状态输出相应的开启或关闭提示信息,最后再调用beep函数控制蜂鸣器。
        • 对于index = 8的情况,即对于ALL_ON指令,将所有的 GPIO 引脚(对应 8 个通道继电器)设置为高电平(开启状态),通过for循环将relay_status数组所有元素设置为 1,表示全部继电器开启,输出全部继电器开启提示信息,最后再调用beep函数控制蜂鸣器。
        • 对于index = 9的情况,即对于ALL_OFF指令,将所有的 GPIO 引脚(对应 8 个通道继电器)设置为低电平(关闭状态),通过for循环将relay_status数组所有元素设置为 0,表示全部继电器关闭,输出全部继电器关闭提示信息,最后再调用beep函数控制蜂鸣器。
        • 如果index 的值不属于上述指令情况,则输出接收到非指令数据的提示信息
  • gpio_irq_handler():该函数通过IO中断方式,实现控制继电器开关,数字接口DI1~DI8对应继电器CH1~CH8。例如,当数字接口DI1为低电平时,继电器CH1打开,当数字接口DI1为高电平时,对应继电器CH1关闭

02_MQTT

【程序说明】


  • 本示例通过以太网接口实现网络连接,并通过 MQTT 通信协议实现远程控制 8 个继电器

【注意事项】


  • 需在 Waveshare 云中创建设备
  • 需修改程序中的 MQTT 相关参数

【代码分析】


  • 函数说明
    • ethernet_init():通过以太网口连接网络
    • mqtt_connect():连接 MQTT 服务器
    • mqtt_subscribe():订阅 MQTT 主题
    • mqtt_publish():发布 MQTT 消息
  • 参数说明
    • MQTT参数
      • MQTT_SERVER:服务端 IP
      • MQTT_PORT:服务端端口号
      • MQTT_CLIENT_ID:客户端 ID
      • MQTT_USERNAME:用户名
      • MQTT_PASSWORD:密码
      • MQTT_SUBSCRIBE_TOPIC:订阅主题名称
      • MQTT_PUBLISH_TOPIC:发布主题名称
  • 逻辑流程
    • 设备初始化:初始化 W5500 和 MQTT,调用ethernet_init()mqtt_connect()连接网络和 MQTT 服务器,调用mqtt_subscribe()订阅 MQTT 主题
    • 控制继电器开关:通过client.set_callback()设置 MQTT 接收回调函数,在主循环中等待 MQTT 消息,当判断接收的 MQTT 消息后调用mqtt_recv_callback(),解析 MQTT 消息并控制相应继电器开关
    • 发送继电器状态:为了从服务端判断继电器开关操作是否成功,开发板在控制继电器开关后,会调用mqtt_publish()向服务端发送继电器最新状态

【Waveshare云控制】


外部扩展

折叠

RS485 扩展继电器路数

  • 使用 Modbus RTU Relay 扩展 6 路继电器
  • 将 Modbus RTU Relay 连接至 RP2350-ETH-8DI-8RO RS485 接口
  • 示例将逐一开启 Modbus-RTU-Relay 的 CH1~CH6,再逐一关闭

资料

配套资料

示例程序

原理图

数据手册

官方资料

树莓派官方文档

树莓派开源例程

开发软件


FAQ

问题:Raspberry Pi Pico 2 GPIO配置为下拉输入,引脚悬空时,为什么读取IO为高电平?

可以参考RP2350-datasheet中RP2350-E9部分内容


问题:使用RS485控制其他设备时不灵敏、或通信不上?

请将跳线帽移至 120R 再次尝试,部分 RS485 设备需要串入 120R 电阻


技术支持

周一-周五(9:30-6:30)周六(9:30-5:30)

手机:13434470212

邮箱:services04@spotpear.cn

QQ:202004841