#include "SR04.h"//超声波头文件
#include <Servo.h>//舵机头文件
#define TRIG_PIN A5 //超声波触发引脚
#define ECHO_PIN A4 //超声波接收引脚
int Front_Distance = 0;//储存前面距离变量
int Left_Distance = 0;//储存左面距离变量
int Right_Distance = 0;//储存右面距离变量
Servo myservo; //创建舵机对象
int pos = 0; //储存舵机角度的变量
int left_motor_en = 5;//左电机使能
int right_motor_en = 6;//右电机使能
int left_motor_go = 3;//左电机正传
int right_motor_go = 4;//右电机正传
int left_motor_back = 2;//左电机反转
int right_motor_back = 7;//右电机反转
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;//存储超声波距离值变量
#include <IRremote.h>
int RECV_PIN = A1; //红外线接收器OUTPUT端接在A1
IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号
decode_results results; //解码结果放在decode_results构造的对象results里
void setup() {
//电机驱动引脚全部设置为输出模式
pinMode(left_motor_en,OUTPUT);
pinMode(right_motor_en,OUTPUT);
pinMode(left_motor_go,OUTPUT);
pinMode(right_motor_go,OUTPUT);
pinMode(left_motor_back,OUTPUT);
pinMode(right_motor_back,OUTPUT);
myservo.attach(9); // 设置舵机控制脚为数字9脚
//控制车速
analogWrite(left_motor_en,130);//左电机占空比值 取值范围0-255,255最快
analogWrite(right_motor_en,130);//右电机占空比值取值范围0-255 ,255最快
irrecv.enableIRIn(); //启动红外解码
}
//小车前进
void forward()
{
digitalWrite(left_motor_go,HIGH); //左电机前进
digitalWrite(left_motor_back,LOW);
digitalWrite(right_motor_go,HIGH); //右电机前进
digitalWrite(right_motor_back,LOW);
}
//小车后退
void backward()
{
digitalWrite(left_motor_go,LOW); //左电机反转
digitalWrite(left_motor_back,HIGH);
digitalWrite(right_motor_go,LOW); //右电机反转
digitalWrite(right_motor_back,HIGH);
}
//小车单轮左转
void left()
{
digitalWrite(left_motor_go,LOW); //左电机停止
digitalWrite(left_motor_back,LOW);
digitalWrite(right_motor_go,HIGH); //右电机前进
digitalWrite(right_motor_back,LOW);
}
//小车单轮右转
void right()
{
digitalWrite(left_motor_go,HIGH); //左电机前进
digitalWrite(left_motor_back,LOW);
digitalWrite(right_motor_go,LOW); //右电机停止
digitalWrite(right_motor_back,LOW);
}
//停车
void stop_car()
{
digitalWrite(left_motor_go,LOW); //左电机停止
digitalWrite(left_motor_back,LOW);
digitalWrite(right_motor_go,LOW); //右电机停止
digitalWrite(right_motor_back,LOW);
}
//小车原地左转
void left_rapidly()
{
digitalWrite(left_motor_go,LOW); //左电机反转
digitalWrite(left_motor_back,HIGH);
digitalWrite(right_motor_go,HIGH); //右电机正转
digitalWrite(right_motor_back,LOW);
}
//小车原地右转
void right_rapidly()
{
digitalWrite(left_motor_go,HIGH); //左电机正转
digitalWrite(left_motor_back,LOW);
digitalWrite(right_motor_go,LOW); //右电机反转
digitalWrite(right_motor_back,HIGH);
}
void front_detection()//测量小车前方距离
{
myservo.write(90);//舵机旋转90处于小车正前方
delay(65);//等待舵机到达指定角度
Front_Distance = sr04.Distance();//读取超声波距离
}
void left_detection()//测量小车左面距离
{
myservo.write(180);//舵机旋转180处于小车左面
delay(300);//等待舵机到达指定角度
Left_Distance = sr04.Distance();//读取超声波距离
}
void right_detection()//测量小车右面距离
{
myservo.write(0);//舵机旋转0处于小车右面
delay(300);//等待舵机到达指定角度
Right_Distance = sr04.Distance();//读取超声波距离
}
void zhengchang()
{
front_detection();//测量小车前方距离
if(Front_Distance < 35)//当前方厘米处出现障碍物时
{
stop_car(); delay(100);
backward(); delay(300);//先停车再后退一段距离
stop_car(); delay(100);//再次停车,扫描找出可行驶的空旷路线
left_detection();//测量左侧是否有障碍物
right_detection();//测量右侧是否有障碍物
if(Left_Distance < 35 && Right_Distance < 35)
{
left_rapidly();//
delay(600);//实现掉头
}
else if(Left_Distance > Right_Distance)//左边比右边空旷
{
left(); delay(500);//左转
stop_car(); delay(100);//停车稳定方向
}
else//否则,右边比左边空旷
{
right(); delay(500);//右转
stop_car(); delay(100);//停车稳定方向
}
}
else//前方无障碍物则前进
{
forward();//前进
}
}
void moshushou(){
a=sr04.Distance();//读取超声波距离
if(a > 20)//设置避障距离(单位厘米)
{
forward();//当手掌距离超声波大于20cm时执行前进
}
else
{
backward(); //否则执行后退
}
delay(65);//间隔65毫秒刷新一次
}
void loop() {
if (irrecv.decode(&results)) {
switch(results.value){ //判定按下的是哪个按键
case 0xFF18E7: zhengchang(); break;//数字“2”键,超声波避障
case 0xFF4AB5: backward(); break;//数字“8”键,后退
case 0xFF10EF: left(); break;//数字“4”键,左转
case 0xFF5AA5: right(); break;//数字“6”键,右转
case 0xFF38C7: stop_car(); break;//数字“5”键,停车
}
irrecv.resume();
}
} |