Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
f651104
first_comm
horatiuoprea Apr 10, 2026
2eaa23a
add deadline
github-classroom[bot] Apr 13, 2026
5a0e03d
Asign Repo
horatiuoprea Apr 13, 2026
9399e69
Merge branch 'UPB-PMRust:main' into project/horatiu.oprea
horatiuoprea Apr 13, 2026
d47c024
Merge branch 'main' of https://github.com/horatiuoprea/website
horatiuoprea Apr 13, 2026
f20e777
solved remote merge
horatiuoprea Apr 13, 2026
d0c5541
Merge branch 'main' into project/horatiu.oprea
horatiuoprea Apr 13, 2026
b2a9621
Project documentation starter
horatiuoprea Apr 26, 2026
ebeed65
Documentatie
horatiuoprea Apr 27, 2026
5e33137
Merge branch 'main' into project/horatiu.oprea
irina-b-dev May 12, 2026
64b0f5b
Final Documentation
horatiuoprea May 17, 2026
b88782b
Merge branch 'main' into project/horatiu.oprea
horatiuoprea May 19, 2026
33fcb25
Image pb solved
horatiuoprea May 21, 2026
1cc797e
Merge branch 'main' into project/horatiu.oprea
horatiuoprea May 21, 2026
6409a1c
Final pull
horatiuoprea May 21, 2026
be2aef3
Merge branch 'project/horatiu.oprea' of https://github.com/horatiuopr…
horatiuoprea May 21, 2026
2231aca
No .png
horatiuoprea May 21, 2026
6f47c7d
Resize
horatiuoprea May 21, 2026
b633c6f
Reshape + Del
horatiuoprea May 21, 2026
0e2707f
Original README.md
horatiuoprea May 22, 2026
7c25d72
Merge branch 'main' into project/horatiu.oprea
horatiuoprea May 23, 2026
2cd8c05
Merge branch 'main' into project/horatiu.oprea
horatiuoprea May 23, 2026
c79766e
Lower-case names
horatiuoprea May 23, 2026
9d6b91c
Merge branch 'project/horatiu.oprea' of https://github.com/horatiuopr…
horatiuoprea May 23, 2026
338a88a
Merge branch 'main' into project/horatiu.oprea
horatiuoprea May 23, 2026
220a359
Maybe
horatiuoprea May 23, 2026
0efb850
Final
horatiuoprea May 24, 2026
dc3094e
Merge branch 'main' into project/horatiu.oprea
horatiuoprea May 24, 2026
6412c90
Low_Case
horatiuoprea May 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Comment thread
horatiuoprea marked this conversation as resolved.
Comment thread
horatiuoprea marked this conversation as resolved.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -20,35 +20,47 @@ Embedded systems and control theory are two domains I wanted to explore simultan

## Architecture

The system is structured around four main architectural components that form a closed control loop:
The system is structured around 4 main architectural components that form a closed control loop:

**Sensor** — The VL53L0X laser Time-of-Flight sensor is mounted at the top of the tube and measures the distance to the ball via I2C. This gives the current height y(t).

**Controller** — The STM32 Nucleo-U545RE-Q runs the PID algorithm in an Embassy async task at a fixed 20ms cycle. It reads the current height from the sensor, computes the error relative to the target, and produces a control output u(t) in the range 0–100%.

**Actuator** — The Delta PFB0412EN-E fan receives a PWM signal at 25kHz directly on its dedicated blue wire. The duty cycle of this signal determines the fan speed, which controls the airflow and thus the ball's position.

**User Interface** — Four potentiometers provide analog inputs via ADC: one sets the target height, and three adjust Kp, Ki, Kd in Manual mode. A 1602 I2C LCD displays system state. A toggle switch selects between Auto and Manual mode.
**User Interface** — Four potentiometers provide analog inputs via ADC: one sets the target height in Auto Mode, and three adjust Kp, Ki, Kd in Manual mode. A ST7920 LCD displays system state using SPI. A toggle switch selects between Auto and Manual mode.

## Closed Control Loop
## Architecture Diagram

![Closed Loop Diagram](Documentatie.drawio.svg)
![Architecture Diagram](architecture_diagram.drawio.svg)

## Log

### Week 5 - 11 May
### Week 6 - 12 April
**Chose the project task**

### Week 13 - 19 April
**Initial Documentation**

### Week 20 - 26 April
**Final Documentation**

### Week 4 - 10 May
**Tested HW Components**

### Week 12 - 18 May
### Week 11 - 17 May
**Built HW Part and Startet the SW Part**

### Week 19 - 25 May
### Week 18 - 24 May
**Finished the SW Part and Final Design**

## Hardware

