Nota
Ciao, benvenuto nella Community di appassionati SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirti?
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: Accedi in anteprima agli annunci dei nuovi prodotti e alle anticipazioni.
Sconti speciali: Godi di 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.1.4 Potenziometro (MCP3008)
Nota
A seconda della versione del tuo kit, identifica se possiedi ADC0834 o MCP3008 e procedi con la sezione corrispondente.
Introduzione
La funzione ADC viene utilizzata per convertire segnali analogici in valori digitali. In questo esperimento utilizziamo il chip ADC MCP3008 per effettuare questa conversione. Un potenziometro viene usato per generare una tensione variabile, che cambia la grandezza fisica. L’MCP3008 converte quindi questa tensione analogica in un valore digitale che può essere letto ed elaborato dal Raspberry Pi.
Componenti necessari
In questo progetto, abbiamo bisogno dei seguenti componenti.
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 |
Procedura sperimentale
Passo 1: Montare il circuito.
Nota
Posiziona il chip facendo riferimento alla posizione mostrata nell’immagine. Nota che le scanalature sul chip devono essere a sinistra quando viene posizionato.
Passo 2: Configura l’interfaccia SPI e installa la libreria spidev (vedi Configurazione SPI per le istruzioni dettagliate). Se hai già completato questi passaggi, puoi saltarli.
Passo 3: Apri il file del codice
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Passo 4: Esegui.
sudo python3 2.1.4-2_Potentiometer_zero.py
Dopo l’esecuzione del codice, ruota la manopola del potenziometro: l’intensità del LED cambierà di conseguenza.
Avvertimento
Se appare l’errore RuntimeError: Cannot determine SOC peripheral base address, fai riferimento a Se gpiozero non funziona.
Codice
Nota
Puoi Modificare/Reimpostare/Copiare/Eseguire/Interrompere il codice qui sotto. Ma prima, devi portarti nel percorso del codice sorgente, ad esempio davinci-kit-for-raspberry-pi/python-pi5.
Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.
#!/usr/bin/env python3
import spidev
import time
from gpiozero import PWMLED
# Inizializza LED PWM su GPIO22
led = PWMLED(22)
# Inizializza SPI
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CS0 (CE0)
spi.max_speed_hz = 1000000
def read_adc(channel):
"""
Legge un valore analogico da MCP3008
:param channel: Canale ADC (0-7)
:return: Intero a 10 bit (0-1023)
"""
if channel < 0 or channel > 7:
return -1
# Protocollo MCP3008
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 3) << 8) | adc[2]
return value
def MAP(x, in_min, in_max, out_min, out_max):
"""
Mappa un valore da un intervallo a un altro
"""
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
try:
while True:
# Legge dal canale 0 di MCP3008
res = read_adc(0)
print('res = %d' % res)
# Mappa 0–1023 su 0–100%
R_val = MAP(res, 0, 1023, 0, 100)
# Imposta luminosità LED
led.value = R_val / 100.0
time.sleep(0.2)
except KeyboardInterrupt:
led.value = 0 # Spegne il LED
Spiegazione del codice
gpiozeroper il controllo PWM del LED,spidevper la comunicazione SPI con MCP3008 etimeper implementare ritardi.#!/usr/bin/env python3 import spidev import time from gpiozero import PWMLED
Inizializza un oggetto PWMLED collegato al pin GPIO 22 e configura la comunicazione SPI (Bus 0, CE0) con MCP3008.
# Inizializza LED PWM su GPIO22 led = PWMLED(22) # Inizializza SPI spi = spidev.SpiDev() spi.open(0, 0) # Bus 0, CS0 (CE0) spi.max_speed_hz = 1000000
Definisce una funzione
read_adcper comunicare con MCP3008 e leggere valori analogici dal canale specificato (0–7).def read_adc(channel): """ Legge un valore analogico da MCP3008 :param channel: Canale ADC (0-7) :return: Intero a 10 bit (0-1023) """ if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 3) << 8) | adc[2] return value
Definisce una funzione
MAPper convertire un intervallo di valori in un altro, utile per mappare i valori ADC ai livelli di luminosità del LED.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
Legge continuamente il valore ADC in un ciclo, mappando il valore a 10 bit (0–1023) in un livello di luminosità (0–100) per il LED. Regola la luminosità del LED di conseguenza e attende 0,2 secondi tra una lettura e l’altra.
try: while True: # Legge dal canale 0 di MCP3008 res = read_adc(0) print('res = %d' % res) # Mappa 0–1023 su 0–100% R_val = MAP(res, 0, 1023, 0, 100) # Imposta luminosità LED led.value = R_val / 100.0 time.sleep(0.2) except KeyboardInterrupt: led.value = 0 # Spegne il LED