Prototipi e test

Dall'aprile 2023 al settembre 2024 — costruzione, test e lanci reali del razzo.

Apr 2023
Aprile 2023 — Primo prototipo

Primi scatti del razzo in costruzione e primo video di test statico.

Razzo ad acqua Space AL — Prototipo aprile 2023
Giu 2023
Giugno 2023 — Sessione di build

Secondo video di sviluppo e sessione fotografica intensiva: 4 scatti di assemblaggio.

Razzo ad acqua Space AL — Giugno 2023
Razzo ad acqua Space AL — Giugno 2023
Razzo ad acqua Space AL — Giugno 2023
Razzo ad acqua Space AL — Giugno 2023
27 Giu
Fine Giugno 2023 — Dettagli componenti

Due foto ravvicinate dei moduli e dei connettori.

Razzo ad acqua Space AL — 27 Giu 2023
Razzo ad acqua Space AL — 27 Giu 2023
Lug 2023
Luglio 2023 — Test esterni

Tre fotografie scattate durante una sessione di test in esterno.

Razzo ad acqua Space AL — Luglio 2023
Razzo ad acqua Space AL — Luglio 2023
Razzo ad acqua Space AL — Luglio 2023
Ago 2023
Agosto 2023 — Ottimizzazioni

Quattro scatti della fase di revisione meccanica e raffinamento del design.

Razzo ad acqua Space AL — Agosto 2023
Razzo ad acqua Space AL — Agosto 2023
Razzo ad acqua Space AL — Agosto 2023
Razzo ad acqua Space AL — Agosto 2023
Dic 2023
Dicembre 2023 — v1.0 Firmware

Tre fotografie che documentano il completamento del firmware v1.0 e della prima PCB.

Razzo ad acqua Space AL — Dicembre 2023
Razzo ad acqua Space AL — Dicembre 2023
Razzo ad acqua Space AL — Dicembre 2023
Feb 2024
Febbraio 2024 — PCB & Elettronica

Documentazione della seconda generazione PCB KiCad.

Razzo ad acqua Space AL — Febbraio 2024
Set 2024
Settembre 2024 — Prototipo avanzato Recente

Tre foto del prototipo nella versione più avanzata con gambe e nuova elettronica.

Razzo ad acqua Space AL — Settembre 2024
Razzo ad acqua Space AL — Settembre 2024
Razzo ad acqua Space AL — Settembre 2024

Firmware del razzo

Cronologia completa delle versioni del firmware — dalla v0.0 (primo altimetro) alla v1.3 (altitudine reale in telemetria). Ogni release documenta novità, bug noti e scelte architetturali.

12
Versioni
2
Milestone
1
Major Release
v1.3
Versione Attuale
v0.0 Media letture con funzione dedicata 24 aprile 2023

Punto di partenza del progetto: primo altimetro, con una funzione separata per il calcolo della media e pressione di riferimento calibrata.

  • Funzione compute_mean() separata e riutilizzabile
  • Media su 4 letture consecutive
  • 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.1 Altimetro con apertura paracadute 29 aprile 2023

Versione semplificata dell'altimetro: 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.2 Altimetro + logging su scheda SD 13 maggio 2023

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.3 Stabilizzatori con MPU6050 e 4 servomotori 5 giugno 2023

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.4 Rilevamento caduta libera via interrupt hardware 12 giugno 2023

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.5 Prima versione completa — tutti i sistemi integrati Milestone 20 giugno 2023

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
v0.6 Fusione stabilizzatori + caduta libera (5 servo) 16 settembre 2023

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.7 Tentativo fusione altimetro + SD + stabilizzatori 28 gennaio 2024

Nuovo 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
v1.0 Refactoring completo — telemetria radio nRF24L01 Major 20 dicembre 2025

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 4 marzo 2026

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.5)
  • 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

Software di terra (Python)

Cronologia completa del software di terra — dalla py-v0.0 (prima dashboard con modello 3D) alla py-v1.0 (pacchetto modulare completo). Ogni release documenta novità, bug e scelte architetturali.

