DIY 开源硬件项目

STM32 蓝牙遥控电动小船

基于 STM32F103C8T6 微控制器 + JDY-33 蓝牙模块 + React Native App 的全栈智能船舶控制系统。

STM32F103C8T6 JDY-33 BLE React Native TB6612 + SG90
向下滚动

从手机到螺旋桨的全链路控制

本项目构建了一艘可通过手机蓝牙遥控的电动小船。硬件基于 STM32F103C8T6 Blue Pill 微控制器,搭配 JDY-33 蓝牙模块实现无线通讯,使用 TB6612 驱动直流推进电机、SG90 舵机控制航向。手机端采用 React Native 开发,支持体感操控与安全保护机制。

整个系统的设计涵盖了嵌入式固件开发、自定义蓝牙通讯协议、移动端 App 开发以及硬件电路设计四个核心领域。从最底层的 STM32 HAL 驱动配置,到手机 App 上的体感操控界面,再到两者之间可靠的四字节通讯协议,构成了一个完整的 IoT 原型系统。

项目已完成 App 端全部功能开发(蓝牙扫描连接、体感/滑块舵机控制、电机渐进控制、心跳包机制),并输出了完整的 STM32 固件框架(蓝牙协议解析、PWM 舵机/电机驱动、3 秒超时安全停机)。

100 %
App 功能完成度
3
渐进加速时间
4
字节协议帧
140°
舵机转向范围

四层架构 · 完整数据链路

从手机 App 到螺旋桨,数据经过 BLE 无线传输、串口通讯、STM32 指令解析、再到外设驱动,每层职责清晰。

┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
                     React Native App
   ┌────────────┐  ┌────────────┐  ┌────────────┐  ┌─────────┐
   │ 蓝牙     │  │ 体感操控  │  │ 电机控制  │  │ 连接    │
   │ 管理     │  │ 舵机控制  │  │ 渐进加速  │  │ 状态    │
   └──┬─────┴───┘  └────────────┘  └────────────┘  └─────────┘
└─────────────┬─────────────────────────────────────────────────────┘
         │ BLE Wireless
         ▼
┌─────────────────────────────────────────────────────────────┐
                     JDY-33 蓝牙模块
                  UART (9600 bps, 8N1)
└────────────────────────────┬───────────────────────────────────┘
                         │ PA9 (TX) / PA10 (RX)
                         ▼
┌────────────────────────────────────────────────────┐
                  STM32F103C8T6
   ┌────────────┐  ┌────────────┐  ┌───────────────────┐
   │ 协议解析   │  │ 舵机控制   │  │ 电机控制           │
   │ 帧校验     │  │ TIM3_CH3  │  │ TIM2_CH2 + GPIO    │
   │ 心跳超时   │  │ PB0       │  │ PB1/PB2/PB3        │
   └────────────┘  └─────┬───────┘  └───────┬──────────────────┘
└────────────────────────┬───────────────┬──────────────────────┘
                          │                 │
                          ▼                 ▼
                    ┌──────────┐      ┌──────────┐
                    │  SG90   │      │ TB6612   │
                    │  舵机    │      │ 电机驱动  │
                    │ 20°~160°│      │  + 直流电机│
                    └──────────┘      └──────────┘

硬件连接拓扑

硬件连接图
硬件连接图
硬件物理连接图
硬件物理连接图

上图展示了完整的硬件接线方案。STM32F103C8T6 作为主控制器,通过 USART1(PA9/PA10)与 JDY-33 蓝牙模块通讯,接收手机端发来的控制指令。PB0 输出 50Hz PWM 信号驱动 SG90 舵机控制航向;PB1/PB2 控制 TB6612 电机驱动器的方向逻辑,PB3 输出 1kHz PWM 信号控制电机转速。

系统由 4 节 Eneloop Pro AA 电池(串联约 5V)供电,经 AMS1117-3.3 稳压至 3.3V 供给 STM32 和蓝牙模块。SPI1 接口(PB8/PB9)连接 SSD1306 OLED 显示屏,实时显示蓝牙连接状态、舵机角度和电机功率等系统信息。所有连接均采用标准排针/杜邦线,方便调试和修改。

🛠️ 硬件组件

  • STM32F103C8T6 Blue Pill — 主控制器
  • JDY-33 BLE 模块 — 蓝牙无线通讯
  • TB6612FNG 电机驱动 — 直流电机控制
  • SG90 舵机 — 航向控制 (20°~160°)
  • 6V 直流减速电机 + 螺旋桨 — 推进动力
  • SSD1306 OLED — 系统状态显示
  • AMS1117-3.3 稳压 — 电源管理
  • 4×Eneloop Pro AA — 整机供电

📱 软件架构

  • STM32 HAL — 外设驱动 / USART / TIM / SPI
  • 4 字节协议帧 — 0xAA + CMD + DATA + CHECKSUM
  • 蓝牙指令集 — 舵机 / 电机 / 心跳 (3 条命令)
  • React Native — 跨平台移动端 App
  • 渐进电机控制 — 3 秒从 0 到 100%
  • 体感操控 — 手机姿态映射舵机角度
  • 心跳保活 — 每秒一次,3 秒超时安全停机
  • react-native-ble-plx — 蓝牙 BLE 通讯

📡 数据流运转

  1. 手机端 体感 / 滑块触发 rudderAngle 变化
  2. BluetoothService 打包为 4 字节帧 [0xAA, 0x01, angle, checksum] 通过 BLE 发出
  3. JDY-33 接收数据,通过 UART (9600bps) 转发给 STM32
  4. STM32 串口中断逐字节接收,校验帧头、校验和,提取 CMD + DATA
  5. CMD 路由:0x01→ 设置舵机 PWM 占空比;0x02→ 设置电机方向 + PWM;0x03→ 刷新看门狗计时
  6. 3 秒超时:未收到任何指令时自动停机,舵机回中,电机停止

核心元器件选型

基于成本和易用性考量,主控选用 STM32F103C8T6 Blue Pill,蓝牙模块选用 JDY-33(穿透力强、稳定性好),电机驱动采用 TB6612FNG(3A 峰值电流)。

STM32F103C8T6

Blue Pill · Cortex-M3 · 72MHz · 20KB RAM · 64KB Flash
📡

JDY-33 蓝牙模块

BLE 4.2 · 弹簧天线 · 波特率 9600 · 3.3V
🔄

SG90 舵机

4.8~6V · 0.1s/60° · 1.5kg·cm 扭矩 · 20°~160° 行程
🏎️

TB6612FNG 电机驱动

双 H 桥 · 3A 峰值 · 2.7~5.5V 逻辑 · 电机 VM 最高 12V
🔋

4×Eneloop Pro AA

串联约 5V · 2450mAh · 低自放电
🖥️

SSD1306 OLED

128×64 · SPI 接口 · 3.3V · 显示系统状态
功能引脚外设连接设备
USART1_TXPA9串口发送JDY-33 RXD
USART1_RXPA10串口接收JDY-33 TXD
PWM 舵机PB0TIM3_CH3SG90 信号线
电机 IN1PB1GPIOTB6612 IN1
电机 IN2PB2GPIOTB6612 IN2
电机 PWMPB3TIM2_CH2TB6612 PWMA
OLED RESPB6GPIOSSD1306 RES
OLED DCPB7GPIOSSD1306 DC
SPI1_SCKPB8SPI1SSD1306 SCK
SPI1_MOSIPB9SPI1SSD1306 SDA

4 字节帧格式 · 轻量可靠

自定义蓝牙通讯协议,采用固定长度 4 字节帧,校验和确保数据完整性,适合低算力嵌入式环境。

帧结构

字节 0 0xAA ← 帧头
字节 1 CMD ← 命令字
字节 2 DATA ← 数据
字节 3 CHECKSUM ← (0xAA+CMD+DATA) & 0xFF
CMD命令DATA 范围
0x01舵机控制20~160(物理角度)
0x02电机控制0x00=停止 · 0x01~0x64=前进 · 0x81~0xE4=后退
0x03心跳包0x00

舵机角度映射

App 显示 → 舵机物理角度
-70° → 20°
-50° → 40°
0° → 90°
+50° → 140°
+70° → 160°

公式: 物理角度 = App显示角度 + 90
⚠️

安全机制

STM32 端实现 3 秒无指令自动停机:超过 3 秒未收到任何有效指令(含心跳包),立即停止电机并将舵机回中至 90°。App 端每秒发送一次心跳包(CMD=0x03)维持连接。

React Native 遥控器

使用 React Native 构建的跨平台遥控 App,集成蓝牙 BLE 连接、体感操控、渐进电机控制等完整功能链。

App 截图
App 截图 — 蓝牙遥控器操作界面

📶 蓝牙自动连接

启动时自动请求蓝牙权限,扫描并连接附近的 JDY-33 设备。支持手动设备选择和连接状态实时显示。

已实现

🔄 体感操控舵机

通过手机姿态传感器实时映射舵机角度(-70°~+70°),同时支持滑块手动控制,角度变化即时通过蓝牙发送。

已实现

⚡ 电机渐进加速

按住"全速前进"或"倒车后退"按钮,3 秒内 PWM 从 0 渐进到 100%。松开后以 2 倍速率快速减速至停止。互斥逻辑确保同时按住两个按钮时电机停止。

已实现

💓 心跳保活机制

蓝牙连接成功后每秒发送一次心跳包(CMD=0x03),确保 STM32 端的 3 秒超时安全机制不会误触发。

已实现

🖥️ OLED 状态显示

STM32 端 SSD1306 OLED 显示屏实时显示蓝牙连接状态、当前舵机角度和电机功率百分比,方便调试和运行监控。

已实现