# pic-o_link **Repository Path**: sdju123/pic-o_link ## Basic Information - **Project Name**: pic-o_link - **Description**: 基于esp32的多协议转WiFi模块 - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2022-05-17 - **Last Updated**: 2022-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于ESP32的多协议转WiFi模块 > 本项目为基于乐鑫公司的 ESP32-pico-d4 芯片制作的无线模块,具有多个通信协议接口:UART、SPI。设计初衷是为了方便智能车比赛的摄像头算法调试,通过和上位机配合降低调试难度 > > esp32 硬件支持 5Mbps UART 和 10Mbps SPI slave 由于芯片名称里有一个 pico 单词而且本项目和图像有关,所以将该模块取名为 Pic-o Link 该模块的一大特点是可以兼容逐飞的无线串口接口,具有硬件流控功能,并且可以直接使用逐飞的无线串口驱动实现单向通信,免去了车友们测试该模块需要重新制板的需要,**目前仅支持单向发送到上位机** 本项目还处于雏形,代码硬件还比较粗糙,欢迎各位大佬来交流和提出改进意见,本人QQ:1626632460 开源智能车图传上位机可以使用另一位大佬的 https://gitee.com/zhou-wenqi/ipc-for-car.git 没有精力自制可直接购买成品,Pic-o Link 成品已上架淘宝:https://m.tb.cn/h.fKasoOm?tk=pqB52h37KoX **PCB 仿真如下** | 类别 | UART+SPI | | :----------: | :----------------------------------------------------------: | | 3D仿真图 | image-20220313214931448 | | 焊接效果 | ![IMG_20220329_100642](image/IMG_20220329_100642.jpg) | | 立创开源链接 | https://oshwhub.com/Wander_er/891fe1d235694ef7afe684f5a2f05b73 | **目录结构** - `doc` 文档 - `firmware` Pic-o Link 固件及单片机使用例程 - `Pic-o_Link` Pic-o Link 固件 - `RT1064 `RT1064 使用例程 - `hardware` Pic-o Link 的硬件文件 - `software` 上位机软件 - `monitor_python` python 上位机脚本 - `image`图片 ## 硬件(立创EDA-专业版) - 基于 esp32-pico-d4 - spi 接口 - uart 接口 - 一个复位按键 - 一个下载按键 - 电源指示灯 - rgb 三色灯 - 5V 电源输入,3.3V 电源稳压 ## 固件(基于 ESP-IDF 框架) **两种通信模式** - **UART** 波特率最大5Mbps,**一次最多接收20000字节** 使用串口轮询从缓冲区中提取接收数据,有两个参数,分别是接收缓冲区大小和最长等待时间,当接收的字节数达到缓冲区大小时立即视为完成一次接收;发送完毕但没有达到接收缓冲区大小时,则等待最长等待时间再视作完成一次传输,这个等待时间是固定的20ms 所以可以视作具有两种模式,通过在固件中修改 `uart_read_bytes`() 函数的 `length` 参数切换 - **透传模式**:指传输数据没有固定的字节数限制,每次通信可以传输各种大小的数据,更加灵活 使用透传模式建议发送间隔大于 `串口传输时间` + `20ms` + `udp传输时间(速率按30Mbps算)` `length` 参数为缓冲区大小 `RX_BUF_SIZE-1` 时为透传模式,即假设没有数据会达到这个长度 - **固定字节模式**:指传输数据有固定的字节数限制,速度比透传模式更快,但只能传输固定大小的数据 使用固定字节模式建议发送间隔大于 `串口传输时间` + `udp传输时间(速率按30Mbps算)` `length` 参数为要发送的固定数据的字节数时为固定字节,例如传输 60 x 90 灰度图时为 5400 > 当然,发送低于这个长度的数据时也可视作为透传模式 - **SPI** 波特率最大10Mbps,**一次最多接收25000字节** - 只支持4字节倍数长度的数据接收,SPI 模式为3 - 建议发送间隔大于 `SPI传输时间` + `udp传输时间(速率按30Mbps算)` **固件集成了 UART 和 SPI 两种通信模式,可以通过串口通信协议配置参数写进Flash里,掉电不丢失,免去了反复修改固件的需要** ## 常见问题 **和下位机如何连线?** - **UART** | Pic-o Link | 下位机 | | :-------------: | :----------------------------------------------------------: | | RXD | TXD | | TXD | RXD | | RTS (复用 MOSI) | CTS(没有的话影响不大,但是要在下位机串口传输函数里禁掉流控检测) | - **SPI** | Pic-o Link | 下位机 | | :--------: | :----: | | CLK | CLK | | MISO | MISO | | MOSI | MOSI | | CS | CS | - **5V 供电,地线必接** **如何计算传完一张图像所用的时间?** 以 UART 3Mbps 传输 60 x 90 灰度图为例,首先计算图像的位数:60 x 90 x 8 = 43200 bits,再用位数除以波特率:43200 / 3000000 = 0.0144 s = 14.4 ms **如何进入和使用配置模式?** 电脑使用 USB 转 TTL 串口助手连接 `Pic-o Link`,短接 `MOSI` 和 `CS` 引脚再复位,**rgb 指示灯显示黄色**代表进入配置模式,此时可以通过串口配置 Pic-o Link 参数,**波特率115200**,协议见表格 | 类别 | 备注 | 帧头 | 长度 | | :--------------------------: | :------------------------------: | :------: | :----: | | 通信协议选择 | 8位无符号整形,0 : UART, 1 : SPI | 0x41 (A) | 1字节 | | UART 通信模式波特率 | 32位无符号整形,<=5000000 | 0x42 (B) | 4字节 | | UART 通信模式接收缓冲字节数 | 16位无符号整形,<=20000 | 0x43 (C) | 2字节 | | WiFi 账号 | 字符串,最长32字节 | 0x44 (D) | 32字节 | | WiFi 密码 | 字符串,最长64字节 | 0x45 (E) | 64字节 | | UDP Server ip地址 | 字符串,最长16字节 | 0x46 (F) | 16字节 | | UDP Server 端口 | 16位无符号整形,<= 65535 | 0x47 (G) | 2字节 | | 读取模块参数 | 单指令 | 0x48 (H) | 无 | | 将模块内存中的参数写入 Flash | 单指令 | 0x49 (I) | 无 | **具体配置哪个 IP 地址?** 以下两种情形指示了 Pic-o Link 配置的 IP 地址参数: ![使用情形](image/使用情形.png) **如何打开固件工程?** - 安装 **VS code** 的 **Platform IO** 插件,然后右键 `Pic-o Link` 文件夹选择 `通过 Code 打开`,**打开后等待一段时间,插件会自动安装好依赖和编译工具链** ![image-20220419130240555](image/image-20220419130240555.png) **如何进入下载模式烧录固件?** - 电脑使用 USB 转 TTL 串口助手连接 `Pic-o Link` ,按住 Pic-o Link `DOWNLOAD` 键不放再按一下 `RESET` 键,**rgb 灯不亮即进入了下载模式**,可以点击 Platform IO 底部的下载按键一键编译下载,下载完毕后一定要记得按 `RESET` 键 ![下载前操作](image/下载前操作.gif) ![image-20220419130424740](image/image-20220419130424740.png) **如何修改模块的主机名?** - 修改 `sdkconfig.pico32` 文件的 `CONFIG_LWIP_LOCAL_HOSTNAME` 项再重新编译烧录固件 **模块支持的WiFI频率?** - 仅支持2.4GHz **接口及PCB绘制要求**? - 接口:2.54mm 2x4p 排母 - 5V 电源至少要保证 500mA 的输出电流 UART 模式以 TC264 为例(参考逐飞无线串口接口原理图,可直接照搬,注意相比一般的 UART 接口额外需要一个流控引脚,可以模仿逐飞无线串口发送驱动用一个 GPIO 作为输入模式来模拟) ![image-20220419132729475](image/image-20220419132729475.png) ## 工作流程 1. 上电 2. nvs flash 初始化 3. 加载 Flash 配置参数 4. 检测是否进入配置模式 5. 根据配置参数进入通信模式 6. 设置为 WiFi STA 模式 7. WiFI 硬件初始化成功开始扫描 WiFi,指示灯显示当前状态 -> **红** 8. WiFi 连接成功,指示灯显示当前状态 -> **绿**(会闪的很快,立即进入9) 9. 设置为 udp client 模式,指示灯显示当前状态 -> **蓝** 10. 等待下位机传输数据,指示灯显示当前状态 -> **白** 11. 下位机传输完数据,模块开始通过 WiFi udp 向上位机 udp server 发送数据 12. 回到 10 ## 软件 简易的 python 脚本 - 串口发送测试 - 接收图像显示 ## 测试1 **UART** 1.5Mbps 透传模式 > 由于电脑串口助手没有引出硬件流控引脚,所以在串口在发送大量数据时可能会丢失,固定字节模式固定的字节数可能达不到引发错误,所以电脑测试统一使用透传模式 使用电脑串口通信,电脑运行脚本 `.\software\monitor_python\serial_sender.py` 通过串口向 `Pic-o Link` 发送视频帧数据(`.\software\monitor_python\example1.mp4`)。为 90 x 60 灰度图,大小5400字节 电脑运行 `.\software\monitor_python\monitor_image.py` 脚本接收图像。 视频见文件 `.\image\测试1.mp4`,接收还原的视频平均帧数16.2帧,,实际串口发送延迟35ms 总共发送4555帧,出现14帧错误。错误率:0.3% ![测试1](image/测试1.png) ## 测试2 **UART** 1.5Mbps 透传模式 使用电脑串口通信,电脑运行脚本 `.\software\monitor_python\serial_sender_color.py` 通过串口向 `Pic-o Link` 发送彩色视频帧数据(`.\software\monitor_python\example2.mp4`)。为 45 x 30 彩色图,大小不固定,平均3500字节。 电脑运行 `.\software\monitor_python\monitor_image_color.py` 脚本接收彩色图像。 视频见文件 `.\image\测试2.mp4`,接收还原的视频平均帧数20帧,实际串口发送延迟23ms ![测试2](image/测试2.png) ## 测试3 **UART** 5Mbps 固定字节模式 使用 RT1064 通信,波特率 5Mbps,RT1064 固件为 `.\firmware\rt1064\UART` 工程。 电脑运行 `.\software\monitor_python\monitor_image.py` 脚本接收图像。 使用摄像头为总钻风摄像头,图像分辨率 90 x 60,摄像头帧数50帧。 RT1064 在主函数中刷新图像后发送采集图像。实际测试上位机平均每20ms收到图像,帧数50帧左右。由于使用硬件流控没有出现图像数据缺失,视频见文件 `.\image\测试3.mp4`,由于是电脑大屏显示,所以 90x60 的图像显得有些模糊。芯片测试得发送一张灰度图用时13ms ![测试3](image/测试3.png) ## 测试4 **SPI** 使用 RT1064 通信,SPI 频率 10Mbps,RT1064 固件为 `.\firmware\rt1064\SPI` 工程。 电脑运行 `.\software\monitor_python\monitor_image.py` 脚本接收图像。 使用摄像头为总钻风摄像头,图像分辨率 90 x 60,摄像头帧数50帧。 RT1064 在主函数中刷新图像后发送采集图像。实际测试上位机平均每21ms收到图像,帧数50帧左右。芯片测试得发送一张灰度图用时4829us,视频见文件 `.\image\测试4.mp4` ![测试4](image/测试4.png) ## 缺陷 - 发热比较严重 - UART 固件透传模式有一个固定的 20ms 延迟 ## 其他资料 乐鑫官方测试的 ESP32 的 udp/tcp 速率: | Type/Throughput | Air In Lab | Shield-box | Test Tool | IDF Version (commit ID) | | -------------------- | ---------- | -------------- | ------------- | ----------------------- | | Raw 802.11 Packet RX | N/A | **130 MBit/s** | Internal tool | NA | | Raw 802.11 Packet TX | N/A | **130 MBit/s** | Internal tool | NA | | UDP RX | 30 MBit/s | 85 MBit/s | iperf example | 15575346 | | UDP TX | 30 MBit/s | 75 MBit/s | iperf example | 15575346 | | TCP RX | 20 MBit/s | 65 MBit/s | iperf example | 15575346 | | TCP TX | 20 MBit/s | 75 MBit/s | iperf example | 1557534 |