Audrion小车实验过程
一、实验过程
拷贝光盘文件,安装驱动及Arduino软件,观看了教学视频,明白了软件操作界面的各类按钮的含义,进行了事例的上传实验。
接下来就进行了小车的安装工作,这部分不算难,但却针对我们这样动手能力比较强的同学来说是一种乐趣,根据教学视频一步步做下来,很快就完成了小车的安装。
图为小车地板相关器件的安装
图为小车上部器件的安装。
接下来,小组成员进行了智能小车的调试工作,相对来说需要弄清的就是清楚对应视频中所提到各个小灯的区分。
我们分别进行了:黑白线识别模块调试;避障模块调试;电机模块调试。
上为黑白模块调试的操作要点
上为避障模块的操作要点
上为电机模块的操作要点,注意的是电机正反只能接一个信号
接下来,熟悉了硬件设备后,我们根据视频详细了解了小车的电路图和L293D内部等效图。我们相信在了解了内在电路后可以让我们更好的学习有关于编程和系统相关的知识。
上为小车地板电路原理图
图为L293D内部等效图
在我们学习了相关软硬件知识之后,我们正式开始了小车的测试。我们一直认为,在实验前具备充足的知识储备才能更好的实现实验的意义,掌握更多的知识,熟悉编程和烧录的思想。
下面我们就进行了小车的实际性实验
1、智能小车前进实验
实验代码:
int Left_motor_back=8; //左电机后退(IN1)
int Left_motor_go=9; //左电机前进(IN2)
int Right_motor_go=10; // 右电机前进(IN3)
int Right_motor_back=11; // 右电机后退(IN4)
void setup()
{
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
}
void run(int time) // 前进
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH); // 左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,0);
delay(time * 100); //执行时间,可以调整
}
void loop()
{
delay(500);
run(10); //前进
}
注意事项:
1.给小车电机的接口分别接在8.9.10.11
2.实验时间指的是毫秒,所以要乘100在代码上体现就是:delay(time * 100);
3.高电平给电机通电前进,在代码中可以选择转速,调节速度,在小车不能走直线可以将左轮或右轮的速度进行相应的调整。
在经过调整后我们的小车可以直线行走。
2、智能小车前后左右综合实验
实验代码:
void left(int time) //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮不动
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void spin_left(int time) //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,200);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void right(int time) //右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机不动
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH);//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void spin_right(int time) //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,200);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH);//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void back(int time) //后退
{
digitalWrite(Right_motor_go,LOW); //右轮后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,150);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,150);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void loop()
{
delay(2000); //延时2s后启动
back(10); //后退1s
brake(5);//停止0.5s
run(10);//前进1s
brake(5);//停止0.5s
left(10);//向左转1s
right(10);//向右转1s
spin_right(20); //向右旋转2s
spin_left(20);//向左旋转2s
brake(5);//停车
}
注意事项:
1.本实验与上一实验具有联系,而且增加了向左转和向右转,向左转为控制左轮不动,右轮前进,而向右转则是右轮不动左轮前进。
2.后退是给两个*后退高电平,不能同时给前进和后退高电平,这样会导致电机错误电压过大烧坏电机。
3.烧录例程时要断开vcc,一旦vcc接上在烧录后小车会立即搭载程序,开始运行影响实验。
3、智能小车指定花式动作
实验代码:
void loop()
{
int i;
delay(2000); //延时2s后启动
run(10);
back(10);//全速前进急停后退
brake(5);
for(i=0;i<5;i++)
{
run(10);//小车间断性前进5步
brake(1);
}
for(i=0;i<5;i++)
{
back(10);//小车间断性后退5步
brake(1);
}
for(i=0;i<5;i++)
{
left(10);//大弯套小弯连续左旋转
spin_left(5);
}
for(i=0;i<5;i++)
{
right(10);//大弯套小弯连续右旋转
spin_right(5);
}
for(i=0;i<10;i++)
{
right(1);//间断性原地右转弯
brake(1);
}
for(i=0;i<10;i++)
{
left(1);//间断性原地左转弯
brake(1);
}
for(i=0;i<10;i++)
{
left(3);//走S形前进
right(3);
}
for(i=0;i<10;i++)
{
spin_left(3);//间断性原地左打转
brake(3);
}
for(i=0;i<10;i++)
{
spin_right(3);//间断性原地右打转
brake(3);
}
}
注意事项:
1.依旧用到小车的驱动模块,所以大体代码与上两个实验有相似之处。
2.在代码中都有详细设置说明,我们可以自己编写改变数据,来设置特定的花式动作,以此来达到实验目的。
3.烧录时依旧要把vcc拔掉。
4、智能小车按键启动和蜂鸣器报警
实验代码:
void keysacn()
{
int val;
val=digitalRead(key);//读取数字7 口电平值赋给val
while(!digitalRead(key))//当按键没被按下时,一直循环
{
val=digitalRead(key);//此句可省略,可让循环跑空
}
while(digitalRead(key))//当按键被按下时
{
delay(10); //延时10ms
val=digitalRead(key);//读取数字7 口电平值赋给val
if(val==HIGH) //第二次判断按键是否被按下
{
digitalWrite(beep,HIGH); //蜂鸣器响
while(!digitalRead(key)) //判断按键是否被松开
digitalWrite(beep,LOW); //蜂鸣器停止
}
else
digitalWrite(beep,LOW);//蜂鸣器停止
}
}
void loop()
{
keysacn(); //调用按键扫描函数
back(10); //后退1s
brake(5); //停止0.5s
run(10);//前进1s
brake(5); //停止0.5s
left(10);//向左转1s
right(10);//向右转1s
spin_left(20);//向左旋转2s
spin_right(20);//向右旋转2s
brake(5); //停车
}
注意事项:
1.
上为io接口的说明解释
2.
上图为蜂鸣器的解释说明
3.不用限流电阻因为按键为10k,会让电流变得非常小,所以图中的限流电阻影响不大。
图为安装了蜂鸣器的小车。
5、智能小车黑线循迹实验
实验代码:
void keysacn()//按键扫描
{
int val;
val=digitalRead(key);//读取数字7 口电平值赋给val
while(!digitalRead(key))//当按键没被按下时,一直循环
{
val=digitalRead(key);//此句可省略,可让循环跑空
}
while(digitalRead(key))//当按键被按下时
{
delay(10); //延时10ms
val=digitalRead(key);//读取数字7 口电平值赋给val
if(val==HIGH) //第二次判断按键是否被按下
{
digitalWrite(beep,HIGH); //蜂鸣器响
while(!digitalRead(key)) //判断按键是否被松开
digitalWrite(beep,LOW); //蜂鸣器停止
}
else
digitalWrite(beep,LOW);//蜂鸣器停止
}
}
void loop()
{
keysacn();//调用按键扫描函数
while(1)
{
//有信号为LOW 没有信号为HIGH
SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L3亮;没信号表明压在黑线上,车子底板上L3灭
SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭
if (SL == LOW&&SR==LOW)
run(); //调用前进函数
else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转
left();
else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转
right();
else // 都是白色, 停止
brake();
}
}
注意事项:
1.红外接收的光线少了,所提供的阻值就小了,检测模块的电压就会放大,进行差分放大p3.2会输出高电平。
2.对黑线或白色有一个判定过程SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L3亮;没信号表明压在黑线上,车子底板上L3灭
SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭
3.利用语句来控制小车一致在沿着黑色行走。
else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转
else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转
8.智能小车红外避障实验
(1)基础避险
原理和黑线循迹相同,通过下方红外发射接收头,发送信号,有障碍物信号会反射回来,无障碍无则无反射。
实验代码:
void loop()
{
keysacn(); //调用按键扫描函数
while(1)
{
//有信号为LOW 没有信号为HIGH
SR_2 = digitalRead(SensorRight_2);
SL_2 = digitalRead(SensorLeft_2);
if (SL_2 == HIGH&&SR_2==HIGH)
run(); //调用前进函数
else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向左转
left();
else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向右转
right();
else // 都是有障碍物, 后退
back(3);
}
}
注意事项:
1.首先给两个状态,判断左右传感器都是高电平,即没有障碍物则继续前行。右边有障碍物,向左转,反之则相反。都是有障碍物则就后退。
2.需要注意的是如果安装时出现问题*有弧度或者是轮组安装不稳就在代码的基本前进程序部分进行调整。
(2)跟障碍物走
实验代码:
void loop()
{
keysacn(); //调用按键扫描函数
while(1)
{
//有信号为LOW 没有信号为HIGH
SR_2 = digitalRead(SensorRight_2);
SL_2 = digitalRead(SensorLeft_2);
if (SL_2 == LOW&&SR_2==LOW)
run(); //调用前进函数
else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向右转
right();
else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向左转
left();
else // 没有障碍物,停
brake();
}
}
注意事项:
1.为基础避障的优化,需要改动的就是,左边有障碍物则向左走,右边相同,这样就做到了跟随障碍物行走
(3)后退掉头避障
实验代码:
void loop()
{
keysacn(); //调用按键扫描函数
while(1)
{
//有信号为LOW 没有信号为HIGH
SR_2 = digitalRead(SensorRight_2);
SL_2 = digitalRead(SensorLeft_2);
if (SL_2 == HIGH&&SR_2==HIGH)
run(); //调用前进函数
else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向左转
left();
else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向右转
right();
else // 都是有障碍物, 后退
{
back(4.5);//后退
spin_right(4.5);//有旋转,调整方向
}
}
}
9、智能小车超声波测距实验
实验代码:
#include <LiquidCrystal.h> //申明1602液晶的函数库
//申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一
//LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2); //8数据口模式连线声明
LiquidCrystal lcd(13,12,7,6,5,4,3); //4数据口模式连线声明
int Echo = A1; // Echo回声脚(P2.0)
int Trig =A0; // Trig 触发脚(P2.1)
int Distance = 0;
void setup()
{
Serial.begin(9600); // 初始化串口
//初始化电机驱动IO为输出方式
//初始化超声波引脚
pinMode(Echo, INPUT); // 定义超声波输入脚
pinMode(Trig, OUTPUT); // 定义超声波输出脚
lcd.begin(16,2); //初始化1602液晶工作 模式
//定义1602液晶显示范围为2行16列字符
}
void Distance_test() // 量出前方距离
{
digitalWrite(Trig, LOW); // 给触发脚低电平2μs
delayMicroseconds(2);
digitalWrite(Trig, HIGH); // 给触发脚高电平10μs,这里至少是10μs
delayMicroseconds(10);
digitalWrite(Trig, LOW); // 持续给触发脚低电
float Fdistance = pulseIn(Echo, HIGH); // 读取高电平时间(单位:微秒)
Fdistance= Fdistance/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
Serial.print("Distance:"); //输出距离(单位:厘米)
Serial.println(Fdistance); //显示距离
Distance = Fdistance;
}
void loop()
{
Distance_test();
if((2<Distance)&(Distance<400))//超声波测距范围2cm到400cm
{
lcd.home(); //把光标移回左上角,即从头开始输出
lcd.print(" Distance: "); //显示
lcd.setCursor(6,2); //把光标定位在第2行,第6列
lcd.print(Distance); //显示距离
lcd.print("cm"); //显示
}
else
{
lcd.home(); //把光标移回左上角,即从头开始输出
lcd.print("!!! Out of range"); //显示超出距离
}
delay(250);
lcd.clear();
}
注意事项:
1.为了给下节课超声波避障做一下铺垫,用到了小车面板和超声波模块。
2.我们团队首先进行了安装超声波模块,模块原理:本产品使用方法:触发端发一个10US 以上的高电平,就可以在回声端等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。
3.还有需要注意的是:
4.在代码中可以看出,先发射了10us的,内部自己会发出信号,我们接收这个信号,检测到了高电平的信号,经过声波测量距离的公式,刚好换算出来,用fdistance除以58得出距离。
10、智能小车超声波避障实验(无舵机)
实验代码:
void Distance_display()//显示距离
{
if((2<Distance)&(Distance<400))
{
lcd.home(); //把光标移回左上角,即从头开始输出
lcd.print(" Distance: "); //显示
lcd.setCursor(6,2); //把光标定位在第2行,第6列
lcd.print(Distance); //显示距离
lcd.print("cm"); //显示
}
else
{
lcd.home(); //把光标移回左上角,即从头开始输出
lcd.print("!!! Out of range"); //显示超出距离
}
delay(250);
lcd.clear();
}
void loop()
{
keysacn(); //调用按键扫描函数
while(1)
{
Distance_test();//测量前方距离
Distance_display();//液晶屏显示距离
if(Distance < 60)//数值为碰到障碍物的距离,可以按实际情况设置
while(Distance < 60)//再次判断是否有障碍物,若有则转动方向后,继续判断
{
right(1);//右转
brake(1);//停车
Distance_test();//测量前方距离
Distance_display();//液晶屏显示距离
}
else
run();//无障碍物,直行
}
}
注意事项:
1.这一部分我们要设置一些参数,当然电机原位置不动,不用修改。7和12我们分配给了液晶屏幕,所以我们把原来的值重新分配给A2、A3。红外探头数据可以暂时不用,我们在这也不用让小车过快的前进,我们把反应时间做了相应的调整。
2.不要让元器件的口在面包板上接触到一起。
11、智能小车超声波避障实验(有舵机)
实验代码:
void servopulse(int servopin,int myangle)/*定义一个脉冲函数,用来模拟方式产生PWM值*/
{
pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin,HIGH);//将舵机接口电平置高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW);//将舵机接口电平置低
delay(20-pulsewidth/1000);//延时周期内剩余时间
}
void front_detection()
{
//此处循环次数减少,为了增加小车遇到障碍物的反应速度
for(int i=0;i<=5;i++) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,90);//模拟产生PWM
}
Front_Distance = Distance_test();
//Serial.print("Front_Distance:"); //输出距离(单位:厘米)
// Serial.println(Front_Distance); //显示距离
//Distance_display(Front_Distance);
}
void left_detection()
{
for(int i=0;i<=15;i++) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,175);//模拟产生PWM
}
Left_Distance = Distance_test();
//Serial.print("Left_Distance:"); //输出距离(单位:厘米)
//Serial.println(Left_Distance); //显示距离
}
void right_detection()
{
for(int i=0;i<=15;i++) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,5);//模拟产生PWM
}
Right_Distance = Distance_test();
//Serial.print("Right_Distance:"); //输出距离(单位:厘米)
//Serial.println(Right_Distance); //显示距离
}
//===========================================================
void loop()
{
keysacn(); //调用按键扫描函数
while(1)
{
front_detection();//测量前方距离
if(Front_Distance < 32)//当遇到障碍物时
{
back(2);//后退减速
brake(2);//停下来做测距
left_detection();//测量左边距障碍物距离
Distance_display(Left_Distance);//液晶屏显示距离
right_detection();//测量右边距障碍物距离
Distance_display(Right_Distance);//液晶屏显示距离
if((Left_Distance < 35 ) &&( Right_Distance < 35 ))//当左右两侧均有障碍物靠得比较近
spin_left(0.7);//旋转掉头
else if(Left_Distance > Right_Distance)//左边比右边空旷
{
left(3);//左转
brake(1);//刹车,稳定方向
}
else//右边比左边空旷
{
right(3);//右转
brake(1);//刹车,稳定方向
}
}
else
{
run(); //无障碍物,直行
}
}
}
注意事项:
1.根据实际测试我们将反应时间设置成60,紧接着我们进行了舵机的安装,注意安装的时候不要把引脚的针碰歪。
2.给舵机一个脉冲值让其进行一系列的转动。
12、智能小车红外遥控实验
实验代码:
void loop()
{
if (irrecv.decode(&results)) //调用库函数:解码
{
// If it's been at least 1/4 second since the last
// IR received, toggle the relay
if (millis() - last > 250) //确定接收到信号
{
on = !on;//标志位置反
digitalWrite(13, on ? HIGH : LOW);//板子上接收到信号闪烁一下led
dump(&results);//解码红外信号
}
if (results.value == run_car )//按键2
run();//前进
if (results.value == back_car )//按键8
back();//后退
if (results.value == left_car )//按键4
left();//左转
if (results.value == right_car )//按键6
right();//右转
if (results.value == stop_car )//按键5
brake();//停车
if (results.value == left_turn )//按键1
spin_left();//左旋转
if (results.value == right_turn )//按键3
spin_right();//右旋转
last = millis();
irrecv.resume(); // Receive the next value
}
}
注意事项:
1.
图为数据的输入方法
2.
图为遥控器的按键编码,按键编码要与程序中的语句一一对应才行
3.红外遥控器发出的信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰。
13、智能小车黑线循迹&超声波避障综合实验
本实验为小车黑线循迹和超声波实验的综合应用
在无障碍物时小车如同以前一样行走,在碰到障碍时,小车就会停止,经过我们团队的思考,揣测到,此举意在证明,智能小车电路板的操作性很强,兼容性很强,可以互相独立的两个代码,但彼此的功能又分别体现。
二、实验结果
1.完成了光盘中的13个实验,充分理解了小车的电路原理,电路主板的设计精髓,单片机的运算过程。
2.测试了部分单片机代码,了解了Audrion电路板的编写特点,系统运行原理,一个电路板就可以组成一台计算机。
3.在导线的安装过程中需要注意,有些导线实则为损坏导线,在插线时需要先对其进行验电测试,以防阻碍实验。
4.在车轮组调试时要有耐心,参数大小通过自己的感觉去一步步的改动,最后得到一个精准的数据,让小车以及超声波模块正常运行。
三、心得体会
在看到这个题目发布的时候我是在去邮局的路上,因为参与过这学期的大创交流会,当时就发现了这个课题,演示的是避障实验,对这个项目、这个课题充满了好奇与期待。于是第一时间联系了老师,进行了组队,领取了实验器材。
虽然我们小组不是第一组完成的,但我们小组的成员可以保证,我们将所有的视频都详细的看过,将每一行代码都对照着注释看过,对于电路图的熟悉,对于电信号传输的原理都是非常用心的。
Audrino实验板是一个好的开发板,一个开发板可以运行两个没有多达关联的程序,但却又丝毫不影响互相的功能,我们在往后编程的时候也要将这种精髓牢记于心,让代码更加高效,而且不背负累赘。
团队实验是一个非常快乐的过程,大家都有一个目标,也有一种共同面对困难的气氛,俗话说团结就是力量,团队实践是一个非常有学习效率的工作,大家各司其职,有问题一起交流一起碰撞,希望老师在今后可以多开展类似的团队实践项目,实践,在具有一定知识储备下实践,可以获得非常大的成效。
最后感谢老师分配实验,让我们这个团队不但获得了学识上的积累,更加明白了生活中的道理。