发布于 

Ardoino循迹小车

最近加入了学校的工作室,按历届传统新生加入都会去做循迹小车的培训。

在初中时候我也参加过这个比赛,但是当时车子是和积木一样拼一个框架就好了,电路什么的都集成好了。特别是程序是用图形来拉出来的,类似于Scratch,但是是专用来写循迹小车的,功能也比较拉跨。但是工作室的培训是让我们自己买一些模块自己来做。

刚好我一直也挺想去玩玩硬件的,可惜入门太难了对我来说。于是我就参加了这个活动了,顺便来记录一下学习经过。(今天安慰奖刚发下来)

要使用的一些零件如下表:

名称 型号 数量
L298N电机驱动 L289N直流步进电机驱动板模块 红色 新款 1
车模 智能小车底盘 4驱动 1
光电传感器 5
18650电池盒 18650 两节带DC头 带黑线 带盒子带开关 1
杜邦线 20cm长 母头转母头 若干
20cm长 母头转公头 1
XL6009 DC-DC自动升降压模块 要不要无所谓 1
Arduino nano V3.0主控板 1
arduino 扩展板 1

要使用的软件也就喜闻乐见的Arduino外也没啥了。

Arduino上传失败的问题

关于Arduino上传时出现了一个小问题,人傻搞了半天才解决,可能有人会出现我就记录一下吧。

上传时本来代码不长差不多可以秒烧的,结果硬是烧不进去,结果等了半天报了以下的错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
k500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xad

其实很好解决,就在arduino的 工具 -> 处理器 中把“ATmega328P”选项改为“ATmega328P(Old Bootloader)”。要是我没记错应该是和我一样买了老的nano板子导致的。

制作过程

这些做好以后我们就来连一下那些模块,像小车的外壳都有说明书的我就不多说了。这里强烈建议外壳装之前记得把电机的线先焊好。也许没人和我一样傻的连这都忘了。

这里有两种方案一种是加了升压板的,另一种是反之。加了升压板以后速度直线上升,出问题的可能性也直线上升。到写博客的时候升压板的程序我还么写好,有天晚上作死不小心把升压板烧了,等下次有资金了再弄(主要是懒得等快递所以不想买)。所以程序我也只能提供一下没有升压板的了,其实都大同小异,有些细节得自己加一下就好了。

接线也不太难,首先我们把nano安装在扩展板上。将扩展板的3、5、6、9几个针脚的信号脚(标s的那个)用杜邦线与驱动板的IN1、IN2、IN3、IN4脚连接。

将光电传感器用杜邦线用杜邦线与扩展板连接,具体针脚可以随意选择,S接S,V接V,G接G就行。我为了方便就接了A0、A1、A2、A3、A4这几个脚,光电顺序是从左到右对应的那几个针脚的。最后就是给电机驱动板接电源,直接在扩展板下面的dc口飞线过去即可。如果要是使用升压板就在中间连一下升压板,记得IN进OUT出,我是瞎子接反了。

接了升压板以后我们就要把电机扩展板上的一个跳帽给拔掉,就单独孤立出来的那个。然后在驱动板的5V口给个5V的电,nano的扩展板上就有。不加升压板的话就不需要了。

做到这硬件几乎就差不多了,然后我们来看一下软件部分。

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
//这些为电机信号脚,也就是IN1那些脚连着的(连线不同左右正反也不会一致,可以自己先测试一下)
#define Right_low 3
#define Right_high 5
#define Left_high 6
#define Left_low 9

void setup() {
//motors init
pinMode(Left_high, OUTPUT);
pinMode(Left_low, OUTPUT);
pinMode(Right_high, OUTPUT);
pinMode(Right_low, OUTPUT);
//sensor init(这些是光电模块使用的针脚改为自己对应的即可啦)
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
}

void loop() {
// Brake analogRead是用来读取光电参数,500为高电压也就是检测到黑线,210为低电压反之
if((analogRead(A1) >= 500&&analogRead(A3) >= 500)||(analogRead(A1) >= 500&&analogRead(A3) >= 500)||(analogRead(A1) >= 500&&analogRead(A3) >= 500))
brake();

// Go straight
else if(analogRead(A0) <= 210&&analogRead(A1) <= 210&&analogRead(A2) >= 500&&analogRead(A3) <= 210&&analogRead(A4) <= 210)
straight();

// Turn Right
else if((analogRead(A3) >= 500||analogRead(A4) >= 500)&&(analogRead(A0) <= 210||analogRead(A1) <= 210))
right();

// Turn Left
else if((analogRead(A0) >= 500||analogRead(A1) >= 500)&&(analogRead(A3) <= 210||analogRead(A4) <= 210))
left();
}

void straight(){
analogWrite(Left_high, 255);//255为电机速度,区间为[-255,255],负数反转
analogWrite(Left_low, 0);
analogWrite(Right_high, 255);
analogWrite(Right_low, 0);
}

void left(){
analogWrite(Left_high, 0);
analogWrite(Left_low, 150);
analogWrite(Right_high, 255);
analogWrite(Right_low, 0);
}

void right(){
analogWrite(Left_high, 255);
analogWrite(Left_low, 0);
analogWrite(Right_high , 0);
analogWrite(Right_low,150);
}

void brake(){
digitalWrite(Right_high, 0);
digitalWrite(Right_low, 0);
digitalWrite(Left_high, 0);
digitalWrite(Left_low, 0);
}

这个版本非常简易,因为车车没有升压板速度不太快所以走着很稳。如果有C语言基础的小伙伴理解应该不会有问题。大概模块上电以后开始运行一遍setup函数初始化数据,然后循环运行loop函数。loop也就是循环的意思。一般要写的功能都是在loop里写。

写在最后

升压板我测试了几次,过弯的时候用这个程序因为执行了一遍转弯以后就会执行直行命令,车速太快就会冲出去。如果自行不调太快也就没有装升压板的必要了,我现在没时间去修改代码,就留给各位自己修改一下程序了。

比赛结束了车也用不上了,于是我就买了HC05蓝牙模块回来打算做成遥控车玩。等近期做好以后有时间就写一下博客记录一下。