树莓派智能小车:手机蓝牙遥控
paopaola2026-07-014636
之前实现的是小车自主避障,这期我们来加蓝牙模块——掏出手机就能遥控小车,不用连显示器也不用开SSH。
👉 配合B站视频看更直观

一、HC-05蓝牙模块参数
| 参数 | 值 |
|---|---|
| 工作电压 | 3.3V ~ 5V |
| 通信方式 | 串口(UART) |
| 默认波特率 | 9600(AT模式38400) |
| 通信距离 | 约10米(空旷) |
| 配对密码 | 1234 或 0000 |
二、硬件接线
| HC-05 | 树莓派 |
|---|---|
| VCC | 5V(Pin 2或4) |
| GND | GND(Pin 6等) |
| TXD | GPIO 15(RX, Pin 10) |
| RXD | GPIO 14(TX, Pin 8) |
| STATE/EN | 不接 |
注意:HC-05的RXD接树莓派TX,TXD接树莓派RX——交叉接,这叫"串口交叉线"。
HC-05是3.3V逻辑电平,可以直接接树莓派GPIO,不用分压。
三、配置树莓派串口
树莓派默认把UART串口给了蓝牙,需要先切回来:
# 1. 编辑config.txt
sudo nano /boot/config.txt
# 在文件末尾加上
enable_uart=1
# 2. 禁用蓝牙串口服务
sudo systemctl disable hciuart
# 3. 重启
sudo reboot
重启后检查串口设备:
ls -l /dev/serial*
# 应该能看到 /dev/ttyAMA0
四、配置HC-05(AT模式)
首次使用HC-05需要进AT模式配置:按住模块上的按键再通电,LED会慢闪(约2秒一次),表示进入AT模式。
安装minicom测试串口:
sudo apt install minicom -y
sudo minicom -D /dev/ttyAMA0 -b 38400 -o
输入AT指令(注意加回车):
AT # 测试通信,返回OK
AT+NAME=paopaola-car # 改蓝牙名称
AT+PSWD=1234 # 设置配对密码
AT+UART=9600,0,0 # 设置波特率9600
AT+ROLE=0 # 设置为主从模式(从模式)
AT+CMODE=1 # 任意设备可连接
配置完成后重新上电,这次不用按按键,LED快速闪烁表示等待配对。
五、手机配对
- 打开手机蓝牙,搜索设备,找到"paopaola-car"
- 配对密码1234
- 配对成功后安装"Serial Bluetooth Terminal"或"蓝牙串口助手"APP
- 在APP里连接paopaola-car
六、Python蓝牙遥控代码
import RPi.GPIO as GPIO
import serial
import time
# 电机引脚
IN1, IN2, IN3, IN4 = 17, 18, 22, 23
ENA, ENB = 27, 24
GPIO.setmode(GPIO.BCM)
GPIO.setup([IN1, IN2, IN3, IN4, ENA, ENB], GPIO.OUT)
pwmA = GPIO.PWM(ENA, 100)
pwmB = GPIO.PWM(ENB, 100)
pwmA.start(0); pwmB.start(0)
# 打开蓝牙串口
ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
def forward(s=80):
GPIO.output(IN1, GPIO.HIGH); GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH); GPIO.output(IN4, GPIO.LOW)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def backward(s=60):
GPIO.output(IN1, GPIO.LOW); GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW); GPIO.output(IN4, GPIO.HIGH)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def turn_left(s=60):
GPIO.output(IN1, GPIO.LOW); GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH); GPIO.output(IN4, GPIO.LOW)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def turn_right(s=60):
GPIO.output(IN1, GPIO.HIGH); GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW); GPIO.output(IN4, GPIO.HIGH)
pwmA.ChangeDutyCycle(s); pwmB.ChangeDutyCycle(s)
def stop():
GPIO.output([IN1, IN2, IN3, IN4], GPIO.LOW)
pwmA.ChangeDutyCycle(0); pwmB.ChangeDutyCycle(0)
print("等待蓝牙连接...")
try:
while True:
if ser.in_waiting > 0:
cmd = ser.read().decode('utf-8', errors='ignore')
if cmd == 'F': # 前进
forward()
print("前进")
elif cmd == 'B': # 后退
backward()
print("后退")
elif cmd == 'L': # 左转
turn_left()
print("左转")
elif cmd == 'R': # 右转
turn_right()
print("右转")
elif cmd == 'S': # 停止
stop()
print("停止")
elif cmd == '0': # 速度0~9(停止~全速)
stop()
elif cmd in '123456789':
speed = int(cmd) * 10
# 继续当前方向但改变速度
print(f"速度: {speed}%")
time.sleep(0.05)
except KeyboardInterrupt:
stop()
ser.close()
GPIO.cleanup()
七、APP按键配置
在"Serial Bluetooth Terminal"APP中配置按键:
- ↑ 发送 F(前进)
- ↓ 发送 B(后退)
- ← 发送 L(左转)
- → 发送 R(右转)
- ■ 发送 S(停止)
- 数字键 1~9 调速
八、进阶扩展思路
- 语音控制:用百度语音识别API,手机说话就能控制小车
- 图传:加USB摄像头,用mjpg-streamer实现实时画面回传
- Web控制:在树莓派上跑Flask,手机浏览器打开网页就能遥控
- 远程控制:接4G模块或连WiFi路由器,实现外网遥控
到这期为止,树莓派智能小车从配件到整车、从基础驱动到蓝牙遥控,整个系列教程就告一段落了。这个框架搭好之后,往上加什么功能都行,全看你的想象力!
全部代码和教程在 www.paopaola.com 可以找到,有问题进QQ群241350086交流。


微信联系
淘宝联系