什么是 Arduino 智能机器人?
它是一个以 Arduino 作为“大脑”,通过各种传感器感知世界,再根据预设的逻辑(代码)控制执行器(如电机)来完成任务或与环境互动的物理装置。

Arduino 的角色:
- 大脑: 负责读取传感器数据,运行程序逻辑,并向执行器发出指令。
- 中枢神经: 连接所有传感器和执行器,让它们协同工作。
机器人的核心组成部分
一个典型的 Arduino 机器人由以下几个部分构成:
-
控制器:
- Arduino UNO R3: 最经典、最适合初学者的选择,社区资源丰富,扩展性强。
- Arduino Nano: 体积更小,适合对尺寸有要求的紧凑型机器人。
- Arduino Mega: 拥有更多的 I/O 引脚和内存,适合功能复杂、需要连接大量传感器的机器人。
-
执行器:
(图片来源网络,侵删)- 直流减速电机 + 轮子: 最常见的移动方式,用于驱动轮子。
- 舵机: 可以精确控制角度,常用于机械臂、云台、头部转动等。
- 步进电机: 能精确控制转动角度和速度,适用于 3D 打印机、CNC 机器人等。
-
传感器:
- “眼睛” - 感知环境:
- 超声波传感器: 测量前方障碍物的距离,常用于避障。
- 红外循迹传感器: 检测黑白线条,用于循迹小车。
- 红外避障传感器: 与超声波类似,但精度较低,成本低。
- 摄像头模块 (如 OV7670): 可以进行图像识别,是高级机器人的关键。
- “耳朵” - 感知指令:
- 蓝牙/WiFi 模块 (如 HC-05/HC-06, ESP8266): 实现手机 App 或电脑远程控制。
- 麦克风模块: 可以实现语音控制(需要额外处理)。
- “平衡感” - 感知自身状态:
- 陀螺仪/加速度计 (如 MPU-6050): 用于自平衡机器人,检测机器人的倾角。
- “眼睛” - 感知环境:
-
结构/底盘:
可以是购买的机器人小车底盘套件,也可以是 3D 打印或自己动手制作的,底盘需要稳固,能够承载所有电子元件。
-
电源:
(图片来源网络,侵删)- 电池盒: 最常用,通常使用 4-8 节 5 号/7 号电池盒,提供 6V 或 12V 电压。
- 锂电池组: 能量密度高,但需要配合充电管理模块,且要注意安全。
-
电机驱动:
- L298N: 经典的双 H 桥电机驱动模块,可以驱动两个直流电机,支持正反转和调速。注意: L298N 发热较大,大电流时需要散热片。
- TB6612FNG: 更新、更高效的电机驱动模块,发热小,体积小,是 L298N 的一个很好的替代品。
Arduino 机器人项目分级(从易到难)
入门级 - 线性控制机器人
这类机器人只能按照预设的程序顺序执行动作,没有感知和决策能力。
-
项目实例:
- 基础遥控车: 通过蓝牙模块接收手机指令,控制前进、后退、左转、右转。
- 自动循迹小车: 使用红外循迹传感器,沿着地上的黑线自动行驶。
- 避障小车: 使用超声波传感器,检测到前方障碍物后自动转向避开。
-
核心技能:
- 数字/模拟引脚的读写。
pinMode(),digitalRead(),digitalWrite(),analogRead(),analogWrite()。if-else条件判断。- 简单的电机控制逻辑。
进阶级 - 反馈控制机器人
这类机器人通过传感器获取环境反馈,并做出实时决策,具有“智能”的雏形。
-
项目实例:
- 迷宫探索机器人: 结合了循迹和避障功能,可以探索简单的迷宫。
- 跟随小车: 使用红外或超声波传感器,跟随前方的物体或人移动。
- 机械臂: 使用多个舵机,通过蓝牙或按钮控制,抓取物体。
-
核心技能:
- PID(比例-积分-微分)控制算法(用于平滑控制,如速度、平衡)。
- 状态机编程思想,处理更复杂的逻辑。
- 串口通信与数据解析。
高级 - 智能感知机器人
这类机器人能够处理更复杂的信息(如图像、语音),并进行高级决策。
-
项目实例:
- 视觉巡线机器人: 使用摄像头代替红外传感器,可以识别更复杂的颜色、形状或二维码。
- 人脸/物体跟随机器人: 通过摄像头识别特定的人或物体,并始终跟随。
- 自平衡机器人: 使用 MPU-6050 陀螺仪,通过 PID 算法实时调整电机转速,保持直立不倒,这是 Arduino 机器人领域的“圣杯”项目之一。
-
核心技能:
- 图像处理算法(如 OpenMV, TensorFlow Lite for Microcontrollers)。
- 复杂的 PID 参数整定。
- 多传感器数据融合技术。
一个经典项目:智能避障小车(代码与思路)
这是最经典的入门项目,能让你快速掌握机器人开发的核心流程。
硬件清单
- Arduino UNO R3
- L298N 电机驱动模块
- 超声波传感器
- 直流减速电机 x2
- 轮子 x2
- 机器人底盘
- 电池盒 (6V 或 12V)
- 杜邦线若干
连接图
- L298N -> Arduino:
IN1-> Pin 7IN2-> Pin 6IN3-> Pin 5IN4-> Pin 4ENA-> Pin 9 (PWM)ENB-> Pin 10 (PWM)
- L298N -> 超声波传感器:
VCC-> 5VGND-> GNDTrig-> Pin 12Echo-> Pin 11
- L298N -> 电机:
- 将两个电机分别接到
OUT1/OUT2和OUT3/OUT4。
- 将两个电机分别接到
- 电源:
- 电池盒正负极分别接到 L298N 模块的
+12V和GND。注意: 不要直接接到 Arduino 的 VIN,因为电流可能过大损坏 Arduino,L298N 会为 Arduino 提供 5V 电源。
- 电池盒正负极分别接到 L298N 模块的
Arduino 代码
// 定义引脚
const int enA = 9; // 使能电机A (PWM)
const int in1 = 7; // 输入1
const int in2 = 6; // 输入2
const int enB = 10; // 使能电机B (PWM)
const int in3 = 5; // 输入3
const int in4 = 4; // 输入4
const int trigPin = 12; // 超声波 Trig
const int echoPin = 11; // 超声波 Echo
// 定义变量
long duration;
int distance;
void setup() {
// 设置所有引脚模式
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(trigPin, OUTPUT); // Trig is an output
pinMode(echoPin, INPUT); // Echo is an input
// 初始化串口通信,用于调试
Serial.begin(9600);
}
void loop() {
// 1. 测量距离
distance = getDistance();
Serial.print("Distance: ");
Serial.println(distance);
// 2. 根据距离做出决策
if (distance > 20) {
// 距离大于20cm,前进
moveForward();
} else {
// 距离小于等于20cm,停止并转向
stopRobot();
delay(500); // 停止半秒
turnRight(); // 假设右转
delay(1000); // 转向1秒
}
}
// --- 电机控制函数 ---
void moveForward() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, 200); // 设置速度 (0-255)
analogWrite(enB, 200);
}
void turnRight() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH); // 右轮后退
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW); // 左轮前进
analogWrite(enA, 200);
analogWrite(enB, 200);
}
void stopRobot() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// --- 超声波测距函数 ---
int getDistance() {
// 发送一个10us的高电平来触发Trig
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 读取Echo引脚返回的脉冲时间,单位为微秒
duration = pulseIn(echoPin, HIGH);
// 计算距离: 声速 = 340m/s = 0.034cm/us
// 距离 = (时间 * 声速) / 2 (因为去回)
int distance = duration * 0.034 / 2;
return distance;
}
代码思路解析
-
setup()函数:- 定义所有引脚的输入输出模式。
pinMode(enA/enB, OUTPUT):将使能引脚设为输出,用于控制电机速度。pinMode(in1-in4, OUTPUT):将控制引脚设为输出,用于控制电机正反转。pinMode(trigPin, OUTPUT):超声波的 Trig 引脚需要 Arduino 发送信号。pinMode(echoPin, INPUT):超声波的 Echo 引脚需要 Arduino 接收信号。Serial.begin(9600):启动串口,方便我们在电脑上看到distance的值,便于调试。
-
loop()函数:- 这是机器人的主循环,会不断重复执行。
getDistance():调用测距函数,获取前方障碍物的距离。if-else判断:这是机器人的“决策中心”。- 如果距离大于 20cm,就调用
moveForward()函数前进。 - 如果距离小于等于 20cm,就先调用
stopRobot()停止,然后调用turnRight()右转,并延时 1 秒,给机器人足够的时间转过身去。
- 如果距离大于 20cm,就调用
-
电机控制函数 (
moveForward,turnRight,stopRobot):- 通过控制
in1,in2,in3,in4的电平组合,来决定两个电机的转动方向。 analogWrite()函数可以输出一个 PWM 信号,从而平滑地控制电机的转速。
- 通过控制
-
超声波测距函数 (
getDistance):- 触发: 给
Trig引脚一个 10 微秒的高电平脉冲,这是超声波模块开始工作的“启动信号”。 - 接收: 模块收到信号后,会从
Echo引脚发送一个高电平脉冲,这个脉冲的宽度就是超声波从发射到返回所经过的时间。 - 计算: 使用
pulseIn(echoPin, HIGH)函数可以精确测量这个脉冲的宽度(duration),根据声速和时间,计算出距离。
- 触发: 给
学习资源与建议
- 购买套件: 强烈建议初学者购买一个包含 Arduino UNO、传感器、电机、底盘和导线的机器人小车套件,这能让你免去采购和组装的麻烦,专注于编程和逻辑实现。
- 在线教程:
- Bilibili: 有大量优秀的中文视频教程,搜索“Arduino 小车”、“Arduino 机器人”等关键词。
- YouTube: 国外有很多高质量的教程,如 Paul McWhorter, GreatScott! 等,可以开启字幕学习。
- 官方文档: Arduino 官网有最权威的函数库和引脚说明。
- 社区论坛:
- Arduino 中文社区: 国内的 Arduino 爱好者聚集地,遇到问题可以在这里提问。
- GitHub: 搜索你的机器人项目,可以找到很多开源的代码和设计参考。
给你的建议:
- 从模仿开始: 先跟着教程做一个完整的项目,确保它能正常工作。
- 理解原理: 不要只复制代码,一定要搞清楚每一行代码的作用,以及硬件连接的逻辑。
- 大胆修改: 尝试修改代码,比如改变避障的距离、调整电机的速度,看看会发生什么。
- 分步调试: 如果项目不工作,先测试最简单的部分,先让电机转起来,再测试传感器读数是否正确,最后再把它们组合起来。
祝你玩得开心,做出属于你自己的智能机器人!
标签: arduino智能机器人制作教程 arduino智能机器人编程入门 arduino智能机器人配件清单