以下是一个与机器人相关的案例、项目和竞赛内容的详细说明及相关源码示例。该项目涉及使用Arduino开发一个简单的避障机器人。通过这个项目,你将学习如何使用超声波传感器、直流电机和Arduino控制器来构建一个能够自动避障的机器人。
项目简介
该项目展示了如何使用Arduino、超声波传感器和直流电机来构建一个简单的避障机器人。机器人能够检测前方障碍物并自动避开,改变行驶方向。
目录结构
markdown 复制代码obstacle_avoidance_robot/
├──
obstacle_avoidance_robot.ino
├──
README.md
└──
libraries/
├──
NewPing/
│ ├──
NewPing.h
│ └──
NewPing.cpp
└──
Motor/
├──
Motor.h
└──
Motor.cpp
硬件要求
-
Arduino开发板(如Arduino Uno)
-
超声波传感器(如HC-SR04)
-
直流电机及电机驱动模块(如L298N)
-
机器人底盘及轮子
-
面包板和跳线
接线图
rust 复制代码超声波传感器
-> Arduino
VCC -> 5V
GND -> GND
Trig -> 9
Echo -> 10
电机驱动模块
-> Arduino
IN1 -> 2
IN2 -> 3
IN3 -> 4
IN4 -> 5
ENA -> 6
ENB -> 7
VCC -> 12V
GND -> GND
1. Arduino代码
obstacle_avoidance_robot.ino
cpp 复制代码#include <NewPing.h>
#include "Motor.h"
//
超声波传感器引脚定义
#define TRIG_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 200
//
超声波传感器对象
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
//
电机引脚定义
#define IN1 2
#define IN2 3
#define IN3 4
#define IN4 5
#define ENA 6
#define ENB 7
//
电机对象
Motor motorLeft(IN1, IN2, ENA);
Motor motorRight(IN3, IN4, ENB);
void setup() {
Serial.begin(9600);
motorLeft.setSpeed(200);
motorRight.setSpeed(200);
}
void loop() {
//
获取超声波传感器测量的距离
unsigned int distance = sonar.ping_cm();
//
打印距离到串口监视器
Serial.print("Distance: ");
Serial.print(distance);
Serial.println("cm");
//
根据距离控制电机
if (distance > 0 && distance < 20) {
//
障碍物距离小于
20cm
,停止并转向
motorLeft.stop();
motorRight.stop();
delay(500);
motorLeft.backward();
motorRight.backward();
delay(500);
motorLeft.stop();
motorRight.stop();
delay(500);
motorLeft.forward();
motorRight.backward();
delay(500);
motorLeft.stop();
motorRight.stop();
delay(500);
} else {
//
无障碍物,前进
motorLeft.forward();
motorRight.forward();
}
delay(100);
}
Motor.h
cpp 复制代码#ifndef MOTOR_H
#define MOTOR_H
class Motor {
public:
Motor(int pin1, int pin2, int speedPin);
void setSpeed(int speed);
void forward();
void backward();
void stop();
private:
int _pin1, _pin2, _speedPin, _speed;
};
#endif
Motor.cpp
cpp 复制代码#include "Arduino.h"
#include "Motor.h"
Motor::Motor(int pin1, int pin2, int speedPin) {
_pin1 = pin1;
_pin2 = pin2;
_speedPin = speedPin;
pinMode(_pin1, OUTPUT);
pinMode(_pin2, OUTPUT);
pinMode(_speedPin, OUTPUT);
}
void Motor::setSpeed(int speed) {
_speed = speed;
analogWrite(_speedPin, _speed);
}
void Motor::forward() {
digitalWrite(_pin1, HIGH);
digitalWrite(_pin2, LOW);
analogWrite(_speedPin, _speed);
}
void Motor::backward() {
digitalWrite(_pin1, LOW);
digitalWrite(_pin2, HIGH);
analogWrite(_speedPin, _speed);
}
void Motor::stop() {
digitalWrite(_pin1, LOW);
digitalWrite(_pin2, LOW);
analogWrite(_speedPin, 0);
}