Raspberry Pi Pico MicroPython

09/03/24

mecamic

Matériel

Description Raspberry Pi Pico

De quoi est constitué un microcontrôleur ?

Position temporelleDurée
C'est quoi un microcontrôleur
Raspberry pico WH

Description Raspberry Pi Pico

La Raspberry Pi Pico-W est une carte programmable miniature avec interface WiFi et Bluetooth construite autour d'un microcontrôleur RP2040. Elle est très simple d'accès et propose d'excellentes performances à très faible coût.

  • Fonctionnalités:

    Cette version est idéale pour la réalisation de petits projets connectés, à faible consommation et nécessitant la flexibilité et la puissance du microcontrôleur RP2040. Raspberry Pi propose une documentation détaillée permettant aux débutants et amateurs de se familiariser avec la programmation en MicroPython, Python ou encore en C ou C++ de façon simple et ludique.

  • Programmation:

    Le Raspberry Pi Pico se programme en MicroPython via son port micro-USB avec l'IDE Thonny , disponible gratuitement pour Windows, macOS et Linux. Le microcontrôleur RP2040 peut également exécuter des instructions via des lignes de commandes (REPL). Pour les utilisateurs plus avancés, des kits de développement (SDK) permettent la réalisation d'applications en C/C++ et Python.

Complément

  • Les entrées logiques de cette carte sont uniquement compatibles 3,3 Vcc. Une tension supérieure endommagerait la Pico.

  • Cette carte n'exécute pas d'OS Linux, ne dispose pas de connecteur HDMI, CSI, DSI, etc. Cette carte est un microcontrôleur dont le fonctionnement se rapproche d'une carte Arduino.

Caractéristiques Raspberry pico W

  • Alimentation :

    • 5 Vcc via micro USB

    • 1,8 à 5,5 Vcc via la broche VSYS

    • 5 Vcc via la broche VBUS

  • Microcontrôleur: RP2040 Microprocesseur: ARM Cortex-M0+ Dual Core à 133 MHz

  • Mémoire SRAM: 264 KB

  • Mémoire Flash: 2 MB

  • Interface WiFi :

    • circuit: Infineon CYW43439

    • fréquence: 2,4 GHz 802.11n

    • antenne intégrée

    • compatible WPA3 et SoftAP (point d'accès, jusqu'à 4 clients maxi)

    • interface: SPI

  • Bluetooth 5.2 :

    • Support pour Bluetooth Low Energy

    • Support pour Bluetooth Classic

  • 26 broches GPIO comprenant :

    • 23 x E/S digitales

    • 3 x entrées analogiques (via ADC 12 bit)

    • 2 x interfaces UART

    • 2 x bus I2C

    • 6 x sorties PWM

    • 8 x broches PIO (programmable I/O)

    • 1 x interface SWD de debug

  • Interface hôte et périphérique de stockage USB 1.1 via le port micro-USB

  • Module RTC intégré

  • LED programmable sur GP25

  • Température de service: -20 à 85 °C

  • Dimensions: 51 x 21 x 3,9 mm

  • Poids: 3 g

Brochage Raspberry pico

Modèle sans Wifi 

Pinout and design files no wifi
Pinout and design files no wifi detailed

Modèle avec Wifi 

Pinout and design files wifi

Les ports en détails

Pour les fonctionnalités des ports en détails il suffit de suivre ce lien.

Caractéristiques datasheets Shields base Grove

Qu'est-ce que c'est ?

  • Grove est un système de connecteur plug-and-play open-source développé par Seeed Studio.

  • Les modules Grove ont été conçus pour l’éducation et le prototypage rapide. Plus de 3000 composants ; capteurs et actionneurs sont disponibles.

  • Simple : car vous n’avez pas besoin de réfléchir à « quel fil va où ? ».

  • Sûr ; car un détrompeur évite de se tromper avec la polarité.

  • Rapide ; car aucune aucune soudure à faire.

  • Branchez, codez, alimentez et c’est fait.

  • La documentation de Seeed Studio est très détaillée, complète, et comporte des exemples de code pour vous aider à démarrer vos projets.

Shields base Grove pour raspberry pico

Shield for pi pico
  1. Analog Port: include 3 anlog ports, A0, A1, A2.

  2. Digital Ports: include 3 digital ports, D16, D18, D20.

  3. UART Port: 2 UART port.

  4. I2C Ports: 2 I2C ports.

  5. Power Switch: 5V/3.3V selectable power switch.

  6. SPI port: 1 spi0 port.

Repérage des bornes

Repérage des bornes

Attention

  • Attention, ne pas dépasser 3,3V sur les entrées analogiques

  • VCC = 5V ou 3,3V en fonction de la position de l'interrupteur

Câblage

Câblage

Programmation MicroPython

Flasher le le Raspberry pico W

