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

../_images/mcp3008_and_adc0834.jpg

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.

../_images/list2_2.2.1_photoresistor.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado desde los siguientes enlaces.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

LED

COMPRAR

MCP3008

-

Fotoresistor

COMPRAR

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

../_images/schematic_2.2.1_photoresistor_mcp3008.png

Procedimientos experimentales

Paso 1: Construye el circuito.

../_images/july24_2.2.1_photoresistor_mcp3008.png

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

  1. Importar librerías necesarias:

    • RPi.GPIO para controlar pines GPIO y generar señal PWM.

    • spidev para comunicarse con el MCP3008 a través de SPI.

    • time para gestionar temporización y retardos.

    #!/usr/bin/env python3
    
    import RPi.GPIO as GPIO
    import spidev
    import time
    
  2. 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)
    
  3. 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
    
  4. 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
    
  5. 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)
    
  6. 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()