Outils pour utilisateurs

Outils du site


issue194:micro-ci_micro-la

Before we get started on this month’s subject, I want to give you a little bit of an update on MicroPython 1.20. As of the first of June 2023, the I2C issue still somewhat exists. You CAN use I2C, but, at this time, you can’t use the old defaults. I say old defaults because it looks like the people at RPi asked that the defaults be changed to what they are now. So, to be sure that your I2C projects will work under 1.20, use the table below to set your I2C pins. As to the NeoPixel driver, you CAN use the one you used previously, but should rename it, just to avoid any confusion between you and MicroPython. I’ve tested this using the Pico-W and the Pico with three sets of 1-meter strings of 30 devices each. Everything works fine.

Avant de commencer à parler du sujet du mois, je voudrais faire une petite mise à jour sur MicroPython 1.20.

Depuis le 1er juin 2023, le problème d'I2C est toujours d'actualité. Vous POUVEZ utiliser I2C, mais, pour l'instant, vous ne pouvez pas utiliser les anciennes valeurs par défaut. Je parle d'anciennes valeurs par défaut parce qu'il semble que les gens de RPi aient demandé à ce que les valeurs par défaut soient changées pour ce qu'elles sont maintenant. Donc, pour être sûr que vos projets I2C fonctionneront sous la version 1.20, utilisez le tableau ci-dessous pour configurer vos broches I2C.

En ce qui concerne le pilote NeoPixel, vous POUVEZ utiliser celui que vous utilisiez précédemment, mais vous devriez le renommer, juste pour éviter toute confusion entre vous et MicroPython. Je l'ai testé en utilisant le Pico-W et le Pico avec trois séries de rubans de 1 mètre avec 30 éléments chacune. Tout fonctionne bien.

Also, as of June 2023, the BLE bluetooth drivers were still being worked on, but were showing great progress. When done, you should be able to use most code from ESP-32 boards. I’ll give you a hint about the subject of the next MTMT, which should be controlling motors using the Pico-W. This is a great way to break into robotics. Now onto the subject of the month, the HC-SR04 ultrasonic obstacle avoidance sensor. As far as I know, this sensor comes only in a 5Vdc version. However, not all is lost. I was able to get a small 4-channel I2C-safe Bi-directional Logic Level Converter that costs about $4.00 USD. It works well. You can see it in the wiring image above.

Par ailleurs, en juin 2023, les pilotes Bluetooth BLE étaient toujours en cours de développement, mais ils progressaient considérablement. Lorsqu'ils seront terminés, vous devriez pouvoir utiliser la plupart du code des cartes ESP-32.

Je vous donne un indice sur le sujet du prochain Micro-ci Micro-là, qui devrait être le contrôle de moteurs à l'aide du Pico-W. C'est un excellent moyen de s'initier à la robotique.

Passons maintenant au sujet du mois, le capteur d'évitement d'obstacles à ultrasons HC-SR04.

A ma connaissance, ce capteur n'existe qu'en version 5 V dc. Cependant, tout n'est pas perdu. J'ai pu me procurer un petit convertisseur de niveau logique bidirectionnel à 4 canaux, sans risque pour I2C, qui coûte environ 4,00 $ US. Il fonctionne bien.

Vous pouvez le voir dans l'image de câblage ci-dessus.

The pinout is pretty straightforward, even if you are using the logic level converter. I’ve created a small table here (below) to help you along. I’ve tested the project with and without the logic level converter, and I haven’t noticed any major difference between the two setups, so if you don’t have a converter, you should be able to use it without any problems. How it works There is a lot of science behind this little sensor and I would be remiss if I didn’t address it here. So I’m going to put on my science geek hat before we get into the code.

Le brochage est assez simple, même si vous utilisez le convertisseur de niveau logique. J'ai créé un petit tableau (ci-dessous) pour vous aider.

J'ai testé le projet avec et sans convertisseur de niveau logique et je n'ai pas remarqué de différence majeure entre les deux configurations, donc si vous n'avez pas de convertisseur, vous devriez pouvoir l'utiliser sans problème.

Comment cela fonctionne-t-il ?

Il y a beaucoup de science derrière ce petit capteur et je m'en voudrais de ne pas en parler ici. Je vais donc mettre mon chapeau de scientifique avant d'entrer dans le code.

