12
Versioni
2
Milestone
1
Major Release
v1.3
Versione Attuale
v0.0 Primo altimetro con apertura paracadute

Punto di partenza del progetto. Codice minimalista che legge l'altitudine tramite BMP085 e apre il paracadute quando il razzo inizia a scendere.

  • Lettura altitudine con sensore barometrico BMP085
  • Media su 3 letture consecutive per ridurre il rumore
  • 1 servomotore per apertura paracadute (pin 8)
  • Rilevamento apice: il servo si attiva quando l'altitudine scende sotto il massimo
  • Pressione al livello del mare hardcoded a 101325 Pa — non calibrata per il sito di lancio
  • Media calcolata dividendo int per int: troncamento con errori di arrotondamento
  • Nessun debounce: oscillazioni barometriche possono aprire il paracadute prematuramente
  • Condizione apertura: mediaAltezza - mediaPrecedente + 1 < 0 — il +1 è arbitrario
  • Arduino + BMP085 (I2C) + 1× Servo
Adafruit_BMP085 Servo.h BMP085 1× Servo
v0.1 Media letture con funzione dedicata

Miglioramento della precisione altimetrica con una funzione separata per il calcolo della media e pressione di riferimento ricalibrata.

  • Funzione compute_mean() separata e riutilizzabile
  • Media portata a 4 letture (era 3)
  • SEA_LEVEL_PRESSURE aggiornato a 101220 Pa (calibrazione locale)
  • Array dedicato altezze[] per raccolta campioni
  • Calcolo media ora usa float internamente per evitare troncamento
  • Condizione apertura paracadute ancora con il +1 arbitrario
  • Nessuna protezione contro riapertura multipla del paracadute
Adafruit_BMP085 BMP085 1× Servo
v0.2 Stabilizzatori con MPU6050 e 4 servomotori

Prima implementazione del sistema di stabilizzazione attiva. Abbandono temporaneo dell'altimetro per sviluppare il controllo d'assetto.

  • Giroscopio/accelerometro MPU6050 per rilevamento assetto
  • 4 servomotori per controllo su assi X e Y (thrust vector)
  • LED verde e rosso per stato visivo
  • Calibrazione automatica offset giroscopio all'avvio (calcGyroOffsets())
  • Funzione getAccelleration() per rilevare se il razzo è in volo
  • Bug critico: if (mpu6050.getAngleX() == -1 < 0 < 1) — confronto a catena non valido in C++, sempre vero
  • Logica stabilizzatore aggiornata ogni 1000ms: troppo lento per correggere in volo
  • Conflitto pin: ledping = 7 e servopin4 = 7 sullo stesso pin
MPU6050_tockn Servo.h MPU6050 4× Servo LED + Buzzer
v0.3 Rilevamento caduta libera via interrupt hardware

Approccio alternativo all'apertura paracadute: uso dell'interrupt hardware di caduta libera dell'MPU6050 anziché il barometro.

  • Interrupt hardware su pin 2 (attachInterrupt(0, doInt, RISING))
  • Configurazione soglie caduta libera: threshold 17, duration 2ms
  • Filtro DHPF a 5Hz per sopprimere vibrazioni motore
  • Risposta immediata grazie all'interrupt (non dipende dal loop)
  • Soglia 17 hardcoded — sensibile a vibrazioni, potenziali falsi positivi
  • Servo torna a 90° dopo 5 secondi fissi — non verifica lo stato reale
  • Flag freefallDetected non protetto da race condition
MPU6050 (elektronikit) Servo.h MPU6050 1× Servo (paracadute)
v0.4 Fusione stabilizzatori + caduta libera (5 servo)

Prima versione che unisce i due sistemi principali: stabilizzatori attivi durante il volo e apertura automatica paracadute in caduta.

  • 5 servomotori: 4 stabilizzatori (pin 7–10) + 1 paracadute (pin 6)
  • Soglia caduta libera alzata a 100 per ridurre falsi positivi
  • Flag paracadute per bloccare stabilizzatori durante l'apertura
  • In apertura paracadute: tutti e 4 i servo si portano a 180°
  • Bug confronto a catena == -1 < 0 < 1 ancora presente
  • Stabilizzatore aggiornato ogni 1000ms — ancora troppo lento
MPU6050 (elektronikit) 5× Servo
v0.5 Altimetro + logging su scheda SD

Introduzione della scheda SD per il logging dei dati di volo. Permette l'analisi post-lancio di altitudine ed eventi.

  • Scheda SD su pin 4 per registrazione dati
  • File servo.txt con log continuo di altitudine e eventi
  • File chiuso automaticamente al primo evento paracadute
  • File aperto con O_WRITE: sovrascrive i dati esistenti senza append
  • Il file non viene mai flushato durante il volo — dati persi se alimentazione cade
Adafruit_BMP085 SD.h + SPI.h SD card (pin 4)
v0.6 Tentativo fusione altimetro + SD + stabilizzatori

Primo tentativo di integrare tutti i sistemi in un unico codice. Versione transitoria con componenti parzialmente commentati.

  • Struttura unificata: MPU6050_tockn + BMP085 + SD in un solo sketch
  • Serial output degli angoli X/Y ogni secondo
  • BMP085 e SD card commentati — non funzionali in questa versione
  • Conflitto: myServo.attach(8) e servopin2 = 8 sullo stesso pin
  • File SD non aperto — scritture su oggetto non inizializzato (UB)
