基于wifi摄像头与单片机的串口透传及二次开发
1.硬件说明
1.实物图片
这是在淘宝花了137买的wifi透传摄像头,拆开外壳我发现里面是esp32的摄像模块改版,现在主要对其进行二次开发
2.总线通讯
摄像头的背后有两个总线接口,若要与其进行通讯,需要配备摄像头配套的Zlink模块和wifi摄像头模块进行总线通信,再由Zlink模块转出TTL,接到单片机与单片机通讯
其实Zlink模块连接的本质还是TTL,将跳线帽接至规定位置后,就可以与单片机进行通讯
2.使用说明
1.手机连接
给 wifi 摄像头模块供电,然后 wifi 摄像头模块会发出热点,热点名称为 众灵机器 人_XXXX,密码是 zhonglingkeji
连接上热点以后,打开浏览器搜索192.168.4.1,就可以进入控制网页
按下屏幕两边的按键可以通过串口发出一串指令
2.模块配置
若模块未插入TF卡,只能按其默认文件进行配置
【0 号正】:按下时发送的指令为#000P1000T2000!,松开时发送的指令为#255PDST!
【1 号正】:按下时发送的指令为#001P1000T2000!,松开时发送的指令为#255PDST!
【2 号正】:按下时发送的指令为#002P1000T2000!,松开时发送的指令为#255PDST!
【3 号正】:按下时发送的指令为#003P1000T2000!,松开时发送的指令为#255PDST!
【4 号正】:按下时发送的指令为#004P1000T2000!,松开时发送的指令为#255PDST!
【5 号正】:按下时发送的指令为#005P1000T2000!,松开时发送的指令为#255PDST!
【6 号正】:按下时发送的指令为#006P1000T2000!,松开时发送的指令为#255PDST!
【7 号正】:按下时发送的指令为#007P1000T2000!,松开时发送的指令为#255PDST!
【左上】:按下时发送的指令为$DCR:600,600!,松开时发送的指令为$DCR:0,0!
【左下】:按下时发送的指令为$DCR:-600,-600!,松开时发送的指令为$DCR:0,0!
【左左】:按下时发送的指令为$DCR:-600,600!,松开时发送的指令为$DCR:0,0!
【左右】:按下时发送的指令为$DCR:600,-600!,松开时发送的指令为$DCR:0,0!
【左中】:按下时发送的指令为$DCR:0,0!,松开时发送的指令为$DCR:0,0!
【右上】:按下时发送的指令为$DCR:900,900!,松开时发送的指令为$DCR:0,0!
【右下】:按下时发送的指令为$DCR:-900,-900!,松开时发送的指令为$DCR:0,0!
【右左】:按下时发送的指令为$DCR:-900,900!,松开时发送的指令为$DCR:0,0!
等等
当使用了TF卡时,可以通过更改TF卡内部的配置文件来进行调整
可以通过更改配置文件进行配置同时也可以更改按钮的名称
3.二次开发
1.电源电路
问了客服这个Zlink模块的供电要求,客服的答案是7.4v-8.4v最好,这个电压值比较偏,现成的芯片不能直接使用,但是我也需要集成在一块电路板上,采用12v对我的产品供电,除去12-5v共给单片机以外,任需要额外设计12-8v的DC-DC降压电路
XL4015的降压电路,可以实现大电流的降压,正好满足了wifi摄像头的启动大电流,电路原价也比较常见
XL4015的稳压公式: VOUT=1.25*(1+R6/R7)
我这里需要一个8v的输出,所以我选用了这两个阻值的电阻,这里也可以自己计算,得出一个想要的阻值,或者采用滑动变阻器,若使用滑动变阻器需要先调试滑动变阻器阻值,防止损坏后级电路,电阻尽量采用紧密电阻减小误差
2.文件配置
通过串口软件测试,我发现,摄像头是以文本的形式将数据发送给我的单片机,所以在程序里还需要额外的改动
这里我只需要用两边各4个按钮,所以我只对需要用的按钮进行了处理,这里配置需要注意,发送的指令格式必须以#开头,以^结尾,中间的数字留给我的程序进行判断
3.串口程序
梳理完成了摄像头模块的使用与注意事项后,简单测试一下就可以进行单片机程序的编程了
void InitUart()//115200 波特率
{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR |= 0x04; //定时器时钟1T模式BRT = 0xFD; //设置定时重载值AUXR |= 0x01; //串口1使用独立波特率发射器为波特率发生器AUXR |= 0x10; //启动独立波特率发射器ES = 1; //使能串口1中断
}/*--------------------------------------串口一 发送一个字符
--------------------------------------*/void uart1_txd(unsigned char x)
{SBUF = x;
}
我这里用的是stc12单片机,先对串口进行配置,注意这里还需要开启总中断
void uart0_interrupt(void) interrupt 4
{if(RI==1) { xiaodu[num]=SBUF; //数据包接收 if(num >= 1){num++;}if(num==0&&xiaodu[num]==0x23){num=1;} //当接收的第一个字符为0xaa时才接收第二位字符else if(num==0&&xiaodu[num]!=0x23){num=0;memset(xiaodu, 0, sizeof(xiaodu));}else if(num==1&&xiaodu[num]==0x39){num=0;memset(xiaodu, 0, sizeof(xiaodu));while(xiaodu[1]);}if(num>=6){num=0;}RI=0;}}
这是串口接收的程序,文件里指令配置的要求刚好作为我的标志位,当识别到第一位#时,才会继续读取下面的数据,不然就丢掉,#9^作为我的松手指令当识别到的时候也会丢掉,通过串口的收发,我发现文本的数字在16进制下也有规律,都是0x3+文本数字,也就是说,我只需要识别标志位后面的数字就可以完成判断
if(xiaodu[1] == 0x35){dw = 1;}if(xiaodu[1] == 0x36){dw = 0;}if(dw == 1&&zd != 2){zd=1;}if(zd == 1){rgb = 0;delay_ms(500);rgb = 1;zd = 2;}if(dw == 0 && zd == 2){rgb = 0;delay_ms(2000);rgb = 1;zd = 0;}if(xiaodu[1] == 0x31){colour++;colour%=9;rgb = 0;delay_ms(1000);rgb = 1;}if(xiaodu[1] == 0x32){while(xiaodu[1] == 0x32);djjs++;djjs%=2;}//舵机状态转换if(djjs == 0){pwm = 5;OLED_ShowChinese(34,6,29,16);}else{pwm = 17;OLED_ShowChinese(34,6,28,16);}if(xiaodu[1] == 0x30){rgb = 0;delay_ms(2000);rgb = 1;colour=0;}
这是我的条件配置程序
4.最终成品
这就是我的项目产品,自动灭蚊装置,可以通过操控控制盒上的按键进行操控,也可以通过,wifi摄像头模块对其进行操控