Looking at the datasheet, whenever the Pico/MicroController wants to see if there is anything within its range, it sends out a pulse on the Trigger pin of the sensor. That causes the sensor to send out a burst of 8 pulses of ultrasonic sound at 40 kHz through the emitter and then it starts listening for an echo. The ultrasonic sound will bounce off most objects within the 4-meter maximum range and hopefully come back to the receiver. The amount of time between the sending and receiving is measured (in microseconds), and can be converted into a distance measurement using a formula EchoTime(us) / 58 = centimeters. This is then sent back to the driver which, in turn, sends the distance back to our program. Our program can then take the information from the driver and simply display it, or use it to determine how much closer to the detected object the application wants to get.

En regardant la fiche technique, chaque fois que le Pico/MicroContrôleur veut voir s'il y a quelque chose dans son rayon d'action, il envoie une impulsion sur la broche de déclenchement du capteur. Le capteur envoie alors une salve de 8 impulsions d'ultrasons à 40 kHz par l'intermédiaire de l'émetteur et commence à écouter l'écho. Les ultrasons rebondissent sur la plupart des objets situés dans la zone de portée maximale de 4 mètres et reviennent, nous l'espérons, vers le récepteur. Le temps écoulé entre l'émission et la réception est mesuré (en microsecondes) et peut être converti en une mesure de distance à l'aide de la formule EchoTime(µs)/58 = centimètres. Cette mesure est ensuite renvoyée au pilote qui, à son tour, renvoie la distance à notre programme.

Notre programme peut alors prendre l'information du pilote et l'afficher tout simplement ou l'utiliser pour déterminer à quelle distance de l'objet détecté l'application veut s'approcher.

The sensor has a range somewhere between about 2 cm and 4 meters, but the max distance could be anywhere between 2 and 4 meters. All of that having been said, we have to remember to consider what kind of material we are going to be encountering as we try to use this project. Because we are relying on an echo coming back to the sensor, we have to take into account what type of object the ultrasonic signal is bouncing off of. If it’s a hard surface like wood or drywall, there won’t be much absorption. However, if the object is like a curtain, a fair amount of the signal will be absorbed and might give you false data.

Le capteur a une portée comprise entre 2 cm et 4 mètres, mais la distance maximale peut être comprise entre 2 et 4 mètres.

Cela étant dit, nous devons nous rappeler de prendre en compte le type de matériau que nous allons rencontrer en essayant d'utiliser ce projet.

Comme nous comptons sur un écho revenant au capteur, nous devons tenir compte du type d'objet sur lequel le signal ultrasonique rebondit. S'il s'agit d'une surface dure comme le bois ou les cloisons sèches, il n'y aura pas beaucoup d'absorption. En revanche, si l'objet est un rideau, une bonne partie du signal sera absorbée et ça risque de fausser les données.

Another thing you want to take into consideration – if you are going to mount the sensor on, let’s say, a rover or small robot – make sure that the sensor is mounted as straight as possible at the front of the device. This is due to the signal’s reflection not returning. The law of physics says that the angle of incidence is equal to the angle of reflection. This gets into some pretty deep science, so I’ll avoid a discussion here. If you are curious, you can look at http://www.fast.u-psud.fr/~martin/acoustique/support/r%C3%A9flection-r%C3%A9fraction.pdf or https://en.wikipedia.org/wiki/Angle_of_incidence_(optics). You could also do an Internet search for “ultrasonic reflection” to find other sources of information. The Code

Une autre chose à prendre en considération - si vous vous apprêtez à monter le capteur sur, disons, un rover ou un petit robot - assurez-vous que le capteur est monté aussi droit que possible à l'avant de l'appareil. Cela est dû au fait que la réflexion du signal ne revient pas. La loi de la physique dit que l'angle d'incidence est égal à l'angle de réflexion. Il s'agit là de la science des professionnels, que je n'aborderai donc pas ici. Si vous êtes curieux, vous pouvez consulter http://www.fast.u-psud.fr/~martin/acoustique/support/réflection-réfraction.pdf ou https://fr.wikipedia.org/wiki/Angle_d'incidence_(optique). Vous pouvez également effectuer une recherche sur Internet sur « réflexion ultrasonique » pour trouver d'autres sources d'information.

Le code