Prérequis

  • le logiciel « Thonny IDE »installé.

  • Une carte Raspberry Pi Pico, bien évidemment

  • Un câble USB ↔ microUSB, pour faire la liaison entre votre ordinateur.

Juste un mot sur les bootloader, firmware et programmes micropython d’un Pico

Tout d’abord, il faut savoir que tous les Raspberry Pi Pico disposent d’un « bootloader intégré », dans leur mémoire ROM ; c’est à dire un programme de démarrage « gravé dans le dur », dans la mémoire morte du microcontrôleur. Ce programme permet entre autre :

  • la communication entre le Raspberry Pico et un ordi, via le port USB

  • et l’exécution de code programme, stocké en mémoire FLASH

La mémoire FLASH, peut contenir :

  • un programme ; écrit en langage machine, directement compréhensible par le microcontrôleur,

  • et d’éventuelles données.

En fait, pour qu’un Raspberry Pi Pico puisse exécuter des scripts écrits en MicroPython, nous allons utiliser la mémoire FLASH.

  • la partie programme hébergera un interpréteur micropython. C’est à dire un micrologiciel, aussi appelé firmware en anglais, permettant de transformer à la volée du code MicroPython, en langage machine, que le microcontrôleur saura comprendre.

  • et la partie données hébergera nos fichiers-programmes écrits en MicroPython

Ainsi, le microcontrôleur du Pico exécutera du code machine fournit au fur et à mesure par le firmware (l’interpréteur micropython), en sachant que ce code machine proviendra de nos scripts micropython, interprétés à la volée.

Implanter le firmware « micropython »

Cette étape s'effectue une seule fois à la réception des cartes neuves. L'opération est réversible si on veut programmer en Arduino.

  • La première chose à faire, si vous souhaitez exécuter du code micropython sur votre Raspberry Pi Pico, c’est de lui transmettre l’interpréteur micropython, sous forme de firmware. Cet interpréteur, pour rappel, permettra de convertir le code python en langage machine, pour que le microcontrôleur puisse l’exécuter.

  • À noter que l’interpréteur micropython (le firmware) se présente sous la forme d’un fichier « .UF2 », téléchargeable sur le site :

    https://micropython.org/download/RPI_PICO_W/

  • Il est spécifique à chaque « famille » de microcontrôleur et nous prendrons la dernière version stable.

  • Pour installer ce micrologiciel dans votre Pico, nous utiliserons Thonny.

MéthodeLa partie hardware

Pour ce faire, il suffit d’effectuer les 5opérations suivantes :

  1. Gardez votre Raspberry Pico débranché ; il ne doit pas être branché au PC ni au Pico, pour l’instant.

  2. Télécharger le dernier firmware stable en suivant le lien ci-dessus. Il sera normalement sauvegardé dans votre dossier de téléchargement par défaut sur votre PC.

  3. Appuyez sur le bouton BOOTSEL de votre carte Pico. C’est normalement le seul bouton poussoir présent sur la carte, à moins que vous ayez une variante, « non officielle ».Bouton BOOTSEL

  4. Et, tout en maintenant le bouton poussoir appuyé, branchez le Raspberry Pico avec le connecteur aimanté.Connecteur aimanté

  5. Et en continuant à maintenir le bouton poussoir appuyé, branchez le Raspberry Pico sur votre PC avec le connecteur USB.Connexion PC

MéthodeLa partie software

  • Vous devriez voir une fenêtre s’ouvrir sur votre PC, comme si vous aviez branché une clef USB qui correspondant au Pico.... il est en mode "FirmWare Update".

Fenêtre d'installation
  • Il ne reste plus qu'a glisser/déposer le fichier rp2-pico-w-20220630-unstable-v1.19.1-xxx.uf2 vers le lecteur correspondant au Pico W.

01e Transfert sous le fenêtre d'installation

Lorsque le software est installé la fenêtre de la clef USB qui correspondant au Pico se ferme et disparait.

Vérification de la connexion

Attention

A faire systématiquement avant de refaire une nouvelle manipulation.

FondamentalPrise de contrôle

  • Enfin, dernière étape, si Thonny n’a pas automatiquement basculé d’interpréteur, en bas. Sélectionnez « MicroPython (Raspberry Pi Pico) » à la place de « Local Python 3 », en bas à droite, comme visible ci-dessous :

Choix de l'interpréteur
  • Et pour vérifier que tout se soit bien passé, il suffit de lire la version du firmware du Pico, à présent détecté par l’IDE Thonny. Cela apparaît en clair dans la console.

Vérification de l'interpréteur sélectionné

Bonnes pratiques

Indentation

  • L'indentation de votre code doit être de 4 caractères ; automatique dans Thonny avec la touche tabulation

Code layout

  • 79 caractères par ligne, pas plus.

Les imports

  • Les bibliothèques ou fonction sont à déclarer au début du script.

Les espaces

