Cosa ne pensate ?
Che conosco l'applicazione troppo poco per poder dare giudizi definitivi, ma non mi ispira fiducia.
Le letture che ho chiamato pseudo-contemporanee non lo sono nemmeno lontanamente, sono sequenziali.
E, peggio ancora, non sono atomiche: l'interrupt può esserci una volta tra sensore 1 e sensore 2, una volta prima del sensore 1 e un'altra volta da qualche altra parte.
Inoltre il sistema operativo del raspberry pi ha il suo scheduler che fa un po' quello che vuole.
Sono tutte incertezze che si sommano e producono jitter.
Se raccogli abbastanza campioni, probabilmente l'errore sparisce nella media, ma non è detto (dipende da come è distribuito).
Quando ho letto cosa vuoi fare, i miei primi pensieri sono stati:
- ci vuole una FPGA (poi mi son detto che forse esagero
)
- ci vuole un accelerometro con threshold impostabile, al superamento del quale viene generato un interrupt
- ci vogliono accelerometri e encoder con uscita analogica (come già scritto da
stefanopc), da campionare con un tre convertitori sincroni (o con una misura interleaved usando il multiplexer d'ingresso di un ADC sufficientemente veloce).
Tornando sull'I2C, ho dato un'occhiata alle specifiche del componente. Non dovrebbero esserci problemi a raggiungere velocità di lettura molto elevate. Probabilmente diverse centinaia di letture al secondo non sono un problema. È che con il tuo sistema non hai sincronia e assegnare un "timestamp" affidabile ai dati che ricevi è praticamente impossibile.
Se vuoi continuare su questa strada, ti elenco un paio di strategie che potrebbero mitigare il problema:
- usa due interfacce I2C indipendenti, usane le API in modo non-blocking e avviane la lettura in un'operazione atomica
- realizza la decodifica del segnale dell'encoder in hardware. I moduli timer/counter dei microcontroller hanno spesso questa funzionalità. In questo modo sgravi il software di molto. Allo stesso tempo puoi impostare sulla stessa periferica la funzione compare che genera un interrupt al raggiungimento di un certo angolo. Questo a sua volta fa partire la lettura dell'accelerometro
- se puoi, usa un canale DMA per la lettura dell'accelerometro
- se puoi, usa la versione SPI invece di quella I2C (timing molto piú deterministico)
Boiler