亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车

概述

本教程将学习如何无线控制上期制作的 Arduino 机器人小车。展示三种无线控制方法:HC-05 蓝牙模块、NRF24L01 收发模块、HC-12 长距离无线模块,以及用智能手机和自制 Android App 控制。可观看视频或阅读图文教程。

各模块连接使用教程已有,文中提供链接。

HC-05 蓝牙模块控制 Arduino 机器人小车

需两个 HC-05,用 AT 命令配置主从:摇杆端为主,小车端为从。

用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车
用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 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)。

用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车
用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车
用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车

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 及素材可下载:

用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车

Arduino_Robot_Car_Joystick_App.apk

1 file(s) 1.62 MB Download 用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车

Arduino_Robot_Car_Joystick_App_aia_file

1 file(s) 171.20 KB Download 用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车

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 收发模块控制

用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车
用 HC-05 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车

电路图: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 蓝牙、NRF24L01、HC-12 无线控制 Arduino 机器人小车

发射端代码(同 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);
}

以上就是本教程全部内容。欢迎在评论区提问。

制造工艺

  1. 蓝牙控制树莓派机器人:语音反馈功能构建指南
  2. 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
  3. Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
  4. Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
  5. Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
  6. 智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
  7. 通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
  8. 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
  9. 无线Arduino编程盾:HC-05蓝牙模块实现免USB线烧录
  10. 使用 Arduino Uno 和蓝牙实现遥控小车:分步指南
  11. 手势控制电脑:Arduino + Python 实现无接触操作 VLC 播放器
  12. 自制 AI 助手机器人:Arduino 与 Python 协同实现语音交互与肢体动作