Les espaces suivent la syntaxe anglo-saxone et non française.

  • Entourer les opérateurs (+, -, /, *, ==, !=, >=, not, in, and, or...) d'un espace avant et d'un espace après. Espace opérateurs

  • Pas d'espace à l'intérieur de crochets, d'accolades et de parenthèses. Espaces intérieurs

  • Pas d'espace avant la parenthèse ouvrante d'une fonction ou le crochet ouvrant d'une liste ou d'un dictionnaire. Espace crochet

  • On met un espace après les caractères : et , (mais pas avant).

Respecter les conventions de nommage

  • Écrire les noms de variables en minuscules, avec des underscores (tirets bas). Nom variables

  • Écrire les variables constantes en majuscules, avec des underscores. Nom variables constantes

  • Écrire les noms de fonction avec la même convention que les variables

Les leds

Led monochrome

Introduction

Une LED est comme une diode, elle ne laisse passer le courant que dans un seul sens. Si vous la branchez mal, elle ne fonctionnera pas. Il suffit de la retourner.

Pour vous aider à raccorder une LED :

  • Une LED dispose d'une broche PLUS longue et d'une broche courte. La broche la PLUS longue va au POSITIF.

  • Il manque également de la matière sur l'un des côté de la LED. La où il y a de la matière en MOINS c'est la borne NEGATIVE. La borne que l'on raccorde à la masse.

Led cathode anode

Montage

Le montage se fait avec une résistance en série. Pour obtenir un résultat optimal avec des leds il faut choisir la valeur de la résistance avec soin. On peut consulter successivement ces trois sites pour choisir la valeur appropriée :

Montage led avec résistance

Commande

La commande peut se faire en :

Led RGB

Introduction

Faire clignoter une LED ou une séquence de LEDs c'est vraiment très sympa. Ce qui est encore mieux, c'est de contrôler la couleur d'une LED. Cela est rendu possible à l'aide d'une LED particulière dite "RGB" ou "RVB". Elle est en fait composée de 3 LEDs de couleurs différentes enfermées dans un seul et même composant.

Les meilleures LEDs RGB seront les LEDs dite à diffusion (LEDs tricolores diffuses)

Led RGB

Ce qui est appréciable avec les LED tricolores diffuses c'est que le mélange des couleurs se fait à l'intérieur de la LED.

D'une façon générale, il est préférable d'utiliser une LED tricolores à Anode Commune. L'anode commune signifie que vous connectez la broche commune au +5 Volts et que vous raccordez ensuite les autres broches à la masse au travers d'une résistance.

Il est plus approprié d'utiliser des LEDs RGB à anode commune (le +5 volts commun) plutôt que des LEDs à Cathode Commune (le GND/masse en commun) parce que les circuits intégrés contrôleurs multi-LED sont souvent conçus pour des Anodes Communes et ne peuvent pas être utilisés avec des Cathodes Communes.

Le montage

Schéma de montage

Dans un premier temps, il faut bien observer la LED pour identifier les différents broches correspondant aux différentes couleurs. La longueur des différentes broches vous y aidera.

Montage sur une breadboard

Principe de fonctionnement

La LED RGB utilise une anode commune (le + est en commun). Il faut donc manipuler la tension sur les broches négatives des différentes LEDs de couleur.

Pour résumer le fonctionnement:

  • On allume une LED de couleur en mettant la broche/pin à 0 volts.

  • On éteint une LED en mettant la broche/pin à +5 volts.

Dans le même ordre d'idée, le contrôle PWM fonctionne à l'identique.

  • Assigner une valeur 255 en PWM (100% de cycle utile) éteint la LED.

  • Assigner une valeur 30 en PWM (30% de cycle utile) allume la LED à 70%.

  • Assigner une valeur 0 en PWN (0% de cycle utile) allume la LED à 100%.

Les bandeaux de leds

Les bandeaux de leds ou « strip led »

Incorporer des hordes de LEDs dans un projet électronique peuvent le transformer en une toile d'araignée de fils et un code difficile à maintenir. L'arrivée de LEDs disposant d'une puce pilote dédicacée change la donne en allégeant le travail du microcontrôleur et le câblage afin de se concentrer sur l'application.

Le WS2812 avec source de lumière intégrée WS2812 Integrated Light Source ou plus communément nommé NeoPixel permet d'obtenir des LEDs pleine de couleurs, simple a mettre en œuvre, évolutive (scalable) et abordable.

Les leds rouge, vert et bleue sont intégrées côte à côte sur un petit support SMD (composants montés en surface) lui-même intégré sur la puce du pilote contrôleur. Le tout contrôlé par un simple fil. Ils peuvent être utilisés individuellement, arrangés pour former une longue chaîne ou assemblés pour réaliser diverses formes.

Une led en gros plan

