蓝牙小车遥控项目日志

项目目标:蓝牙遥控小车

项目过程:

11月5日:

  • 讨论了蓝牙和红外遥控小车,考虑到蓝牙遥控可直接用手机app进行操作,确定项目目标为通过蓝牙对小车进行遥控操作

11月7日:

  • 探讨了小车的主要组成部分:单片机,电机驱动板模块,电机,蓝牙模块
  • 对各部分之间的联系以及小车的运作原理进行了学习和讨论:
    • 通过手机蓝牙SPP对蓝牙模块发出信号指令
    • 蓝牙模块接收到指令后从通信口传递给单片机进行信息判断
    • 单片机通过控制电机驱动板输出端的电压的高低来实现对电机的控制,从而使小车实现相应的操作指令

11月27日:

  • 对项目所需要的材料进行了更为细致的商榷,一些细节的补充也使项目更加的成熟
    • 是否使用麦克纳姆轮
    • 电机的选择:直流电机还是步进电机
    • 小车底盘板是否由我们自己绘图切割
    • 单片机的选择:stm 32或51单片机或arduino
    • 驱动模块的确定
    • 蓝牙模块的确定
  • 对该部分最后的讨论结果为:
    • 采用普通的两轮+万向轮的形式
    • 选用了tt直流减速电机
    • 小车底盘板网购
    • 从难度的角度出发,确定选择采用51单片机(芯片stc89c52)
    • 选择了l298n红版驱动
    • 选用了hc-05蓝牙模块

12月1日:

  • 所有材料均购入,对小车的主体部分进行了组装
  • 研究单片机代码,开始编写项目程序

12月15日:

  • 对小车进行各部分的调试,项目出现暂时性的障碍,电机驱动板无法驱动电机运转
  • 因为对电机直接通电,可以运转,所以我们判断应该是其他板块出现了问题
  • 由于电机驱动板的驱动电压为5v,而小车上的6节1.5v干电池的电压理论上为9v,远远大于5v,因此我们开始并没有将电压作为首要考虑因素,但在对单片机的代码进行核对和检验,蓝牙模块反复测试,更换新的电机驱动板后,均未解决电机无法运转的问题;当晚,我们将小车上的6节1.5v干电池更换成2节3.7v锂电池,电机运转成功,小车可实现蓝牙控制(电源电压过低的原因应该是:在项目进行的过程中,因为多次调试,产生了大量的消耗,使得其电压低于5v)

12月21日:

  • 网上买的电池到了(太开心了(╥╯^╰╥))
  • 开始编写pwm调速程序,用了52特有的t2定时器进行pwm调速(keil4的52头文件里好像没有T2MOD的地址,去头文件里面添加 sfr T2MOD = 0xC9; 这一条语句就可以了)

实现结果:

通过手机蓝牙SPP对小车发出前进,后退,暂停,左转,右转,加速,减速等指令,并实现了其相应的功能

总结:

  • 通过这次项目,我们初步了解了有关串口通信、电机驱动和定时器设置的一些内容,对单片机的理解稍微深入了一点。
  • 在项目进行的过程中,有遇到很多问题,我们通过控制变量法进行排查,最终完成了该项目。但是从中,我们发现:以后做项目的时候可以先对一些硬件进行调试,确认无误后,进行下一步,不然做到一半,发现哪里出了问题再排查问题,会非常的麻烦。
  • 本次项目只是做出了一个非常简单的蓝牙小车,我们还打算在此基础上加入红外避障或寻迹功能,以模拟远程遥控驾驶,但因时间有限,仅完成了蓝牙驱动一部分,之后,我们会继续完善我们的小车,让它成为一个多功能小车。

  • 另附代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit ena=P1^0;
sbit in1=P1^1;
sbit in2=P1^2;
sbit in3=P1^3;
sbit in4=P1^4;
sbit enb=P1^5;

uchar mode;
uint flag=0,pwm=70,pwmadd=0;

//串口通信的计时器
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd; //波特率9600
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void ser() interrupt 4
{
RI=0;
mode=SBUF;
flag=1;
}

//延迟函数
void delay(uint x)
{
uint a,b;
for(a=0;a<x;a++)
for(b=0;b<148;b++);
}

//pwm的定时器t2
void motor_pwm ()
{
if(pwm>=pwmadd)
{ena=1;enb=1;}
else
{ena=0;enb=0;}
if(pwmadd>=100)
pwmadd=0;
else
pwmadd++;
}

void time_init ()
{
T2CON = 0x00; //定时器T2--PWM 头文件没有T2MOD地址
T2MOD = 0x00;
RCAP2H = 0xff;
RCAP2L = 0x47;
TH2 = 0xff;
TL2 = 0x47; //定时0.1ms
ET2 = 1; //定时器2中断开
TR2 = 1; //PWM定时器开
}
void pwm_time2 () interrupt 5
{
TR2 = 0;
TF2 = 0;
ET2 = 0; //定时器0中断禁止

motor_pwm();//PWM占空比输出

ET2 = 1; //定时中断0开启
TR2 = 1;
}


/*前进*/
void forward()
{
in1=1;
in2=0;
in3=1;
in4=0;
}

/*后退*/
void back()
{
in1=0;
in2=1;
in3=0;
in4=1;
}

/*左转*/
void left()
{
in1=1;
in2=1;
in3=1;
in4=0;
}

/*右转*/
void right()
{
in1=1;
in2=0;
in3=1;
in4=1;
}

/*停止*/
void stop()
{
in1=0;
in2=0;
in3=0;
in4=0;
}
void main (void)
{
init();
time_init ();
while(1)
{
if(flag)
{
ES=0;
if (mode=='2')
{
forward();
delay(20);
}
if (mode=='8')
{
back();
delay(20);
}
if (mode=='4')
{
left();
delay(20);
}
if (mode=='6')
{
right();
delay(20);
}
if (mode=='5')
{
stop();
delay(20);
}
if (mode=='1')
{
pwm+=10;
if(pwm>100)
pwm=100;
}
if (mode=='3')
{
pwm-=10;
if(pwm<40)
pwm=40;
}
ES=1;
flag=0;
}
}
}