315无线模块+单片机的无线系统
见上图。因为要对舰上16枚火箭进行遥控点火,所以DIY了这个电路。但事实上只要加上合适的外围芯片,要实现对该模型的整体控制也是完全可以的(速度和舵角的控制)。这篇文章只描述最基本的芯片通信调试过程。有关的具体控制暂不公布,如果你对这个遥控设计感兴趣或有商业需求,请留言。
这个设计的成本可以说是极低的:20块一对无线模块(一个信号发射模块,一个接受模块,淘宝上买的),加上6块钱一个51的单片机,还有一些零碎器件,总体不会超过35元。用在海陆模型上完全可以,但飞行器就难了,首先体积重量都不合格,其次我对这种315芯片的抗干扰性保持怀疑。
另外值得一提的是基于这个电路拓展的遥控电路功能强大,实现十来个通道的比例控制完全是可以的。或可以传递来自传感器的信息(比如舵轮仪、温湿度传感器、抄表、无线安防控制等)
我所使用的315芯片的资料:
http://www.ayxsj.com/j04v.htm
遥控端信号发射部分的电路(测试用)
1原理:
第一块单片机p1.0口输出脉冲方波提供给无线发射模块,无线发射模块将信号以电磁波的形式传到无线接收模块。无线接收模块会根据这个电磁波还原出脉冲方波提供给第二块单片机,第二块单片机进行进一步的解算处理。
2通信协议:
根据这个原理和315模块的特性。我决定以900us高电平和2000us底电平表示1;450us高电平和 2000us低电平表示0。而8个1或0组成一个字节。为了防止误码,所以在每个字节的前面加一个2ms高电平和2ms低电平的起始码。
3单片机相关知识:
⑴用定时器产生制定脉宽的脉冲
⑵用计数器计算接收到脉冲的宽度
GATE=1时(门控方式), 启动计数器的条件 TR=1且INT0=1。所以利用这点,可以测量外部脉冲的高电平宽度
4单片机调试程序:
第一步的调试不停发送1( 一个位) ,观察接收到的信号是否正常。有示波器的话非常方便直观,如果没有示波器,那么可以在单片机上接16个LED灯,将TH0显示在P2口的8个灯,TL0显示在P0的8个灯。比如收到脉宽900us的信号,那么TL0=11000010B TH0=1B ,下排P2口左边第二个和右边最后两个灯亮,上排P0口左边第一个亮。然而实验中发现实际接收到的脉宽比预计的平均少20us,但是这丝毫不会影响接收数据的正确性,因为在这个协议中只要判断TH0和TL0的高4位就足以识别是1或0了发送程序关键部分如下。
略
第二步的调试发送一字节数据( 8个位) ,并显示在P2口上ORG 0000H
AJMP MAIN
ORG 0010H
MAIN:
MOV TMOD,#01H
CLR C
MOV R5,#08H
aa: MOV A,#10101010B
acall send
mov a,#01010101b
acall send
mov a,#11110000b
acall send
mov a,#1111b
acall send
ajmp aa
send: MOV TH0,#00fcH
MOV TL0,#0018H
SETB P1.0
SETB TR0
JNB TF0,$
CLR P1.0
CLR TF0
MOV TH0,#00FCH
MOV TL0,#0025H
SETB TR0
JNB TF0,$
CLR TF0
SS: RLC A
JC S1
AJMP S0
S1: MOV TH0,#00feH
MOV TL0,#003fH
SETB P1.0
SETB TR0
JNB TF0,$
CLR P1.0
CLR TF0
MOV TH0,#00FCH
MOV TL0,#0025H
SETB TR0
JNB TF0,$
CLR TF0
AJMP OUT
s0: MOV TH0,#00ffH
MOV TL0,#001fH
SETB P1.0
SETB TR0
JNB TF0,$
CLR P1.0
CLR TF0
MOV TH0,#00FCH
MOV TL0,#0025H
SETB TR0
JNB TF0,$
CLR TF0
ajmp out
OUT: DJNZ R5,SS
clr c
mov a,#10101010b
mov r5,#08h
ret
DELAY: mov R0,#05Fh
w_1: mov R1,#0fFh
w_2: djnz R1,w_2
djnz R0,w_1 RET
接收端的电路(测试)
如果顺利,那么在接收芯片的数据输出端也会产生900us脉宽的脉冲波。如果没有示波器,那么怎么知道接受到信号的脉宽呢?我在P2口接了8个LED。读取TH0 TL0 里的数值,取反,然后依次在P2上显示。比如900us脉宽对应TH0=11B TL0=10000100B,对应位为1折亮,所以当显示TH0的时候最左边的两个LED会被点亮,而显示TL0的时候从左往右:第三个和最后一个亮。但事实上脉冲信号存在20us的误差。然而这丝毫不影响遥控的准确性,因为我是取900us表示1,450us表示0,然后根据8个1或0组成一个字节的控制码。具体的通信协议就不在这啰嗦了
接收部分测试用的代码
ORG 0000H
AJMP MAIN
org 0003h
ajmp TF
ORG 0050H
MAIN:
SETB IT0
CLR IE0
MOV TMOD,#00001001B
MOV TH0,#00H
MOV TL0,#00H
MOV IE,#10000001B
ajmp $
TF: acall det
MOV A,TH0
CJNE A,#07H,diuqi
AJMP DETECT
detect: acall det
MOV A,TH0
CJNE A,#03H,S_C
AJMP SETB1
S_C:MOV A,TH0
CJNE A,#01h,ERROR
AJMP SETB0
SETB1:
MOV A,R7
SETB C
RLC A
MOV R7,A
DJNZ R3,DETECT
AJMP OUT
SETB0:
MOV A,R7
CLR C
RLC A
MOV R7,A
DJNZ R3,DETECT
AJMP OUT
det: mov th0,#00h
mov tl0,#00h
JB P3.2,detect
SETB TR0
S_2: JNB P3.2,S_2
s_3: JB P3.2,s_3
clr tr0
ret
diuqi: acall fuwei
reti
ERROR:
clr p0.7
acall delay
setb p0.7
acall delay
acall fuwei
RETI
OUT: clr p0.6
CPL A
mov p2,A
mov r4,#20h
del:acall delay
djnz r4,del
setb p0.6
mov p2,#0ffh
acall delay
acall fuwei
reti
fuwei: mov TH0,#00h
mov TL0,#00h
MOV R3,#08H
MOV R6,#02H
clr ie0
ret
DELAY: mov R0,#061h
w_1: mov R1,#0ffh
w_2: djnz R1,w_2
djnz R0,w_1
RET