diff --git a/website/versioned_docs/version-acs_cc/project/2026/david.balan/altitude_hold_drone.svg b/website/versioned_docs/version-acs_cc/project/2026/david.balan/altitude_hold_drone.svg new file mode 100644 index 00000000000..689da89c800 --- /dev/null +++ b/website/versioned_docs/version-acs_cc/project/2026/david.balan/altitude_hold_drone.svg @@ -0,0 +1 @@ +Image generated by Eeschema-SVGMotorA1B2C3M1GNDCLKIN1AUX_DA6AUX_CL7VLOGIC8AD09REGOUT10FSYNC11INT12VDD13GND18CPOUT20SCL23SDA24U1MPU-6050+BATTBT1Battery_CellGNDGPIO01GPIO12GND3GPIO24GPIO35GPIO46GPIO57GPIO69GPIO710GPIO811GPIO912GPIO1014GPIO1115GPIO1216GPIO1317GPIO1419GPIO1520GPIO1621GPIO1722GPIO1824GPIO1925GPIO2026GPIO2127GPIO2229RUN30GPIO26_ADC031GPIO27_ADC132AGND33GPIO28_ADC234ADC_VREF353V3363V3_EN37VSYS39VBUS40A1RaspberryPi_Pico_WGND+5V+3V3GNDGNDESC_30ABAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8J3GND+3V3GND+3V3+BATTGNDGND+BATT+BATT+BATTPWR_FLAG+5VGND1CSB2SDI3SCK4SDO5VDDIO6GND7VDD8U3BMP280AVDDVCSEL1AVSSVCSEL2GND3XSHUT5GPIO17SDA9SCL10AVDD11U2VL53L1CXV0FY1+3V3ESC_30ABAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8J4MotorA1B2C3M4ESC_30ABAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8J1+3V3GNDGNDMotorA1B2C3M3MotorA1B2C3M2GNDESC_30ABAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8J2GNDM1_BM4_CM4_BM4_AM1_CM1_AM1_BM2_CM3_AM2_BM3_BM2_AM1_CM2_AM4_AM4_BM4_CPWM_M4PWM_M2SDAPWM_M3PWM_M4SCLSCLSDAPWM_M1SDASCLSDASCLM3_AM2_BM2_CPWM_M2M3_BM3_CM3_CPWM_M3M1_APWM_M1Balan David-CristianBT1Battery_CellGNDGND+BATT+BATTPWR_FLAGJ4BAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8GNDGNDU1MPU-6050CLKIN1AUX_DA6AUX_CL7VLOGIC8AD09REGOUT10FSYNC11INT12VDD13GND18CPOUT20SCL23SDA24A1RaspberryPi_Pico_WGPIO01GPIO12GND3GPIO24GPIO35GPIO46GPIO57GPIO69GPIO710GPIO811GPIO912GPIO1014GPIO1115GPIO1216GPIO1317GPIO1419GPIO1520GPIO1621GPIO1722GPIO1824GPIO1925GPIO2026GPIO2127GPIO2229RUN30GPIO26_ADC031GPIO27_ADC132AGND33GPIO28_ADC234ADC_VREF353V3363V3_EN37VSYS39VBUS40GND+3V3+3V3+5V+3V3+3V3U2VL53L1CXV0FY1AVDDVCSEL1AVSSVCSEL2GND3XSHUT5GPIO17SDA9SCL10AVDD11GNDU3BMP280GND1CSB2SDI3SCK4SDO5VDDIO6GND7VDD8+3V3GNDJ3BAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8GND+BATTGNDJ2BAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8GNDJ1BAT+1BAT-2SIG3BEC_5V4GND_SIG5A6B7C8+5V+BATTGND+BATTGND \ No newline at end of file diff --git a/website/versioned_docs/version-acs_cc/project/2026/david.balan/index.md b/website/versioned_docs/version-acs_cc/project/2026/david.balan/index.md index 35c2b2e4463..f5e5db48869 100644 --- a/website/versioned_docs/version-acs_cc/project/2026/david.balan/index.md +++ b/website/versioned_docs/version-acs_cc/project/2026/david.balan/index.md @@ -22,7 +22,7 @@ I chose this project because it combines real-time embedded control, sensor fusi The system is organized into six layers, with data flowing top-down from the user's command to the spinning motors and power flowing bottom-up from the battery to every component: * **Remote control** — an Android phone runs a Rust UDP client that sends target setpoints (throttle, pitch, roll, yaw) over WiFi. -* **Sensors and input** — MPU-6050 reads gyroscope and accelerometer data over I2C at 200 Hz, HC-SR04P reads altitude over GPIO at 50 Hz, and the CYW43439 WiFi chip on the Pico 2W receives setpoints over a UDP socket. +* **Sensors and input** — MPU-6050 reads gyroscope and accelerometer data over I2C at 200 Hz, a BMP280 barometer and a VL53L1X laser time-of-flight sensor both read altitude data over I2C at 50 Hz, and the CYW43439 WiFi chip on the Pico 2W receives setpoints over a UDP socket. * **Flight controller** (running on the Pico 2W in Rust) — a Kalman filter fuses the IMU readings into stable pitch and roll estimates, a setpoint manager holds the current targets (and locks altitude when the throttle is released), and four independent PID controllers (pitch, roll, yaw, altitude) compute the corrections needed to drive the filtered state toward the setpoints. * **Motor mixing and drivers** — the motor mixer combines the four PID outputs into individual speed commands for each of the four motors; each command is then sent as a PWM signal to a 30A BLHeli ESC, which converts it into a 3-phase drive signal. * **Propulsion** — four A2212 1000KV brushless motors with 1045 propellers, arranged on the F450 frame in an X configuration with alternating CW and CCW rotation directions to cancel out the torque around the vertical axis. @@ -50,7 +50,8 @@ The drone is built from the following components: * **Raspberry Pi Pico 2W** — the flight controller; runs the Rust firmware (Kalman filter, four PID loops, motor mixer) and hosts the WiFi access point that receives commands from the phone. * **MPU-6050 (GY-521)** — 6-axis IMU containing a 3-axis gyroscope and a 3-axis accelerometer; provides raw orientation data over I2C at 200 Hz, used by the Kalman filter to estimate pitch and roll. -* **HC-SR04P** — ultrasonic distance sensor (3.3V variant, safe for the Pico's GPIO); measures the distance to the ground at 50 Hz, used as input for the altitude PID. +* **BMP280** — barometric pressure sensor; measures atmospheric pressure over I2C at 50 Hz to estimate absolute altitude, providing long-term-stable altitude data for the altitude PID and covering ranges beyond the laser sensor's reach. +* **VL53L1X** — laser time-of-flight distance sensor; measures the distance to the ground over I2C at 50 Hz with a narrow beam (immune to propeller downwash and acoustic noise), providing precise short-range altitude data for the altitude PID, especially during liftoff and landing. * **F450 frame with integrated PDB and landing gear** — the airframe that holds everything together; the integrated power distribution board distributes 11.1V from the battery to all four ESCs (rated up to 100A), and the landing gear protects the electronics during landings. * **4× A2212 1000KV brushless motors** — provide the lift; rated for 2-3S LiPo and up to 12A each, paired with 1045 propellers for stable hover on a 3S battery. * **4× 1045 propellers (2 CW + 2 CCW)** — convert motor rotation into thrust; the alternating rotation directions cancel out torque around the vertical axis so the drone doesn't spin uncontrollably. @@ -59,6 +60,7 @@ The drone is built from the following components: * **SkyRC iMAX B6AC V2 charger** — used off-board to balance-charge the LiPo battery between flights; supports 1-6S LiPo at up to 6A. ### Schematics +![Schematic](altitude_hold_drone.svg) ### Bill of Materials @@ -70,7 +72,8 @@ The drone is built from the following components: | [3S 2200mAh 30C LiPo Battery (XT60)](https://www.emag.ro/) | Main power source | 120 RON | | [SkyRC iMAX B6AC V2 Charger](https://www.skyrc.com/) | LiPo balance charger | 213 RON | | [MPU-6050 (GY-521)](https://www.optimusdigital.ro/) | Gyroscope + accelerometer (I2C) | 32 RON | -| [HC-SR04P](https://www.optimusdigital.ro/) | Ultrasonic distance sensor (3.3V) | 32 RON | +| [BMP280] | Barometric pressure / altitude sensor (I2C) | 15 RON | +| [VL53L1X] | Laser time-of-flight distance sensor (I2C) | 40 RON | ## Software