用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车
概述
本教程将学习如何无线控制上期制作的 Arduino 机器人小车。展示三种无线控制方法:HC-05 蓝牙模块、NRF24L01 收发模块、HC-12 长距离无线模块,以及用智能手机和自制 Android App 控制。可观看视频或阅读图文教程。
各模块连接使用教程已有,文中提供链接。
HC-05 蓝牙模块控制 Arduino 机器人小车
需两个 HC-05,用 AT 命令配置主从:摇杆端为主,小车端为从。


所需组件:
- HC-05 蓝牙模块
- 摇杆模块
- 18650 电池
- 18650 充电板
- L298N 驱动
- 12V 高扭矩直流电机
- Arduino 开发板
源代码
基于上期直接摇杆控制代码修改。
HC-05 主设备代码(摇杆端)
/* Arduino 机器人小车无线控制 HC-05 == 主设备 - 摇杆 == by Dejan Nedelkovski, www.HowToMechatronics.com */
int xAxis, yAxis;
void setup() { Serial.begin(38400); }
void loop() {
xAxis = analogRead(A0);
yAxis = analogRead(A1);
Serial.write(xAxis/4); // 0-1023 -> 0-255 (1字节)
Serial.write(yAxis/4);
delay(20);
}
主设备读取摇杆 X/Y,除 4 压缩为 0-255 单字节,串口发送给从机。
HC-05 从设备代码片段(小车端)
// 从 Arduino 机器人小车代码
while (Serial.available() >= 2) {
x = Serial.read(); delay(10);
y = Serial.read();
}
xAxis = x*4; // 还原 0-1023
yAxis = y*4;
从机收到 2 字节后读取,乘 4 还原为 0-1023 供电机控制代码使用。上传代码时需断开 RX/TX。
完整 HC-05 从设备代码
/* Arduino 机器人小车无线控制 HC-05 == 从设备 - Arduino 机器人小车 == by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9 #define in1 4 #define in2 5
#define enB 10 #define in3 6 #define in4 7
int xAxis, yAxis; unsigned int x=0, y=0;
int motorSpeedA=0, motorSpeedB=0;
void setup() {
pinMode(enA,OUTPUT); pinMode(enB,OUTPUT);
pinMode(in1,OUTPUT); pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT); pinMode(in4,OUTPUT);
Serial.begin(38400);
}
void loop() {
x = 510/4; y = 510/4; // 默认中位
while (Serial.available() >= 2) { x=Serial.read(); delay(10); y=Serial.read(); }
delay(10);
xAxis = x*4; yAxis = y*4;
// Y 轴前进后退
if (yAxis < 470) { digitalWrite(in1,HIGH); digitalWrite(in2,LOW); digitalWrite(in3,HIGH); digitalWrite(in4,LOW); motorSpeedA=map(yAxis,470,0,0,255); motorSpeedB=map(yAxis,470,0,0,255); }
else if (yAxis > 550) { digitalWrite(in1,LOW); digitalWrite(in2,HIGH); digitalWrite(in3,LOW); digitalWrite(in4,HIGH); motorSpeedA=map(yAxis,550,1023,0,255); motorSpeedB=map(yAxis,550,1023,0,255); }
else { motorSpeedA=0; motorSpeedB=0; }
// X 轴左右转向
if (xAxis < 470) { int xMapped=map(xAxis,470,0,0,255); motorSpeedA-=xMapped; motorSpeedB+=xMapped; if(motorSpeedA<0)motorSpeedA=0; if(motorSpeedB>255)motorSpeedB=255; }
if (xAxis > 550) { int xMapped=map(xAxis,550,1023,0,255); motorSpeedA+=xMapped; motorSpeedB-=xMapped; if(motorSpeedA>255)motorSpeedA=255; if(motorSpeedB<0)motorSpeedB=0; }
// 低速防抖
if (motorSpeedA<70) motorSpeedA=0; if (motorSpeedB<70) motorSpeedB=0;
analogWrite(enA,motorSpeedA); analogWrite(enB,motorSpeedB);
}
智能手机 + 自制 Android App 控制
小车电路同 HC-05 从机模式。用 MIT App Inventor 制作 App 模拟摇杆(两个 ImageSprite)。



App 逻辑:拖动摇杆球移动到手指位置,同时发送 X/Y 蓝牙数据。Arduino 用 Serial.read 同方式接收。App 返回的 X/Y 范围 60-220,用 map() 转 0-1023。
while (Serial.available() >= 2) { x=Serial.read(); delay(10); y=Serial.read(); }
if (x>60 & x<220) xAxis=map(x,220,60,1023,0);
if (y>60 & y<220) yAxis=map(y,220,60,0,1023);
松手时球回中并发送停止值。App 及素材可下载:
Arduino_Robot_Car_Joystick_App.apk
1 file(s) 1.62 MB Download
Arduino_Robot_Car_Joystick_App_aia_file
1 file(s) 171.20 KB Download
Joystick App Images
1 file(s) 44.36 KB Download完整 Arduino 代码(App 版)
/* Arduino 机器人小车无线控制 HC-05 + 自制 Android App == 从设备 == by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9 #define in1 4 #define in2 5
#define enB 10 #define in3 6 #define in4 7
int xAxis, yAxis; int x=0, y=0;
int motorSpeedA=0, motorSpeedB=0;
void setup() {
pinMode(enA,OUTPUT); pinMode(enB,OUTPUT);
pinMode(in1,OUTPUT); pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT); pinMode(in4,OUTPUT);
Serial.begin(38400);
}
void loop() {
xAxis=510; yAxis=510;
while (Serial.available() >= 2) { x=Serial.read(); delay(10); y=Serial.read(); }
delay(10);
if (x>60 & x<220) xAxis=map(x,220,60,1023,0);
if (y>60 & y<220) yAxis=map(y,220,60,0,1023);
// 电机控制逻辑同上...
analogWrite(enA,motorSpeedA); analogWrite(enB,motorSpeedB);
}
NRF24L01 收发模块控制


电路图:NRF24L01 用 SPI,故 L298N 的 ENA/ENB 改接引脚 2/3。需安装 RF24 库。
发射端代码(摇杆)
/* Arduino 机器人小车无线控制 NRF24L01 == 发射端 - 摇杆 == by Dejan Nedelkovski, www.HowToMechatronics.com
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h>
RF24 radio(8,9); const byte address[6]="00001";
char xyData[32]=""; String xAxis, yAxis;
void setup() { Serial.begin(9600); radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); }
void loop() {
xAxis=analogRead(A0); yAxis=analogRead(A1);
xAxis.toCharArray(xyData,5); radio.write(&xyData,sizeof(xyData));
yAxis.toCharArray(xyData,5); radio.write(&xyData,sizeof(xyData));
delay(20);
}
模拟值转字符串再 toCharArray 入字符数组,radio.write 发送。
接收端代码片段(小车)
if (radio.available()) {
radio.read(&receivedData,sizeof(receivedData));
xAxis=atoi(&receivedData[0]); delay(10);
radio.read(&receivedData,sizeof(receivedData));
yAxis=atoi(&receivedData[0]); delay(10);
}
radio.read 读入字符数组,atoi() 转整数供电机控制用。
完整接收端代码
/* Arduino 机器人小车无线控制 NRF24L01 == 接收端 - Arduino 机器人小车 == by Dejan Nedelkovski, www.HowToMechatronics.com
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h>
#define enA 2 #define in1 4 #define in2 5
#define enB 3 #define in3 6 #define in4 7
RF24 radio(8,9); const byte address[6]="00001";
char receivedData[32]=""; int xAxis, yAxis;
int motorSpeedA=0, motorSpeedB=0;
void setup() {
pinMode(enA,OUTPUT); pinMode(enB,OUTPUT);
pinMode(in1,OUTPUT); pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT); pinMode(in4,OUTPUT);
Serial.begin(9600);
radio.begin(); radio.openReadingPipe(0,address); radio.setPALevel(RF24_PA_MIN); radio.startListening();
}
void loop() {
if (radio.available()) {
radio.read(&receivedData,sizeof(receivedData));
xAxis=atoi(&receivedData[0]); delay(10);
radio.read(&receivedData,sizeof(receivedData));
yAxis=atoi(&receivedData[0]); delay(10);
}
// 电机控制逻辑同上...
analogWrite(enA,motorSpeedA); analogWrite(enB,motorSpeedB);
}
HC-12 长距离收发模块控制
HC-12 通讯距离达 1.8km,串口通信方式与 HC-05 类似。

发射端代码(同 HC-05 主机)
/* Arduino 机器人小车无线控制 HC-12 == 发射端 - 摇杆 == by Dejan Nedelkovski, www.HowToMechatronics.com */
int xAxis, yAxis;
void setup() { Serial.begin(9600); }
void loop() {
xAxis=analogRead(A0); yAxis=analogRead(A1);
Serial.write(xAxis/4); Serial.write(yAxis/4); delay(20);
}
接收端代码(同 HC-05 从机,波特率 9600)
/* Arduino 机器人小车无线控制 HC-12 == 接收端 - Arduino 机器人小车 == by Dejan Nedelkovski, www.HowToMechatronics.com */
#define enA 9 #define in1 4 #define in2 5
#define enB 10 #define in3 6 #define in4 7
int xAxis, yAxis; int x=0, y=0;
int motorSpeedA=0, motorSpeedB=0;
void setup() {
pinMode(enA,OUTPUT); pinMode(enB,OUTPUT);
pinMode(in1,OUTPUT); pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT); pinMode(in4,OUTPUT);
Serial.begin(9600);
}
void loop() {
xAxis=510; yAxis=510;
while (Serial.available()==0) {}
x=Serial.read(); delay(10); y=Serial.read(); delay(10);
xAxis=x*4; yAxis=y*4;
// 电机控制逻辑同上...
analogWrite(enA,motorSpeedA); analogWrite(enB,motorSpeedB);
}
以上就是本教程全部内容。欢迎在评论区提问。
制造工艺
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
- 智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
- 通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- 无线Arduino编程盾:HC-05蓝牙模块实现免USB线烧录
- 使用 Arduino Uno 和蓝牙实现遥控小车:分步指南
- 手势控制电脑:Arduino + Python 实现无接触操作 VLC 播放器
- 自制 AI 助手机器人:Arduino 与 Python 协同实现语音交互与肢体动作