Nota
¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Profundiza en Raspberry Pi, Arduino y ESP32 junto con otros aficionados.
¿Por qué unirse?
Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.
Avances exclusivos: Obtén acceso anticipado a anuncios y vistas previas de nuevos productos.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones y sorteos festivos: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy.
2.2.1 Fotorresistor (MCP3008)
Nota
Dependiendo de la versión de tu kit, identifica si tienes ADC0834 o MCP3008 y sigue 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 realizar funciones de control de luz, como una lámpara nocturna. Este proyecto es muy similar al potenciómetro, y podrías pensar que cambia el voltaje para detectar la luz.
Componentes requeridos
En este proyecto, necesitamos los siguientes componentes.
Principio
Un fotorresistor o célula fotoeléctrica es una resistencia variable controlada por luz. La resistencia de un fotorresistor disminuye a medida que aumenta la intensidad de la luz incidente; en otras palabras, exhibe fotoconductividad. Un fotorresistor puede aplicarse en circuitos detectores de luz y en circuitos de activación por luz u oscuridad.
Diagrama esquemático
Nombre en la T-Board |
Físico |
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.
Para usuarios de lenguaje C
Paso 2: Ve a la carpeta del código.
cd ~/davinci-kit-for-raspberry-pi/c/2.2.1-2/
Paso 3: Compila el código.
gcc 2.2.1_Photoresistor.c -o photoresistor -lwiringPi -lm
Paso 4: Ejecuta el archivo compilado.
./photoresistor
Cuando el código se está ejecutando, el brillo del LED cambiará según la intensidad de luz detectada por el fotorresistor.
Nota
Si no funciona después de ejecutar, o aparece el error: «wiringPi.h: No such file or directory», consulta Instalar y Comprobar WiringPi.
Código
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <softPwm.h>
#define SPI_CHANNEL 0 // Usar canal SPI 0 (CE0)
#define SPI_SPEED 1000000 // Velocidad SPI de 1 MHz
#define LedPin 3 // GPIO3 (WiringPi) para PWM del LED
// Leer valor ADC del MCP3008, canal 0~7
int readMCP3008(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Bit de inicio
buffer[1] = (8 + channel) << 4; // Configuración del canal
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
// Combinar el resultado
int result = ((buffer[1] & 3) << 8) | buffer[2];
return result;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("¡Error al iniciar wiringPi!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("¡Error al configurar SPI!\n");
return 1;
}
softPwmCreate(LedPin, 0, 100); // Inicializar PWM por software
while (1) {
int analogVal = readMCP3008(0); // Leer de CH0
printf("Valor ADC: %d\n", analogVal);
// Escalar el valor de 10 bits (0–1023) al rango PWM (0–100)
int pwmVal = analogVal * 100 / 1023;
softPwmWrite(LedPin, pwmVal);
delay(100);
}
return 0;
}
Explicación del código
El código aquí es el mismo que en 2.1.4 Potenciómetro. Si tienes alguna duda, consulta la explicación del código en 2.1.4 Potenciómetro (MCP3008).
Para usuarios de lenguaje Python
Paso 2: Configura la interfaz SPI e instala la librería spidev (consulta Configuración de SPI para más detalles). Si ya completaste estos pasos, puedes omitirlos.
Paso 3: Ve a la carpeta del código.
cd ~/davinci-kit-for-raspberry-pi/python
Paso 4: Ejecuta el archivo.
sudo python3 2.2.1-2_photoresistor.py
Cuando el código se está ejecutando, el brillo del LED cambiará según la intensidad de 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 a continuación.
Antes de eso, ve a la ruta del código fuente como davinci-kit-for-raspberry-pi/python.
Después de modificarlo, 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) # Comenzar con ciclo de trabajo 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 del MCP3008
def read_adc(channel):
"""
Lee valor analógico del MCP3008 (canal 0–7)
Devuelve: 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 brillo PWM
try:
while True:
analogVal = read_adc(0)
print(f"valor = {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 vía SPI.timepara manejar pausas y tiempos.
#!/usr/bin/env python3 import RPi.GPIO as GPIO import spidev import time
Configurar el pin GPIO 22 como salida PWM en modo BCM. Luego, inicializar el PWM a 1000 Hz con ciclo de trabajo inicial de 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 con el MCP3008 en bus 0, CE0 y velocidad 1 MHz.
spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
Definir la función
read_adc(channel)para leer valores analógicos del MCP3008.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
En el bucle principal:
Leer la entrada analógica del canal 0.
Convertir el valor en ciclo de trabajo PWM (0–100%).
Ajustar el brillo del LED con
pwm.ChangeDutyCycle().Repetir cada 0.2 segundos.
# Main loop to read ADC and set PWM brightness try: while True: analogVal = read_adc(0) print(f"value = {analogVal}") # Scale ADC value (0–1023) to duty cycle (0–100) duty_cycle = analogVal * 100 / 1023 pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.2)
Si el programa se interrumpe con Ctrl+C, detener el PWM, limpiar los GPIO y cerrar SPI.
except KeyboardInterrupt: pass finally: pwm.stop() GPIO.cleanup() spi.close()