50元自制Arduino蓝牙遥控机器人:从零搭建两轮差分驱动小车
1. 项目背景与核心概念最近在整理工作室的旧零件时发现手头有不少闲置的舵机、Arduino开发板和几个旧玩具车的轮子。一个想法冒了出来能不能用最低的成本把这些“电子垃圾”组合成一个能跑、能遥控的桌面小机器人经过一番折腾最终用不到50元的额外开销成功实现了一个功能完整的轮式机器人。这不仅仅是废物利用更是一次对嵌入式开发、电机控制和简单机械结构的绝佳实践。这个项目非常适合电子爱好者、嵌入式初学者或任何想动手体验机器人乐趣的朋友。它不追求复杂的算法和昂贵的传感器核心在于理解如何用最基础的硬件实现“运动”这个机器人最根本的能力。通过本文你将掌握从零开始搭建一个两轮差分驱动机器人的完整流程包括硬件选型、电路连接、代码编写和遥控实现。最终你将获得一个可以放在桌面上通过手机或电脑指令灵活移动的智能小车。2. 硬件清单与成本核算实现这个项目的核心是“利用手头闲置按需低价采购”。以下是详细的物料清单和成本分析总价严格控制在50元以内。2.1 核心控制器大脑主控板Arduino Nano 或 Arduino Uno 兼容板来源建议很多朋友学习Arduino后板子就闲置了可以借用或从二手平台淘换。如果购买一片CH340芯片的Arduino Nano兼容板价格通常在10-15元。作用作为机器人的大脑运行控制程序处理指令并输出信号控制电机。2.2 动力与执行机构手脚减速电机 x 2来源建议这是成本大头。推荐使用N20微型减速电机带减速箱扭矩适中非常适合桌面小车。全新的价格一对大约15-20元。更省钱的办法是拆解旧玩具车、光驱或打印机通常能找到可用的直流电机但需要自己配轮子。作用提供机器人移动的动力。我们采用两轮差分驱动结构即通过控制左右两个轮子的转速和方向来实现前进、后退、转向。电机驱动模块L298N 或 TB6612FNG 驱动板来源建议L298N模块非常普遍价格约6-8元。TB6612FNG效率更高、发热更小价格稍贵约10-12元。本项目以L298N为例。作用Arduino的IO口输出电流很小约20mA无法直接驱动电机需要几百mA。电机驱动模块就是一个“电流放大器”接收Arduino的小信号然后输出大电流来控制电机的启停、转速和方向。轮子 x 2来源建议最好与电机配套购买。如果使用拆机电机可以用3D打印轮子或者用瓶盖、积木等材料自制。成本约2-5元。万向轮或牛眼轮 x 1来源建议用于支撑车身保持平衡。可以用一个乐高小球轮或者甚至用一个光滑的塑料瓶盖代替。成本约1-3元或零成本。2.3 电源系统心脏电池18650锂电池 x 2 或 7.4V 锂电池组来源建议旧充电宝、旧笔记本电池包里经常有18650电池。确保电池状态良好。如果购买两节带电池盒约15元。注意电机驱动和Arduino需要不同的电压后续电路部分会详细说明。作用为整个系统供电。电机需要较高的电压如7.4V来获得足够扭矩而Arduino需要稳定的5V电压。电源开关 x 1来源建议自锁开关价格约1元。杜邦线公对公、公对母若干来源建议电子制作必备一捆约5元可以用于很多项目。2.4 车体与连接骨架底盘来源建议零成本方案的首选可以使用厚亚克力板、废弃的塑料板、甚至多层硬纸板涂白乳胶加固。本项目使用一块大约10x15cm的亚克力板边角料。固定材料来源建议螺丝螺母、尼龙扎带、热熔胶枪借用或已有。成本约2元。2.5 遥控方案可选二选一方案A蓝牙遥控推荐成本低易实现HC-05 或 HC-06 蓝牙模块 x 1价格约10元。遥控端手机上下载一个通用的“蓝牙串口”APP如Arduino Bluetooth Controller即可免费。方案BWi-Fi遥控可玩性高ESP-01s (ESP8266) 模块 x 1价格约8元。遥控端手机或电脑浏览器通过Wi-Fi网页控制。成本总计我们按需采购计算。假设你手头有Arduino板和电池那么只需要购买电机18元驱动模块7元蓝牙模块10元轮子等杂项5元40元。即使全部采购也很容易控制在50元预算内。3. 机械结构与电路搭建3.1 车体组装设计布局在底盘上规划好位置。通常将两个驱动电机安装在底盘前部或后部的左右两侧万向轮安装在底盘中部另一侧形成稳定的三点支撑。电池和主控板放在中间以平衡重心。固定电机使用螺丝或强力的热熔胶将两个减速电机牢固地安装在底盘两侧。确保电机的输出轴方向一致并且轮子能顺畅转动不摩擦底盘。安装万向轮在底盘另一端中心位置安装万向轮。安装主控与电池用尼龙扎带或螺丝将Arduino板和电池盒固定在底盘上。注意留出连接线的空间。3.2 电路连接详解这是项目的核心务必仔细。我们使用L298N驱动两个电机并通过蓝牙模块接收指令。供电方案是电池同时给L298N和Arduino供电但需注意电压匹配。连接原理图文字描述电源部分将两节18650电池串联约7.4V正负极接入L298N驱动板的12V和GND接线端子。虽然标12V但7.4V完全可用关键步骤将L298N驱动板上的5V输出端子用一根导线连接到Arduino板的5V引脚。这样L298N内部的稳压电路就将电池电压降压成了稳定的5V给Arduino供电。同时确保L298N和Arduino的GND地线用导线连接在一起共地这是电路正常工作的基础。电机连接将左侧电机两根线接入L298N的OUT1和OUT2端子。将右侧电机两根线接入L298N的OUT3和OUT4端子。如果电机转向与预期相反只需对调这两根线即可。控制信号连接Arduino - L298NL298N的IN1引脚 - ArduinoD5引脚L298N的IN2引脚 - ArduinoD6引脚L298N的IN3引脚 - ArduinoD9引脚L298N的IN4引脚 - ArduinoD10引脚这四路信号用于控制两个电机的正反转。L298N的ENA引脚 - ArduinoD3引脚 (PWM)L298N的ENB引脚 - ArduinoD11引脚 (PWM)这两个PWM引脚用于控制两个电机的速度。蓝牙模块连接HC-05HC-05的VCC- Arduino5VHC-05的GND- ArduinoGNDHC-05的TXD- ArduinoRX(D0)HC-05的RXD- ArduinoTX(D1)注意烧录程序时需暂时断开蓝牙模块的TXD/RXD与Arduino的连接否则可能干扰串口通信导致上传失败。接线核对表Arduino引脚连接至功能说明5VL298N 5V端子 HC-05 VCC提供5V电源GNDL298N GND端子 HC-05 GND公共地线D3 (PWM)L298N ENA左侧电机调速D5L298N IN1左侧电机方向控制1D6L298N IN2左侧电机方向控制2D9L298N IN3右侧电机方向控制1D10L298N IN4右侧电机方向控制2D11 (PWM)L298N ENB右侧电机调速RX (D0)HC-05 TXD接收蓝牙数据TX (D1)HC-05 RXD发送蓝牙数据4. 核心控制程序编写我们将程序分为几个部分引脚定义、电机控制函数、蓝牙指令解析和主循环逻辑。4.1 Arduino代码全解析创建一个新的Arduino项目将以下代码复制进去。请根据你的实际接线修改引脚定义。// 文件desktop_robot.ino // 定义L298N控制引脚 const int LEFT_MOTOR_EN 3; // 左侧电机使能PWM const int LEFT_MOTOR_IN1 5; const int LEFT_MOTOR_IN2 6; const int RIGHT_MOTOR_EN 11; // 右侧电机使能PWM const int RIGHT_MOTOR_IN3 9; const int RIGHT_MOTOR_IN4 10; // 电机速度值 (0-255, PWM调节) int motorSpeed 150; // 默认速度 void setup() { // 初始化所有控制引脚为输出模式 pinMode(LEFT_MOTOR_EN, OUTPUT); pinMode(LEFT_MOTOR_IN1, OUTPUT); pinMode(LEFT_MOTOR_IN2, OUTPUT); pinMode(RIGHT_MOTOR_EN, OUTPUT); pinMode(RIGHT_MOTOR_IN3, OUTPUT); pinMode(RIGHT_MOTOR_IN4, OUTPUT); // 初始化串口通信用于蓝牙模块和调试 Serial.begin(9600); Serial.println(Robot Ready! Send commands:); Serial.println(F: Forward, B: Backward, L: Turn Left, R: Turn Right, S: Stop); Serial.println(1-9: Set Speed (1slow, 9fast)); } // 自定义函数控制单个电机动作 void setMotor(int enPin, int inAPin, int inBPin, int speed, bool direction) { // direction: true forward, false backward analogWrite(enPin, speed); // 设置PWM速度 if (direction) { digitalWrite(inAPin, HIGH); digitalWrite(inBPin, LOW); } else { digitalWrite(inAPin, LOW); digitalWrite(inBPin, HIGH); } } // 自定义函数控制机器人动作 void robotMove(char cmd) { switch (cmd) { case F: // 前进 setMotor(LEFT_MOTOR_EN, LEFT_MOTOR_IN1, LEFT_MOTOR_IN2, motorSpeed, true); setMotor(RIGHT_MOTOR_EN, RIGHT_MOTOR_IN3, RIGHT_MOTOR_IN4, motorSpeed, true); Serial.println(Moving FORWARD); break; case B: // 后退 setMotor(LEFT_MOTOR_EN, LEFT_MOTOR_IN1, LEFT_MOTOR_IN2, motorSpeed, false); setMotor(RIGHT_MOTOR_EN, RIGHT_MOTOR_IN3, RIGHT_MOTOR_IN4, motorSpeed, false); Serial.println(Moving BACKWARD); break; case L: // 左转 (左轮后退右轮前进) setMotor(LEFT_MOTOR_EN, LEFT_MOTOR_IN1, LEFT_MOTOR_IN2, motorSpeed, false); setMotor(RIGHT_MOTOR_EN, RIGHT_MOTOR_IN3, RIGHT_MOTOR_IN4, motorSpeed, true); Serial.println(Turning LEFT); break; case R: // 右转 (左轮前进右轮后退) setMotor(LEFT_MOTOR_EN, LEFT_MOTOR_IN1, LEFT_MOTOR_IN2, motorSpeed, true); setMotor(RIGHT_MOTOR_EN, RIGHT_MOTOR_IN3, RIGHT_MOTOR_IN4, motorSpeed, false); Serial.println(Turning RIGHT); break; case S: // 停止 // 将两个使能引脚设为LOW快速刹车 analogWrite(LEFT_MOTOR_EN, 0); analogWrite(RIGHT_MOTOR_EN, 0); // 也可以将方向引脚都设为LOW滑行停止 // digitalWrite(LEFT_MOTOR_IN1, LOW); // digitalWrite(LEFT_MOTOR_IN2, LOW); // digitalWrite(RIGHT_MOTOR_IN3, LOW); // digitalWrite(RIGHT_MOTOR_IN4, LOW); Serial.println(STOP); break; default: // 如果不是移动指令则可能是速度指令在loop中处理 break; } } void loop() { // 检查串口是否有数据可读来自蓝牙 if (Serial.available() 0) { char receivedChar Serial.read(); // 读取一个字符 // 处理移动指令 if (receivedChar F || receivedChar B || receivedChar L || receivedChar R || receivedChar S) { robotMove(receivedChar); } // 处理速度指令 ‘1’ 到 ‘9’ else if (receivedChar 1 receivedChar 9) { // 将字符‘1’-‘9’映射到速度值 50 - 250 motorSpeed map(receivedChar - 0, 1, 9, 80, 250); Serial.print(Speed set to: ); Serial.println(motorSpeed); } // 可选清空串口缓冲区防止指令堆积 while(Serial.available() 0) { Serial.read(); } } // 可以在这里添加其他非阻塞任务如传感器读取 }4.2 代码关键点解析PWM调速analogWrite(pin, value)函数用于向使能引脚ENA, ENB输出PWM信号。value范围0-255值越大电机平均电压越高转速越快。我们通过motorSpeed变量统一管理速度。方向控制通过设置IN1/IN2或IN3/IN4的电平组合来控制电机转向。HIGH/LOW和LOW/HIGH分别代表正转和反转LOW/LOW为滑行停止HIGH/HIGH为刹车但L298N一般不这么用我们采用使能端置零来刹车。差分转向左转时让左轮后退、右轮前进机器人就会以两轮中点为中心向左旋转。右转同理。这是两轮差分驱动平台转向的基本原理。串口通信Serial.begin(9600)初始化与蓝牙模块的通信。蓝牙模块相当于一个无线串口手机APP发送的字符如‘F’会通过串口传递给Arduino。指令映射程序定义了简单的字符指令集易于理解和扩展。你可以通过修改robotMove函数和loop中的判断逻辑来增加新功能。5. 蓝牙连接与遥控测试5.1 手机APP配置在手机应用商店搜索并安装一个通用的“蓝牙串口”APP例如Serial Bluetooth Terminal、Arduino Bluetooth Controller等。打开手机蓝牙然后给机器人上电。打开蓝牙串口APP扫描蓝牙设备。你应该能找到一个名为 “HC-05” 或类似名称的设备默认配对密码通常是1234或0000。点击连接该设备。5.2 测试与操控连接成功后APP通常会有一个发送字符的输入框或预设按钮。在APP中设置按钮分别发送字符F,B,L,R,S。也可以直接输入字符发送。观察机器人的动作是否与预期一致前进、后退、左转、右转、停止。发送数字1到9来调节机器人的速度。调试技巧在Arduino IDE中打开串口监视器工具 - 串口监视器波特率设为9600你可以看到机器人接收到的指令和打印的状态信息这对于排查通信问题非常有帮助。6. 常见问题与排查思路在制作过程中你可能会遇到以下问题。这里提供系统的排查方法。问题现象可能原因排查步骤与解决方案机器人完全不动1. 电源未接通或电压不足。2. 主控板未正确供电或程序未上传。3. 电机驱动模块使能信号未开启。1. 检查电池是否有电开关是否打开用万用表测量驱动板电源输入端电压是否6V。2. 检查Arduino板上的电源指示灯是否亮起。重新上传一遍程序确认上传成功。3. 检查代码中ENA和ENB对应的引脚D3, D11是否已设置为OUTPUT模式并在动作函数中是否有analogWrite输出PWM值非0。只有一个轮子转1. 其中一个电机接线松动或损坏。2. 对应电机的驱动通道信号线连接错误或虚焊。3. 代码中对应电机的控制引脚定义错误。1. 交换两个电机的接线到驱动板如果原来不转的电机现在转了说明电机是好的问题在驱动板或信号线。2. 用万用表或示波器检查不转电机对应的Arduino控制引脚IN1/IN2/IN3/IN4, ENA/ENB在执行动作时是否有电平变化。3. 仔细核对代码中的引脚定义与实际接线是否完全一致。电机转动方向相反电机线序接反。将该电机连接驱动板输出端子的两根线对调即可。蓝牙连接不上1. 蓝牙模块未正确供电。2. 蓝牙模块处于AT指令模式。3. 手机未搜索到设备。1. 检查蓝牙模块VCC是否接5VGND是否共地。2. HC-05模块上电时若KEY引脚接高电平则进入AT模式指示灯慢闪此时无法被搜索。确保KEY引脚悬空或接低电平正常模式指示灯快闪。3. 尝试用手机其他蓝牙APP或电脑进行搜索确认模块是否完好。蓝牙连接后发送指令无反应1. 串口引脚冲突。2. 波特率不匹配。3. APP发送的指令格式不对。1.确保上传程序时已断开蓝牙模块的TXD/RXD与Arduino的连接上传完成后再接回。2. 检查代码中Serial.begin(9600)与蓝牙模块的波特率是否一致HC-05默认通常是9600。3. 打开Arduino串口监视器看手机发送指令时监视器是否有显示。确认APP发送的是单个字符且没有额外的回车换行符除非代码做了处理。电机有“滋滋”声但不转或无力1. 电源功率不足。2. 驱动板与电机不匹配或损坏。3. 机械阻力过大。1. 这是最常见的原因18650电池电量不足或劣质电池内阻大无法提供电机启动所需的大电流。尝试更换为满电、动力型的18650电池或使用7.4V锂电池组。2. L298N驱动能力有限如果电机堵转电流过大可能损坏。触摸L298N芯片是否异常发烫。3. 检查轮子是否被卡住传动是否顺畅。7. 功能扩展与进阶玩法基础功能实现后你可以以此为平台添加更多传感器和功能打造更智能的机器人。7.1 增加超声波避障硬件HC-SR04超声波模块约5元。连接VCC-5V, GND-GND, Trig-D7, Echo-D8。思路在loop函数中持续测量前方距离。当距离小于设定阈值如15cm时自动调用robotMove(B)后退然后robotMove(L)或robotMove(R)转弯实现简单避障。7.2 增加红外或PS2手柄遥控硬件红外接收头遥控器约8元或PS2手柄接收器约25元。优点比蓝牙APP操控手感更好指令更丰富。需要寻找对应的Arduino库并修改代码解析手柄信号。7.3 升级主控使用ESP32硬件用ESP32开发板约20元替代Arduino Nano。优势自带Wi-Fi和蓝牙性能更强引脚更多。可以直接通过网页WebSocket或手机APP进行更酷炫的控制甚至接入物联网平台。7.4 设计更美观的车壳使用3D打印或激光切割为你的机器人制作一个专属外壳。用废弃的塑料模型、乐高积木进行改装增加趣味性。这个50元桌面机器人的项目价值远不止于最终的玩具。它完整地串联了嵌入式开发的核心流程需求分析、硬件选型、电路设计、机械装配、固件编程、调试排错。当你看到自己亲手制作的机器人在指令下精准运动时那种成就感是单纯的购买成品无法比拟的。希望这个教程能成为你进入机器人世界的第一块敲门砖。