MPU6050_tockn MPU6050 4× Servo
v0.7 Prima versione completa — tutti i sistemi integrati Milestone

Pietra miliare del progetto: tutti i sistemi attivi in un unico firmware. Richiede tutte le librerie e 5 servomotori.

  • Tutti i sistemi attivi: caduta libera + stabilizzatori + SD + altimetro
  • 5 servo operativi: 4 stabilizzatori + 1 paracadute
  • Logging altitudine su SD con BMP085
  • Bug critico: file.close() chiamato ad ogni ciclo — il file si chiude e non si può più scrivere
  • Bug: SD aperta prima di SD.begin() — mai inizializzata
  • Latenza stabilizzatori ancora 1000ms
MPU6050 Adafruit_BMP085 SD.h 5× Servo + SD card
v1.0 Refactoring completo — telemetria radio nRF24L01 Major

Riscrittura completa dell'architettura. Abbandono delle librerie MPU per lettura I2C raw, introduzione della radio nRF24L01 per telemetria bidirezionale in tempo reale.

  • Lettura MPU-6050 diretta via I2C raw (registri 0x3B–0x48) — nessuna libreria dedicata
  • Calcolo Pitch e Roll con atan2() — preciso su tutti i quadranti
  • Radio nRF24L01 (pin 7/8) per trasmissione telemetria a terra
  • 6 servo: 4 thrust vector (pin 2–5) + paracadute (pin 7) + gambe (pin 9)
  • Rilevamento apice via decadimento vettore accelerazione (Amp)
  • Offset MPU calibrati manualmente: AcX-2050, AcY-77, AcZ-1947
  • Canale radio non impostato, interferenze probabili
  • Servo paracadute su pin 7 e radio CE su pin 7 — conflitto pin
  • BMP085 commentato — altitudine non trasmessa
RF24.h nRF24L01.h MPU6050 (raw I2C) nRF24L01 6× Servo
v1.1 Struttura SensorData e flag trustVector

Ottimizzazione della trasmissione radio e introduzione del flag trustVector per abilitare gli stabilizzatori solo durante il volo effettivo.

  • Struct SensorData per impacchettare Pitch, Roll, altitudine, paracadute, Amp
  • Radio ottimizzata: canale 100, RF24_250KBPS, RF24_PA_MIN
  • Indirizzo radio cambiato a "ABCDE" (5 char ASCII validi)
  • Flag trustVector: stabilizzatori attivi solo quando Amp > 10 (in volo)
  • Conflitto pin radio/servo risolto: radio su pin 9/10, servo su pin separati
  • Stabilizzatori non si attivano durante la preparazione al lancio
  • Struct non packed — possibile disallineamento byte con ricevitore Python
  • Altitudine nel pacchetto sempre 0 — sensore BMP non ancora collegato
RF24.h MPU6050 (raw I2C) nRF24L01 (canale 100)
v1.2 Struct packed e compatibilità Arduino/Python 18 aprile 2026

Fix della serializzazione della struttura dati per garantire compatibilità tra firmware Arduino e software Python di telemetria a terra.

  • __attribute__((packed)) sulla struct per allineamento byte garantito
  • Tutti i campi convertiti in int32_t (4 byte ciascuno) — struct da 20 byte esatti
  • Debug dimensione struct in setup(): deve stampare esattamente 20
  • Disallineamento byte struct tra Arduino e Python — dati corrotti sul ricevitore
  • Rimossi commenti obsoleti e variabili inutilizzate
  • Altitudine nel pacchetto sempre 0 — sensore BMP non ancora fisicamente collegato
RF24.h MPU6050 (raw I2C) nRF24L01
v1.3 Integrazione altimetro BMP180 — altitudine reale in telemetria 21 aprile 2026 Versione Attuale

Versione più avanzata del firmware. L'altitudine reale è finalmente integrata nel pacchetto radio. Il razzo trasmette a terra in tempo reale: pitch, roll, accelerazione, stato paracadute e quota relativa in centimetri.

  • Sensore BMP180 inizializzato in setup() con verifica errore
  • Calibrazione quota zero al momento dell'accensione (altitudineDiRiferimento)
  • Altitudine relativa calcolata in cm: (assoluta - riferimento) × 100
  • Altitudine trasmessa via radio nel campo data.altitudine (int32_t)
  • Serial output: ALT=XXXcm aggiunto alla riga di debug
  • Campo altitudine nel pacchetto radio finalmente valorizzato con dati reali
  • Offset rispetto alla quota di accensione elimina variazioni barometriche assolute
  • Offset MPU ancora hardcoded — richiede ricalibrazione per ogni sensore
  • Nessuna registrazione SD dei dati di volo (rimossa dal v0.7)
  • Soglia trustVector fissa Amp > 10 — da calibrare con dati reali di lancio
  • Delay 500ms durante rilevamento caduta — finestra cieca ancora presente
RF24.h Adafruit_BMP085 MPU6050 + BMP180 nRF24L01 3× Servo