周末在家翻出一块落灰的Arduino UNO开发板,突然萌生了做个智能小车的念头。查了查资料发现,原来用最常见的L9110电机驱动模块和两个130直流电机,就能搭建一个可遥控的双轮底盘,总成本居然不超过一杯奶茶钱!这可比买现成的玩具小车有意思多了——不仅能自由定制功能,还能真正理解智能硬件的底层控制逻辑。
对于刚接触机器人制作的爱好者来说,这个项目堪称完美入门选择:硬件接线简单直观,代码逻辑清晰易懂,材料全部来自电商平台常备元件。更重要的是,完成基础底盘后可以无限扩展——加个超声波模块变身避障小车,接上蓝牙模块实现手机遥控,甚至装个摄像头玩视觉追踪。下面我就带大家一步步实现这个既便宜又好玩的创客项目。
在淘宝搜索"电机驱动模块"会出现几十种选择,从几块钱的L9110到上百元的DRV8833。对于新手项目,L9110的优势非常明显:
注意:L9110的0.8A电流上限决定了它只能驱动小型直流电机,若需要更大功率建议选用TB6612等驱动芯片。
模型店里标价几十元的"机器人专用电机"其实和普通130电机本质相同。这种直径28mm的直流电机之所以成为创客首选,是因为:
标准化程度高:轴径3mm,间距15mm的安装孔位已成行业标准
性能参数均衡:
| 参数 | 典型值 |
|---|---|
| 工作电压 | 3-6V |
| 空载转速 | 9000±10% RPM |
| 负载电流 | 0.3A@5V |
| 减速比选项 | 1:48/1:120 |
改装潜力大:可直接安装橡胶轮或3D打印联轴器
整套系统的核心部件在淘宝都能一站式购齐,这是经过比价后的最优配置:
python复制# 预算控制版物料清单(总价≈47元)
materials = {
"Arduino UNO R3": 18.8, # 国产兼容版
"L9110驱动模块": 3.5, # 含杜邦线
"130直流电机×2": 6.9, # 配橡胶轮套装
"电池盒": 2.5, # 4节AA电池盒
"亚克力底盘": 15.0, # 15×10cm激光切割件
"杂项": 1.3 # 螺丝螺母包
}
小技巧:搜索"Arduino智能小车套件"往往比单独购买更划算,但要注意确认是否包含驱动模块。
没有激光切割机?厨房里的披萨盒就能变身底盘!这是我验证过的简易制作流程:
实测表明,瓦楞纸板底盘在木地板上可承受500g负载,但潮湿环境会显著降低强度。
花15元定制激光切割件能获得更专业的结构。推荐这种开孔设计:
code复制[前部]
○──○ ← 超声波传感器预留孔
│ │
○──○ ← 电机安装孔(Φ3mm)
[后部]
□□□□ ← 电池仓卡槽
安装时需要特别注意:
原装的4节AA电池盒虽然便宜但续航有限,这里推荐三种升级方案:
| 方案 | 成本 | 续航时间 | 充电方式 |
|---|---|---|---|
| 18650锂电池 | 25元 | 2小时 | 专用充电器 |
| 锂聚合物电池 | 15元 | 1.5小时 | Micro USB |
| 手机充电宝 | 0元 | 4小时 | 即插即用 |
个人体验:小米移动电源的5V/2A输出非常稳定,且自带过充保护。
模块上的4个控制引脚需要这样连接Arduino:
arduino复制// 电机A控制
#define A_IA 3 // PWM速度控制
#define A_IB 5 // 方向控制
// 电机B控制
#define B_IA 6 // PWM速度控制
#define B_IB 9 // 方向控制
关键接线要点:
新手常遇到的三个坑:
在实验室炸过两个驱动模块后,我总结出这些保命经验:
arduino复制void emergencyStop() {
digitalWrite(A_IA, LOW);
digitalWrite(A_IB, LOW);
digitalWrite(B_IA, LOW);
digitalWrite(B_IB, LOW);
}
这段经过实战检验的驱动库能让你少走弯路:
arduino复制void motorControl(int motor, int speed, bool dir) {
// motor: 0表示A电机,1表示B电机
// speed: 0-255的PWM值
// dir: 方向(true为正向)
if(motor == 0) {
analogWrite(A_IA, dir ? speed : 0);
analogWrite(A_IB, dir ? 0 : speed);
} else {
analogWrite(B_IA, dir ? speed : 0);
analogWrite(B_IB, dir ? 0 : speed);
}
}
调用示例:
arduino复制motorControl(0, 200, true); // A电机正向200速度
motorControl(1, 150, false); // B电机反向150速度
基于上述函数可以组合出丰富动作:
差速转向:
arduino复制void turnLeft(int speed) {
motorControl(0, speed*0.6, true);
motorControl(1, speed, true);
}
定点旋转:
arduino复制void rotateCW(int speed) {
motorControl(0, speed, true);
motorControl(1, speed, false);
}
缓启动曲线:
arduino复制void smoothStart(int targetSpeed) {
for(int i=0; i<targetSpeed; i+=5) {
motorControl(0, i, true);
motorControl(1, i, true);
delay(30);
}
}
这段增强版串口协议支持交互式测试:
arduino复制void handleSerial() {
if(Serial.available()) {
char cmd = Serial.read();
int val = Serial.parseInt();
switch(cmd) {
case 'F': // 前进
motorControl(0, val, true);
motorControl(1, val, true);
break;
case 'B': // 后退
motorControl(0, val, false);
motorControl(1, val, false);
break;
case 'L': // 左转
motorControl(0, val*0.6, true);
motorControl(1, val, true);
break;
// 更多指令...
}
}
}
发送"F200"即可让小车以200速度前进,调试时特别方便。
加装HC-SR04超声波模块后,代码只需增加这几行:
arduino复制#define TRIG_PIN 7
#define ECHO_PIN 8
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
return pulseIn(ECHO_PIN, HIGH) * 0.034/2;
}
void autoAvoid() {
if(getDistance() < 20) {
motorControl(0, 200, false);
motorControl(1, 200, true);
delay(300);
}
}
用HC-05模块实现安卓控制的关键配置:
AT命令模式设置:
code复制AT+NAME=MyCar
AT+PSWD=1234
AT+UART=9600,0,0
APP端开发:
使用MIT App Inventor拖拽控件即可创建控制界面
协议解析:
arduino复制if(Serial1.available()) { // 蓝牙使用Serial1
char c = Serial1.read();
// 解析控制指令...
}
经过多次迭代,这些小改动能显著提升体验:
最后分享一个真实教训:第一次测试时没固定好电池盒,小车启动瞬间电池飞出去砸坏了电视。现在我的所有项目都会用尼龙扎带+泡棉胶双重固定电源。