6
Versioni
1
Major Release
2
Modalità Input
py-v1.0
Versione Attuale
py-v0.0 Dashboard Dash con visualizzatore 3D STL e input seriale 3 aprile 2025

Aggiunto visualizzatore 3D interattivo del modello STL del razzo che ruota in tempo reale con i dati di assetto. Dati ricevuti via seriale USB.

  • Visualizzatore 3D STL del razzo con dash-vtk + VTK
  • Rotazione del modello 3D in tempo reale con angoli pitch/roll ricevuti
  • Sorgente dati: porta seriale COM6 a 9600 baud
  • Parsing stringa seriale con formato: Alt = X ; X = Y ; Y = Z
  • Pulsanti software nel browser
  • Storico lanci con checklist di selezione nel grafico
  • Lettura seriale sincrona, senza busy-wait
  • Compatibilità con PC Windows (non richiede Raspberry Pi)
  • Porta seriale hardcoded a COM6 — non portabile su altri PC
  • Oggetto ser creato a livello di modulo — errore immediato se COM6 non esiste
  • Il modello STL viene riletto e riprocessato con VTK ad ogni callback — molto lento
  • Stato globale (asse_x, asse_y, storico) non thread-safe
Dash + Plotly dash-vtk + VTK pyserial Browser (Dash) + 3D STL Seriale COM6
py-v0.1 Primo test ricezione radio — output terminale 21 maggio 2025

Script minimalista per verificare che la radio NRF24L01 riceva correttamente i dati trasmessi dall'Arduino del razzo. Nessuna interfaccia grafica.

  • Inizializzazione radio NRF24L01 via pyrf24 (CE=GPIO22, CSN=CE0)
  • Protocollo a 4 pacchetti da 32 byte: pitch, roll, altitudine, paracadute
  • Decodifica little-endian a 4 byte per ogni valore (struct.unpack('<i', ...))
  • Canale 76, payload 32 byte, 1 Mbps
  • Output continuo su terminale
  • Canale 76 — non corrisponde al canale 100 usato dal firmware Arduino v1.1+
  • Indirizzo pipe "00001" — non corrisponde a "ABCDE" usato dall'Arduino v1.1+
  • Attesa pacchetti con busy-wait (while not radio.available()) — blocca il processo
  • Nessuna gestione timeout: se un pacchetto non arriva il loop si blocca indefinitamente
pyrf24 struct NRF24L01 (GPIO22/CE0) Radio
py-v0.2 Dashboard Dash con grafico e pulsanti GPIO 21 maggio 2025

Interfaccia grafica completa: dashboard web Dash con grafico altitudine in tempo reale, cronometro di volo e controllo tramite pulsanti fisici GPIO su Raspberry Pi.

  • Dashboard web Plotly Dash accessibile da browser
  • Grafico altitudine dinamico in tempo reale
  • Cronometro di volo con thread background dedicato
  • Pulsanti fisici GPIO: avvia (pin 2), pausa (pin 3), reset (pin 4), refresh (pin 5)
  • Storico lanci: salva i dati di ogni lancio e li rende selezionabili
  • Indicatore paracadute: immagine con glow verde (aperto) / rosso (chiuso)
  • Canale radio ancora 76 e pipe "00001" — disallineato con Arduino v1.1+
  • Lettura radio nel callback Dash: blocca il thread UI durante l'attesa dei 4 pacchetti
  • Stato paracadute globale non protetto da lock — race condition con thread cronometro
  • Il grafico mostra solo l'asse Y (pitch) come altitudine — dato non corretto
Dash + Plotly pyrf24 RPi.GPIO Browser (Dash) GPIO pulsanti fisici Radio
py-v0.3 Interfaccia Tkinter nativa con 4 grafici matplotlib 27 agosto 2025

