有时出入不太方便。
这种情况下,作为一个有几十年工作经验的工程师,我为了不愧于这一称号,主动承接接下改造楼宇对讲分机的重任。
上一次花了点时间,把分机外壳拆开,用万用表把数据通信部分电路抄了下来,如下图:
数据通信电路
今天又花了半天时间,利用之前基于LoRA通信的智能灌溉系统测试时报废的样品,
改了几个电阻,焊了几条飞线,再改写了一小段程序,顺利完成了远程开锁的功能。
远程开锁功能的系统架构如下:
系统架构
远程开锁操作步骤如下:
- 智能灌溉主控与自建服务器建立TCP长链接;
- 为了达到免布线的目的,主控与安装在分机附件的通信小板采用LoRA进行无线通信;
- 用户走到门前时,打开手机x信,在公众号菜单上点击链接;
- 从自建云服务器上下载开锁界面;
- 通过x信提供的API接口对用户的身份进行认证,生成access token;
- 采用 websocket协议向云服务器服务器发送开锁消息以及access token;
- 云服务器根据access token判断权限,如果有权限,则向智能灌溉主控转发开锁消息;
- 智能灌溉主控将开锁消息通过LoRA通信转发给由智能灌溉分控改造的通信小板;
- 通信小板生成从楼宇对讲总线上抓包得到的开锁消息,通知楼宇对讲主机开锁;
- 楼宇对讲主机收到消息之后,执行开锁动作;
改造的电路
如上图,阴影部分区域为由智能灌溉分控改造的通信小板电路,其余部分为对讲分机的通信相关电路;
通信小板通过SPI接口与LoRA模块对接;
从其单片机的UART模块输出的UART数据经过两极反向之后,由PNP三极管将其发送到总线;
在输出的PNP三极管Q9的E极串入两个并联的100欧电阻,使得通信采用电流信号实现。
可以增加通信数据的传输距离和抗干扰能力;
当串口数据位为0时,通信小板向总线提供200mA左右的电流;
当串口数据位为1时,通信小板不向总线提供电流;
楼宇对讲的分机处于待机状态时,仍会定时向总线发送心跳数据。
这一心跳数据会影响通信小板的通信,因此,增加了NPN三极管Q12组成的电路;
当通信小板需要发送数据时,单片机在YOUT_04口输出高电平,使得Q12处于饱和导通状态;
此时,如果楼宇对讲分机有数据发送,其提供的电流信号将被Q12消耗,而不会流入总线,从而不会对通信小板的通信造成影响;
碰到的几个问题以及应对的措施在调试过程中,碰到了几个问题:
1) 供电问题
刚开始想通过对讲分机内部的12V电源给通信小板供电。细算下来,电流太大,功耗太高。
最后采用9V电池给通信小板供电,所幸通信小板支持低功耗,静态平均工作电流仅几十uA,一节电池工作一年应该没有问题;
分析如下:
对讲系统的12V电流由28V的总线电源通过7812稳压得到,
而通信小板的单片机工作电源由外部电源通过3.3V的LDO稳压得到;
LoRA处于工作状态时,其工作电流可高达50mA;
如果由对讲分机内部的12V供电,则其内部的7812的功耗高达 50*(28-12)=800mW。
温升可高达50度左右;
通信小板的LDO的功耗也高达50*(12-3.3)=435mW,SOT-23封装的LDO的温升至少高达50度以上;
2)串口通信的时钟精度问题
灌溉分机采用内部高速R、C振荡器作为时钟,开始测试时,通信小板发了命令,
但是主机没有任何反应,用示波器实测通信波形,发现1200bps的波特率,
但是1个bit的脉宽居然是890us左右,与实际的 833us脉宽相比;
误差高达(890us-833us)/833us=7%。
当发送到第10个停止位时,其误差高达70%,显示接收端已经无法再正确解析数据;
果断把预留的外部晶振焊上,时钟改成外部晶振,问分机愉快地与主机打上了招呼;
3)分机待机状态开锁的问题
在分机未进入通话状态时,通信小板发送开锁命令,主机就是不执行任何动作;
再细查,原来分机待机开锁的功能被禁用了。
对讲系统只保留了主机呼叫、分机摘机再开锁的功能;
不得以,只能在通信小板上实现简单的自动摘机、开锁功能;
即检测到有呼叫命令(后续增加)或者收到从服务器发送的开锁命令,则:
a. 通过YOUT_04输出高电平,禁止对讲分机发送数据,延时一段时间;
b. 往总线发送摘机命令,延时一段时间;
c. 往总线发送开锁命令,延时一段时间;
d. YOUT_04输出低电平,允许对讲分机发送数据;
4)模拟按键操作的问题
在整个调试过程中,也有想法模拟按键操作,
如果是机械按键,可以接线从摘机和开锁按键焊出线来控制;
无奈对讲分机是触摸按键,而且触摸按键由另一块小板上的专用芯片检测;
如果要模拟按键操作,则需要实现专用芯片的协议,还需要不影响原来按键操作;
相关麻烦,只能暂时选放弃;
程序灌溉分机已经有了完整的程序,因此只需要在原来LoRA通信以及RS485通信的基本上增加一个简单的状态机;
- if(bTimer100ms){
- if(unlocktimer > 0){
- unlocktimer --;
- }
- }
- if(unlockstate == 1){
- fnMB_Init();
- uartbuff[0] = 0x7f;
- uartbuff[1] = 0x06;
- uartbuff[2] = 0x0A;
- uartbuff[3] = 0x04;
- uartbuff[4] = 0x00;
- uartbuff[5] = 0x00;
- uartbuff[6] = 0x15;
- uartbuff[7] = 0x23;
- RS485_Send(0, uartbuff, 8, FALSE);
- unlocktimer = 20;
- unlockstate = 2;
- }
- else if(unlockstate == 2){
- if(0 == unlocktimer){
- unlockstate = 3;
- }
- }else if(unlockstate == 3){
- uartbuff[0] = 0x7f;
- uartbuff[1] = 0x06;
- uartbuff[2] = 0x22;
- uartbuff[3] = 0x04;
- uartbuff[4] = 0x00;
- uartbuff[5] = 0x00;
- uartbuff[6] = 0x15;
- uartbuff[7] = 0x3b;
- RS485_Send(0, uartbuff, 8, FALSE);
- unlocktimer = 15;
- unlockstate = 4;
- }else{
- if(0 == unlocktimer){
- unlockstate = 0;
- }
- }
通信小板
来源:物联网全栈开发