A propos des NeoPixels

  • Toutes les LEDs addressables ne sont pas des NeoPixels. “NeoPixel” est la marque d'Adafruit pour les pixels RGB individuellement adressable et les bandes de pixels (dit "strips") basé sur les LEDs/pilotes WS2812 et WS2811, utilisant un protocole de contrôle à un seul fil. Il existe d'autres produits dont les pixels WS2801, LPD8806 et bande RGB analogique utilisant des méthodologies différentes et disposant de leur propres tutoriels.

  • Les NeoPixels ne se contentent pas de s'allumer tout seul, ils nécessitent un microcontrôleur, tel qu'un Raspberry pico et un peu de programmation.

  • NeoPixel n'est pas "la réponse idéale" pour tous les projets. Le signal de contrôle exige une gestion du temps très strict.

Puis-je réaliser un afficheur POV ?

Puis-je réaliser un afficheur POV (persistence of vision à persistance de la vision)

NéoPixel n'est pas recommandé pour ce type de projet. Le taux de rafraichissement est relativement faible (environ 400 Hz) et l'affichage des couleurs durant les mouvements rapides pourraient présenter un "effet tacheté" ainsi Les NeoPixels sont parfait pour des afficheurs stationnaires.

Puis-je réaliser du light painting?

Le mouvement plus lent utilisé pour la réalisation de tableau light painting photographique est compatible avec le taux de rafraichissement limité des NéoPixels; Les NéoPixels étant très lumineux, le résultat est excellent, surtout avec l'utilisation de diffuseur de lumière.

ComplémentDifférents produits NeoPixels

Ils sont disponibles en 3 "densités" différentes: 30, 60 et 144 LEDs par mètre, sur un PCB flexible blanc ou noir.

30 leds par mètre ruban blanc

Sachant que la tension nominale recommandée est de 5 Volts. La puissance d'utilisation de pointe, toutes les leds au maximum de luminosité par mètre sera de :

  • 9.5 Watts pour 30 LEDs/m (environ 2 Ampères à 5 Volts).

  • 18 Watts pour 60 LEDs/m (environ 3.6 Ampères à 5 Volts).

  • 35 Watts pour 144 LEDs (7 Ampères à 5 Volts).

ComplémentChoses importantes à savoir sur les Strips NeoPixel

  • Les ruban/strip NéoPixel sont vendu au mètre. Les rubans avec 144 pixels/mètre sont toujours séparés en tronçon de 1 mètre de long.

    Pour les rubans de 60 et 30 pixels/mètre. Les commandes de plusieurs mètres peuvent être livré en un seul tronçon (si possible) mais cela à une limite: 4 mètre pour 60 pixels/mètre, ou 5 mètres pour 30 pixels/mètres.

    Tous les rubans sont produits en segment de 1/2 mètre et sont joint en ruban de longueur plus importante. A la jointure, l'espacement entre les deux pixels consécutifs est légèrement plus important (2 ou 3 millimètres en plus).

  • Pour les bandes de 60 ou 30 pixels/mètre: si vous commandez une petite section (moins de 4 où 5 mètres, en fonction de la densité), la section pourrait (ou pas) avoir de connecteur JST 3-broches soudé à l'un des bouts. Ces fiches sont utilisées pour le test d'usine — la fiche n'indique pas toujours s'il s'agit d'une entrée ou d'une sortie! Les flèches imprimées sur le ruban indique le sens de propagation des données (et donc l'entrée et la sortie).

  • Bien que ces rubans soient flexibles, ils ne tolèrent pas la flexion continue et répétée. Une application typique est l'installation architecturale où les rubans peuvent être incurvés autour des colonnes puis rester en place. La flexion répétée, comme sur un costume brisera assez vite les soudures de connexion. Pour une utilisation souple, utilisez des segments plus courts sur une base semi-rigide ou optez pour des NéoPixels individuels.

  • Le ruban flexible est enfermé dans une gaine en silicone étanche, immunisant le strip contre la pluie et les éclaboussures, mais il n'est pas recommandé pour une immersion en continue.

  • Si vous avez besoin d'un profilé plus fin vous pouvez découper et enlever la gaine silicone mais, bien entendu, la bande n'est plus étanche.

  • Il y a très peu de type de colle capable d'adhérer à la gaine silicone. L'utilisation de colson est généralement plus facile et rapide pour attacher mécaniquement le ruban. Les deux seules colles fiables connue sont: Permatex 66B Clear RTV Silicone (attention: les colles silicones ne fonctionnent pas toutes!) et Loctite Plastics Bonding System (une colle cyanoacrylate bi-composant). Le Permatex 66B silicone peut également être utilisée pour sceller le bout coupé d'un ruban.

ComplémentFormes des NéoPixel

