Bluetooth Car & Remote Controller
A dual-unit system featuring wireless control and real-time telemetry.
Author: Oncioiu Miruna Elena
GitHub Project Link: https://github.com/UPB-PMRust-Students/acs-project-2026-Miruna-Oncioiu
Description
The project is a Bluetooth-based robotic system consisting of a 2-wheeled mobile car and a dedicated handheld remote. Both units utilize STM32 Nucleo-64 microcontrollers. The remote reads joystick inputs to transmit directional data, while the car processes these signals to drive two DC motors. The system also integrates a ToF sensor for distance monitoring and an OLED display for real-time telemetry.
Motivation
I chose this project to implement a robust Master-Slave communication link between two embedded devices. By building a custom remote controller instead of using a mobile app, I was able to manage the full data pipeline: from analog joystick acquisition to UART Bluetooth transmission and PWM motor execution.
Architecture
The system architecture is divided into two main hardware-software modules:
-
Remote Controller Unit
- Input: Analog Joystick (X/Y axes).
- Processing: ADC sampling and packet serialization.
- Output: Bluetooth TX (Commands).
-
Mobile Car Unit
- Input: Bluetooth RX (Command parsing).
- Processing: Movement logic and motor speed calculation.
- Output: PWM for Motor Driver, I2C for OLED and ToF Sensor.
Log
Week 13 - 19 April
- Project planning and component acquisition.
- Setup of the Rust development environment for STM32.
- Mechanical assembly of the 2-wheeled chassis with a ball caster.
Week 20 - 26 April
- Soldered header pins for the motor driver, OLED, and ToF sensor.
- Verified power delivery from the 4xAA battery pack.
- Completed 1st version of the documentation
Week 27 - 03 May
Hardware
The hardware architecture features two STM32F401RE Nucleo-64 boards configured in a Master-Slave setup for synchronized control. The Remote Controller acts as the Master, reading analog joystick positions via ADC and transmitting serial commands through an HC-05 Bluetooth module. The Mobile Car serves as the Slave, parsing UART strings to drive two DC motors via an L298N H-Bridge using PWM signals. Additionally, the system integrates an SG90 servomotor to sweep a VL53L0X ToF sensor for distance monitoring, providing real-time visual feedback on an SSD1306 OLED display via the I2C bus.
Schematics
Bill of Materials
| Device | Usage | Price |
|---|---|---|
| 2x STM32 Nucleo-64 (F401RE) | Microcontrollers (Car & Remote) | ~240 RON |
| 2x HC-05 Bluetooth Module | Wireless communication link | 60 RON |
| Joystick Module | Remote control steering | 35 RON |
| SSD1306 OLED Display | On-board telemetry display | 18 RON |
| VL53L0X ToF Sensor | Obstacle distance monitoring | 20 RON |
| SG90 Servomotor | Rotating the ToF sensor for the "radar" sweep | 29 RON |
| Breadboard Kit (830pts + Wires + Power Module) | Prototyping, power distribution, and component interconnection | 34 RON |
| 400pts Breadboard | Compact prototyping board for the Remote Controller | 6 RON |
| Jumper Wire Set | Signal and power routing between modules | 15 RON |
| Battery Holder (4x AA) | Mobile power source for the robotic car | 10 RON |
Software
| Library | Description | Usage |
|---|---|---|
| embassy-stm32 | Hardware Abstraction Layer (Async) | Managing GPIO, ADC, UART, and PWM peripherals in a non-blocking way |
| embassy-executor | Async task executor | Orchestrates the main application logic and concurrent tasks |
| embassy-time | Async timekeeping and delays | Precise timing for sensor polling and motor control loops |
| embedded-graphics | 2D graphics library | Rendering text, icons, and distance graphs for the display |
| ssd1306 | OLED driver | I2C communication interface for the SSD1306 display |
| vl53l0x | ToF distance driver | Acquiring millimeter-precision distance data from the laser sensor |
| defmt | Lightweight logging framework | Efficient debugging and real-time logging without blocking the CPU |
| defmt-rtt | RTT logging transport | Sending debug logs from the Nucleo board to the PC terminal |
| panic-probe | Panic handler | Provides detailed crash reports via RTT during development |
| embedded-hal | Hardware Abstraction Layer traits | Ensuring compatibility between the HAL and peripheral drivers |