There are a few drivers out there and you can certainly “roll your own”. However, I’m going to suggest you start with one that works pretty well for me. You can find it, as well as their code to run the driver on the RPi Pico/Pico-W, at https://microcontrollerslab.com/hc-sr04-ultrasonic-sensor-raspberry-pi-pico-micropython-tutorial/ They have a much deeper explanation of how the whole thing works, so you might want to take a look at their article as well as getting the code. I’ll also put it in a repository for your convenience. First the driver. I’ll show only the important parts here. import machine, time from machine import Pin

Il existe plusieurs pilotes et vous pouvez certainement « faire votre propre choix ». Cependant, je vais vous suggérer de commencer par celui qui fonctionne très bien pour moi. Vous pouvez le trouver, ainsi que son code pour exécuter le pilote sur le RPi Pico/Pico-W, à https://microcontrollerslab.com/hc-sr04-ultrasonic-sensor-raspberry-pi-pico-micropython-tutorial/.

Vous y trouverez une explication beaucoup plus détaillée de la façon dont tout cela fonctionne et vous pouvez donc jeter un coup d'œil à cet article et obtenir le code. Je le mettrai également dans un dépôt pour vous faciliter la tâche.

D'abord le pilote. Je ne montrerai ici que les parties importantes.

import machine, time

from machine import Pin

First, we have the imports. The driver simply uses machine, machine.Pin, and time. Next, we have the actual class. I’m going to omit most of the comments. The init function (above) sets up the trigger and echo pins and the echo timeout value (in microseconds). The _send_pulse_and_wait() function sends a pulse of 10 microseconds to the trigger pin, then starts looking for a return pulse on the echo pin, checking the elapsed time (bottom left). The distance_mm() function is not actually called from the test program, but is there if you want to get return data that is more granular than the distance_cm() function (below).

Tout d'abord, nous avons les imports. Le pilote utilise simplement machine, machine.Pin et time.

Ensuite, nous avons la classe proprement dite. Je vais omettre la plupart des commentaires.

La fonction init (ci-dessus) définit les broches de déclenchement et d'écho ainsi que la valeur du délai d'attente de l'écho (en microsecondes).

La fonction _send_pulse_and_wait() envoie une impulsion de 10 microsecondes à la broche de déclenchement, puis commence à chercher une impulsion de retour sur la broche d'écho, en vérifiant le temps écoulé (en bas à gauche).

La fonction distance_mm() n'est pas réellement appelée par le programme de test, mais elle est là si vous souhaitez obtenir des données de retour plus fines qu'avec la fonction distance_cm() (ci-dessous).

The distance_cm() function (below) is the actual function that gets called from the test program. It first calls the _send_pulse_and_wait() function, and gets back the pulse time. Then that value is returned as the number of centimeters that represents the time between the trigger and the echo return. If you want to see the reasoning behind the formulas, you can look at the comments in the actual driver file. As for the test program, it’s really much simpler than the actual driver. We import the driver class and time.sleep. from hcsr04 import HCSR04 from time import sleep

La fonction distance_cm() (ci-dessous) est la fonction qui est appelée par le programme de test. Elle appelle d'abord la fonction _send_pulse_and_wait() et récupère le temps d'impulsion. Cette valeur est ensuite renvoyée sous la forme d'un nombre de centimètres représentant le temps écoulé entre le déclenchement et le retour de l'écho.

Si vous souhaitez connaître le raisonnement qui sous-tend les formules, vous pouvez consulter les commentaires dans le fichier du pilote.

Le programme de test est, quant à lui, beaucoup plus simple que le pilote lui-même.

Nous importons la classe du pilote et time.sleep.

from hcsr04 import HCSR04

from time import sleep

Then, we instantiate the class from the driver, assigning the trigger and echo pins, and providing a timeout value in microseconds. I added an optional line of code to assign a button on GPIO 20 as an input. This is so we can poll pin 20 for a low to let the program know that the button has been pressed. If the button has been pressed, it will allow the program to exit the forever loop that we will create. There is no issue if you don’t include a button in your setup. The code will still look for the falling signal, but it really won’t make any difference if it doesn’t see it. You can always just use the stop button in Thonny to end the program.

Ensuite, nous instancions la classe du pilote, en assignant les broches de déclenchement et d'écho, et en fournissant une valeur de timeout en microsecondes.

J'ai ajouté une ligne de code optionnelle pour assigner un bouton sur le GPIO 20 en tant qu'entrée. Cela nous permet d'interroger la broche 20 pour obtenir un niveau bas afin d'indiquer au programme que le bouton a été enfoncé. Si le bouton a été pressé, cela permettra au programme de sortir de la boucle infinie que nous allons créer. Il n'y a pas de problème si vous n'incluez pas de bouton dans votre configuration. Le code cherchera toujours le signal de chute, mais cela ne fera aucune différence s'il ne le voit pas. Vous pouvez toujours utiliser le bouton d'arrêt de Thonny pour terminer le programme.