Il existe des formes à base de NéoPixel pour simplifier la réalisation de nombreux projets.

  • Les anneaux (rings) sont parfait pour la bijouterie, pièce d'horlogerie et afficheur de navigation. Rings

  • Les matrices (matrix) permettent de réaliser des afficheurs bitmaps et messages déroulant. Matrix

  • Les stick 8 LEDs NéoPixels plus rigide qu'un ruban flexible. Souder les pastilles à l'arrière pour connecter les fils ou les broches pour l'utiliser avec un breadboard. Stick

  • Les NéoPixels simples permettent de contrôler l'emplacement de chaque pixel, disponibles avec ou sans un support. Individuelle avec support

  • Toutes les formes NéoPixel peuvent être chainés. La sortie d'une forme peut être connectée à l'entrée de l'autre. Elles alors sont contrôlées à partir d'une seule broche d'un microcontrôleur.

Led intégrée

Allumer et éteindre la led embarquée

Borne de connexion de la led

La LED intégrée est connectée sur :

  • GP25 du RP2040 sur la version sans WIFI (H)

  • WL_GPIO0 sur la version avec WIFI (WH)

MicroPython gère automatiquement cette différence en utilisant "LED" comme repère.

Led intégrée

Allumer et éteindre la led à chaque activation du programme

Cliquez dans le volet principal de l'éditeur de Thonny et entrez le code suivant pour allumer la LED.

from machine import Pin
led = Pin(25, Pin.OUT)
led.toggle()

Cliquez sur le bouton pour exécuter votre code.

Allumage led Thonny

Thonny vous demandera si vous souhaitez enregistrer le fichier sur Cet ordinateur ou la carte raspberry. Choisir MicroPython sur le périphérique.

Sauvegarde Thonny
  • Entrer blink.py comme nom de fichier.

  • Vous devez entrer .py pour l'extension de fichier pour que Thonny reconnaisse le fichier comme un fichier Python.

  • Thonny peut enregistrer votre programme sur votre Raspberry Pi Pico et l'exécuter.

  • Vous devriez voir la LLED embarqué activée et désactivée chaque fois que vous cliquez sur le bouton exécuter.

Programme pour allumer puis éteindre la LED intégrée toutes les 500ms

from machine import Pin
from time import *
led_int = Pin("LED", Pin.OUT)  # broche GP25 ou WL_GPI00 en sortie
while True:             # boucle infinie puisque la condition est toujours vraie (True) 
    led_int.value(1)        # allume la LED
    sleep_ms(500)           # pause de 500 ms
    led_int.value(0)        # éteint la LED
    sleep_ms(500)           # pause de 500 ms

N'oubliez pas de faire la même manipulation que précédemment en enregistrant votre programme sous blink5.py

Led stick NeoPixel

LED NeoPixel WS2813

Borne de connexion du stick led

Le stick led est connectée sur :

Stick de 10 NeoPixels WS2813

Programme pour allumer les 3 premiers NeoPixels du stick

from machine import Pin
from neopixel import NeoPixel    # import de la bibliothèque NeoPixel
np = NeoPixel(Pin(16), 10)       # crée un objet np de 10 Néopixels connectés broche GP16 (repère D16 shield Grove)
np[0] = (255, 0, 0)              # affecte du rouge au 1er NeoPixel (adresse = 0)
np[1] = (0, 255, 0)              # affecte du verte au 2ème NeoPixel (adresse = 1)
np[2] = (0, 20, 0)               # affecte du vert pale au 3ème NeoPixel (adresse = 2)
np.write()                       # écriture des données vers les NeoPixels

Enregistrez votre programme sous blink3.py

Programme pour allumer 3 NeoPixels en bleu du stick

from machine import Pin
from neopixel import NeoPixel    # import de la bibliothèque NeoPixel
np = NeoPixel(Pin(16), 10)       # crée un objet np de 8 Néopixels connectés broche GP16 (repère D16 shield Grove)
for x in range(2, 5):            # boucle pour x de 2 à 4 (2 compris, 5 non compris)
    np[x] = (0, 0, 20)           # affecte du bleu au NeoPixel d'adresse x
np.write()                       # écriture des données vers les NeoPixels

Enregistrez votre programme sous blink3blue.py

Programme pour affecter une couleur et une intensité aléatoire aux 10 NeoPixels

from machine import Pin
from neopixel import NeoPixel
from time import sleep_ms
from random import randint
np = NeoPixel(Pin(16), 10)
while True:
    # Pour chaque NeoPixel, de x = 0 à 9
    for x in range(0, 10):
        # intensité aléatoire entre 0-60 par canaux RVB 
        r = randint(0, 60)
        v = randint(0, 60)
        b = randint(0, 60)
        # Affecte le tuple (r, v, b) au NeoPixel
        np[x] = (r, v, b)
        # Envoi des données aux Neopixels
        np.write()
        sleep_ms(100)

Enregistrez votre programme sous blinkAleatoire.py

Led intégrée bluetooth et téléphone

Bluetooth Classic & BLE

Le Bluetooth

