Questo codice Arduino è progettato per implementare un sistema di tracciamento del movimento utilizzando un accelerometro e un giroscopio. Il sistema è in grado di rilevare variazioni nella posizione, nella velocità e nell'orientamento del dispositivo a cui è collegato.
- Rappresentazione dello Stato: Il codice definisce una struttura di dati per memorizzare lo stato corrente del dispositivo, includendo la posizione, la velocità e l'orientamento.
- Sensori e Lettura dei Dati: Utilizzando un accelerometro e un giroscopio, il codice legge costantemente i dati sensoriali per determinare le variazioni nella posizione e nell'orientamento del dispositivo nel tempo.
- Calcolo della Gravità: Durante l'inizializzazione, il codice stima la forza di gravità per compensare gli effetti gravitazionali sui dati dell'accelerometro.
- Interruzione del Tocco: Viene utilizzato un sensore di tocco per rilevare gli eventi di tocco sul dispositivo e attivare azioni di conseguenza, nel nostro caso manderà la relativa nota.
- Comunicazione MIDI Bluetooth: Il codice stabilisce una connessione Bluetooth e comunica tramite il protocollo MIDI.
- Inizializzazione: Durante l'avvio, il codice inizializza i sensori, calcola la gravità iniziale e stabilisce la connessione Bluetooth.
- Aggiornamento Continuo dello Stato: Il codice legge costantemente i dati dai sensori e aggiorna lo stato del dispositivo in base alle variazioni rilevate.
- Rilevamento del Tocco: Quando viene rilevato un tocco sul sensore, il codice attiva azioni di conseguenza, come la trasmissione di segnali MIDI o l'avvio di altre funzionalità.
- Comunicazione Bluetooth MIDI: Quando la connessione Bluetooth è attiva, il codice invia periodicamente segnali MIDI a dispositivi esterni compatibili.
Arduino.h
: Libreria standard di Arduino.BLEMidi.h
: Libreria per la comunicazione MIDI via Bluetooth.Wire.h
: Libreria per la comunicazione I2C.
state_t
: Struttura che contiene la posizione, la velocità e la matrice di orientamento (rotation matrix) del corpo rispetto all'ambiente.acel
,gyro
,init_g
: Variabili per i dati dei sensori di accelerazione e giroscopio.curr
: Variabile booleana per determinare lo stato attuale.t
: Array per memorizzare il tempo.touch
: Array per memorizzare lo stato del tocco.test_low
,c_t
: Variabili booleane per la gestione del tocco.threshold
: Soglia per il tocco.
eul2Rotm
: Converte gli angoli di Eulero in una matrice di rotazione.rotm2Eul
: Converte una matrice di rotazione in angoli di Eulero.matMul
: Moltiplica due matrici.matVecMul
: Moltiplica una matrice per un vettore.matTrans
: Trasposta una matrice di rotazione.
getAcelData
: Ottiene i dati dell'accelerometro.getInertialData
: Ottiene i dati inerziali dai sensori.updateState
: Aggiorna lo stato del sistema in base ai dati inerziali.
gotTouchEvent
: Gestisce l'interrupt del touch.
- Configurazione iniziale delle connessioni Bluetooth e del touch.
- Calibrazione dell'accelerometro per determinare la gravità iniziale.
- Se il touch cambia stato, invia un messaggio seriale.
- Se è connesso un dispositivo Bluetooth, invia una nota MIDI (A4) a piena velocità per un secondo, quindi la spegne.
- Se non è connesso un dispositivo Bluetooth, attende un secondo.