Abbandono di Dash a favore di un'interfaccia nativa Tkinter. Quattro grafici matplotlib separati per altitudine, X, Y, Z. Input via seriale.

  • Interfaccia nativa Tkinter fullscreen — nessun browser necessario
  • 4 grafici matplotlib in tempo reale: altitudine, X, Y, Z
  • Thread separato per lettura seriale — GUI non si blocca durante la lettura
  • Parsing per prefissi: Alt =, X =, Y =, Z =
  • Correzione altitudine: sottrae 65 m (offset di calibrazione locale)
  • Eliminata dipendenza VTK e dash-vtk — avvio molto più veloce
  • Thread lettura seriale separato: GUI sempre reattiva
  • Porta COM6 ancora hardcoded
  • Offset 65 m hardcoded — specifico del sito di test, non configurabile
  • Aggiornamento grafici ogni secondo (sleep 1 s nel thread) — bassa frequenza
  • Importazione renderer non inclusa nel codice — errore all'avvio
  • Nessun indicatore paracadute e nessun cronometro di volo
tkinter matplotlib pyserial Tkinter nativo Seriale COM6
py-v0.4 Versione ibrida Tkinter + Plotly + radio pigpio/nrf24 24 febbraio 2026

Ritorno alla radio con una nuova libreria (pigpio/nrf24). Interfaccia Tkinter fullscreen con grandi display numerici, affiancata da grafici Plotly aperti nel browser.

  • Radio tramite nrf24 + pigpio — libreria alternativa a pyrf24
  • Canale corretto a 100 e pipe "ABCDE" — allineato con Arduino v1.1+
  • GUI Tkinter fullscreen: PITCH e ROLL come grandi numeri colorati
  • Colori dinamici: lime se l'angolo è tra −3° e +3°, rosso altrimenti
  • Indicatore paracadute: label "PARACADUTE" cambia colore
  • Grafici Plotly con 3 subplot (accelerazione, pitch, roll) aperti nel browser
  • Thread radio separato: GUI non si blocca
  • Canale e indirizzo radio allineati con il firmware Arduino
  • Thread radio separato: nessun blocco della GUI
  • Eliminato busy-wait: nrf.data_ready() con sleep 50 ms
  • I grafici Plotly vengono aperti nel browser una sola volta all'avvio — non si aggiornano in tempo reale
  • Struct unpack con formato <ii f ? (13 byte) non compatibile con struct Arduino packed a 20 byte
  • pigpio richiede il demone pigpiod avviato manualmente prima dell'esecuzione
  • Nessun cronometro di volo, nessuno storico lanci
  • L'altitudine non viene mostrata nell'interfaccia grafica
tkinter plotly pigpio + nrf24 Tkinter + Browser Plotly Radio (canale 100)
py-v1.0 Refactoring completo — pacchetto modulare space-al-telemetry Major 16 giugno 2026

Riscrittura completa dell'intera applicazione in un pacchetto Python strutturato. Architettura modulare con separazione netta tra UI, stato, configurazione e sorgente dati. Supporto nativo sia radio che seriale.

  • app.py — entry point pulito, solo layout Dash e callback
  • config.py — tutti i parametri configurabili in un file (canale, pin, porte, URL)
  • state.py — classe FlightState thread-safe con lock per cronometro e dati volo
  • radio_reader.py — RadioReader con timeout, interfaccia leggi_coordinate()
  • serial_reader.py — SerialReader con stessa interfaccia di RadioReader
  • gpio_compat.py — stub GPIO per eseguire su PC Windows senza Raspberry Pi
  • Selezione sorgente dati via MODALITA_INPUT: "radio" o "serial"
  • Gestione errori con TimeoutError e OSError — il programma non crasha se i dati non arrivano
  • Race condition sullo stato globale: tutto protetto da threading.Lock
  • Porta seriale e canale radio configurabili senza modificare il codice
  • Compatibilità PC: gpio_compat permette sviluppo su Windows senza Raspberry Pi
  • Timeout sul reader: il programma non si blocca se i dati non arrivano
  • Grafici Plotly Dash aggiornati in tempo reale (non più snapshot statici)
  • Storico lanci thread-safe con copia difensiva nelle snapshot
Dash + Plotly pyrf24 / pyserial threading Browser (Dash) Radio o Seriale (configurabile) GPIO opzionali