Bluetooth Low Energy, abrégé BLE, est une variante de la technologie sans fil Bluetooth développée avec comme caractéristique notable une économie d'énergie . Contrairement à Bluetooth Classic qui est toujours actif, BLE peut rester dans un état de sommeil quand il ne transmet pas de données. Cela le rend idéal pour une utilisation dans des appareils fonctionnant sur batterie tels que des montres intelligentes, des trackers de fitness et des dispositifs de surveillance de la sécurité.

Le Pico W fonctionne à la fois avec Bluetooth Classic et Bluetooth Low Energy

BLE a les topologies de communication suivantes:

  • Point à Point: Communication entre deux nœuds(appareils) dans un réseau; communication serveur-client.

  • Réseau Mesh Network: Plusieurs nœuds peuvent communiquer entre eux dans cette topologie.

  • Mode Diffusion: Un serveur diffusera des données sur le réseau qui peuvent être lues par de nombreux appareils.

Pour cette application, nous allons configurer Raspberry Pi Pico dans le rôle périphérique et établir une communication point à point avec un appareil Android via Bluetooth Low Energy.

Contrôler la LED embarquée en Bluetooth avec android

Étape 1: Installez le fichier micropython uf2

IL faut que vous ayez installé la dernière version de microPython UF2 pour le raspberry pico w sur votre microcontrôleur.

Étape 2: Installer dans thonny une bibliothèque

Pour pouvoir mettre en place la commande Bluetooth il faut tinstaller la bibiothèque supplémentaire suivante ;

ble_simple_peripheral.py

Étape 3: Enregistrer deux programmes sur le pico w

Premier Programme

Nous devrons enregistrer deux programmes MicroPython dans notre RPi Pico pour communiquer via Bluetooth Low Energy. Connectez votre Raspberry Pi Pico W à l'ordinateur à l'aide d'un câble USB. Ouvrez un nouveau programme dans Thonny IDE en allant sur Fichier puis Nouveau. Copiez le code ci-dessous.

# Helpers for generating BLE advertising payloads.
# A more fully-featured (and easier to use) version of this is implemented in
# aioble. This code is provided just as a basic example. See
# https://github.com/micropython/micropython-lib/tree/master/micropython/bluetooth/aioble
from micropython import const
import struct
import bluetooth
# Advertising payloads are repeated packets of the following form:
#   1 byte data length (N + 1)
#   1 byte type (see constants below)
#   N bytes type-specific data
_ADV_TYPE_FLAGS = const(0x01)
_ADV_TYPE_NAME = const(0x09)
_ADV_TYPE_UUID16_COMPLETE = const(0x3)
_ADV_TYPE_UUID32_COMPLETE = const(0x5)
_ADV_TYPE_UUID128_COMPLETE = const(0x7)
_ADV_TYPE_UUID16_MORE = const(0x2)
_ADV_TYPE_UUID32_MORE = const(0x4)
_ADV_TYPE_UUID128_MORE = const(0x6)
_ADV_TYPE_APPEARANCE = const(0x19)
_ADV_MAX_PAYLOAD = const(31)
# Generate a payload to be passed to gap_advertise(adv_data=...).
def advertising_payload(limited_disc=False, br_edr=False, name=None, services=None, appearance=0):
    payload = bytearray()
    def _append(adv_type, value):
        nonlocal payload
        payload += struct.pack("BB", len(value) + 1, adv_type) + value
    _append(
        _ADV_TYPE_FLAGS,
        struct.pack("B", (0x01 if limited_disc else 0x02) + (0x18 if br_edr else 0x04)),
    )
    if name:
        _append(_ADV_TYPE_NAME, name)
    if services:
        for uuid in services:
            b = bytes(uuid)
            if len(b) == 2:
                _append(_ADV_TYPE_UUID16_COMPLETE, b)
            elif len(b) == 4:
                _append(_ADV_TYPE_UUID32_COMPLETE, b)
            elif len(b) == 16:
                _append(_ADV_TYPE_UUID128_COMPLETE, b)
    # See org.bluetooth.characteristic.gap.appearance.xml
    if appearance:
        _append(_ADV_TYPE_APPEARANCE, struct.pack("<h", appearance))
    if len(payload) > _ADV_MAX_PAYLOAD:
        raise ValueError("advertising payload too large")
    return payload
def decode_field(payload, adv_type):
    i = 0
    result = []
    while i + 1 < len(payload):
        if payload[i + 1] == adv_type:
            result.append(payload[i + 2 : i + payload[i] + 1])
        i += 1 + payload[i]
    return result
def decode_name(payload):
    n = decode_field(payload, _ADV_TYPE_NAME)
    return str(n[0], "utf-8") if n else ""
def decode_services(payload):
    services = []
    for u in decode_field(payload, _ADV_TYPE_UUID16_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<h", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID32_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<d", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID128_COMPLETE):
        services.append(bluetooth.UUID(u))
    return services
