我们将通过Arduino IDE 写一个代码使小机器人可以进行循迹运动。具体表现为:在地面传感器未检测到黑线时直行左右两个地面传感器同时感应到黑线时停止5秒随后进行转弯:第一次检验到进行左转转弯持续到无法检测两个地面传感器无法同时感应到黑线随即停止继续执行。同理在第二次检验到左右两个地面传感器同时感应到黑线时进行右转。同理第三次检验到进行左转同理第四次检验到进行右转。最后一次右转完成后直行5s开始
以下是代码实现:
#define leftSensor A0 // 左地面传感器
#define rightSensor A1 // 右地面传感器
#define motor1 5 // 左电机
#define motor2 6 // 右电机
int leftValue, rightValue; // 地面传感器读取的数值
int state = 0; // 状态变量,0表示直行,1表示停止,2表示左转,3表示右转,4表示沿墙运动
unsigned long stopTime = 0; // 停止时间
unsigned long turnTime = 0; // 转弯时间
void setup() {
pinMode(leftSensor, INPUT);
pinMode(rightSensor, INPUT);
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
Serial.begin(9600);
}
void loop() {
leftValue = analogRead(leftSensor);
rightValue = analogRead(rightSensor);
Serial.print(leftValue);
Serial.print(" ");
Serial.println(rightValue);
switch (state) {
case 0: // 直行
digitalWrite(motor1, HIGH);
digitalWrite(motor2, HIGH);
if (leftValue < 500 && rightValue < 500) { // 检测到黑线
state = 1;
stopTime = millis() + 5000; // 停止5秒
}
break;
case 1: // 停止
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
if (millis() > stopTime) { // 停止时间到
if (leftValue < 500 && rightValue < 500) { // 检测到黑线
state = 2; // 左转
turnTime = millis();
} else {
state = 0; // 直行
}
}
break;
case 2: // 左转
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
if (millis() - turnTime > 1000 && (leftValue > 500 || rightValue > 500)) { // 持续1秒或检测不到黑线
state = 3; // 右转
turnTime = millis();
}
break;
case 3: // 右转
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
if (millis() - turnTime > 1000 && (leftValue > 500 || rightValue > 500)) { // 持续1秒或检测不到黑线
if (leftValue < 500 && rightValue < 500) { // 检测到黑线
state = 2; // 左转
} else {
state = 0; // 直行
}
}
break;
case 4: // 沿墙运动
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
if (leftValue < 500 && rightValue < 500) { // 检测到黑线
state = 1;
stopTime = millis() + 5000; // 停止5秒
}
break;
}
}
``
原文地址: https://www.cveoy.top/t/topic/fHOv 著作权归作者所有。请勿转载和采集!