课程目标
学习走迷宫的右手法则的应用
根据算法逻辑实现走迷宫功能
能根据场地实际要求进行车辆调试
相关知识
**机器人迷宫项目:**是常见的机器人竞赛项目,在一个搭建好的迷宫场景内,设计机器人,实现从入口顺利抵达出口,根据完成时间的长短来进行评分。
右手法则: 针对有墙壁的迷宫,只要顺着墙壁走,遇到可以转向的口子始终向右,转向失败再向右转到下一个可以走的方向,这种方法只对树形迷宫有效。对于有循环的迷宫就需要设计更加智能化的机器人才能实现。
**红外接近传感器:**红外接近传感器是一种集发射与接收于一体的光电开关传感器。当发出的红外光碰撞到范围内的目标时,它会反射到光电二极管上,从而实现监测判断。
电路搭建
所需材料
ArduinoUNO * 1
红外接近传感器 * 3
上节课的车辆结构 * 1
LED * 1
杜邦线若干
电路连接
程序编写
练习一:红外接近传感器控制开关灯
手靠近传感器时,LED灯开,离开传感器时,LED灯关。
图形化方式:
读取9号管脚上的信号值为低电平,说明有障碍物靠近,这时候点亮2号管脚上的LED。
代码方式:
/* 项目名称:红外控制开关灯
* 项目时间:2022.04.07
* 项目作者:MRX
*/
int SensorPin = 9;
int LedPin = 2;
void setup() {
pinMode(SensorPin,INPUT);
pinMode(LedPin,OUTPUT);
}
void loop() {
if(digitalRead(SensorPin)){
digitalWrite(LedPin,LOW);
}
else{
digitalWrite(LedPin,HIGH);
}
}
练习二:沿墙面前进的小车
使用一个传感器,让小车能够沿着墙面前行,效果如下:
原理分析:
右手法则逻辑分析。
电路接线:
图形化方式:
代码方式:
/* 项目名称:小车贴墙走
* 项目时间:2022.04.07
* 项目作者:MRX
*/
int IN1 = 2; // IN1 connected to pin 4
int IN2 = 4;
int ENA = 3;
int IN3 = 6; // IN3 connected to pin 6
int IN4 = 7;
int ENB = 5;
int value = 255; // the duty cycle
const int SensorPin = 10;
void Forward() {
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,value);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,value);
}
void Back() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,value);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,value);
}
void Right() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,value);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,0);
}
void Left() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,0);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,value);
}
void Stop() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
analogWrite(ENA,0);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
analogWrite(ENB,0);
}
void setup(){
Serial.begin(9600);
for (int i = 2;i <= 7;i++){
pinMode(i, OUTPUT);
}
pinMode(SensorPin,INPUT);
}
void loop(){
if (digitalRead(SensorPin) == LOW) {
Left();
} else{
Right();
}
}
练习三:走迷宫小车
编程控制小车沿着障碍物行走,效果如下:
图形化方式:
代码方式:
项目所涉及到的延时及电机正反转,都要根据自己的接线来进行调整。
/* 项目名称:走迷宫
* 项目时间:2022.04.07
* 项目作者:MRX
*/
int IN1 = 2; // IN1 connected to pin 4
int IN2 = 4;
int ENA = 3;
int IN3 = 6; // IN3 connected to pin 6
int IN4 = 7;
int ENB = 5;
int value = 255; // the duty cycle
void Forward() {
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA,value);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,value);
}
void Back() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,value);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,value);
}
void Right() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,value);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,0);
}
void Left() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,0);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENB,value);
}
void Stop() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
analogWrite(ENA,0);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
analogWrite(ENB,0);
}
void TurnLeft() {
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(ENA,100);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENB,100);
}
void setup(){
for (int i = 2;i <= 7;i++){
pinMode(i, OUTPUT);
}
for (int i = 8;i <= 10;i++){
pinMode(i,INPUT);
}
}
void loop(){
if (digitalRead(8) == LOW) {
TurnLeft();
delay(500);
} else if (digitalRead(9) == LOW) {
TurnLeft();
delay(200);
} else if (digitalRead(10) == LOW) {
Left();
} else {
Right();
}
}