一、提要
由于学校召开,在2023年开展电赛,赛题是2022年别的学校都开展过的。由于stm32普遍性,所以网上源码很多,但是没有相关arduino的源代码,电赛开始之时我自学arduino,虽然在比赛中不是很尽人意,在几个月内积累了不少经验与教训,发出此源码供大家参考。
赛题如下:
二、材料准备
1.主车:Arduino UNO板,12v电池,8v电池(供电机驱动)、L298N电机驱动、超声波测距模块、HC-05蓝牙模块、有源蜂鸣器、(注意一定要用有源,只要通电就能响)、五路灰度传感器以及四个电机。
2.从车:比主车多了一个OLED显示屏。
此处的材料也有很多不足之处,可以看结尾处分析!
三、源码
1、主车源码
#include <SoftwareSerial.h>
#define tx 4 //蓝牙串口引脚
#define rx 0
//只有2.3引脚提供拦截模式
#define ModlePin 2 //模式引脚
#define BeginPin 3 //启动引脚
#define TrigPin 5 //超声波引脚
#define EchoPin 6
#define LeftMotor1 7 // 电机引脚
#define LeftMotor2 8
#define RightMotor1 11
#define RightMotor2 12
#define LeftPwm 9
#define RightPwm 10
#define LED 13 //LED引脚
#define track1 14 // 循迹模块引脚
#define track2 15
#define track3 16
#define track4 17
#define track5 18
#define buzzer 19 //蜂鸣器
byte Sensor[5]; //初始化循迹的值
// 蓝牙引脚
SoftwareSerial TX(rx, tx);
/*
模块:
蓝牙模块
电机驱动模块
超声波模块
循迹模块
*/
/*
0、4 蓝牙串口 O/I
2 模式选择 O
3 开始模式 O
5、6 超声波 O/I
19 蜂鸣器 O
7、8、11、12、9、10 电机以及PWM O
13 LED灯 O
A0、A1、A2、A3、A4 循迹 I
*/
/*
Modle 模式参数
Begin 小车启动参数
EndNum 到达终点次数
Speed 速度
distance 距离
*/
// 限制行为的变量
byte Modle = 0; //模式的选择
bool Begin = 0; //当为1,程序代码执行
byte EndNum = 0; //经过终点的次数
byte Speed = 0; //速度设置
int distance = 0; //距离变量
bool lr_open = 0; //左右通道开启
bool F_Stop_End = 0; //四号线专家设置停止是否完成
unsigned long Now_b = 0, Begin_a = 0;//(单位ms)Now_b是从arduino开始经过的时间 Begin_a是小车开始启动时的时间点
int Now_B = 0, Begin_A = 0, Begin_End = 0;//(单位s)Now_B、Begin_A分别是对应Now_b、Begin_A的秒的时间 Begin_End = Begin_A - Now_B,即为开始启动后小车经过的时间
//byte y = 0;//用于调试,不用管
void MotorDrive(bool Left1, bool Left2, bool Right1, bool Right2, int LPwm, int RPwm) // 电机驱动
{
delay(10);
digitalWrite(LeftMotor1, Left1);
digitalWrite(LeftMotor2, Left2);
analogWrite(LeftPwm, LPwm);
digitalWrite(RightMotor1, Right1);
digitalWrite(RightMotor2, Right2);
analogWrite(RightPwm, RPwm);
}
void Go(byte num) {
int a = 0, b = 0, c = 0, d = 0, e = 10; //a:对正走一侧加速 b:对反走一侧减速 c:应用于模式三的主车变从,测距加减速 d:对于模式四的转弯变换的减速e:用于延迟
if (Modle == 1 || Modle == 2 || Modle == 3) {
a = 30;
if (Speed == 130)
b = 20;
else {
b = 30;
d = 60;
}
} else if (Modle = 4) {
a = 20;
b = 30;
d = 80;
}
if (Modle == 3 && EndNum == 1) {
if (distance > 5 && distance < 16) {
c = -75;
e = 30;
} else if (distance > 16 && distance < 18) {
c = -60;
e = 20;
} else if (distance > 26)
c = 20;
}
switch (num) {
case 1: //直走
{
MotorDrive(1, 0, 1, 0, Speed + c, Speed + c);
delay(e);
break;
}
case 2: //小左转
{
MotorDrive(0, 1, 1, 0, Speed - b - d, Speed + a - d);
delay(10);
break;
}
case 3: //大左转
{
MotorDrive(0, 1, 1, 0, Speed - b - d, Speed + a + b - d);
delay(30);
break;
}
case 4: //小右转
{
MotorDrive(1, 0, 0, 1, Speed + a - d, Speed - b - d);
delay(10);
break;
}
case 5: //大右转
{
MotorDrive(1, 0, 0, 1, Speed + a + b - d, Speed - b - d);
delay(15);
break;
}
case 6: //停车
{
MotorDrive(0, 0, 0, 0, 0, 0);
delay(5000);
break;
}
}
}
//****************************************************************【【【【Set up】】】】**********************************************************************************
void setup() {
Serial.begin(9600);
TX.begin(38400);
//其他引脚初始化(蓝牙串口、超声波、蜂鸣器、模式中断、LED灯)
Other_Init();
//电机引脚初始化、Pwm引脚初始化
Motor_Init();
//循迹模块引脚初始化
Track_Init();
}
//*************************************************************【【【【Set up 分块】】】】**********************************************************************************
void ModleSet() // 模式、速度、到达终点次数 设置
{
delay(10);
while (digitalRead(ModlePin) == LOW)
;
Modle += 1;
if (Modle > 4)
Modle = 1;
switch (Modle) {
case 1:
{
Speed = 140; // 0.3
EndNum = 1;
break;
}
case 2:
{
Speed = 190; // 0.5
EndNum = 2;
break;
}
case 3:
{
Speed = 190; // 0.5
EndNum = 3;
break;
}
case 4:
{
Speed = 240; // 1
EndNum = 3;
break;
}
}
delay(30);
TX.write("M");
TX.print(Modle);
delay(3);
TX.wr