Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue179:micro-ci_micro-la [2022/03/30 19:10] – d52fr | issue179:micro-ci_micro-la [2022/04/01 16:53] (Version actuelle) – andre_domenech |
---|
I used the standard I2C bus 0, which uses GPIO pin 8 for SDA and GPIO pin 9 for SCL.** | I used the standard I2C bus 0, which uses GPIO pin 8 for SDA and GPIO pin 9 for SCL.** |
| |
Ce mois-ci, nous allons nous intéresser à l'interfaçage de la carte LSM303DLHC Accéléromètre et Magnétomètre trois axes (Compas) à picots avec le microcontrôleur Raspberry Pi Pico. Il existe de nombreux sites Web qui traitent de l'interfaçage de la carte avec un Arduino et quelques-uns qui traitent de l'interfaçage avec la PyBoard, mais très peu traitent de la façon de traiter l'ESP32, l'ESP8622 ou le Raspberry Pi Pico à l'aide de Micropython. | Ce mois-ci, nous allons nous intéresser à l'interfaçage de la carte LSM303DLHC Accéléromètre et Magnétomètre trois axes (Compas) à picots avec le microcontrôleur Raspberry Pi Pico. Il existe de nombreux sites Web qui traitent de l'interfaçage de la carte avec un Arduino et quelques-uns qui traitent de l'interfaçage avec la PyBoard, mais très peu parlent de la façon de traiter l'ESP32, l'ESP8622 ou le Raspberry Pi Pico à l'aide de Micropython. |
| |
J'ai trouvé trois différentes bibliothèques de pilotes qui étaient censées être pour Micropython et qui étaient censées supporter les trois microcontrôleurs sur lesquels nous nous concentrons. Après avoir testé les trois pilotes, seul un d'entre eux a fonctionné correctement sur l'une des trois cartes et ce dernier n'a fonctionné que sur le RPi Pico. | J'ai trouvé trois différentes bibliothèques de pilotes qui étaient censées être pour Micropython et qui étaient censées supporter les trois microcontrôleurs sur lesquels nous nous concentrons. Après avoir testé les trois pilotes, seul un d'entre eux a fonctionné correctement sur l'une des trois cartes et ce dernier n'a fonctionné que sur le RPi Pico. |
| |
Tout d'abord, parlons du câblage. Heureusement, cette carte de capteur supporte I2C, donc le branchement est assez standard, comme vous pouvez le voir sur le dessin de la plaque d'essai. | Tout d'abord, parlons du câblage. Heureusement, cette carte de capteur supporte I2C, car, ainsi, le branchement est assez standard, comme vous pouvez le voir sur le dessin de la plaque d'essai. |
| |
J'ai utilisé le bus I2C standard 0, qui utilise la broche GPIO 8 pour SDA et la broche GPIO 9 pour SCL. | J'ai utilisé le bus I2C standard 0, qui utilise la broche GPIO 8 pour SDA et la broche GPIO 9 pour SCL. |
En exécutant le programme i2cscan pour le Pico, j'ai vérifié que les adresses étaient 0x19 (pour l'accéléromètre) et 0x1e (pour le magnétomètre), ce qui correspond aux informations du pilote. | En exécutant le programme i2cscan pour le Pico, j'ai vérifié que les adresses étaient 0x19 (pour l'accéléromètre) et 0x1e (pour le magnétomètre), ce qui correspond aux informations du pilote. |
| |
Cette bibliothèque de pilotes peut être trouvée sur https://gitlab.iue.fh-kiel.de/hassan.karo/robotling-m3-labor/-/blob/feature/config_2020/robotling_lib/driver/lsm303.py mais nécessite quelques modifications pour fonctionner correctement sur le Pico. Je vais également fournir le pilote modifié sur mon dépôt. Vous trouverez l'adresse du dépôt à la fin de cet article. | Cette bibliothèque de pilotes peut être trouvée sur https://gitlab.iue.fh-kiel.de/hassan.karo/robotling-m3-labor/-/blob/feature/config_2020/robotling_lib/driver/lsm303.py mais nécessite néanmoins quelques modifications pour fonctionner correctement sur le Pico. Je vais également fournir le pilote modifié sur mon dépôt. Vous trouverez l'adresse du dépôt à la fin de cet article. |
| |
Nous ne pouvons pas avancer sans les modifications du pilote, alors regardons les changements. Je ne vais pas essayer de fournir le code source complet ici. Copiez le fichier source sur votre Pico et utilisez Thonny pour le modifier. | Nous ne pouvons pas avancer sans les modifications du pilote, alors regardons les changements. Je ne vais pas essayer de fournir le code source complet ici. Copiez le fichier source sur votre Pico et utilisez Thonny pour le modifier. |
In our driver library is the function that returns a tuple providing the x, y and z axis.** | In our driver library is the function that returns a tuple providing the x, y and z axis.** |
| |
La première chose, comme vous le savez déjà, est de mettre en place les importations. Nous devons avoir accès aux fonctions I2C. Puisque nous utilisons le bus i2c 0, nous n'avons pas besoin d'importer les fonctions Pin, mais je vais également les intégrer. Nous devons également importer la classe LSM303 de la bibliothèque que nous venons de créer, ainsi que sleep depuis time, et les fonctions atan2 et pi depuis la bibliothèque mathématique. | La première chose, comme vous le savez déjà, est de mettre en place les importations. Nous devons avoir accès aux fonctions I2C. Puisque nous utilisons le bus i2c 0, nous n'avons pas besoin d'importer les fonctions Pin, mais je vais également les intégrer. Nous devons aussi importer la classe LSM303 de la bibliothèque que nous venons de créer, ainsi que sleep depuis time, et les fonctions atan2 et pi depuis la bibliothèque mathématique. |
| |
from machine import I2C,Pin | from machine import I2C,Pin |
from math import atan2,pi | from math import atan2,pi |
| |
Ensuite, nous devons définir l'objet i2c, instancier la classe LSM303 à l'objet compass, et définir une variable pour la boucle « éternelle » que nous utiliserons pour interroger continuellement le magnétomètre. | Ensuite, nous devons définir l'objet i2c, instancier la classe LSM303 à l'objet compass et définir une variable pour la boucle « éternelle » que nous utiliserons pour interroger continuellement le magnétomètre. |
| |
i2c=I2C(0) | i2c=I2C(0) |
After we have the value of where the sensor is pointing, the data coming back will be from -180 to +180. We need to normalize the value to be from 0 to 359. So we simply check to see if the value is less than 0 and if so we add 360 to the value and return that.** | After we have the value of where the sensor is pointing, the data coming back will be from -180 to +180. We need to normalize the value to be from 0 to 359. So we simply check to see if the value is less than 0 and if so we add 360 to the value and return that.** |
| |
Voici à quoi ressemble la fonction (en haut à droite). | Voici à quoi ressemble la fonction (en haut à droite de la page suivante). |
| |
Heureusement, nous n'avons pas à taper cela dans notre code. Quoi qu'il en soit, revenons au code de notre programme de test. | Heureusement, nous n'avons pas à taper cela dans notre code. Quoi qu'il en soit, revenons au code de notre programme de test. |
Maintenant, nous créons notre boucle « éternelle » (en bas à gauche) qui interroge l'objet compass pour obtenir notre cap par rapport au nord magnétique. | Maintenant, nous créons notre boucle « éternelle » (en bas à gauche) qui interroge l'objet compass pour obtenir notre cap par rapport au nord magnétique. |
| |
Je vais emprunter une partie du texte du site Web d'Adafruit pour expliquer ce qui se passe dans le code : En l'absence de champs magnétiques locaux puissants, les lectures du capteur devraient refléter le champ magnétique de la terre (entre 20 et 60 micro-Teslas). Lorsque le capteur est maintenu à niveau, en calculant l'angle du champ magnétique par rapport aux axes X et Y, le dispositif peut être utilisé comme une boussole. Pour convertir les lectures microTesla en un cap de boussole de 0 à 360 degrés, nous pouvons utiliser la fonction atan2() pour calculer l'angle du vecteur défini par les lectures des axes Y et X. Le résultat sera en radians, c'est-à-dire qu'il s'agira d'un angle de 0 à 100 degrés. Le résultat sera exprimé en radians, nous le multiplions donc par 180 degrés et le divisons par Pi pour le convertir en degrés. | Je vais emprunter une partie du texte du site Web d'Adafruit pour expliquer ce qui se passe dans le code : en l'absence de champs magnétiques locaux puissants, les relevés du capteur devraient refléter le champ magnétique de la terre (entre 20 et 60 micro-Teslas). Lorsque le capteur est maintenu à niveau, en calculant l'angle du champ magnétique par rapport aux axes X et Y, le dispositif peut être utilisé comme une boussole. Pour convertir les relevés microTesla en un cap de boussole de 0 à 360 degrés, nous pouvons utiliser la fonction atan2() pour calculer l'angle du vecteur défini par les relevés des axes Y et X. Le résultat sera exprimé en radians, nous le multiplions donc par 180 degrés et le divisons par Pi pour le convertir en degrés. |
| |
Une fois que nous avons la valeur de l'orientation du capteur, les données qui reviennent sont comprises entre -180 et +180. Nous devons normaliser la valeur pour qu'elle soit comprise entre 0 et 359. Nous vérifions donc simplement si la valeur est inférieure à 0 et si c'est le cas, nous ajoutons 360 à la valeur et nous la retournons. | Une fois que nous avons la valeur de l'orientation du capteur, les données qui reviennent sont comprises entre -180 et +180. Nous devons normaliser la valeur pour qu'elle soit comprise entre 0 et 359. Nous vérifions donc simplement si la valeur est inférieure à 0 et si c'est le cas, nous ajoutons 360 à la valeur et nous la retournons. |
J'ai mis le code de notre projet sur mon dépôt à https://github.com/gregwa1953/FCM-179_MicroThisMicroThat . | J'ai mis le code de notre projet sur mon dépôt à https://github.com/gregwa1953/FCM-179_MicroThisMicroThat . |
| |
Dans un prochain article (le mois prochain, j'espère), nous ajouterons un anneau de LED RVB de style NeoPixel à notre projet pour fournir une indication visuelle qui pointe vers le nord - quelle que soit la direction à laquelle nous sommes confrontés, émulant ainsi une vraie boussole. | Dans un prochain article (le mois prochain, j'espère), nous ajouterons un anneau de LED RVB de style NeoPixel à notre projet pour fournir une indication visuelle qui pointe vers le nord, quelle que soit la direction à laquelle nous sommes confrontés, émulant ainsi une vraie boussole. |
| |
Jusqu'à la prochaine fois, comme toujours, restez en sécurité, en bonne santé, positifs et créatifs ! | Jusqu'à la prochaine fois, comme toujours, restez en sécurité, en bonne santé, positifs et créatifs ! |
**Next, the RPi Pico Micropython port doesn’t include a method called deviceAddrList, so we need to replace that. However, the i2c.scan function already returns a list, so we can simply replace the line.** | **Next, the RPi Pico Micropython port doesn’t include a method called deviceAddrList, so we need to replace that. However, the i2c.scan function already returns a list, so we can simply replace the line.** |
| |
Ensuite, le portage du Micropython vers le RPi Pico n'inclut pas de méthode appelée deviceAddrList, nous devons donc la remplacer. Cependant, la fonction i2c.scan retourne déjà une liste, donc nous pouvons simplement remplacer la ligne. | Ensuite, le portage du Micropython vers le RPi Pico n'inclut pas de méthode appelée deviceAddrList et nous devons donc la remplacer. Cependant, la fonction i2c.scan retourne déjà une liste ; aussi, nous pouvons simplement remplacer la ligne. |
| |