使用 Arduino Uno 和蓝牙实现遥控小车:分步指南
组件与物料
| Arduino UNO | ×1 |
| SparkFun 双 H 桥电机驱动板 L298 | ×1 |
所需工具与设备
| 3D 打印机(通用) |
应用与在线服务
| MIT App Inventor 2 |
| Arduino IDE |
项目简介
我想远程控制一辆小车,尝试了多种方案后决定采用蓝牙通信。准备好所需硬件并编写软件后,这个项目成为了我在 Hackster 上发布的第二个作品。

代码
Arduino 代码
char buffer[67];
byte Pino02 = 2;
byte Pino03 = 3;
byte Pino04 = 4;
byte Pino05 = 5;
byte Pino06 = 6;
byte Pino07 = 7;
byte Pino12 = 12;
byte Pino13 = 13;
void setup() {
Serial.begin(9600);
Serial.flush();
pinMode(Pino02, OUTPUT);
pinMode(Pino03, OUTPUT);
pinMode(Pino04, OUTPUT);
pinMode(Pino05, OUTPUT);
pinMode(Pino06, OUTPUT);
pinMode(Pino07, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
int index = 0;
delay(100); // 等待缓冲区填满
int numChar = Serial.available();
if (numChar > 65) numChar = 65;
while (numChar--) {
buffer[index++] = Serial.read();
}
splitString(buffer);
}
}
void splitString(char* data) {
Serial.print("接收数据: ");
Serial.println(data);
char* parameter;
parameter = strtok(data, " ,");
while (parameter != NULL) {
setLED(parameter);
parameter = strtok(NULL, " ,");
}
// 清空缓冲区
for (int x = 0; x < 66; x++) {
buffer[x] = '\0';
}
Serial.flush();
}
void setLED(char* data) {
// 前进左转
if (data[0] == 'A') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 前进右转
if (data[0] == 'C') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 后退1
if (data[0] == 'B') {
analogWrite(9, 25); analogWrite(10, 25);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 后退2
if (data[0] == 'M') {
analogWrite(9, 75); analogWrite(10, 75);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 后退3
if (data[0] == 'N') {
analogWrite(9, 125); analogWrite(10, 125);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 后退4
if (data[0] == 'P') {
analogWrite(9, 175); analogWrite(10, 175);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 后退5
if (data[0] == 'L') {
analogWrite(9, 225); analogWrite(10, 225);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
}
// 前进1
if (data[0] == 'D') {
analogWrite(9, 25); analogWrite(10, 25);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 前进2
if (data[0] == 'H') {
analogWrite(9, 75); analogWrite(10, 75);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 前进3
if (data[0] == 'I') {
analogWrite(9, 125); analogWrite(10, 125);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 前进4
if (data[0] == 'K') {
analogWrite(9, 175); analogWrite(10, 175);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 前进5
if (data[0] == 'L') {
analogWrite(9, 225); analogWrite(10, 225);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
digitalWrite(12, HIGH); digitalWrite(13, LOW);
}
// 停止
if (data[0] == 'U') {
digitalWrite(Pino02, LOW); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, LOW);
digitalWrite(12, LOW); digitalWrite(13, LOW);
}
// 慢速前进
if (data[0] == 'E') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, LOW); digitalWrite(Pino03, HIGH);
digitalWrite(Pino04, LOW); digitalWrite(Pino05, HIGH);
}
// 慢速后退
if (data[0] == 'F') {
analogWrite(9, 50); analogWrite(10, 50);
digitalWrite(Pino02, HIGH); digitalWrite(Pino03, LOW);
digitalWrite(Pino04, HIGH); digitalWrite(Pino05, LOW);
}
}
自定义零件与外壳
arduinoslider2_dxxyKBsRDa.apk
制造工艺
- 集成二维码、RFID与体温验证的门禁控制系统
- 树莓派 + Arduino UNO + 三星 SAMI 极速构建火灾检测系统
- 自制 Arduino 伊斯兰祷告时间实时时钟
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- Arduino Nano + 摇杆控制双步进电机:Visuino 图形化教程
- Arduino Uno驱动MAX7219级联8×8 LED矩阵:从入门到动画显示
- 用 Arduino Uno 和 1Sheeld 构建 4x4x4 LED 立方体 - 互动音乐可视化项目
- 蓝牙控制 8×8 LED 点阵滚动显示:Arduino Nano + MAX7219
- Arduino 智能咖啡机:蓝牙控制、温度曲线与自动启停
- 语音控制 LED:Arduino Micro + BitVoicer Server 语音识别实战
- Arduino Uno 控制 25kHz 4 针 PWM 风扇 - 硬件、代码与测试