Le projet "iSpindle" ne peut pas fonctionner :
- le logiciel utilise les données "Accéléromètre", relatives à son Emplacement, plutôt que celles de "Rotation",
- la "Rotation" telle que donnée par le MPU6050 est une variation de rotation : si le iSpindle change d'orientation et est ensuite immobile, les données récupérées seront les mêmes que dans n'importe quelle autre position : zéro ! Pour obtenir une rotation absolue il faut "intégrer" (mathématiquement) ces données à intervalle régulier (les additionner), ce que l'on peut faire par programme, ou en le demandant au "DMP" ("Digital Motion Processor") intégré à la puce. La lecture par DMP n'est pas activée.
- Si le MPU est arrêté -WeMo débranchée, puis rebranchée dans une autre position-, il ne s'apperçoit de rien (évidemment : les mouvements ne sont pas "intégrés"). Par bonheur la mise en veille "DeepSleep" de la Wemo ne coupe pas l'alimentation du MPU.
Le MPU6050 en lui même n'est pas adapté au projet :
- le MPU6050 ne fournit pas des données véritablement "Absolues" de position ou de Rotation. En effet on constate une "dérive" ("drift") des données avec le temps.
Cette dérive est même importante : 2° à 4° au bout de quelques minutes (testé sur le programme exemple "MPU6050 DMP6")
Partant du postulat que la rotation terrestre faisait partie de la dérive (360° par 24h, donc 15° par heure), j'ai tenté une correction (les première et dernière lignes sont celles de l'Exemple) :
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
// added (test):
nowTime = millis();
float hours = ((float)(nowTime-startTime))/(3600.0*1000.0);
float ypr0Fixed = (ypr[0] * 180.0/M_PI) + hours*360.0/24.0;
// result after 6 hours:
// ypr -77.04 0.63 0.29 -5.89
// (expected: 0 0 0 0)
Serial.print("ypr\t");
La WeMo a (donc, mentionné dans le code) "tourné" pendant 6 heures, avec une dérive finale non corrigée de 77°, et corrigée, de 6°. Cette correction n'est donc pas robuste.
Pour la position absolue il faudrait par exemple un GPS (mais on s'en moque). Pour la Rotation, il faut par exemple un Compas (magnétique) ou "magnétomètre", ou des capteurs basés sur d'autres principe : optique, effet Hall, ... Les cartes MPU6050 possèdent parfois une entrée pour de tels dispositifs (nommée par exemple "bus I2C secondaire"), mais n'en sont pas doté en interne.
On peut trouver de tels dispositifs à lui rajouter, mais ils sont un peu cher (15 à 20€).
Le plus simple est de trouver un Gyroscope avec Compas intégré, généralement qualifié de 9DOF (signifiant -de manière impropre- : "9 degrés de liberté").
Les cartes basées sur la puce BNO0551 (CJMCU-055, GY-BNO055) semblent convenir -> vérifié : OK
Bibliothèques BNO055 (pour Arduino.app) : utiliser "Adafruit BNO055"