Muten a écrit:Je suis preneur de l'identification de la source des perturbations, car je suis en train de me faire un Alfano + captures infos + compteur maison (je posterai ça sur le forum).
Je pars sur la base de ce mec :
http://dawa.panik-po.com/ (avec qui j'ai des contacts, mais j'attends mes derniers composants pour finaliser).
J'ai progressé. Et puis aussi regardé ce qu'il a fait. Autour d'un Zero, un processeur à 48MHz. Pour lequel il semble exister une version au moins de FreeRTOS (un peu balaise à exploiter). Son sketch est séquentiel, typique Arduino, ses sources sont là:
https://github.com/quichedood/DAWA/blob ... WA-5.0.ino
if (gps.available(GPS_PORT)) {
...
faire des choses
...
/**************************************************************
Read 9-axis data
**************************************************************/
bno.getEvent(&event);
/**************************************************************
Read I2C analog values
**************************************************************/
readAdcValues(anaValues); // Takes time to read all values (one voltage conversion = 12.2ms !)Son projet et sa trame est intéressante. Il n'aurait qu'à en répartir des portions dans des threads, pour profiter de son M0 à 48MHz. Parle lui de ceci, de ce genre de solutions, simples:
https://github.com/mikaelpatel/Arduino-SchedulerPour le moment, j'évalue encore le truc, avec mon Teensy (à 72MHz). Avec un thread main, et d'autres, séparés, un pour chacun des MPU, afficheur OLED, GPS et monitoring de batterie (pour le moment, je n'envisage pas de me raccorder sur la moto, mais de ne faire qu'un petit truc à poser dessus et sur batterie). Ca semble tenir la route, même avec le MPU à 100Hz. Alors avec le MPU à 20-25Hz, ça devrait finalement le faire facilement.
Le MPU à 20Hz ou plus? Pour remplir un ring buffer et pour en extraire l'angle max de la dernière seconde plutôt que de me contenter d'une valeur d'angle au pif de l'instant. Une seconde, c'est énorme, la moto a eu le temps de pencher d'un côté à l'autre.... ou encore de riper dans la seconde et de pencher autrement.
Ou encore un ring buffer avec les données des 10 à 20 dernières secondes, pour pouvoir regarder l'écran tranquillement, après être sorti de virages:
#define DATA_SAMPLES_ROLL 200
float max_roll[DATA_SAMPLES_ROLL];
int max_roll_recent_pointer;
float max_roll_trip_left, max_roll_trip_right;
roll = 0;
for (int i = 0; i < DATA_SAMPLES_ROLL; i++)
roll = max(roll, max_roll[i]);
En debug, pour le moment, avec le MPU à 100Hz, ça me donne ceci, et je devrais maintenant avoir encore du temps CPU pour assez d'autres choses, dont pour écrire toutes les secondes sur la carte SD. 5 choses ou boucles de type loop() qui s'exécutent en parallèle:
SD card present
OLED display update...
1.64
OLED display update...
OLED display update...
3,2019-07-25 21:51:01.000,***,***,,32,11910,5,225,0,13239,
Have a fix!
Running on mains
SD card present
OLED display update...
OLED display update...
OLED display update...
1.66
Battery : 4151mV, 0mA, 100%
3,2019-07-25 21:51:02.000,***,***,,218,11880,5,233,0,13708,
OLED display update...
Have a fix!
Running on mains
SD card present
OLED display update...
OLED display update...
OLED display update...
3,2019-07-25 21:51:03.000,***,***,,270,11860,5,241,0,14179,
1.66
OLED display update...
Have a fix!
Au lieu d'y avoir un setup() et une loop() uniques, il y en a plusieurs:
void setup() {
SPI.setSCK(14);
SPI.begin();
Wire.begin();
Wire.setClock(400000L);
Scheduler.start(setupDisplay, loopDisplay);
Scheduler.start(setupMPU, loopMPU);
Scheduler.start(setupGPS, loopGPS);
Scheduler.start(setupBattery, loopBattery);
J'ai encore pour projet d'ajouter un émetteur/récepteur radio de type NRF24L01+. Juste une loopRadio de plus. Dont je ne savais pas encore quoi faire exactement. J'aime bien son idée de lire les data DDA et de les enregistrer aussi... un module sous la selle et via radio, hop, dans la carte SD.