Outils pour utilisateurs

Outils du site


issue181:micro-ci

First, please allow me to apologize for not having a Micro This Micro That. I was having very bad issues with my vision and it was all I could do to get the “normal” Python article done. It’s not much better right now, especially when trying to wire up a circuit. However, we will press onward as best as we can. Think back two months to part 13 (which was in FCM #179). We were using LSM 303 with the Raspberry Pi Pico to create a digital compass. The final product was obtaining a normalized integer value that gave us the number of degrees off of North. So if we were standing with the breadboard and sensor pointing to the East, we would get 90 as our heading. This month, we will use a 24 pixel NeoPixel ring. Since there are 360 degrees in our circle and we have 24 LEDs, that would mean that each of our LEDs would represent 15 degrees. So if LED[0] represents North, East would then be LED[6], South would be LED[12] and West would be LED[18].

Tout d'abord, permettez-moi de m'excuser de ne pas avoir fait un Micro-ci Micro-là le mois dernier. J'avais de très gros problèmes de vue et rédiger l'article « normal » sur Python était tout ce que je pouvais faire. Ce n'est pas beaucoup mieux en ce moment, surtout quand on essaie de câbler un circuit. Cependant, nous allons continuer à avancer du mieux que nous pouvons.

Revenez deux mois en arrière, à la partie 13 (qui était dans le FCM n° 179). Nous utilisions le LSM 303 avec le Raspberry Pi Pico pour créer une boussole numérique. Le produit final consistait à obtenir une valeur entière normalisée qui nous donnait le nombre de degrés par rapport au Nord. Ainsi, si nous étions debout avec la plaque d'essai et le capteur pointant vers l'est, nous obtiendrions 90 comme cap.

Ce mois-ci, nous allons utiliser un anneau NeoPixel de 24 pixels.

Comme il y a 360 degrés dans notre cercle et que nous avons 24 LEDs, cela signifie que chacune de nos LEDs représente 15 degrés. Ainsi, si la LED [0] représente le Nord, l'Est serait alors sur la LED [6], le Sud sur la LED [12] et l'Ouest sur la LED [18].

The basic algorithm (in pseudo code) is something like shown above. We’ll have to add the Neopixel ring to the breadboard. Remember, we will also have to have a 3 x AA rechargeable battery pack to power the Neopixel ring. Please notice that the image shows using a 3 AAA battery pack, but it is really a 3 AA battery pack. Also notice that there is a ground connection between the Neopixel ring, the battery pack and the RPi Pico. This month, we will create a test program that will verify the logic that we will use to integrate the heading from the LSM303 to the NeoPixel ring. Of course, we have to start with the imports. We will also create some variables that will be needed for the Neopixel ring. import array, time from machine import Pin import rp2 # Configure the number of WS2812 LEDs, pins and brightness. NUM_LEDS = 24 PIN_NUM = 16 brightness = 0.1

L'algorithme de base (en pseudo-code) ressemble à celui présenté ci-dessus.

Nous devrons ajouter l'anneau Neopixel à la plaque d'essai. N'oubliez pas que nous devrons également disposer d'un pack de 3 piles AA rechargeables pour alimenter l'anneau Neopixel. Remarquez que l'image montre l'utilisation d'un pack de 3 piles AAA, mais il s'agit en réalité d'un pack de 3 piles AA.

Remarquez également qu'il y a une connexion de masse entre l'anneau Neopixel, la batterie et le RPi Pico.

Ce mois-ci, nous allons créer un programme de test qui vérifiera la logique que nous utiliserons pour intégrer le cap du LSM303 à l'anneau NeoPixel.

Bien sûr, nous devons commencer par les importations. Nous allons également créer certaines variables qui seront nécessaires pour l'anneau Neopixel.

import array, time

from machine import Pin

import rp2

# Configurer le nombre de LEDs du WS2812, les broches et la luminosité.

NUM_LEDS = 24

PIN_NUM = 16

brightness = 0.1

Now we need to create the driver. We will embed this (right) into our program. Remember that we set which NeoPixel, and its color, using the pixels_set() function, but until the pixels_show() function is called, the Neopixel LED doesn’t actually light. Now we set a few constants that provide the RGB values for some predefined colors. BLACK = (0, 0, 0) RED = (255, 0, 0) YELLOW = (255, 150, 0) GREEN = (0, 255, 0) CYAN = (0, 255, 255) BLUE = (0, 0, 255) PURPLE = (180, 0, 255) WHITE = (255, 255, 255) Now (next page, top right) we can create a few support functions that we will need to make our life easier.

Maintenant, nous devons créer le pilote. Nous allons l'intégrer (à droite) dans notre programme.

Rappelez-vous que nous avons défini quel NeoPixel, et sa couleur, en utilisant la fonction pixels_set(), mais jusqu'à ce que la fonction pixels_show() soit appelée, la LED Neopixel ne s'allume pas en fait.

Nous définissons maintenant quelques constantes qui fournissent les valeurs RVB pour certaines couleurs prédéfinies.

BLACK = (0, 0, 0) RED = (255, 0, 0) YELLOW = (255, 150, 0) GREEN = (0, 255, 0) CYAN = (0, 255, 255)

BLUE = (0, 0, 255) PURPLE = (180, 0, 255) WHITE = (255, 255, 255)

Maintenant (page suivante, en haut à droite), nous pouvons créer quelques fonctions de soutien dont nous aurons besoin pour nous faciliter la vie.

We will use the Red color to mark North (LED[0]) and Blue to mark East, South and West. When we get to it, the color that marks the heading will be in Green (shown bottom left). The turn_off_all() function simply sets all the pixels on the ring to BLACK (or off). We’ve put the markers (which should pretty much stay lit unless the heading is one of those directions) for North, South, East and West into a list so we can check to see if we are on a marker LED. North will set LED[0] to Red and the other three are set to Blue. Now the real worker function is set_heading(). This function (shown middle right) embodies the logic from the pseudo code we created earlier.

Nous utiliserons la couleur Rouge pour marquer le Nord (LED[0]) et le Bleu pour marquer l'Est, le Sud et l'Ouest. Lorsque nous y arriverons, la couleur qui marque le cap sera en Vert (montré en bas à gauche).

La fonction turn_off_all() met simplement tous les pixels de l'anneau en NOIR (ou éteint).

Nous avons placé les marqueurs (qui devraient rester allumés à moins que le cap ne soit l'une de ces directions) du Nord, du Sud, de l'Est et de l'Ouest dans une liste afin de pouvoir vérifier si nous nous trouvons sur une LED de marqueur. Le Nord mettra la LED[0] en rouge et les trois autres en bleu.

Maintenant, la véritable fonction de travail est set_heading(). Cette fonction (illustrée au milieu à droite) incarne la logique du pseudo-code que nous avons créé plus tôt.

Finally, we create the logic to control everything (shown bottom right). To simulate moving around in a circle, we use a for loop, stepping from 0 to 361, and pass that value into our set_heading() function to light the correct LED. Then we reverse the for loop to simulate moving in an anti-clockwise circle. Save this program as CompassDisplay1.py. When you run it, you should see the four marker LEDs then after a short delay, you should see the green LED marking our heading move around the ring then move back around to 0 (the red LED). It’s somewhat kludgy, but it does the job. You can find the program code on my repository at https://github.com/gregwa1953/FCM-181_MicroThisMicroThat . Next time, we’ll add in the code that supports the LSM303 to finalize our project. Until next time, as always; stay safe, healthy, positive and creative!

Enfin, nous créons la logique pour tout contrôler (en bas à droite). Pour simuler un déplacement en cercle, nous utilisons une boucle for, allant de 0 à 361, et nous passons cette valeur dans notre fonction set_heading() pour allumer la bonne LED. Puis nous inversons la boucle for pour simuler un déplacement en cercle dans le sens inverse des aiguilles d'une montre.

Enregistrez ce programme sous CompassDisplay1.py. Lorsque vous l'exécutez, vous devriez voir les quatre DEL de marquage, puis après un court délai, vous devriez voir la DEL verte marquant notre cap se déplacer autour de l'anneau puis revenir à 0 (la DEL rouge). C'est un peu bancal, mais cela fait l'affaire.

Vous pouvez trouver le code du programme sur mon dépôt à https://github.com/gregwa1953/FCM-181_MicroThisMicroThat .

La prochaine fois, nous ajouterons le code qui supporte le LSM303 pour finaliser notre projet.

Jusqu'à la prochaine fois, comme toujours, restez en sécurité, en bonne santé, positif et créatif !

issue181/micro-ci.txt · Dernière modification : 2022/06/03 17:28 de andre_domenech