We then enter the ‘forever’ loop (right). We poll the sensor and get a distance value. Then I include a calculation to convert centimeters to inches, display them both on the REPL terminal, check to see if the button has been pressed (if there is one), break the loop if we get a 0 from the button pin, and finally sleep for 1 second before starting the loop all over again. Testing the program I’m going to assume that you are using a breadboard to hold your project. Place it on a table and place a ruler between the sensor and something fairly big like a box of tissues. This will give you a known reference. When you run the test program, you should see, about every second, something like this… Distance 28.95189 cm - 11.39838 in

Nous entrons ensuite dans la boucle « infinie » (à droite). Nous interrogeons le capteur et obtenons une valeur de distance. Ensuite, j'inclus un calcul pour convertir les centimètres en pouces, afficher les deux sur le terminal REPL, vérifier si le bouton a été pressé (s'il y en a un), interrompre la boucle si nous obtenons un 0 de la broche du bouton, et enfin dormir pendant 1 seconde avant de recommencer la boucle.

Test du programme

Je vais supposer que vous utilisez une planque d'essai pour votre projet. Placez-la sur une table et placez une règle entre le capteur et quelque chose d'assez grand comme une boîte de mouchoirs en papier. Cela vous donnera une référence connue. Lorsque vous exécutez le programme de test, vous devriez voir, toutes les secondes environ, quelque chose comme ceci :

Distance 28.95189 cm - 11.39838 in

If it works, and the distance returned is somewhat reasonable, you can test the sensor by pointing at something else. If not, you will most likely be getting a return that looks something like this… Distance 225.0 cm - 88.58268 in This is the “default” return that means that the sensor didn’t receive a clear echo back before the timeout value. Given the sensor has a range between about 2 cm and 4 meters, as long as your target is within about 3 meters, this could mean that you have the trigger and echo pins swapped. The other possibility could be that the breadboard you are using has a bad spot or two. Try reseating the Pico, the sensor, and your jumper wires, and try again. I’ve seen it happen that even a brand new breadboard might have a bad spot, or 5, and the normal “tech support” answer is if you are using a breadboard, try different positions for your components and/or check your wires.

Si le programme fonctionne et que la distance affichée est raisonnable, vous pouvez tester le capteur en pointant vers quelque chose d'autre. Si ce n'est pas le cas, vous obtiendrez probablement un résultat ressemblant à ceci :

Distance 225.0 cm - 88.58268 in

Il s'agit du retour « par défaut » qui signifie que le capteur n'a pas reçu d'écho clair avant la fin du délai d'attente. Étant donné que le capteur a une portée comprise entre 2 cm et 4 mètres, si votre cible se trouve à moins de 3 mètres, cela pourrait signifier que vous avez interverti les broches de déclenchement et d'écho. L'autre possibilité est que la plaque d'essai que vous utilisez présente un ou deux points faibles. Essayez de réinstaller le Pico, le capteur et vos fils de connexion, et réessayez. J'ai vu que même une plaque d'essai toute neuve pouvait avoir un mauvais contact, ou 5, et la réponse normale du « support technique » est, si vous utilisez une plaque d'essai, de tester différentes positions pour vos composants et/ou vos fils.

Well, that’s about it for this month. As I said, I’ve put the code for both the driver and the demo program in my repository at https://github.com/gregwa1953/FCM194_MTMT. Be sure to save your code for the project and the sensor, because we will be revisiting this in a future article when we get into the subject of robotics. Until then, as always; stay safe, healthy, positive and creative!

Bon, ce sera tout pour ce mois-ci. Comme je l'ai dit, j'ai mis le code pour le pilote et pour le programme de démo dans mon dépôt à https://github.com/gregwa1953/FCM194_MTMT. Assurez-vous de sauvegarder votre code du projet et du capteur, car nous y reviendrons dans un prochain article quand nous passerons à un sujet sur les robots.

Jusque-là et comme d'habitude : restez en sécurité, en bonne santé, positifs et créatifs !

issue194/micro-ci_micro-la.txt · Dernière modification : 2023/07/03 17:15 de andre_domenech