#include <Servo.h>//舵机控制库
//调试控制,注释掉下面两句取消调试
#define DEBUG_PRINT //调试串口打印输出控制
#define DEBUG_REMOTE //将获取到的数据发送到手机APP,便于调试
//所有引脚的设置
//1、L298N电机驱动
#define LEFT_MOTOR1 2
#define LEFT_MOTOR2 3
#define RIGHT_MOTOR1 4
#define RIGHT_MOTOR2 5
#define LEFT_ENA 6
#define RIGHT_ENB 9
//2、超声避障SR04
#define SR04_TRIG 10
#define SR04_ECHO 11
//3、舵机(辅助超声避障功能)
#define SERVO_PWM 12
//4、红外寻迹
#define LINE1 A0
#define LINE2 A1
#define LINE3 A2
#define LINE4 A3
//5、蓝牙模块 JDY-18
#define BLE_SERIAL Serial1
//控制命令定义
#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4
Servo myServo;//舵机
void setup()
{
//引脚模式设置
pinMode(LED_BUILTIN, OUTPUT);//板载LED
Serial.begin(9600);//用于调试
pinMode(LEFT_MOTOR1, OUTPUT);
pinMode(LEFT_MOTOR2, OUTPUT);
pinMode(RIGHT_MOTOR1, OUTPUT);
pinMode(RIGHT_MOTOR2, OUTPUT);
pinMode(LEFT_ENA,OUTPUT);
pinMode(RIGHT_ENB,OUTPUT);
pinMode(SR04_TRIG, OUTPUT);
pinMode(SR04_ECHO, INPUT);
myServo.attach(SERVO_PWM);
pinMode(LINE1,INPUT);
pinMode(LINE2,INPUT);
pinMode(LINE3,INPUT);
pinMode(LINE4,INPUT);
BLE_SERIAL.begin(9600);
BLE_SERIAL.println("AT+NAMELingzhiBleCar");//设置蓝牙设备名称
}
void motor_run(int cmd){
switch(cmd)
{
case FORWARD:
#ifdef DEBUG_PRINT
Serial.println("向前");
#endif
digitalWrite(LEFT_MOTOR1, HIGH);
digitalWrite(LEFT_MOTOR2, LOW);
digitalWrite(RIGHT_MOTOR1, HIGH);
digitalWrite(RIGHT_MOTOR2, LOW);
break:
case BACKWARD:
#ifdef DEBUG_PRINT
Serial.println("向后");
#endif
digitalWrite(LEFT_MOTOR1, LOW);
digitalWrite(LEFT_MOTOR2, HIGH);
digitalWrite(RIGHT_MOTOR1, LOW);
digitalWrite(RIGHT_MOTOR2, HIGH);
break;
case TURNLEFT:
#ifdef DEBUG_PRINT
Serial.println("左转");
#endif
digitalWrite(LEFT_MOTOR1, HIGH);
digitalWrite(LEFT_MOTOR2, LOW);//C
digitalWrite(RIGHT_MOTOR1, HIGH);
digitalWrite(RIGHT_MOTOR2, LOW);
break;
case TURNRIGHT:
#ifdef DEBUG_PRINT
Serial.println("右转");
#endif
digitalWrite(LEFT_MOTOR1, HIGH);
digitalWrite(LEFT_MOTOR2, LOW);
digitalWrite(RIGHT_MOTOR1, HIGH);//C
digitalWrite(RIGHT_MOTOR2, LOW);
break;
case STOP:
default:
#ifdef DEBUG_PRINT
Serial.println("停止");
#endif
digitalWrite(LEFT_MOTOR1, LOW);
digitalWrite(LEFT_MOTOR2, LOW);
digitalWrite(RIGHT_MOTOR1, LOW);
digitalWrite(RIGHT_MOTOR2, LOW);
break;
}
}
void loop() {
if(Serial.available()>0)
{
Serial.print("cmd:");
int cmd = Serial.read() - 48;
Serial.println(cmd);
motor_run(cmd);
}
}
int getInstance()
{
digitalWrite(SR04_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(SR04_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(SR04_TRIG, LOW);
int distance = pulseIn(SR04_ECHO, HIGH);
distance = distance/58.0;
return distance;
}
void avoidance(int avoidDistance)
{
int i = 0;
int time = 30;//舵机速度
int disFor = 0;//探测的距离
int disLeft = 0;
int disRight = 0;
int d = 70;
//首先探测正前方
myServo.write(d);
for(i=0;i<5;i++)
{
disFor += getDistance();
delay(50);
}
disFor = disFor/5;
#ifdef DEBUG_PRINT
Serial.print(" 前方距离:");
Serial.println(disFor);
#endif