Nota
Ciao, benvenuto nella Community Facebook di appassionati di 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 l’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 Fotoresistore (MCP3008)
Nota
A seconda della versione del tuo kit, identifica se hai ADC0834 o MCP3008 e procedi con la sezione corrispondente.
Introduzione
Il fotoresistore è un componente comunemente usato per rilevare l’intensità della luce ambientale. Aiuta il controller a riconoscere giorno e notte e a realizzare funzioni di controllo della luce come le lampade notturne. Questo progetto è molto simile a quello con il potenziometro: potresti pensare che anch’esso modifichi la tensione per rilevare la luce.
Componenti richiesti
In questo progetto, ci servono i seguenti componenti.
È sicuramente conveniente 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
Passo 4: Esegui il file eseguibile.
sudo python3 2.2.1-2_photoresistor.py
Quando il codice è in esecuzione, la luminosità del LED cambierà in base all’intensità della luce rilevata dal fotoresistore.
Avvertimento
Se compare il messaggio di 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 nel percorso del codice sorgente come raphael-kit/python.
Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
# Pin GPIO per LED PWM
PWM_PIN = 22
# Configura GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)
# Inizializza PWM (frequenza = 1000Hz)
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0) # Avvia con duty cycle 0%
# Inizializza SPI (MCP3008 su Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # 1 MHz
# Funzione per leggere il valore ADC da MCP3008
def read_adc(channel):
"""
Legge il valore analogico da MCP3008 (canale 0–7)
Restituisce: valore a 10 bit (0–1023)
"""
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
# Ciclo principale per leggere l'ADC e impostare la luminosità del PWM
try:
while True:
analogVal = read_adc(0)
print(f"value = {analogVal}")
# Scala il valore ADC (0–1023) a duty cycle (0–100)
duty_cycle = analogVal * 100 / 1023
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
spi.close()
Spiegazione del codice
Importa le librerie necessarie:
RPi.GPIOper controllare i pin GPIO e generare il segnale PWM.spidevper comunicare con l’ADC MCP3008 tramite SPI.timeper gestire temporizzazioni e ritardi.
#!/usr/bin/env python3 import RPi.GPIO as GPIO import spidev import time
Configura il pin GPIO 22 come uscita PWM usando la modalità BCM. Inizializza quindi un PWM software a 1000 Hz con duty cycle iniziale dello 0%.
# Pin GPIO per LED PWM PWM_PIN = 22 GPIO.setmode(GPIO.BCM) GPIO.setup(PWM_PIN, GPIO.OUT) pwm = GPIO.PWM(PWM_PIN, 1000) pwm.start(0) # Avvia con duty cycle 0%
Configura l’interfaccia SPI per comunicare con MCP3008 sul bus 0, chip enable 0 (CE0), e velocità SPI a 1 MHz.
spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000 # 1 MHz
Definisce una funzione
read_adc(channel)per leggere valori analogici da MCP3008. La funzione invia tre byte al chip e ricostruisce un valore analogico 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
Il ciclo principale:
Legge l’ingresso analogico dal canale 0 di MCP3008.
Converte il valore in un duty cycle PWM (0–100%).
Regola la luminosità del LED tramite
pwm.ChangeDutyCycle().Si ripete ogni 0,2 secondi.
try: while True: analogVal = read_adc(0) print(f"value = {analogVal}") duty_cycle = analogVal * 100 / 1023 pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.2)
Quando l’utente interrompe il programma con Ctrl+C, il PWM e i GPIO vengono correttamente ripristinati e l’interfaccia SPI viene chiusa.
except KeyboardInterrupt: pass finally: pwm.stop() GPIO.cleanup() spi.close()