基于arduino编写代码,L298N电机驱动两轮车,三个TCRT5000循迹模块3PIN用来检测赛道,将3个红外循迹模块命名为L(左),I(中),R(右)。当L,I,R其中一个检测到赛道时,只有L,则全力左转,只有I,则全力直行,只有R,则全力右转。L和I,I和R中一对检测到赛道时该情况与上面相差不大,只是转弯力度减小即可。加入HC-SR04超声波模块当前方有人时,两轮车停止不动,SYN6288语音合成模块发出一条语音,语音内容为:“请将手放在测温口前”。超过50秒播放另一条语音,语言内容是“麻烦让一让”。这时将手放在MLX90614非接触式红外测温传感器前,检测温度。当温度大于等于37°时,控制SG90舵机顺时针转动90°,等手拿开后舵机转回原位。当温度小于37°大于34°时发出语言内容为“对不起你不能使用此垃圾桶”。连接蓝牙模块,在蓝牙调试器中发送指令。可以直接控制小车直行左转右转,再发送一个指令小车继续循迹形式。
时间: 2024-04-21 09:23:59 浏览: 181
你可以使用以下代码来实现你描述的功能:
```cpp
#include <AFMotor.h>
#include <SoftwareSerial.h>
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
int leftPin = A0; // L循迹模块引脚
int middlePin = A1; // I循迹模块引脚
int rightPin = A2; // R循迹模块引脚
int echoPin = 4; // 超声波模块回声引脚
int trigPin = 5; // 超声波模块触发引脚
int servoPin = 9; // SG90舵机引脚
SoftwareSerial bluetooth(10, 11); // 蓝牙模块引脚
void setup() {
pinMode(leftPin, INPUT);
pinMode(middlePin, INPUT);
pinMode(rightPin, INPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(servoPin, OUTPUT);
motor1.setSpeed(255);
motor2.setSpeed(255);
bluetooth.begin(9600); // 设置蓝牙通信速率为9600
}
void loop() {
boolean left = digitalRead(leftPin);
boolean middle = digitalRead(middlePin);
boolean right = digitalRead(rightPin);
if (left && !middle && !right) {
turnLeft();
} else if (!left && middle && !right) {
moveForward();
} else if (!left && !middle && right) {
turnRight();
} else if (left && middle && !right) {
slightLeft();
} else if (!left && middle && right) {
slightRight();
} else {
stopMoving();
}
if (isObstacleDetected()) {
stopMoving();
voicePrompt("请将手放在测温口前");
delay(50000);
voicePrompt("麻烦让一让");
delay(1000);
float temperature = measureTemperature();
if (temperature >= 37) {
rotateServoClockwise();
delay(5000);
rotateServoCounterclockwise();
} else if (temperature > 34) {
voicePrompt("对不起你不能使用此垃圾桶");
}
}
if (bluetooth.available()) {
char command = bluetooth.read();
executeCommand(command);
}
}
void moveForward() {
motor1.run(FORWARD);
motor2.run(FORWARD);
}
void turnLeft() {
motor1.run(BACKWARD);
motor2.run(FORWARD);
}
void turnRight() {
motor1.run(FORWARD);
motor2.run(BACKWARD);
}
void slightLeft() {
motor1.run(RELEASE);
motor2.run(FORWARD);
}
void slightRight() {
motor1.run(FORWARD);
motor2.run(RELEASE);
}
void stopMoving() {
motor1.run(RELEASE);
motor2.run(RELEASE);
}
boolean isObstacleDetected() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
if (distance < 20) {
return true;
} else {
return false;
}
}
void voicePrompt(String message) {
// 使用SYN6288语音合成模块发出语音
// 实现方式取决于具体的语音合成模块使用方法
}
float measureTemperature() {
// 使用MLX90614测温传感器读取温度数据
// 实现方式取决于具体的测温传感器使用方法
}
void rotateServoClockwise() {
for (int i = 0; i <= 90; i++) {
digitalWrite(servoPin, HIGH);
delayMicroseconds(500 + i * 11);
digitalWrite(servoPin, LOW);
delayMicroseconds(19000 - i * 11);
}
}
void rotateServoCounterclockwise() {
for (int i = 90; i >= 0; i--) {
digitalWrite(servoPin, HIGH);
delayMicroseconds(500 + i * 11);
digitalWrite(servoPin, LOW);
delayMicroseconds(19000 - i * 11);
}
}
void executeCommand(char command) {
switch (command) {
case 'F':
moveForward();
break;
case 'L':
turnLeft();
break;
case 'R':
turnRight();
break;
case 'T':
stopMoving();
break;
case 'A':
loop();
break;
default:
break;
}
}
```
这段代码假设你已经安装了 AFMotor 库和 SoftwareSerial 库。你需要根据你使用的具体硬件和库进行适当的调整。此外,你还需要根据你的语音合成模块和温度传感器的具体使用方法来实现相应的函数。
阅读全文