前言
考虑到之前那篇博客写的太简略,也只给了一个最终代码,比较容易让人看不懂。本篇主要写一些不同功能函数的代码讲解,要看整体部分的请前往我的另一篇博客—基于Arduino(MEGA2560)的智能物流小车项目
测试部分
▶ 此代码用于测试车轮是否正确连线,以及不同高低电平的小车行进状态。
▶ 更改运动控制函数的高低电平(HIGH,LOW),保证小车烧录代码后能依次执行向前、向后、向左、向右、停止四个运动状态。
▶ 若不是正常顺序,更改代码即可,并且记住自己小车的四个状态的高低电平。
#include <Servo.h>
//定义五中运动状态
#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4
//定义需要用到的引脚
int leftMotor1 = 14;
int leftMotor2 = 15;
int rightMotor1 = 16;
int rightMotor2 = 17;
int leftPWM = 2;
int rightPWM = 3;
void setup() {
// put your setup code here, to run once:
//设置控制电机的引脚为输出状态
pinMode(leftMotor1, OUTPUT);
pinMode(leftMotor2, OUTPUT);
pinMode(rightMotor1, OUTPUT);
pinMode(rightMotor2, OUTPUT);
pinMode(leftPWM, OUTPUT);
pinMode(rightPWM, OUTPUT);
}
void loop() {
int cmd;
for(cmd=0;cmd<4;cmd++)
//依次执行向前、向后、向左、向右、停止四个运动状态
{
motorRun(cmd,255);
delay(1000);//每个命令执行2s
}
}
//运动控制函数(注意!需要更改的地方为此处)
void motorRun(int cmd,int value)
{
analogWrite(leftPWM, value); //设置PWM输出,即设置速度
analogWrite(rightPWM, value);
switch(cmd){
case 0:
Serial.println("FORWARD"); //输出状态
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
case 1:
Serial.println("BACKWARD"); //输出状态
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2,HIGH );
digitalWrite(rightMotor1,HIGH );
digitalWrite(rightMotor2,LOW);
break;
case 2:
Serial.println("TURN LEFT"); //输出状态
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, LOW);
break;
case 3:
Serial.println("TURN RIGHT"); //输出状态
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
default:
Serial.println("STOP"); //输出状态
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, LOW);
}
}
循迹部分
#include <Servo.h>
#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4
int leftMotor1 = 14; //直流电机引脚
int leftMotor2 = 15;
int rightMotor1 = 16;
int rightMotor2 = 17;
int trac1 = 11; //车头四个灰度传感器引脚
int trac2 = 10; //从车头方向的最右边开始排序
int trac3 = 9;
int trac4 = 8;
int leftPWM = 3; //驱动PWM引脚
int rightPWM = 2;
int data[4]; //记录灰度读取值(0/1)
void setup() {
//串口初始化
Serial.begin(9600);
//测速引脚初始化
pinMode(leftMotor1, OUTPUT);
pinMode(leftMotor2, OUTPUT);
pinMode(rightMotor1, OUTPUT);
pinMode(rightMotor2, OUTPUT);
pinMode(leftPWM, OUTPUT);
pinMode(rightPWM, OUTPUT);
//寻迹模块引脚初始化
pinMode(trac1, INPUT);
pinMode(trac2, INPUT);
pinMode(trac3, INPUT);
pinMode(trac4, INPUT);
}
//运动控制函数
//确保与测试部分测试好的函数相同
void motorRun(int cmd,int value)
{
analogWrite(leftPWM, value); //设置PWM输出,即设置速度
analogWrite(rightPWM, value);
switch(cmd){
case FORWARD:
Serial.println("FORWARD"); //输出状态
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, HIGH);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
case BACKWARD:
Serial.println("BACKWARD"); //输出状态
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
break;
case TURNLEFT:
Serial.println("TURN LEFT"); //输出状态
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2,HIGH);
digitalWrite(rightMotor1,HIGH);
digitalWrite(rightMotor2,LOW);
break;
case TURNRIGHT:
Serial.println("TURN RIGHT"); //输出状态
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
break;
default:
Serial.println("STOP"); //输出状态
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, LOW);
}
}
//循迹函数
void tracing()
{
data[0] = digitalRead(11);
data[1] = digitalRead(10);
data[2] = digitalRead(9);
data[3] = digitalRead(8);
if((!data[0] && data[1] && data[2] & 4& !data[3]))
{
motorRun(FORWARD,220);
}
else if(data[0] && data[1] && data[2] && data[3])
{
motorRun(FORWARD,220);
}
/*else if(!data[0] && data[1] && data[2] && data[3])
{
motorRun(TURNLEFT, 100,100);
} 上坡微调*/
else if(data[2] || data[3])
{
motorRun(TURNLEFT,255);
}
else if(data[0] || data[1])
{
motorRun(TURNRIGHT,255);
}
/* else if(!data[0] && !data[1] && data[2] &&!data[3])
{
motorRun(TURNLEFT,220);
}
else if(!data[0] && !data[1] && data[2] && data[3])
{
motorRun(TURNLEFT,220);
}
else if(!data[0] && !data[1] && !data[2] && data[3])
{
motorRun(TURNLEFT,220);
}
else if(!data[0] && data[1] && !data[2] && !data[3])
{
motorRun(TURNRIGHT,220);
}
else if(data[0] && data[1] && !data[2] && !data[3])
{
motorRun(TURNRIGHT,220);
}*/
Serial.print(data[0]);
Serial.print("---");
Serial.print(data[1]);
Serial.print("---");
Serial.print(data[2]);
Serial.print("---");
Serial.print(data[3]);
Serial.print("---");
}
void loop()
{
tracing();
}
超声波测距部分
const int TrigPin = 5;
const int EchoPin = 4; // 发射,接收引脚
float cm;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop()
{
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);
}
避障部分
▶ 此代码用于检测小车运动过程中,超声波是否在正常工作。有时候通过串口监视超声波能正确读出距离,小车运动时超声波就不会正常工作。
▶ 此代码为小车一直前进,检测到障碍物时,执行左转-前行-右转-大前行-右转-前行-左转从而达到避开障碍物的目的且车头回正。
#include <Servo.h>
#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define TURNLEFT 3
#define TURNRIGHT 4
int leftMotor1 = 14;
int leftMotor2 = 15;
int rightMotor1 = 16;
int rightMotor2 = 17;
int leftPWM = 2;
int rightPWM = 3;
Servo myServo; //舵机
int inputPin=4; // 定义超声波信号接收接口
int outputPin=5; // 定义超声波信号发出接口
int dis;
float cm;
void setup() {
// put your setup code here, to run once:
//串口初始化
Serial.begin(9600);
//舵机引脚初始化
myServo.attach(4);
//测速引脚初始化
pinMode(leftMotor1, OUTPUT);
pinMode(leftMotor2, OUTPUT);
pinMode(rightMotor1, OUTPUT);
pinMode(rightMotor2, OUTPUT);
pinMode(leftPWM, OUTPUT);
pinMode(rightPWM, OUTPUT);
//超声波控制引脚初始化
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
}
void motorRun(int cmd,int value)
{
analogWrite(leftPWM, value); //设置PWM输出,即设置速度
analogWrite(rightPWM, value);
switch(cmd){
case FORWARD:
Serial.println("FORWARD"); //输出状态
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
break;
case