Venerdì scorso abbiamo presentato la scheda multisensore Pimoroni. Oggi vediamo alcuni esempi di programmazione Micropython per schede Pico.
Come gestire una scheda che contiene più sensori? Come accederfe a tutte le funzioni attraverso una semplice chiamata? Oggi impareremo la tecnica più semplice, che consiste nell’inviare i segnali di pilotaggio ad uno specifico indirizzo I2C (per maggiori informazioni sul protocollo I2C potete leggere questo articolo).
Iniziamo subito con la gestione del sensore ambientale BME280.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import time from breakout_bme280 import BreakoutBME280 from pimoroni_i2c import PimoroniI2C PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5} PINS_PICO_EXPLORER = {"sda": 20, "scl": 21} i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN) bme = BreakoutBME280(i2c) while True: reading = bme.read() print(reading) time.sleep(1.0) |
Dopo aver importato le librerie necessarie ed il modulo Micropython nell’IDE, importiamo il modulo time (ci serivrà per chiamare il metodo sleep() ). Definiamo quindi i PIN sda ed scl, necessari per la comunicazione del sensore con la scheda, quindi definiamo l’oggetto bme con i parametri i2c appena determinati.
Il ciclo infinito while() esegue una lettura del sensore e stampa il valore letto, quindi si ferma per 1 secondo. Semplice no?
Nota: In questo esempio utilizziamo il sistema pacchettizzato da Pimoroni, ma nulla ci vieta di accedere ad un sensore BME280 attraverso la classica libreria Bosch…
La gestione del sensore di luminosità ltr559 è altrettanto semplice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import time from pimoroni_i2c import PimoroniI2C from breakout_ltr559 import BreakoutLTR559 PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5} PINS_PICO_EXPLORER = {"sda": 20, "scl": 21} i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN) ltr = BreakoutLTR559(i2c) part_id = ltr.part_id() print("Found LTR559. Part ID: 0x", '{:02x}'.format(part_id), sep="") while True: reading = ltr.get_reading() if reading is not None: print("Lux:", reading[BreakoutLTR559.LUX], "Prox:", reading[BreakoutLTR559.PROXIMITY]) time.sleep(0.1) |
Le prime righe sono quasi identiche all’esempio precedente: cambia solo (ovviamente) l’indirizzo I2C del sensore, mentre il canale è uguale.
Per prima cosa viene letto il part_id del sensore, per controllare che l’inizializzazione della libreria e la creazione dell’oggetto siano andate a buon fine. Viene poi stampata una stringa con le informazioni ricevute.
Il ciclo infinito esegue la lettura dei segnali sul bus all’indirizzo del sensore, e se viene letto qualcosa vengono stampate le informazioni ricevute, quindi il ciclo si ferma per un decimo di secondo e riparte.
Nota: la wiki di Pimoroni riporta un secondo esempio, che anziché utilizzare il loop infinito (non la migliore tecnica di lavoro) utilizza un sistema di interrupt. Vi invito aad approfondirlo se siete curiosi di come funzionino gli interrupt su Pico con Micropython.
Infine, vediamo come si gestisce il sensore LSM6DS3:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from machine import I2C from lsm6ds3 import LSM6DS3, NORMAL_MODE_104HZ import time # Create the I2C instance and pass that to LSM6DS3 i2c = I2C(0, scl=13, sda=12) sensor = LSM6DS3(i2c, mode=NORMAL_MODE_104HZ) # Grab and print the current readings once per second while True: ax, ay, az, gx, gy, gz = sensor.get_readings() print("Accelerometer\nX:{}, Y:{}, Z:{}\nGyro\nX:{}, Y:{}, Z{}\n\n ".format(ax, ay, az, gx, gy, gz)) time.sleep(1.0) |
Importiamo la libreria consigliata da Pimoroni, LSM6DD3, ed il kernel Micropython.
Creiamo quindi l’istanza i2C e creiamo l’oggetto relativo al sensore.
Nel ciclo infinito, inseriamo i valori provenienti dal metido get_readings() in altrettante variabili temporanee. Potremo così stamparle in modo formattato come assi dell’accelerometro e valori di posizione del giroscopio. Chiudiamo come al solito con una sleep() di un secondo, quindi riprendiamo.
Buon divertimento!
Iscriviti ai nostri gruppi Telegram
Link utili
- Arduino UNO R3
- Elegoo UNO R3
- Arduino Starter Kit per principianti
- Elegoo Advanced Starter Kit
- Arduino Nano