Arduino 驱动的迷你漫游车:自制避障机器人
零部件与材料
- Arduino Nano R3 × 1
- 面包板(通用) × 1
- 杜邦线(通用) × 1
- 超声波测距模块 HC-SR04 × 1
- Adafruit 微型连续旋转舵机 FS90R 专用轮 × 2
- Adafruit 微型连续旋转舵机 FS90R × 2
- LED(任意颜色) × 2
- 4×AA 电池盒 × 1
- SparkFun 3/8" 金属万向轮 × 1
- 塑料盒(如廉价保鲜盒或 500g 黄油盒) × 1
- 贴纸装饰 × 1
所需工具
- 热熔胶枪
- 美工刀
软件与平台
- Arduino IDE
项目背景
我 9 岁的侄子和 7 岁的侄女看了我之前制作的避障机器人视频后兴奋不已。遗憾的是那个教程因硬盘损毁永远丢失了(从此领会备份和 GitHub 的重要性)。
我决定设计一个简化版,既具教育意义又好玩。底盘用的是蟹肉棒包装盒,尺寸刚好完美(感谢父亲大量消费蟹肉棒)。黄油盒也合适。
安全声明: 孩子们几乎完成了所有制作。我绝不建议无监护人指导让儿童操作刀具、电烙铁等。请根据孩子能力判断任务分配。我们甚至让孩子戴护目镜,用无绳电动螺丝刀钻孔以减少风险。急救包全程未用上,但成年人必须把控安全。
电路设计
电路连接了两个舵机,稍显复杂。为方便孩子接线,我将面包板原理图 1:1 打印在 A4 纸上,配对颜色和长度正确的杜邦线。


接线完成后上传程序。代码含注释便于调试。若接线正确,舵机转动、LED 闪烁;手伸至超声波模块前,一舵机停转、另一舵机反转片刻即避障动作。
机械组装
- 前部标记超声波模块位置,剪开“眼睛”孔。
- 侧面测量轮子位置,在盒底边缘剪孔安装舵机,孔径要让舵机本体进去但安装耳卡住。
- 小钻头钻两孔装 LED。
- 盒底后部拧入或热熔胶固定万向轮。

将所有电子元件放入盒内,热熔胶固定。胶干后安装车轮。最后装饰盒子(欢迎发照片!)。

装入电池,小车将在房间随机游走,直到电池耗尽、噪音让你厌烦、或被狗叼走!:D
代码
#include <Servo.h>
/* 如果你的超声波模块只有 3 引脚,取消注释第 6 行,注释掉第 7 行 */
//int distanceR = A0; // Trigger 引脚
int distance = 6; // Trigger 引脚
int pingDelay = 10; // 超声波脉冲宽度
int distanceR = A0; // Echo 引脚
int led1 = 8, led2 = 9; // LED
Servo leftPower;
Servo rightPower;
unsigned long flashTime;
unsigned long nextSensorTime;
float obstacleDist = 0.0f;
void setup() {
//Serial.begin(115200);
leftPower.attach(3);
rightPower.attach(5);
leftPower.write(90);
rightPower.write(90);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
delay(1000);
}
void loop() {
LEDs();
// 限制测距频率为 5Hz,省电
if(millis() - nextSensorTime > 200){
nextSensorTime = millis();
// 读两次取大值,防止偶发误读
float reading1 = TakeReading();
delay(100);
float reading2 = TakeReading();
Serial.println(reading1);
Serial.println(reading2);
obstacleDist = reading1 >= reading2 ? reading1 : reading2;
// 距离小于 10cm 转向,否则前进
if(obstacleDist < 10.0f){
//Serial.println("turn");
turn();
}else{
//Serial.println("forward");
forward();
}
}
}
void LEDs(){
if(millis() - flashTime > 1000) flashTime = millis();
if(millis() - flashTime < 500){
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
}else if(millis() - flashTime > 500){
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
}
}
void forward(){
/* 如果车倒退,交换 135 和 45 */
leftPower.write(135);
rightPower.write(45);
}
void turn(){
/* 若想反向转向,取消注释 92-93,注释 95-96 */
//leftPower.write(90);
//rightPower.write(135);
leftPower.write(45);
rightPower.write(90);
delay(350);
}
float TakeReading(){
unsigned long echo = 0;
float result = 0.0f;
pinMode(distance, OUTPUT);
digitalWrite(distance, LOW);
delayMicroseconds(2);
digitalWrite(distance, HIGH);
delayMicroseconds(pingDelay);
digitalWrite(distance, LOW);
pinMode(distanceR, INPUT);
digitalWrite(distanceR, HIGH);
echo = pulseIn(distanceR, HIGH, 38000);
result = echo / 58.138;
return result;
}
原理图文件
Fritzing 源文件:littlerover_87IypZOgwm.fzz
制造工艺
- 树莓派 2 运行 Windows IoT Core 打造 Rover 机器人:从入门到进阶指南
- Arduino UNO + MAX7219 自制《UFO攻击》复古射击游戏机
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 水驱动火焰效果:Arduino UNO + Neopixel Stick 仿真壁炉
- 3D RGB Arduclock — 蓝牙控制全彩LED时钟带RTC与闹钟
- MyRiver:基于 Arduino MKR FOX 1200 的河流水质远程监测系统
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Arduino + 模拟摇杆互动游戏:五向 LED 反馈
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- 便携测距仪 DIY 套件:Arduino Nano + HC-SR04 + 18650 电池 + 3D 打印外壳
- DIY Arduino 加湿器控制器:继电器安全控制高压电路