本文最后更新于337 天前,其中的信息可能已经过时,如有错误请发送邮件到273925452@qq.com

这个项目是我大一参加学校的科创比赛做的,时间比较久了,整理一下把它分享出来给需要的人😀
大一做的记录视频
初次接触Aruino,c语言/第一次做的项目/材料说明:Arduino UNO R3×1,L298N×1,超声波模块HC-SR04×3(小车左前右前2个),舵机×1,面包板×1, 12V锂电池×1,杜邦线若干。
Adruino程序部分
#include<Servo.h>
const byte ENB = 5; //左边电机
const byte IN1 = 3; //右后电机
const byte IN2 = 6; //右前电机
const byte IN3 = 9; //左后电机
const byte IN4 = 11; //左前电机
int TrigPin1 = 10;//左边超声波
int EchoPin1 = 2;
int TrigPin0 = 4;// 定义0超声波信号发出接口
int EchoPin0 = 7;// 定义0超声波信号接收口
int TrigPin2 = A0;//右边超声波
int EchoPin2 = A1;
int pos; //舵机位置
int dis0; //前方距离
int dis1; //左边距离
int dis2; //右边距离
int led1 = 8;
int led0 = A4;
int led2 = A2;
Servo myServo; //舵机
void setup() {
Serial.begin(9600); //串口初始化
delay(50);
myServo.attach(12); //舵机引脚初始化
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
delay(100);
//超声波控制引脚初始化
pinMode(TrigPin0,OUTPUT);
pinMode(EchoPin0,INPUT);
pinMode(TrigPin1,OUTPUT);
pinMode(EchoPin1,INPUT);
pinMode(TrigPin2,OUTPUT);
pinMode(EchoPin2,INPUT);
pinMode(led1,OUTPUT);
pinMode(led0,OUTPUT);
pinMode(led2,OUTPUT);
}
void loop() {
digitalWrite(led0,HIGH);
delay(50);
Run();
}
void Run(){
myServo.write(90);
int dis0 = getDistance0();//前方距离
int dis11 = getDistance1();//左边距离
int dis22 = getDistance2();//右边距离
Serial.print(" dis0 = ");Serial.println(dis0);
if(dis0 >= 20||dis0 == 0)
{
ForWard();
if(dis11<=6||dis22<=6)
{
STOP();
autoTurn1();
}
}
else
{
STOP();
autoTurn2();
}
}
void autoTurn1()
{
int dis11 = getDistance1();//左边距离
int dis22 = getDistance2();//右边距离
if (dis11 < dis22){
Serial.println("TurnRight");
TurnRight();
digitalWrite(led2,HIGH);
delay(90);
digitalWrite(led2,LOW);
}
else{
Serial.println("TurnLeft");
TurnLeft();
digitalWrite(led1,HIGH);
delay(90);
digitalWrite(led1,LOW);
}
}
void autoTurn2() //控制舵机持续转向
{
int pos; //舵机位置
int time1=3;
for(pos = 90;pos <= 180;pos += 1 )
{
myServo.write(pos);//告诉舵机转到变量‘pos’中的位置
delay(time1); //等待舵机到达位置
}
delay(300);
int dis1 = getDistance0();//左边距离
Serial.print("dis1 = ");Serial.println(dis1);
for(pos = 180;pos >= 0;pos -= 1 )
{
myServo.write(pos);//告诉舵机转到变量‘pos’中的位置
delay(time1); //等待舵机到达位置
}
delay(300);
dis2 = getDistance0(); //右边距离
Serial.print("dis2 = ");Serial.println(dis2);
for(pos = 0;pos <= 90;pos += 1 ){
myServo.write(pos);//告诉舵机转到变量‘pos’中的位置
delay(time1); //等待舵机到达位置
}
delay(500);
if(dis1 < dis2){
Serial.println("TurnRight");
TurnRight();
digitalWrite(led2,HIGH);
delay(100);
digitalWrite(led2,LOW);
}
else
{
Serial.println("TurnLeft");
TurnLeft();
digitalWrite(led1,HIGH);
delay(100);
digitalWrite(led1,LOW);
}
}
void ForWard() //前进
{
Serial.println("ForWard");
Leftshun();
Rightshun();
}
int ENAspeed = 80; //右车轮调速
int ENBspeed = 80; //左车轮调速
void Rightshun() //右边车轮顺时针
{
analogWrite(IN1,ENAspeed);
analogWrite(IN2,0);
}
void Rightni() //右边车轮逆时针
{
analogWrite(IN1,0);
analogWrite(IN2,ENAspeed);
}
void Leftshun() //左边车轮顺时针
{
analogWrite(ENB,ENBspeed);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
}
void Leftni() //左边车轮逆时针
{
analogWrite(ENB,ENBspeed);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
}
//调试:延迟÷旧度数*新度数
void TurnLeft() //左转45
{
Serial.println("TurnLeft");
analogWrite(IN1,200);
analogWrite(IN2,0);
analogWrite(ENB,200);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
delay(90);
}
void TurnRight() //右转45
{
Serial.println("TurnRight");
analogWrite(IN1,0);
analogWrite(IN2,200);
analogWrite(ENB,200);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
delay(90);
}
void STOP() //停止
{
Serial.println("STOP");
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
delay(500);
}
int getDistance0()
{
int TrigPin0 = 4; // 定义超声波信号发出接口
int EchoPin0 = 7; // 定义超声波信号接收口
digitalWrite(TrigPin0, LOW); // 使发出发出超声波信号接口低电平2μs
delayMicroseconds(2);
digitalWrite(TrigPin0, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
delayMicroseconds(10);
digitalWrite(TrigPin0, LOW); // 保持发出超声波信号接口低电平
int distance0 = pulseIn(EchoPin0, HIGH); // 读出脉冲时间
distance0= distance0/58.0; // 将脉冲时间转化为距离(单位:厘米)
if (distance0 >=50)
{
//如果距离小于50厘米返回数据
return 50;
} //如果距离小于50厘米小灯熄灭
else
return distance0;
}
//左边超声波测距模块
int getDistance1()
{
int TrigPin1 = 10; // 定义超声波信号发出接口1
int EchoPin1 = 2; // 定义超声波信号接收口1
digitalWrite(TrigPin1, LOW); // 使发出发出超声波信号接口低电平2μs
delayMicroseconds(2);
digitalWrite(TrigPin1, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
delayMicroseconds(10);
digitalWrite(TrigPin1, LOW); // 保持发出超声波信号接口低电平
int distance1 = pulseIn(EchoPin1, HIGH); // 读出脉冲时间
distance1= distance1/58.0; // 将脉冲时间转化为距离(单位:厘米)
if (distance1 >=20)
{
return 20;
}
else
return distance1;
}
//右边超声波测距模块
int getDistance2()
{
int TrigPin2 = A0; // 定义超声波信号发出接口2
int EchoPin2 = A1; // 定义超声波信号接收口2
digitalWrite(TrigPin2, LOW); // 使发出发出超声波信号接口低电平2μs
delayMicroseconds(2);
digitalWrite(TrigPin2, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
delayMicroseconds(10);
digitalWrite(TrigPin2, LOW); // 保持发出超声波信号接口低电平
int distance2 = pulseIn(EchoPin2, HIGH); // 读出脉冲时间
distance2= distance2/58.0; // 将脉冲时间转化为距离(单位:厘米)
if (distance2 >=20)
{
return 20;
}
else
return distance2;
}
评论