J’ai juste elle publiée, donc encore plus obtiendrez utilisation de celui-ci. Le code peut être trouvé ici :
https://github.com/TKJElectronics/example-Sketch-for-IMU-including-Kalman-Filter
Bonjour tout le monde
J’ai récemment acheté cette planche IMU 6DDL analogiques (six degrés de liberté) (http://www.sparkfun.com/products/10010) de watterott.com. Il utilise trois gyroscopes et trois accéléromètres pour calculer les angles en trois dimensions.
J’ai regardé un certain temps pour peu de code en ligne et comment communiquer avec eux. Après de nombreuses heures de recherche j’ai réussi de faire une mesure précise des angles af dans deux directions. J’ai décidé d’écrire un petit guide pour les collègues amateurs électroniques.
L’objectif principal de ce guide est d’enseigner aux autres comment obtenir des données utiles de leur IMU ou juste un gyroscope ou l’accéléromètre. Le code pour Arduino se trouvent sur github : https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter. Il devrait être assez facile à mettre en œuvre mon code pour votre propre capteur. Je ne décrirai pas tous les détails sur la théorie sous-jacente, au lieu de cela, vous pouvez regarder les sources pour plus d’informations.
Avant de commencer il faut connecter le Mio comme suit :
Acc_Gyro Arduino
3.3V <> — 3.3V
GND <> — GND
Gx4 X <> — AN0
Gx4 Y <> — AN1
Gx4 Z <> — AN2
ACC X <> — AN3
AN4 Y <> — ACC
CAC Z <> — AN5
Connectez également 3.3V sur la broche AREF sur l’Arduino pour plus de précision.
Il est très important que vous ne connectez pas le capteur à 5V - Cela détruira le capteur.
Maintenant vous êtes prêt pour la lecture des données du capteur.
Pour communiquer avec le capteur est simple :
Le gyroscope mesures degrés par seconde, tandis que l’accéléromètre mesure l’accélération (g) en trois dimensions. Les deux sorties les mesures sous forme d’un signal analogique.
Pour obtenir ces traduite en degrés que vous devez faire un codage :
Le gyroscope
Tout d’abord, il faut traduire les chiques (un nombre entre 0-1023) en quelque chose d’utile (il s’agit d’une ADC avec une résolution de 10 bits, par exemple, ce doit être 4095 (2 ^ 12-1 = 4095) pour 12 bit ADC). Pour ce faire je viens d’utiliser cette simple équation :
gyroRate = (gyroAdc-gyroZero) / sensibilité - où gyroAdc sont la valeur lues de notre capteur, gyroZero est la valeur lorsqu’elle est stationnaire (cela dans le code - Regardez dans la section « Installation ») tandis que la sensibilité est la sensibilité trouvées dans la feuille de données, mais traduit en liquides.
Si vous regardez dans les fiches techniques de deux gyroscopes (http://www.sparkfun.com/datasheets/Sensors/IMU/lpr530al.pdf et http://www.sparkfun.com/datasheets/Sensors/IMU/LY530ALH.pdf), vous verrez que la sensibilité est 3.33mV/deg/s pour la 4xOUT. À traduire en contreparties est assez facile : sensibilité / 3.3 * 1023.
Donc dans cet exemple, j’obtiens :
0.00333/3.3*1023=1.0323.
NB: pour traduire mV à V simple diviser simplement par mille.
L’équation finale ressemblera à ceci :
gyroRate = (gyroAdc-gryoZero) / 1.0323
Le résultat va sortir comme degrés par seconde. Pour traduire cela en degrés, il faut connaître l’heure exacte depuis la dernière boucle. Heureusement, l’Arduino a obtenu une commande simple de le faire : millis(). Grâce à qui, on peut calculer la différence de temps (temps de delta) et ainsi de calculer l’angle du gyroscope. L’équation finale ressemblera à ceci :
gyroAngle += gyroRate * dtime/1000
Malheureusement, le gyroscope dérive au fil du temps. Cela signifie qu’il ne peut pas faire confiance une période plus longue, mais c’est très précis pour une courte période. C’est lorsque l’accéléromètre est très pratique. Il n’a pas toute dérive, mais il est trop instable pour timespan plus courte. Je vais décrire comment combiner ces mesures dans un certain temps, mais tout d’abord, je vais décrire comment traduire les lectures de l’accéléromètre en quelque chose d’utile.
L’accéléromètre
L’accéléromètre mesure l’accélération (g) en trois dimensions. Pour traduire l’analogique lectures en degrés, qu'il suffit de lire l’axe et à soustraire le décalage du zéro comme suit :
accVal = accAdc-accZero
Où accAdc est la lecture analogique et accZero est la valeur quand il lit g 0 - ont été calculés dans le début du code, regardez dans la section « Installation ». La valeur zéro se retrouve dans la fiche technique : http://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf. Vous verrez que la zéro tension à 0g est environ 1.5V, de traduire cela dans les liquides, vous devez encore utiliser cette équation : zeroVoltage / 3.3 * 1023.
Donc dans cet exemple, j’obtiens :
1.5/3.3*1023=465.
Vous pouvez ensuite calculer la hauteur tonale et rouler à l’aide des équations suivantes :
hauteur = atan2 (accYval, accZval) + PI
rouleau = atan2 (accXval, accZval) + PI
Atan2 a une plage de sortie entre - π et π (voir http://en.wikipedia.org/wiki/Atan2), j’ajoute simplement π, la gamme il converti en 0 à 2π.
Pour convertir des radians en degrés nous il suffit de multiplier le résultat par 57.295779513082320876798154814105 - ceci est prédéfinie dans l’IDE Arduino comme RAD_TO_DEG.
Filtre de Kalman
Comme je l’ai expliqué plus tôt le gyroscope est très précis, mais tendent à dériver. L’accéléromètre est un peu instable, mais ne pas dériver. Vous pouvez calculer l’angle précis en utilisant ce qu’on appelle un filtre de Kalman. Un guide détaillé sur la façon dont elle est mise en œuvre peut être trouvé à mon blog : http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it/.
Si vous voulez utiliser quelque chose d’un peu plus simple, vous pouvez utiliser ce qu’on appelle un filtre complémentaire. Il est assez facile à comprendre et le calcul est beaucoup plus simple, car il ne fonctionne qu’en une seule étape.
Par exemple, l’équation pourrait ressembler à ceci :
angle = 0,98 *(angle+gyro*dt) + 0,02 * acc - vous pouvez affiner les chiffres à ce que vous voulez. N’oubliez pas que la somme doit être 1.
Pour moi, le résultat du filtre complémentaire était très fin (ou presque la même chose) que celle calculée par le filtre de Kalman.
Vous avez maintenant appris (on l’espère) Comment obtenir des données analogiques d’IMU et le traduire en quelque chose d’utile. J’ai joint mon propre code pour mon 6DDL IMU (http://www.sparkfun.com/products/10010), mais avec quelques modifications un peu, je suis assez sûr qu’il est possible de l’utiliser avec n’importe quel gyroscope/accéléromètre analogique.
Si vous avez des questions, hésitez pas à poster un commentaire ci-dessous.
Sources :
http://www.Arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1284738418
http://www.x-Firm.com/?page_id=148
http://Web.mit.edu/First/Segway/
Mise à jour
Je viens de terminer un code de traitement qui imprime les données de l’Arduino sur un graphique agréable. Comme vous pouvez le voir dans la vidéo ci-dessous le filtrage est quitté efficace. La ligne bleu clair est l’accéléromètre, la ligne violette est le gyroscope, la ligne noire représente l’angle calculé par le filtre complémentaire et la ligne rouge est l’angle calculé par le filtre de Kalman. Comme vous pouvez voir le filtre de Kalman est juste un peu plus précis (je sais c’est difficile de voir dans la vidéo) que le filtre complémentaire, surtout quand je le secouer.
J’ai joint mon code, le code de mise à jour pour l’Arduino et le code de traitement. Il est également possible de consulter les données de l’axe y. Décommentez simplement drawAxisY() ; dans le code.
Nouveau firmware
J’ai décidé de mettre tout le code source sur github, car il est beaucoup plus facile à entretenir.
Le code plus récent se trouve maintenant à github : https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter
Mon robot d’équilibrage
Voici une vidéo de mon robot d’équilibrage. Il utilise les mêmes IMU et algorithme tel que décrit dans le post ci-dessus.
Kickstarter
J’ai mon robot équilibrage sur Kickstarter vient de sortir : http://www.kickstarter.com/projects/tkjelectronics/balanduino-balancing-robot-kit
Pensez à soutenir le projet.