Arduino智能小车搭建学习
学习一下怎么搭建一个具有智能避障,寻迹的蓝牙遥控车。个人认为可以主要分为以下两个步骤:1. 硬件电路连接。2. 编码。编好程序的Arduino去控制各个元件去发挥作用就如同人的大脑去控制手脚。
由于本人基本是属于0基础,将在此对不认识的元器件留下笔记,并尝试理解每一个电路和代码的意义。Arduino是如何实现对电子元器件控制的,单独的Arduino初步熟悉可以参考上一篇笔记,这里只记录小车中用到的功能模块。
组装好的智障鬼畜小车演示:
1. 硬件电路焊接与组装
基本流程:先焊接好各个模块,再将模块组装。焊接时先焊接小元件再焊接大元件。(由于零件都是买了的,所以不涉及PCB电路板设计,想要进一步提高,这个也得学一学,要是板子都没有,焊个啥)
主板焊接效果
小车底板焊接
电池盒的焊接
电池盒的焊接主要是把两根线连接起来,先把线皮拨开(用剥线钳子我总是用不好,我用美工刀削开的),再把裸露的导线穿上热缩管(黑的和红的各套一根,再套一个热缩管子把两个捆在一起),防止短路。先把裸露的导线拧好,再焊接上,再剪掉多余的部分,再套好热缩管,用烙铁头烫一下,捆绑好就OK了。
寻迹模块焊接
(哭了,这里R0 L0 GND VCC的排母焊接反面了,它应该是与R0和L0同侧的,然后直接就能插入小车底板P2的排针上)
组装好的小车
涉及相关工具和元器件知识
相关工具
- 电烙铁的使用。(手一定要远离烙铁头啊,不然你会闻道菜市场用火去除猪蹄上的毛时发出来的香味,别问我为什么知道)
- 吸锡器的使用。万一焊错了要用。
电烙铁和吸锡器的使用教程链接。
松香使用教程链接。 - 固定胶带:因为焊接电路板是在背面,背过来焊接元器件时元器件容易掉下去,胶带用来固定。
元器件
将元器件一个个焊接到主板上,秉承着先焊接小元件(电阻和LED类)再焊接大元件的原则,防止大的装上去之后,小的安装不上。然后作为小白,我主要了解下这些元器件的使用方法和功能,还有就是元器件为什么是这么安装!一个个来~
色环电阻的识别,金色条带的朝着右边摆放,这里用的四环电阻。功能:分流分压。
LED灯,长为正级,短为负极。
蜂鸣器,长为正级,短为负极。
瓷片电容,无极性,以陶瓷作为绝缘介质的电容,电容量较小,用于高稳定振荡回路中,作为回路电容器及垫整电容器。
电解电容,长脚为正,短脚为负极,用氧化膜(氧化铝或五氧化二钽)作电介质,电容量较大,通常在电源电路或中频、低频电路中起电源滤波、退耦、信号耦合及时间常数设定、隔直流等作用。
拓展:
电容的公式为:C=εS/4πkd 。其中,ε是一个常数,S为电容极板的正对面积,d为电容极板的距离,k则是静电力常量。常见的平行板电容器,电容为C=εS/d(ε为极板间介质的介电常数,S为极板面积,d为极板间的距离)。
关键参数:1.标称容值与误差 2.额定电压 3.温度系数 4.绝缘电阻 5.损耗 6.频率特性 7.介质 8.封装尺寸
电容器选择参考:https://jingyan.baidu.com/article/a17d52851fa6fe8099c8f27f.html
红外接收:主要用于将红外信号转化为电信号,底层原理可自行按照规格搜索(拓展资料)。
按键开关,拨动开关:控制电源短路与断路。
稳压芯片:稳压芯片可以保护电路,使电路不会因为脉冲而受到破坏。这里是配合锂电池使用,原理和选择(拓展资料)
二极管:有白边的为负极,不清楚时可以用万用表测试。功能:1. 整流 2. 开关 3. 限幅 4. 续流 5. 检波 6. 变容 7. 显示 8. 稳压 9. 触发
IC座(16PIC座子)与驱动芯片(L293D):这里主要用来驱动电机。
接线座(XH-2P与XH-7P):用于接通导线。
排针与排母
跳线:跳线实际就是连接电路板两需求点的金属连接线。
直流减速电机:小车前面两个轮子的动力驱动装置,是减速机和马达的集合体,此处两个电机必须都是红线朝外,黑线朝内,镜像对称。
寻迹模块:透明断是发射(接板子的T),黑色是接收(接板子的R)
红外反射开关
可调电位器:本质就是一个可变电阻。
舵机云台:舵机主要是控制物体角度的,包含三根线,黄色的是IO口,中间的橙线是VCC,旁边的褐色线是GND。
- 超声波模块:上述的舵机云台主要用于控制超声波模块转向用。
- 蓝牙模块:供给主板蓝牙数据传输功能。
- 面包板:开发板上还有富余的IO口,可以连接面包板拓展功能。
2. 程序导入
软件是Arduino 1.8.13,烧入程序时一定要先看下,选得是不是所用的Arduino UNO板,还有就是软件菜单栏中工具的端口那选得是和设备管理中端口一样,我这里是COM3。主要是看下小车的黑线循迹、避障、遥控实验是如何实现的,其中避障可以靠红外实现,也可以靠超声波模块实现,故各摘取了一些程序,等代码完全看得懂了,也可以自己修改和添加来调控板子上的元器件。
卖家提供程序代码解读
程序是Copy卖家的哦,以后需要功能再在这个基础上改。
1、智能小车黑线循迹、避障、遥控实验综合程序。
//============================智宇科技===========================
// 智能小车黑线循、红外避障、遥控综合实验
//===============================================================
//#include
#include //包含红外库 关键点
int RECV_PIN = A4;//端口声明
IRrecv irrecv(RECV_PIN);
decode_results results;//结构声明
int on = 0;//标志位
unsigned long last = millis();
long run_car = 0x00FF629D;//按键CH
long back_car = 0x00FFA857;//按键+
long left_car = 0x00FF22DD;//按键<<
long right_car = 0x00FFC23D;//按键>||
long stop_car = 0x00FF02FD;//按键>>|
long left_turn = 0x00ffE01F;//按键-
long right_turn = 0x00FF906F;//按键EQ
int Left_motor_go=8; //左电机前进(IN1)
int Left_motor_back=9; //左电机后退(IN2)
int Right_motor_go=10; // 右电机前进(IN3)
int Right_motor_back=11; // 右电机后退(IN4)
#define PORT_KEY A2 //定义按键 数字A2 接口
#define PORT_LED1 7 //定义LED 数字7 接口
#define PORT_LED2 12 //定义LED2 数字12 接口
int beep=A3;//定义蜂鸣器 数字A3 接口
#define KEYMODE_1 1 // 定义按键模式1
#define KEYMODE_2 2 // 定义按键模式2
#define KEYMODE_3 3 // 定义按键模式3
uint8_t keyMode; //指无符号8bit整型数
const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1)
const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2)
const int SensorRight_2 = 5; //中间红外避障传感器()
int SR_2; //中间红外避障传感器状态
int SL; //左循迹红外传感器状态
int SR; //右循迹红外传感器状态
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)
pinMode(beep,OUTPUT);
pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入
pinMode(13, OUTPUT);////端口模式,输出
Serial.begin(9600); //波特率9600
irrecv.enableIRIn(); // Start the receiver
KeyScanInit();
LEDInit();
}
//=======================智能小车的基本动作 遥控控制单独用电机驱动函数=========================
// 遥控实验不可调节电机速度,调节pwm值会影响红外的信号接收
void run2() // 前进
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW); // 左电机前进
digitalWrite(Left_motor_back,HIGH);
}
void brake2() //刹车,停车
{
digitalWrite(Right_motor_go,LOW);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,LOW);
}
void left2() //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW); //左轮后退
digitalWrite(Left_motor_back,LOW);
}
void spin_left2() //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,HIGH); //左轮后退
digitalWrite(Left_motor_back,LOW);
}
void right2() //右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);//左电机前进
digitalWrite(Left_motor_back,HIGH);
}
void spin_right2() //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,HIGH);
digitalWrite(Left_motor_go,LOW);//左电机前进
digitalWrite(Left_motor_back,HIGH);
}
void back2() //后退
{
digitalWrite(Right_motor_go,LOW); //右轮后退
digitalWrite(Right_motor_back,HIGH);
digitalWrite(Left_motor_go,HIGH); //左轮后退
digitalWrite(Left_motor_back,LOW);
}
//=======================智能小车的基本动作=========================
//void run(int time) // 前进
void run()
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,150);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,LOW); // 左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,150);
//delay(time * 100); //执行时间,可以调整
}
//void brake(int time) //刹车,停车
void brake()
{
digitalWrite(Right_motor_go,LOW);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,LOW);
//delay(time * 100);//执行时间,可以调整
}
//void left(int time) //左转(左轮不动,右轮前进)
void left()
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,150);
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() //左转(左轮后退,右轮前进)
{
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,HIGH); //左轮后退
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
// delay(time * 100); //执行时间,可以调整
}
//void right(int time) //右转(右轮不动,左轮前进)
void right()
{
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,LOW);//左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,150);//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,LOW);//左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,200);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
//void back(int time) //后退
void back()
{
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 dump(decode_results *results)
{
int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{
//Serial.println("Could not decode message");
brake();
}
}
void IR_IN() //机器人遥控子程序
{
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 )//按键CH
run2();//前进
if (results.value == back_car )//按键+
back2();//后退
if (results.value == left_car )//按键<<
left2();//左转
if (results.value == right_car )//按键>||
right2();//右转
if (results.value == stop_car )//按键>>|
brake2();//停车
if (results.value == left_turn )//按键-
spin_left2();//左旋转
if (results.value == right_turn )//按键EQ
spin_right2();//右旋转
last = millis();
irrecv.resume(); // Receive the next value
}
}
void Robot_Avoidance() //机器人避障子程序
{
//有信号为LOW 没有信号为HIGH
SR_2 = digitalRead(SensorRight_2);
if (SR_2==HIGH)//前面没有障碍物
{
run(); //调用前进函数
digitalWrite(beep,LOW); //蜂鸣器不响
//digitalWrite(LED,LOW); //LED不亮
}
else if ( SR_2 == LOW)// 前面探测到有障碍物,有信号返回,向左转
{
digitalWrite(beep,HIGH); //蜂鸣器响
//digitalWrite(LED,HIGH); //LED亮
brake();//停止200MS
delay(300);
back();//后退500MS
delay(400);
left();//调用左转函数 延时500ms
delay(500);
}
}
void Robot_Traction() //机器人循迹子程序
{
//有信号为LOW 没有信号为HIGH
SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L1亮;没信号表明压在黑线上,车子底板上L1灭
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();
}
// 按键处理初始化
void KeyScanInit(void)
{
pinMode(PORT_KEY,INPUT_PULLUP); //输入模式,内部上拉。
keyMode = KEYMODE_1;
}
// 任务:按键处理
void KeyScanTask(void)//
{
static uint8_t keypre = 0; //按键被按下时置1.
if( (keypre == 0) && (digitalRead(PORT_KEY) == HIGH) ) //按键被按下
{
keypre = 1; //置1,避免持续按下按键时再次进入此函数体。
switch(keyMode)
{
case KEYMODE_1:
keyMode = KEYMODE_2; //关键点错位赋值
break;
case KEYMODE_2:
keyMode = KEYMODE_3;
break;
case KEYMODE_3:
keyMode = KEYMODE_1;
break;
default:
break;
}
}
if(digitalRead(PORT_KEY) == LOW) //按键被放开
{
keypre = 0; //置0,允许再次切换LED模式
}
}
// LED初始化
void LEDInit(void)
{
pinMode(PORT_LED1,OUTPUT);
pinMode(PORT_LED2,OUTPUT);
digitalWrite(PORT_LED1,LOW);
digitalWrite(PORT_LED2,LOW);
}
// 任务:循迹、避障、遥控模式处理
void LEDTask(void)
{
switch(keyMode)
{
case KEYMODE_1:
digitalWrite(PORT_LED1,HIGH);
digitalWrite(PORT_LED2,LOW);
Robot_Traction(); //调用循迹子程序
break;
case KEYMODE_2:
digitalWrite(PORT_LED1,LOW);
digitalWrite(PORT_LED2,HIGH);
Robot_Avoidance(); // 调用避障子程序
break;
case KEYMODE_3:
digitalWrite(PORT_LED1,HIGH);
digitalWrite(PORT_LED2,HIGH);
IR_IN(); //调用遥控子程序
break;
default:
break;
}
}
void loop()
{
/*while(1)
{
keysacn();//调用按键扫描函数
//Robot_Traction();
//Robot_Avoidance();
//IR_IN();
}*/
KeyScanTask();
LEDTask();
}//
对应遥控器按键:
2、智能小车超声波避障实验(无舵机)。
//============================智宇科技===========================
// 智能小车超声波避障实验(无舵机)
//===============================================================
//#include
#include //申明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数据口模式连线声明 P13--LCD 4脚 P12--LCD 5脚
//P7--LCD 6脚 P6--LCD 11脚 P5--LCD 12脚 P4--LCD 13脚 P3--LCD 14脚
int Echo = A1; // Echo回声脚(P2.0)
int Trig =A0; // Trig 触发脚(P2.1)
int Distance = 0;
int Left_motor_go=8; //左电机前进(IN1)
int Left_motor_back=9; //左电机后退(IN2)
int Right_motor_go=10; // 右电机前进(IN3)
int Right_motor_back=11; // 右电机后退(IN4)
int key=A2;//定义按键 A2 接口
int beep=A3;//定义蜂鸣器 A3 接口
void setup()
{
Serial.begin(9600); // 初始化串口
//初始化电机驱动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)
pinMode(key,INPUT);//定义按键接口为输入接口
pinMode(beep,OUTPUT);
// pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
// pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
//pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入
//pinMode(SensorLeft_2, INPUT); //定义左红外传感器为输入
//初始化超声波引脚
pinMode(Echo, INPUT); // 定义超声波输入脚
pinMode(Trig, OUTPUT); // 定义超声波输出脚
lcd.begin(16,2); //初始化1602液晶工作 模式
//定义1602液晶显示范围为2行16列字符
}
//=======================智能小车的基本动作=========================
//void run(int time) // 前进
void run() // 前进
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,150);//0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,LOW); // 左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,150);
//delay(time * 100); //执行时间,可以调整
}
void brake(int time) //刹车,停车
{
digitalWrite(Right_motor_go,LOW);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,LOW);
delay(time * 100);//执行时间,可以调整
}
//void left(int time) //左转(左轮不动,右轮前进)
void left() //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,150);
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,150);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH); //左轮后退
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,150);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void right(int time)
//void right() //右转(右轮不动,左轮前进)
{
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,LOW);//左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,150);//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,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 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,HIGH); //左轮后退
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,150);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
//==========================================================
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 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 Distance_display()//显示距离
{
if((2
3、智能小车超声波避障实验(有舵机)。
//============================智宇科技========================================
// 智能小车超声波避障实验(有舵机)
// 程序中电脑打印数值部分都被屏蔽了,打印会影响小车遇到障碍物的反应速度
// 调试时可以打开屏蔽内容Serial.print,打印测到的距离
// 本实验控制速度的pwm值和延时均有调节,但还是配合实际情况,实际电量调节数值
//=============================================================================
//#include
#include //申明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数据口模式连线声明 P13--LCD 4脚 P12--LCD 5脚
//P7--LCD 6脚 P6--LCD 11脚 P5--LCD 12脚 P4--LCD 13脚 P3--LCD 14脚
int Echo = A1; // Echo回声脚(P2.0)
int Trig =A0; // Trig 触发脚(P2.1)
int Front_Distance = 0;//
int Left_Distance = 0;
int Right_Distance = 0;
int Left_motor_go=8; //左电机前进(IN1)
int Left_motor_back=9; //左电机后退(IN2)
int Right_motor_go=10; // 右电机前进(IN3)
int Right_motor_back=11; // 右电机后退(IN4)
int key=A2;//定义按键 A2 接口
int beep=A3;//定义蜂鸣器 A3 接口
//const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1)
//const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2)
//const int SensorRight_2 = 6; //右红外传感器(P3.5 OUT4)
//const int SensorLeft_2 = 5; //左红外传感器(P3.4 OUT3)
//int SL; //左循迹红外传感器状态
//int SR; //右循迹红外传感器状态
//int SL_2; //左红外传感器状态
//int SR_2; //右红外传感器状态
int servopin=2;//设置舵机驱动脚到数字口2
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int val;
void setup()
{
Serial.begin(9600); // 初始化串口
//初始化电机驱动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)
pinMode(key,INPUT);//定义按键接口为输入接口
pinMode(beep,OUTPUT);
// pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
// pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
//pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入
//pinMode(SensorLeft_2, INPUT); //定义左红外传感器为输入
//初始化超声波引脚
pinMode(Echo, INPUT); // 定义超声波输入脚
pinMode(Trig, OUTPUT); // 定义超声波输出脚
lcd.begin(16,2); //初始化1602液晶工作 模式
//定义1602液晶显示范围为2行16列字符
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
}
//=======================智能小车的基本动作=========================
//void run(int time) // 前进
void run() // 前进
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,165);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,LOW); // 左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,160);
//delay(time * 100); //执行时间,可以调整
}
void brake(int time) //刹车,停车
{
digitalWrite(Right_motor_go,LOW);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,LOW);
delay(time * 100);//执行时间,可以调整
}
void left(int time) //左转(左轮不动,右轮前进)
//void left() //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,180);
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,HIGH); //左轮后退
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void right(int time)
//void right() //右转(右轮不动,左轮前进)
{
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,LOW);//左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,200);//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,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 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,HIGH); //左轮后退
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,150);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
//==========================================================
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); //蜂鸣器停止
}
}
float 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;
return Fdistance;
}
void Distance_display(int Distance)//显示距离
{
if((2 Right_Distance)//左边比右边空旷
{
left(3);//左转
brake(1);//刹车,稳定方向
}
else//右边比左边空旷
{
right(3);//右转
brake(1);//刹车,稳定方向
}
}
else
{
run(); //无障碍物,直行
}
}
}
3. 原理图
思考三个问题:1. 要学哪些知识可以看懂这种图? 2. 要学哪些知识会设计这种图? 3. 要学哪些软件会画这种图?