def demo():
    payload = advertising_payload(
        name="micropython",
        services=[bluetooth.UUID(0x181A), bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")],
    )
    print(payload)
    print(decode_name(payload))
    print(decode_services(payload))
if __name__ == "__main__":
    demo()

Clique sur Fichier enregistrer sous puis sélectionnez ton raspberry pico

Sauvegarde fichier Thonny

Donnez le nom du fichier ble_advertising.py et presse OK.

Deuxième Programme

Répétez la procédure et enregistrez le code ci-dessous en le nommantble_simple_périphérique.py sur votre Pico W.

ATTENTION :

Bien lire les lignes 41 à 46

# This example demonstrates a UART periperhal.
# This example demonstrates the low-level bluetooth module. For most
# applications, we recommend using the higher-level aioble library which takes
# care of all IRQ handling and connection management. See
# https://github.com/micropython/micropython-lib/tree/master/micropython/bluetooth/aioble
import bluetooth
import random
import struct
import time
from ble_advertising import advertising_payload
from micropython import const
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_FLAG_READ = const(0x0002)
_FLAG_WRITE_NO_RESPONSE = const(0x0004)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)
_UART_UUID = bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
_UART_TX = (
    bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E"),
    _FLAG_READ | _FLAG_NOTIFY,
)
_UART_RX = (
    bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"),
    _FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE,
)
_UART_SERVICE = (
    _UART_UUID,
    (_UART_TX, _UART_RX),
)
class BLESimplePeripheral:
		# dans le ligne suivante remplacez mpy-uart par vos deux noms limité aux quatre premières lettres
		# par exemple vos noms et prénoms sont Léonard de Vinci et Arsène Lupin
		# donc vos noms respectifs sont Vinci et Lupin limité aux quatre premières lettres
		# écrites en minuscules 
		# il faudra donc remplacer name="mpy-uart" par
		# name="vinc-lupi"
    def __init__(self, ble, name="mpy-uart"):
        self._ble = ble
        self._ble.active(True)
        self._ble.irq(self._irq)
        ((self._handle_tx, self._handle_rx),) = self._ble.gatts_register_services((_UART_SERVICE,))
        self._connections = set()
        self._write_callback = None
        self._payload = advertising_payload(name=name, services=[_UART_UUID])
        self._advertise()
    def _irq(self, event, data):
        # Track connections so we can send notifications.
        if event == _IRQ_CENTRAL_CONNECT:
            conn_handle, _, _ = data
            print("New connection", conn_handle)
            self._connections.add(conn_handle)
        elif event == _IRQ_CENTRAL_DISCONNECT:
            conn_handle, _, _ = data
            print("Disconnected", conn_handle)
            self._connections.remove(conn_handle)
            # Start advertising again to allow a new connection.
            self._advertise()
        elif event == _IRQ_GATTS_WRITE:
            conn_handle, value_handle = data
            value = self._ble.gatts_read(value_handle)
            if value_handle == self._handle_rx and self._write_callback:
                self._write_callback(value)
    def send(self, data):
        for conn_handle in self._connections:
            self._ble.gatts_notify(conn_handle, self._handle_tx, data)
    def is_connected(self):
        return len(self._connections) > 0
    def _advertise(self, interval_us=500000):
        print("Starting advertising")
        self._ble.gap_advertise(interval_us, adv_data=self._payload)
    def on_write(self, callback):
        self._write_callback = callback
def demo():
    ble = bluetooth.BLE()
    p = BLESimplePeripheral(ble)
    def on_rx(v):
        print("RX", v)
    p.on_write(on_rx)
    i = 0
    while True:
        if p.is_connected():
            # Short burst of queued notifications.
            for _ in range(3):
                data = str(i) + "_"
                print("TX", data)
                p.send(data)
                i += 1
        time.sleep_ms(100)
if __name__ == "__main__":
    demo()

Étape 4: Programme microPython bluetooth pour contrôler une led

Maintenant, collez le code suivant dans un nouveau projet sur Thonny IDE.

# Import necessary modules
from machine import Pin 
import bluetooth
from ble_simple_peripheral import BLESimplePeripheral
# Create a Bluetooth Low Energy (BLE) object
ble = bluetooth.BLE()
# Create an instance of the BLESimplePeripheral class with the BLE object
sp = BLESimplePeripheral(ble)
# Create a Pin object for the onboard LED, configure it as an output
led = Pin("LED", Pin.OUT)
# Initialize the LED state to 0 (off)
led_state = 0
# Define a callback function to handle received data
def on_rx(data):
    print("Data received: ", data)  # Print the received data
    global led_state  # Access the global variable led_state
    if data == b'toggle\r\n':  # Check if the received data is "toggle"
        led.value(not led_state)  # Toggle the LED state (on/off)
        led_state = 1 - led_state  # Update the LED state
# Start an infinite loop
while True:
    if sp.is_connected():  # Check if a BLE connection is established
        sp.on_write(on_rx)  # Set the callback function for data reception

Exécutez votre code en appuyant sur F5 ou en l'icône verte. Enregistrez le sur votre Raspberry Pi Pico. Nommez ce programme main.py. Il s'exécutera automatiquement lorsque Pico W redémarrera.

Lorsque le script s'exécute, vous verrez le texte “ Starting advertising ” affiché sur la console.

Étape 5: Configuration de l'application android

  • Pour Android

Installer l'application Terminal Bluetooth série du Play Store qui est disponible gratuitement.

Ouvrez l'application et dans le menu de navigation, cliquez sur Devices.

Faites un Scan sur les réseaux Bluetooth low energy

DAns les options sélectionnez « Show manufacturer data »

Il faut que la géolocalisation soit activée

Terminal Bluetooth série

Sélectionnez le Bluetooth LE puis appuyez sur SCAN. Vous devez maintenant voir votre appareil répertorié comme vinc-lupi. Sélectionnez le nom de l'appareil pour vous y connecter.

Terminal connexion

Lorsque la connexion est établie, vous pouvez voir le message “Connected” sur l'application Android. La console dans Thonny IDE affichera également le texte “Nouvelle connexion 64”

Connexion Thonny

Étape 6: Connecter la led embarquée sur l'application android bluetooth

Sur l'application Android, tapez “toggle” sans les guillemets et appuyez sur l'icône d'envoi.

Commande de la led avec Serial

La LED embarquée sur Raspberry Pi Pico W doit changer d'état de OFF à ON. L'envoi de la commande à nouveau va basculer son état de ON à OFF.

Led NeoPixel bluetooth et téléphone

Code

# Importation des modules nécessaires
from machine import Pin 
import bluetooth
# N'oubliez pas de télécharger ce script : https://github.com/micropython/micropython/blob/master/examples/bluetooth/ble_simple_peripheral.py
from ble_simple_peripheral import BLESimplePeripheral
from neopixel import NeoPixel
from time import sleep_ms
# Définir le nombre de Neopixels
np = NeoPixel(Pin(16), 10)
# Créer un objet Bluetooth Low Energy (BLE)
ble = bluetooth.BLE()
# Créer une instance de la classe BLESimplePeripheral avec l'objet BLE
sp = BLESimplePeripheral(ble)
# Créer un objet Pin pour la LED intégrée, la configurer en sortie
led = Pin("LED", Pin.OUT)
# Initialiser l'état de la LED à 0 (éteint)
led_state = 0
# Définir une fonction pour contrôler les Neopixels
def nled(color):
    for x in range(0, 10):
        if color =="white":
            r, v, b = 255, 255, 255
        elif color == "red":
            r, v, b = 255, 0, 0  # Définir les valeurs RGB pour le rouge
        elif color == "green":
            r, v, b = 0, 255, 0  # Définir les valeurs RGB pour le vert
        elif color == "blue":
            r, v, b = 0, 0, 255  # Définir les valeurs RGB pour le bleu
        elif color == "off":
            r, v, b = 0, 0, 0
        # Définir les valeurs RGB pour les Neopixels
        np[x] = (r, v, b)
        # Mettre à jour les Neopixels
        np.write()
        sleep_ms(100)
# Définir une fonction de rappel pour gérer la réception de données
def on_rx(data):
    print("Données reçues: ", data)  # Afficher les données reçues
    global led_state  # Accéder à la variable globale led_state
    if data == b'toggle\r\n':  # Vérifier si les données reçues sont "toggle"
        led.value(not led_state)  # Inverser l'état de la LED (allumée/éteinte)
        led_state = 1 - led_state  # Mettre à jour l'état de la LED
        # Contrôler les Neopixels en fonction de l'état de la LED
        if led_state:
            nled("white")  # Ou toute autre couleur souhaitée
        else:
            nled("off")
            
    elif data == b'rouge\r\n':
        nled("red")
    elif data == b'vert\r\n':
        nled("green")
    elif data == b'bleu\r\n':
        nled("blue")
    else:
        sp.send("Couleur invalide\n")
        sp.send("Couleurs valides : rouge, vert, bleu, toggle\n")
        print("Couleur invalide")
        print("Couleurs valides : rouge, vert, bleu, toggle")
while True:
    if sp.is_connected():  # Vérifier si une connexion BLE est établie
        sp.on_write(on_rx)  # Définir la fonction de rappel pour la réception de données
Liste des raccourcis clavier

Liste des fonctions de navigation et leurs raccourcis clavier correspondants :

  • Bloc Suivant : flèche droite, flèche bas, barre espace, page suivante, touche N
  • Bloc Précédent : flèche gauche, flèche haut, retour arrière, page précédente, touche P
  • Diapositive Suivante : touche T
  • Diapositive Précédente : touche S
  • Première diapositive : touche Début
  • Revenir à l'accueil : touche H
  • Menu : touche M
  • Télécommande : touche R
  • Plein écran : touche F
  • Cacher outils : touche Z
  • Fermer zoom : touche Échap.