You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: website/versioned_docs/version-fils_en/project/2026/stefania.boinegri/index.md
+32-18Lines changed: 32 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,9 @@ A wearable, motion-controlled gaming interface.
10
10
11
11
## Description
12
12
13
-
AeroGlove is a wearable, motion-controlled gaming interface that bridges the gap between physical movement and digital gameplay. Built around the STM32 Nucleo-U545RE-Q microcontroller, this project transforms natural hand gestures into native PC inputs, effectively acting as both a plug-and-play USB gamepad and an air mouse.
13
+
AeroGlove is a glove that lets you control games by moving your hand. Tilt your palm and the joystick moves on screen. Press a button with your thumb and it sends an action. Hold the button longer than half a second and it switches between gamepad and air-mouse mode, with a short vibration to confirm.
14
+
15
+
The firmware runs on an STM32 Nucleo-U545RE-Q in Rust using the embassy async framework. It reads an MPU6050 motion sensor over I2C, applies a complementary filter to get stable angles, and sends the data over UART to a Python host script on the PC. The script creates a virtual Xbox 360 controller using the ViGEmBus driver, so any game that supports a controller recognizes it automatically.
14
16
15
17
## Motivation
16
18
@@ -30,15 +32,23 @@ Hardware wiring and basic project setup. Configured the Rust Embassy environment
30
32
31
33
### Week 12 - 18 May
32
34
33
-
Focused on USB communication. Set up the USB HID device using the usbd-human-interface-device crate so the PC recognizes the board as a mouse/gamepad. Mapped the sensor data to screen cursor movements.
35
+
Tried to get USB HID working directly on the STM32 so the glove would show up as a native gamepad. Got the USB stack compiling and Windows detected the device, but it kept failing. After debugging with trace logs I found that the USB interrupt wasn't firing properly for the U545 chip in embassy-stm32. Decided to change the communication approach instead of fighting a driver bug.
34
36
35
37
### Week 19 - 25 May
36
38
37
-
Added haptic and visual feedback. Configured the PWM for the vibration motor and set up the RGB LED to indicate device status. Final code cleanup, debugging, and testing for the final presentation.
39
+
Switched to sending data over UART through the ST-Link's built-in serial port. Wrote a Python host script that reads the serial stream and creates a virtual Xbox 360 controller using vgamepad and ViGEmBus. Also added the RGB LED module and implemented tilt-limit haptic feedback that vibrates when you tilt past 50 degrees.
40
+
41
+
Mounted everything on the glove with velcro. The breadboard sits on the back of the hand, the button is extended with soldered wires to the index finger, and the motor is on the palm side. Tested with Hill Climb Racing and the hardwaretester.com gamepad tester. Commented all the code and wrote the documentation.
42
+
43
+

44
+
45
+

38
46
39
47
## Hardware
40
48
41
-
The project uses the STM32 Nucleo-U545RE-Q as the microcontroller to process inputs and handle USB communication. It uses an MPU6050 for motion tracking, a tactile push-button for digital input, an RGB LED for visual feedback, and a vibration motor for haptic feedback.
49
+
The STM32 Nucleo-U545RE-Q is the main microcontroller. The MPU6050 connects over I2C for motion tracking. A tactile button on the index finger provides input, connected back to the breadboard with two soldered jumper wires. The RGB LED shows the current mode and the vibration motor gives haptic feedback. Everything sits on a breadboard on the back of the hand, with the Nucleo board either on the forearm or on the desk.
50
+
51
+
Only one USB cable is needed since the ST-Link handles both programming and serial communication.
42
52
43
53
### Schematics
44
54
@@ -49,24 +59,28 @@ The project uses the STM32 Nucleo-U545RE-Q as the microcontroller to process inp
49
59
| Device | Usage | Price |
50
60
|--------|--------|-------|
51
61
| STM32 Nucleo-U545RE-Q | Microcontroller | 107 RON |
52
-
| MPU6050 Module | Motion Sensor | 12 RON|
53
-
| Tactile Push-Button | Digital Input | 0.36 RON |
54
-
| RGB LED Module | Visual Feedback | 2 RON |
55
-
| Vibration Motor Module | Haptic Feedback | 5 RON |
56
-
| USB Data Cable | Power & Communication | 29 RON |
| Tactile Push-Button 6x6x5mm | Digital input on finger | 0.36 RON |
64
+
| CJMCU RGB LED Module | Mode indicator (red/blue) | 2 RON |
65
+
| Vibration Motor Module | Haptic feedback | 5 RON |
66
+
| USB-C Cable | Power and ST-Link communication | 29 RON |
67
+
| Jumper Wires (M-M and M-F) | Connecting everything | 7 RON |
68
+
| Breadboard | Component mounting | 5 RON |
69
+
| Velcro strips | Attaching components to the glove | 15 RON |
59
70
## Software
60
71
61
72
| Library | Description | Usage |
62
73
|---------|-------------|-------|
63
-
| embassy-rs | The core asynchronous runtime | Allows the microcontroller to handle multiple tasks simultaneously without blocking |
64
-
| embassy-stm32 | Hardware Abstraction Layer for STM32 | Provides digital drivers to control physical pins, I2C, PWM, and USB peripherals |
65
-
| embassy-time | Manages non-blocking timers and delays | Crucial for stabilizing the input signal of the tactile button |
66
-
| embassy-usb | Handles the low-level USB device stack | Establishes and maintains physical data connection between STM32 and host computer |
67
-
| usbd-human-interface-device | USB HID formatter | Formats raw data into standard USB HID reports so the PC recognizes it instantly |
68
-
| mpu6050 | Dedicated community driver | Processes raw I2C signals into usable spatial angles for steering |
69
-
| defmt | Debugging framework | Prints real-time debugging messages to PC screen without slowing down the main loop |
74
+
|[embassy-stm32](https://github.com/embassy-rs/embassy)| Async HAL for STM32 | Provides drivers for I2C, UART, PWM and GPIO |
75
+
|[embassy-executor](https://github.com/embassy-rs/embassy)| Async task runtime | Runs 7 concurrent tasks on one core without an RTOS |
76
+
|[embassy-sync](https://github.com/embassy-rs/embassy)| Synchronization primitives | Watch and Channel for safe data sharing between tasks |
77
+
|[embassy-time](https://github.com/embassy-rs/embassy)| Timers and delays | Used for button debouncing, motor timing and sensor pacing |
78
+
|[defmt](https://github.com/knurling-rs/defmt)| Lightweight logging | Debug output over RTT without slowing down the firmware |
79
+
|[libm](https://github.com/rust-lang/libm)| Math functions for no_std | atan2 and sqrt needed for the angle calculations in the filter |
80
+
|[heapless](https://github.com/rust-embedded/heapless)| Fixed-size collections | Stack-allocated strings for formatting serial packets |
81
+
|[pyserial](https://github.com/pyserial/pyserial)| Python serial port library | Reads UART data from the ST-Link virtual COM port on the PC side |
82
+
|[vgamepad](https://github.com/yannbouteiller/vgamepad)| Virtual gamepad for Windows | Creates a virtual Xbox 360 controller through the ViGEmBus driver |
83
+
|[mouse](https://github.com/boppreh/mouse)| Python mouse control | Moves the system cursor in air-mouse mode |
0 commit comments