[Mise à jour le :19/8/2023]
Ce tutoriel a pour objectif de vous faire découvrir la programmation de la carte Raspberry Pi Pico en MicroPython ou CircuitPython à l'aide de l'éditeur Thonny. Après une description rapide du matériel, vous le connecterez à l'IDE Thonny afin de réaliser les programmes suivants :
L'IDE Thonny propose aux débutants un environnement de programmation intuitif pour Python (MicroPython, CircuitPython), aussi facile à déployer qu'à utiliser. Dans un souci de simplicité, Thonny embarque la dernière version de Python qu'il installe en même temps que l'EDI. Le programme est par ailleurs préconfiguré afin d'éviter les difficultés liées au paramétrage de l'application.
« Dans un système à base de microcontrôleur, on appelle entrées-sorties les échanges d'informations entre le processeur et les périphériques qui lui sont associés. Ainsi, le système peut réagir à des modifications de son environnement, voire le contrôler. Elles sont parfois désignées par l'acronyme I/O, issu de l'anglais Input/Output ou encore E/S pour Entrées/Sorties. » Wikipédia
Pour éviter de faire référence à des valeurs électriques (tension ou intensité), on définit souvent l’état d’un signal numérique en utilisant la logique booléenne.
- true (« 1 » logique) correspondra par exemple à 5V ou 3,3V
- false (« 0 » logique) correspondra à 0V.
# --------------------------------------------------------------- # Exemple de code pour faire clignoter la led de la carte # Matériels : Raspberry Pi Pico, Shield Grove # Langage : MicroPython # IDE : Thonny # Source : blink.py # --------------------------------------------------------------- from machine import Pin import time # Configuration de l'entrée sortie connectée à la led de la carte led = Pin('LED', Pin.OUT) # 'LED' <=> 25 (GPIO25) while (True): led.on() time.sleep(0.5) # Attente 0,5s led.off() time.sleep(0.5)
# --------------------------------------------------------------- # Exemple de code pour faire clignoter la led de la carte # Matériels : Raspberry Pi Pico, Shield Grove # Langage : CircuitPython # IDE : Thonny # Source : blink.py # --------------------------------------------------------------- import board import digitalio import time # Configuration de l'entrée sortie connectée à la led de la carte led = digitalio.DigitalInOut(board.LED) led.direction = digitalio.Direction.OUTPUT while True: led.value = True time.sleep(0.5) # Attente de 0,5s led.value = False time.sleep(0.5)
# ------------------------------------------------------------------------------- # Exemple de code pour afficher la valeur N délivrée par le # convertisseur analogique numérique ADC0 # Matériels : Raspberry Pi Pico, Shield Grove, potentiomètre 10k # Langage : MicroPython # IDE : Thonny # Source : angle.py # ------------------------------------------------------------------------------- # Identification des entrées analogiques disponibles sur le Shield Grove # Shield : RP2040 # : ADC : GPIO # ----------------------------------- # A0 : ADC0 : GP26 # A1 : ADC0,ADC1 : GP26, GP27 # A2 : ADC1,ADC2 : GP27,GP28 # ------------------------------------------------------------------------------- from machine import ADC, Pin import time # Le potentiomètre 10k est connecté à l'entrée analogique A0 du shield. pot = ADC(Pin(26)) while (True): # Lecture de la valeur délivrée par le convertisseur analogique numérique # N est un entier positif codé sur 16 bits N = pot.read_u16() print(f"N = {N}") # Affichage dans la console time.sleep(1) # Attente 1s
# ------------------------------------------------------------------------------- # Exemple de code pour afficher la valeur N délivrée par le convertisseur # analogique numérique ADC0. # Matériels : Raspberry Pi Pico, Shield Grove, potentiomètre 10k # Langage : CircuitPython # IDE : Thonny # Source : angle.py # ------------------------------------------------------------------------------- # Identification des entrées analogiques disponibles sur le Shield Grove # Shield : RP2040 # : ADC : GPIO # ----------------------------------- # A0 : ADC0 : GP26 # A1 : ADC0,ADC1 : GP26, GP27 # A2 : ADC1,ADC2 : GP27,GP28 # ------------------------------------------------------------------------------- import board from analogio import AnalogIn import time # Le potentiomètre 10k est connecté à l'entrée analogique A0 du shield. pot = AnalogIn(board.A0) while (True): # Lecture de la valeur délivrée par le convertisseur analogique numérique # N est un entier positif codé sur 16 bits N = pot.value print(f"N = {N}") # Affichage dans la console time.sleep(1) # Attente 1s
Sur un écran, les pixels constituent une image numérique. On y accède par l'intermédiaire de leurs coordonnées horizontales (X) et verticales (Y). Le système de coordonnées place l'origine (0,0) dans le coin supérieur gauche de l'écran, avec X positif croissant vers la droite et Y positif croissant vers le bas. L'axe Y est inversé par rapport au repère cartésien utilisé en mathématiques, mais c'est une pratique établie dans de nombreux systèmes graphiques informatiques. Si nécessaire, l'affichage peut être pivoté.
Les coordonnées sont toujours exprimées en pixels; il n'y a pas d'échelle implicite au monde réel exprimé en millimètres ou en pouces, la taille d'un dessin sera fonction de la densité, en pixels, de l'afficheur. Si vous visez une représentation du monde réel, vous aurez besoin de mettre vos coordonnées à l'échelle. Le pas des points peut être trouvé dans la fiche technique de l'écran, ou en mesurant sa largeur et en divisant le nombre de pixels par cette mesure.
Pour les affichages monochromes (unicolores), les “couleurs” sont toujours spécifiées comme étant simplement 1 (afficher) ou 0 (effacer). La sémantique set/clear est spécifique au type d'affichage : avec un affichage lumineux OLED, un pixel “set” est allumé, alors qu'avec un écran LCD réfléchissant, pour “set” le pixel est généralement sombre. Il peut y avoir des exceptions, mais généralement vous pouvez compter sur 0 (effacer) représentant l'état d'arrière-plan par défaut pour un affichage récemment initialisé.
# ------------------------------------------------------------------------------- # Exemple de code pour afficher la température délivrée par le capteur interne au # microcontrôleur sur un afficheur graphique. # Matériels : Raspberry Pi Pico, Shield Grove, afficheur à SSD1306 # Langage : MicroPython # IDE : Thonny # Source : afftemp.py # Bibliothèque(s) : /lib/ssd1306.mpy # ------------------------------------------------------------------------------- from machine import Pin, I2C import ssd1306 # code de la bibliothèque à placer dans un dossier /lib sur le RP2 # BUS I2C0 i2c = I2C(0, sda=Pin(8), scl=Pin(9), freq=400_000) # Afficheur oled (ssd1306) connecté au bus I2C0 oled_width = 128 # px oled_height = 64 # px oled = ssd1306.SSD1306_I2C(oled_width,oled_height, i2c) # 1er affichage oled.text("Mesure temp.", 5, 0) # un caractère occupe 8px de haut oled.show() while True: pass
# ------------------------------------------------------------------------------- # Exemple de code pour afficher la température délivrée par le capteur interne au # microcontrôleur sur un afficheur graphique. # Matériels : Raspberry Pi Pico, Shield Grove, afficheur à SSD1306 # Langage : CircuitPython # IDE : Thonny # Source : afftemp.py # Bibliothèque(s) : /font5x8.bin, /lib/adafruit_ssd1306.mpy, # /lib/adafruit_framebuf.mpy # ------------------------------------------------------------------------------- import board import busio # code de la bibliothèque à placer dans un dossier /lib sur le RP2 import adafruit_ssd1306 import time # BUS I2C0 i2c = busio.I2C(board.GP9, board.GP8) # Afficheur oled (ssd1306) connecté au bus I2C0 oled_width = 128 # px oled_height = 64 # px oled = adafruit_ssd1306.SSD1306_I2C(oled_width, oled_height, i2c) # 1er Affichage oled.text("Mesure temp.", 5, 0, 1) # un caractère occupe 8px de haut oled.show() while True: pass
Le capteur utilisé est basé sur un circuit BME280 et mesure la température, l'humidité et la pression atmosphérique. Il communique avec un microcontrôleur via un bus I2C ou SPI.
# ------------------------------------------------------------------------------- # Exemple de code pour afficher la température, l'humidité et la pression # mesurées par un capteur BME280 sur un afficheur graphique . # Matériels : Raspberry Pi Pico, Shield Grove, capteur BM280, afficheur à SSD1306 # Langage : MicroPython # IDE : Thonny # Source : affbme280.py, # Bibliothèque(s) : /lib/ssd1306.mpy, /lib/bme280.py # ------------------------------------------------------------------------------- from machine import Pin, I2C from time import sleep import bme280 # code de la bibliothèque à placer dans un dossier /lib sur le RP2 # BUS I2C1 i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=400_000) # Capteur BME280 connecté à I2C1 du shield Grove bme = bme280.BME280(i2c=i2c) while True: temp = bme.temperature hum = bme.humidity pres = bme.pressure print('Température: ', temp) print('Humidité: ', hum) print('Pression: ', pres) print('') sleep(2)
# ------------------------------------------------------------------------------- # Exemple de code pour afficher la température, l'humidité, la pression et # l'altitude mesurées par un capteur BME280. # Matériels : Raspberry Pi Pico, Shield Grove, capteur BM280, afficheur à ssd1306 # Langage : CircuitPython # IDE : Thonny # Fichiers : affbme280.py, /font5x8.bin, /lib/adafruit_ssd1306.mpy, # /lib/adafruit_framebuf.mpy, /lib/adafruit_bme280.py # ------------------------------------------------------------------------------- import board import busio from adafruit_bme280 import basic as adafruit_bme280 import time # BUS I2C1 i2c = busio.I2C(board.GP7, board.GP6) # SCL, SDA # Capteur BME280 connecté à I2C1 du shield Grove bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c) # A modifier pour que cette valeur corresponde à la pression # (hpa) au niveau de la mer (océan atlantique) bme280.sea_level_pressure = 1016 while True: temp = bme280.temperature hum = bme280.humidity pres = bme280.pressure alt = bme280.altitude print('Température=', temp) print('Humidité: ', hum) print('Pression: ', pres) print('Altitude', alt) print('') time.sleep(2)
Le capteur utilisé est basé sur un circuit TSL2591 permettant de mesurer l'éclairement lumineux. Ce capteur communique avec un microcontrôleur via le bus I2C.
# ------------------------------------------------------------------------------- # Affichage de la luminosité mesurée par un capteur TSL2591 dans la console # Date : 7/7/2023 # Matériels : Raspberry Pi Pico, TSL2591, Shield Grove, adaptateur Qwiic, # câble Qwiic 5cm # Langage : MicroPython # IDE : Thonny # Fichiers : demoTSL2591.py, /lib/tsl2591.py # Source : https://github.com/mchobby/esp8266-upy/tree/master/tsl2591 # ------------------------------------------------------------------------------- from tsl2591 import * # Pilote du module from machine import Pin, I2C # Pilote du bus I2C from time import sleep # pour temporiser # Bus I2C1 i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=400_000) sleep(1) # Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser tsl = TSL2591( i2c ) # Instanciation du capteur while True: print( "Eclairement : %.1f lx" % tsl.lux ) # Lecture d'une valeur ir = tsl.infrared # Valeur entière proportionelle à l'éclairement infrarouge vi = tsl.visible # Valeur entière proportionelle à l'éclairement visible total = ir + vi # Somme des deux ... if total !=0: inv_total = 100 / total print("Infrarouge : %.1f %%" %(ir*inv_total)) print("Lumière visible : %1.f %%" %(vi*inv_total)) print("") sleep(5) # Temporisation de 5 secondes
A faire
- Tutoriels sur RANDOM NERD TUTORIALS2)