The project uses an STM32 Nucleo-U545RE-Q (Cortex-M33) as the main microcontroller, programmed in Rust with the Embassy async framework. The VL53L0X laser ToF sensor communicates over I2C and provides distance measurements with millimeter precision. The Delta PFB0412EN-E axial fan (40x40x28mm, 12V) features a native PWM control input, allowing direct speed control from the STM32 without a MOSFET driver stage. Four 10kΩ potentiometers provide analog inputs for height target and PID tuning. A 1602 LCD with I2C backpack shares the I2C bus with the sensor. A toggle switch selects the operating mode. The fan is powered by a dedicated 12V DC adapter; the STM32 and all logic components are powered via USB (5V), with the onboard regulator supplying 3.3V to the sensor and potentiometers. All grounds are tied to a common reference on the breadboard.

### Schematics

_KiCad schematic to be added here in SVG format._
![alt text](pingpong_levitation.webp)

### Bill of Materials

Expand All @@ -57,10 +69,10 @@ _KiCad schematic to be added here in SVG format._
| [STM32 Nucleo-U545RE-Q](https://www.st.com/en/evaluation-tools/nucleo-u545re-q.html) | Main microcontroller — runs PID algorithm in Rust/Embassy | already owned |
| [VL53L0X Laser ToF Sensor](https://www.optimusdigital.ro/ro/senzori-senzori-de-distanta/3309-modul-senzor-de-distanta-cu-laser-vl53l0x.html) | Measures ball height inside the tube via I2C | [25 RON](https://www.optimusdigital.ro) |
| [Delta PFB0412EN-E Fan 12V](https://www.digikey.com) | Propeller fan — controls airflow in the tube via PWM | already owned |
| [LCD 1602 I2C](https://www.optimusdigital.ro/ro/optoelectronice-lcd-uri/2894-lcd-cu-interfata-i2c-si-backlight-albastru.html) | Displays current height and PID constants | [15 RON](https://www.optimusdigital.ro) |
| [LCD ST7920](https://www.optimusdigital.ro/ro/optoelectronice-lcd-uri/2894-lcd-cu-interfata-i2c-si-backlight-albastru.html) | Displays current height and PID constants | [15 RON](https://www.optimusdigital.ro) |
| Potentiometer 10kΩ (x4) | Height target (x1) + Kp, Ki, Kd tuning (x3) | [5 RON x4](https://www.optimusdigital.ro) |
| Toggle Switch | Selects Auto / Manual operating mode | [3 RON](https://www.optimusdigital.ro) |
| Breadboard MB102 + YuRobot power module | Prototyping platform with integrated power supply | [20 RON](https://www.optimusdigital.ro) |
| Breadboard MB102 - 830 pins | Prototyping platform with integrated power supply | [20 RON](https://www.optimusdigital.ro) |
| DC Jack Module 5.5x2.1mm (breadboard) | Connects 12V adapter to breadboard for fan power | [7 RON](https://www.optimusdigital.ro) |
| Resistor 100Ω | Protects STM32 PWM pin from fan input impedance | [1 RON](https://www.optimusdigital.ro) |
| Jumper Wire Kit (120 pcs) | All signal and power connections on breadboard | [15 RON](https://www.optimusdigital.ro) |
Expand All @@ -75,12 +87,16 @@ _KiCad schematic to be added here in SVG format._
| [embassy-stm32](https://github.com/embassy-rs/embassy) | Async HAL for STM32 microcontrollers | Peripheral access: PWM, I2C, ADC, GPIO |
| [embassy-executor](https://github.com/embassy-rs/embassy) | Async task executor for embedded systems | Runs sensor, control and display tasks concurrently |
| [embassy-time](https://github.com/embassy-rs/embassy) | Timers and delays for Embassy | Fixed 20ms control loop timing |
| [embassy-spi](https://github.com/UPB-PMRust/lab-solutions/tree/main/lab05) | Driver for ST7920-based LCD displays | Renders height and PID values |
| [vl53l0x](https://crates.io/crates/vl53l0x) | Driver for VL53L0X ToF sensor | Reads ball distance over I2C |
| [hd44780-driver](https://crates.io/crates/hd44780-driver) | Driver for HD44780-based LCD displays | Renders height and PID values on 1602 LCD |
| [defmt](https://github.com/knurling-rs/defmt) | Efficient logging framework for embedded Rust | Debug output during development via RTT |
| [defmt-rtt](https://github.com/knurling-rs/defmt) | RTT transport for defmt | Sends log messages to host over USB |
| [panic-probe](https://github.com/knurling-rs/panic-probe) | Panic handler for embedded Rust | Reports panics via defmt |

## Closed Control Loop

![Closed Loop Diagram](documentatie.drawio.svg)

## Links

1. [Embassy — Async framework for embedded Rust](https://embassy.dev)
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading