Nota
Ciao, benvenuto nella Community Facebook di appassionati SunFounder Raspberry Pi & Arduino & ESP32! Approfondisci Raspberry Pi, Arduino ed ESP32 con altri appassionati.
Perché unirsi?
Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.
Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e giveaway: Partecipa a giveaway e promozioni festive.
👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!
2.2.1 Fotoresistenza (MCP3008)
Nota
A seconda della versione del kit, identifica se hai ADC0834 o MCP3008 e procedi con la sezione corrispondente.
Introduzione
La fotoresistenza è un componente comunemente usato per rilevare l’intensità della luce ambientale. Aiuta il controller a riconoscere il giorno e la notte e a realizzare funzioni di controllo della luce, come ad esempio una lampada notturna. Questo progetto è molto simile a quello con il potenziometro, con la differenza che qui la variazione di tensione è legata all’intensità luminosa.
Componenti richiesti
In questo progetto, abbiamo bisogno dei seguenti componenti.
È sicuramente comodo acquistare un kit completo, ecco il link:
Nome |
ARTICOLI IN QUESTO KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE COMPONENTE |
LINK DI ACQUISTO |
|---|---|
- |
|
Schema elettrico
Nome T-Board |
fisico |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
Procedure sperimentali
Passo 1: Costruisci il circuito.
Passo 2: Configura l’interfaccia SPI e installa la libreria spidev (vedi Configurazione SPI per istruzioni dettagliate).
Se hai già completato questi passaggi, puoi saltarli.
Passo 3: Vai alla cartella del codice.
cd ~/raphael-kit/python-pi5
Passo 4: Esegui il file eseguibile.
sudo python3 2.2.1-2_Photoresistor_zero.py
Quando il codice è in esecuzione, la luminosità del LED cambierà in base all’intensità della luce rilevata dalla fotoresistenza.
Avvertimento
Se compare l’errore RuntimeError: Cannot determine SOC peripheral base address, fai riferimento a If gpiozero doesn’t work.
Codice
Nota
Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto.
Prima, però, devi andare al percorso del codice sorgente, ad esempio raphael-kit/python-pi5.
Dopo aver modificato il codice, puoi eseguirlo direttamente per vederne l’effetto.
#!/usr/bin/env python3
import spidev
import time
from gpiozero import PWMLED
# Inizializza un LED PWM sul pin GPIO 22
led = PWMLED(22)
# Inizializza la comunicazione SPI (Bus 0, CE0 -> GPIO8)
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CS0
spi.max_speed_hz = 1000000 # 1 MHz
# Funzione per leggere da un canale MCP3008 (0–7)
def read_adc(channel):
"""
Legge un valore analogico da MCP3008 (0–1023)
"""
if channel < 0 or channel > 7:
return -1
# Protocollo MCP3008: bit di avvio, modalità single-ended, canale (3 bit), filler
r = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((r[1] & 3) << 8) | r[2]
return value
# Funzione per mappare i valori da un intervallo a un altro
def MAP(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
# Ciclo principale per leggere il valore ADC e controllare la luminosità del LED
def loop():
while True:
# Legge il valore analogico dal canale 0 di MCP3008
analogVal = read_adc(0)
print('value = %d' % analogVal)
# Mappa 0–1023 in intervallo PWM 0.0–1.0
led.value = analogVal / 1023.0
# Attende 0,2 secondi
time.sleep(0.2)
# Esegue il ciclo principale e gestisce l'interruzione KeyboardInterrupt
try:
loop()
except KeyboardInterrupt:
led.value = 0 # Spegne il LED prima di uscire
Spiegazione del codice
Questa parte importa la classe
PWMLEDdalla libreriagpiozeroper il controllo dei LED PWM,spidevper la comunicazione SPI con MCP3008 etimeper le funzioni di pausa/ritardo.import spidev import time from gpiozero import PWMLED
Inizializza un LED PWM collegato al pin GPIO 22 e configura l’interfaccia SPI per MCP3008 (Bus 0, CE0) con una velocità di 1 MHz.
led = PWMLED(22) spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
Definisce una funzione per leggere un valore analogico da un canale specifico di MCP3008. Invia un comando di 3 byte tramite SPI e ricava un valore a 10 bit (0–1023) dalla risposta.
def read_adc(channel): if channel < 0 or channel > 7: return -1 r = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((r[1] & 3) << 8) | r[2] return value
Definisce una funzione
MAP()di supporto per convertire un numero da un intervallo a un altro, utile per mappare i valori dell’ADC nell’intervallo PWM.def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
Implementa un ciclo che legge continuamente il valore analogico dal canale 0 di MCP3008, lo converte in un valore di luminosità PWM (0.0–1.0) e lo applica al LED. Il ciclo si interrompe per 0,2 secondi ad ogni iterazione.
def loop(): while True: analogVal = read_adc(0) print('value = %d' % analogVal) led.value = analogVal / 1023.0 time.sleep(0.2)
Gestisce l’uscita con
KeyboardInterrupt. Quando l’utente interrompe il programma (Ctrl+C), il LED viene spento prima della chiusura.try: loop() except KeyboardInterrupt: led.value = 0