这篇文章也发布在我的个人网站上https://swortain.wang
insar-socket是我的第一个产品类的作品,主要的功能是支持Modbus-TCP的插座,可以让你在装置项目中集成一个220的电器,而不需要你懂任何的电子电路知识。
我还写了一写装置软件的库(目前位置仅支持了TouchDesigner)。这样你甚至不需要了解Modbus的相关知识,只需要配网,和软件内部的一些设置即可。
参数
功率:额定功率2000w,长期负载建议不找过1500w。
电压:由于接口采用国标规范,所以无法在国外使用,但是设计上采用100~240V,支持全球通用。
PCB效果图
使用教程
配网
设备第一次链接WiFi时需要进行配网操作,让设备知道需要链接的WiFi的SSID和密码。这个操作如果不更换链接WiFi的名称和密码的情况下,只需要做一次,后面设备每次开机会自动连接最近一次设置的WiFi。
先给设备供电,按钮处红色LED常亮,并且黄色LED缓慢闪烁,此时可以搜索到一个「insar_config_」开头的wifi热点。
连接后会自动弹出一个页面(在iphone上通常会自动弹出)或者显示需登录/认证(在我的小米手机上是这样的)点击后弹出页面
点击Configure WiFi
点击要连接的WiFi名称,在密码行填入密码
点击save后设备后自动重启后链接wifi。黄色LED闪烁几次后常亮,表示已经成功连上WiFi
TouchDesigner库
首先电脑要和设备连入同一个wifi。打开insar-socket.toe这个文件,在insar_socket OP的参数里有一个search点击旁边的pulse会自动搜索局域网内所有的设备。
搜索完成后会弹出一个窗口,点击ok后IP Address会列出所有局域网内所有的设备的IP地址。
在左边连入一个CHOP,当里面任意一个channel从0变为非零的时候会打开插座,反之会关闭插座
后台管理界面
在浏览器输入设备的IP地址,可以看到后台的管理界面,可以看到设备ID,固件版本,插座的通断以及可以控制插座的打开和关闭。
基于其他平台实现二次开发
如果你只是想在已有库的软件(比如目前的Touchdesigner)里面使用本设备的话,这一部分是不需要看的,如果你需要集成到其他的环境中,比如单片机(需要设备能联网,比如使用ESP32、ESP8266或者Arduino UNO加Ethernet shield或者STM32加W5100这些)、openFrameworks、Processing(相关库在计划当中)、或者更底层的比如java、python,那么你需要看下面这部分,同时你需要懂一些TCP/IP通讯相关的知识以及Modbus相关的一些概念。
Modbus 通讯协议
设备是基于Mocbus-RTU TCP协议的,也就是说是基于二进制表示数据的方式,所以你需要知道一些指令的含义,关于Modbus-RTU的一些知识可以看我在简书的这里写一些简单的介绍。设备是作为TCP主机的,所以你需要用TCP客户端去连接
Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。
<footer class="blockquote-footer">维基百科 </footer>
{.blockquote}
参数
- 从机地址:01
- 端口号:29779(这里不是默认的Modbus TCP端口,是为了方式搜索设备的时候搜索到网络中其他的Modbus设备)
- 继电器对应的线圈编号:100
- 校验:modbus标准的CRC16校验
控制例程
以下数字均为十六进制
控制线圈
事务处理标识符 | 协议标识符 | 长度 | 从机地址 | 功能码 | 线圈编号 | 数据 | CRC校验码 |
---|---|---|---|---|---|---|---|
00 00 | 00 00 | 00 08 | 01 | 05 | 00 64 | FF' 00 | CD E5 |
{.table}
数据位如果要打开继电器应为FF 00,如果关闭则是00 00
返回数据与发送的是完全相同的
查询线圈状态
发送
事务处理标识符 | 协议标识符 | 长度 | 从机地址 | 功能码 | 线圈编号 | 数据 | CRC校验码 |
---|---|---|---|---|---|---|---|
00 00 | 00 00 | 00 08 | 01 | 01 | 00 64 | 00 01 | BC 15 |
{.table}
其中事务处理标识符理论上可以是任意数字
协议标识符Modbus都是00 00
线圈编号开始线圈的编号,是100的十六进制,小端模式
数据00 01表示读取一个线圈
注意因为设备内只定义了100号线圈,所以查询其他编号比如99开头的两个线圈或者100开头的2个线圈都会返回错误信息。
返回
事务处理标识符 | 协议标识符 | 长度 | 从机地址 | 功能码 | 后面bytes的数量 | 状态值 |
---|---|---|---|---|---|---|
00 00 | 00 00 | 00 04 | 01 | 01 | 01 | 01 |
{.table}
状态值当继电器打开时是01,关闭时是00
CRC16校验示例代码(Python)
{{< highlight python "linenos=table" >}}
def crc16(data):
crc = 0xFFFF
for pos in data:
crc ^= pos
for i in range(8):
if ((crc & 1) != 0):
crc >>= 1
crc ^= 0xA001
else:
crc >>= 1
return crc.to_bytes(2,byteorder='little',signed=False)
{{< / highlight >}}
硬件的二次开发
设备出厂预制程序,如果只需要使用的话这一部分是不需要看的,如果想基于现有硬件二次开发,那么你需要了解ESP32的相关知识。
设备是由ESP32开发的,预留了烧写接口如下图,排针是不焊接的,可以使用间距2.54mm的顶针烧写,或者焊接普通2.54mm间距的排针。内部预留了空间保证焊接后也可以装上外壳,
烧写接口引脚定义
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
GND | IO0 | RST | RXD | TXD | 3.3V |
烧写过程
因为设备供电的时候PCB上是有220v强电的,所以建议用烧写器给设备供电3.3v,如果烧写器有ESP32的自动复位电路的话需要链接2、3号引脚,否则只需连接其他四个引脚,但是在上电前需要短接2号和GND引脚使设备进入烧写模式。
引脚定义
设备内有两个LED,红色是电源LED无法控制,黄色连接了IO21,可以控制。继电器连接是的IO12引脚