Arduino循墙机器人代码:使用proximity sensor实现避障和沿墙行走
// 定义红色LED引脚
int red_led = 11;
// 定义8个距离传感器的距离数组
volatile int proximity[8];
// 定义8个距离传感器的模拟输入引脚
unsigned char analogPin[8] = {A0,A1,A2,A3,A4,A5,A6,A7};
// 定义左电机PWM引脚
int PWM_left = 6;
// 定义左电机方向引脚
int left_dir = 7;
// 定义右电机PWM引脚
int PWM_right = 5;
// 定义右电机方向引脚
int right_dir = 2;
// 定义基础速度
volatile int base_speed = 12;
void setup() {
// 设置红色LED引脚为输出模式
pinMode(red_led,OUTPUT);
// 设置串口通信波特率为57600
Serial.begin(57600);
}
void loop() {
// 读取传感器7的距离
int distance1 = readProximityDistance(7);
// 读取传感器5的距离
int distance2 = readProximityDistance(5);
// 读取传感器6的距离
int distance3 = readProximityDistance(6);
// 读取传感器0的距离
int distance4 = readProximityDistance(0);
// 读取传感器2的距离
int distance5 = readProximityDistance(2);
// 如果传感器6感应到左侧存在墙体
if(distance3 == 0) {
// 左电机向前转动
leftMotorForward(base_speed+2);
// 右电机向前转动
rightMotorForward(base_speed);
}
// 如果传感器0感应到前方存在障碍物且传感器2感应到右侧不存在障碍物
else if(distance4 == 0 && distance5 == 1) {
// 停止电机运动
MotorStop();
// 延时500毫秒
delay(500);
// 右电机向前转动
rightMotorForward(base_speed);
// 延时500毫秒
delay(500);
}
// 否则
else {
// 左电机向前转动
leftMotorForward(base_speed);
// 右电机向前转动
rightMotorForward(base_speed+3);
}
// 如果四个地面传感器同时感应到黑色
if(proximity[0] < 500 && proximity[1] < 500 && proximity[2] < 500 && proximity[3] < 500) {
// 停止电机运动
MotorStop();
}
}
// 初始化红外LED
void initIRLED(){
// 设置PORTA为输出模式
DDRA |= B11111111;
// 将PORTA的所有引脚都设置为低电平
PORTA &= B00000000;
}
// 打开指定传感器对应的LED
void proxLEDon(unsigned char proxIndex){
PORTA |= 1<<proxIndex;
}
// 关闭指定传感器对应的LED
void proxLEDoff(unsigned char proxIndex){
PORTA &= ~(1<<proxIndex);
}
// 读取指定传感器的距离,如果感应到墙体,则距离为0,否则为1
int readProximityDistance(unsigned char proxIndex){
int distance;
// 打开传感器对应的LED
proxLEDon(proxIndex);
// 延时1毫秒
delay(1);
// 读取传感器的模拟输入值
proximity[proxIndex] = analogRead(analogPin[proxIndex]);
// 如果传感器感应到墙体,则距离为0,否则为1
distance = proximity[proxIndex] < 500 ? 0 : 1;
// 关闭传感器对应的LED
proxLEDoff(proxIndex);
// 返回距离值
return distance;
}
// 停止电机
void MotorStop(){
// 右电机方向引脚设置为高电平
digitalWrite(right_dir, HIGH);
// 右电机PWM引脚设置为高电平
digitalWrite(PWM_right, HIGH);
// 左电机方向引脚设置为高电平
digitalWrite(left_dir, HIGH);
// 左电机PWM引脚设置为高电平
digitalWrite(PWM_left, HIGH);
}
// 左电机前进
dk
void leftMotorForward(float duty){
int dutyInt = duty;
// 将占空比映射到0-100之间
int dutyVal = map(dutyInt,0,100,0,100);
// 设置左电机PWM值
analogWrite(PWM_left, dutyVal);
// 设置左电机方向引脚为低电平
analogWrite(left_dir, 0);
}
// 右电机前进
void rightMotorForward(float duty){
int dutyInt = duty;
// 将占空比映射到0-100之间
int dutyVal = map(dutyInt,0,100,0,100);
// 设置右电机PWM值
analogWrite(PWM_right, dutyVal);
// 设置右电机方向引脚为低电平
analogWrite(right_dir, 0);
}
// 左电机后退
void leftMotorBackward(float duty){
int dutyInt = duty;
// 将占空比映射到0-80之间
int dutyVal = map(dutyInt,0,100,0,80);
// 设置左电机PWM值为0
analogWrite(PWM_left, 0);
// 设置左电机方向引脚为占空比值
analogWrite(left_dir, dutyVal);
}
// 右电机后退
void rightMotorBackward(float duty){
int dutyInt = duty;
// 将占空比映射到0-80之间
int dutyVal = map(dutyInt,0,100,0,80);
// 设置右电机PWM值为0
analogWrite(PWM_right, 0);
// 设置右电机方向引脚为占空比值
analogWrite(right_dir, dutyVal);
}
原文地址: https://www.cveoy.top/t/topic/jpUq 著作权归作者所有。请勿转载和采集!