Nota
¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.
¿Por qué unirse?
Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Avances exclusivos: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones festivas y sorteos: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.
2.2.1 Fotorresistor (MCP3008)
Nota
Dependiendo de la versión de tu kit, identifica si tienes ADC0834 o MCP3008 y procede con la sección correspondiente.
Introducción
El fotorresistor es un componente comúnmente usado para medir la intensidad de la luz ambiental. Ayuda al controlador a reconocer el día y la noche y a realizar funciones de control de luz como una lámpara nocturna. Este proyecto es muy similar al del potenciómetro, y puedes pensar que cambia el voltaje para detectar la luz.
Componentes requeridos
En este proyecto, necesitamos los siguientes componentes.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ARTÍCULOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado desde los siguientes enlaces.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
- |
|
Diagrama esquemático
Nombre T-Board |
physical |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
Procedimientos experimentales
Paso 1: Construye el circuito.
Paso 2: Configura la interfaz SPI e instala la librería spidev (consulta Configuración de SPI para instrucciones detalladas). Si ya realizaste estos pasos, puedes omitirlos.
Paso 3: Ve a la carpeta del código.
cd ~/raphael-kit/python
Paso 4: Ejecuta el archivo.
sudo python3 2.2.1-2_photoresistor.py
Cuando el código está en ejecución, el brillo del LED cambiará de acuerdo con la intensidad de la luz detectada por el fotorresistor.
Advertencia
Si aparece el error RuntimeError: Cannot determine SOC peripheral base address, consulta Si «gpiozero» no funciona.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código de abajo.
Pero antes, necesitas ir a la ruta del código fuente como raphael-kit/python.
Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
# Pin GPIO para el LED PWM
PWM_PIN = 22
# Configuración de GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)
# Inicializar PWM (frecuencia = 1000Hz)
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0) # Inicia con un ciclo de trabajo del 0%
# Inicializar SPI (MCP3008 en Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # 1 MHz
# Función para leer valor ADC de MCP3008
def read_adc(channel):
"""
Lee el valor analógico del MCP3008 (canal 0–7)
Retorna: valor de 10 bits (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
# Bucle principal para leer ADC y ajustar el brillo del PWM
try:
while True:
analogVal = read_adc(0)
print(f"value = {analogVal}")
# Escalar valor ADC (0–1023) a ciclo de trabajo (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()
Explicación del código
Importar librerías necesarias:
RPi.GPIOpara controlar pines GPIO y generar señal PWM.spidevpara comunicarse con el MCP3008 a través de SPI.timepara gestionar temporización y retardos.
#!/usr/bin/env python3 import RPi.GPIO as GPIO import spidev import time
Configurar el pin GPIO 22 como salida PWM usando el modo BCM. Inicializar el PWM por software a 1000 Hz con un ciclo de trabajo inicial del 0%.
PWM_PIN = 22 GPIO.setmode(GPIO.BCM) GPIO.setup(PWM_PIN, GPIO.OUT) pwm = GPIO.PWM(PWM_PIN, 1000) pwm.start(0)
Configurar la interfaz SPI para comunicarse con el MCP3008 en el bus 0, CE0, y establecer la velocidad SPI en 1 MHz.
spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
Definir una función
read_adc(channel)para leer valores analógicos desde el MCP3008. Envía tres bytes al chip y reconstruye un valor analógico de 10 bits (0–1023) a partir de la respuesta.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
Este es el bucle principal que: - Lee la entrada analógica del canal 0 del MCP3008. - Convierte el valor a un ciclo de trabajo PWM (0–100%). - Ajusta el brillo del LED usando
pwm.ChangeDutyCycle(). - Se repite cada 0,2 segundos.try: while True: analogVal = read_adc(0) print(f"value = {analogVal}") duty_cycle = analogVal * 100 / 1023 pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.2)
Cuando el usuario interrumpe el programa con Ctrl+C, el PWM y los GPIO se limpian correctamente, y la interfaz SPI se cierra.
except KeyboardInterrupt: pass finally: pwm.stop() GPIO.cleanup() spi.close()