Compartir a través de


Uso de GPIO para la entrada binaria

Los pines de E/S de uso general (GPIO) se pueden configurar para recibir señales eléctricas como entradas. En su nivel más básico, esto es útil para escenarios que detectan la apertura y cierre de un circuito. Estos circuitos pueden incluir botones pulsadores, interruptores de palanca, interruptores de láminas (reed switches), interruptores de presión y otros dispositivos que representan valores binarios (encendido/apagado) completando un circuito.

En este tutorial, usarás .NET y las patillas GPIO de tu Raspberry Pi para detectar cuando un circuito se abre y se cierra.

Prerrequisitos

  • Equipo con placa única (ARMv7 o superior) basado en ARM (SBC)
  • Cables de puente
  • Placa de navegación (opcional)
  • Placa de distribución GPIO de Raspberry Pi (opcional)
  • SDK de .NET 8 o posterior

Nota:

Este tutorial se escribe suponiendo que el dispositivo de destino sea Raspberry Pi. Sin embargo, este tutorial se puede usar para cualquier SBC basado en Linux que admita .NET, como Orange Pi, ODROID, etc.

Asegúrese de que SSH está habilitado en el dispositivo. Para Raspberry Pi, consulte Configuración de un servidor SSH en la documentación de Raspberry Pi.

Preparación del hardware

Use los componentes de hardware para compilar el circuito como se muestra en el diagrama siguiente:

Diagrama en el que se muestra un circuito que conecta una patilla de tierra a la patilla 21.

En la imagen anterior se muestra una conexión directa entre un pin de tierra y el pin 21.

Sugerencia

En el diagrama se muestra una placa de pruebas y un módulo GPIO con fines ilustrativos, pero no dude en conectar un pin de tierra y el pin 21 con un cable puente en la Raspberry Pi.

Consulte el siguiente diagrama de anclaje según sea necesario:

Diagrama que muestra la disposición de los pines del encabezado GPIO de Raspberry Pi. Imagen cortesía de la Fundación Raspberry Pi.
Imagen cortesía de Raspberry Pi Foundation.

Creación de la aplicación

Complete los pasos siguientes en el entorno de desarrollo preferido:

  1. Cree una nueva aplicación de consola de .NET mediante la CLI de .NET o Visual Studio. Asígneles el nombre InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Agregue el paquete System.Device.Gpio al proyecto. Use .NET CLI desde el directorio del proyecto o Visual Studio.

    dotnet add package System.Device.Gpio --version 3.2.0-*
    
  3. Reemplace el contenido de Program.cs por el código siguiente:

    using System.Device.Gpio;
    using System.Threading.Tasks;
    
    const int Pin = 21;
    const string Alert = "ALERT 🚨";
    const string Ready = "READY ✅";
    
    using var controller = new GpioController();
    controller.OpenPin(Pin, PinMode.InputPullUp);
    
    Console.WriteLine(
        $"Initial status ({DateTime.Now}): {(controller.Read(Pin) == PinValue.High ? Alert : Ready)}");
    
    controller.RegisterCallbackForPinValueChangedEvent(
        Pin,
        PinEventTypes.Falling | PinEventTypes.Rising,
        OnPinEvent);
    
    await Task.Delay(Timeout.Infinite);
    
    static void OnPinEvent(object sender, PinValueChangedEventArgs args)
    {     
        Console.WriteLine(
            $"({DateTime.Now}) {(args.ChangeType is PinEventTypes.Rising ? Alert : Ready)}");
    }
    

    En el código anterior:

    • Una declaración de uso crea una instancia de. La declaración garantiza que el objeto se elimina y los recursos de hardware se liberan correctamente.
      • se instancia sin parámetros, lo que indica que detecte sobre qué plataforma de hardware se ejecuta y use el esquema de numeración de patillas lógicas.
    • El pin 21 de GPIO se abre con .
      • Esto abre el pin con un resistor PullUp activado. En este modo, cuando el pin está conectado a tierra, devolverá un valor específico. Cuando el pin está desconectado del suelo y el circuito está abierto, el pin devuelve .
    • El estado inicial se escribe en una consola mediante una expresión ternaria. El estado actual del pin se lee con . Si es , escribe la cadena en la consola. De lo contrario, escribe la cadena.
    • registra una función de devolución de llamada para ambos eventos en el pin. Estos eventos corresponden a los estados de anclaje de y , respectivamente.
    • La función de devolución de llamada apunta a un método llamado . usa otra expresión ternaria que también escribe las cadenas o correspondientes.
    • El hilo principal se duerme indefinidamente mientras espera eventos de pin.
  4. Compile la aplicación. Si usa la CLI de .NET, ejecute dotnet build. Para compilar en Visual Studio, presione Ctrl+Shift+B.

  5. Implemente la aplicación en el SBC como una aplicación autónoma. Para obtener instrucciones, consulte Deploy .NET apps to Raspberry Pi. Asegúrese de conceder al ejecutable permiso de ejecución mediante .

  6. Ejecute la aplicación en Raspberry Pi cambiando al directorio de implementación y ejecutando el ejecutable.

    ./InputTutorial
    

    La consola muestra texto similar al siguiente:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Desconecte el pin 21 desde el suelo. La consola muestra texto similar al siguiente:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Vuelva a conectar el pin 21 y la tierra. La consola muestra texto similar al siguiente:

    (05/10/2022 16:00:25) READY ✅
    
  9. Para finalizar el programa, presione CtrlC.

¡Felicidades! Ha usado GPIO para detectar la entrada mediante el paquete NuGet. Hay muchos usos para este tipo de entrada. Este ejemplo se puede usar con cualquier escenario en el que un conmutador se conecte o interrumpa un circuito. Aquí tienes un ejemplo de uso con un interruptor de láminas magnéticas, que a menudo se emplea para detectar puertas o ventanas abiertas.

GIF animado que muestra un interruptor de reed magnético que abre y cierra. El conmutador se expone a un imán y la aplicación muestra READY. El imán se quita y la aplicación muestra ALERT. A continuación, se repite la acción.

Tripwire láser

Al ampliar el concepto de ejemplo anterior un poco más, echemos un vistazo a cómo se podría aplicar esto a la creación de un tripwire láser. La creación de un tripwire láser requiere los siguientes componentes adicionales:

  • Módulo de transmisor láser KY-008
  • Módulo del sensor del receptor láser (consulte la nota siguiente)
  • 2 resistores de 10K Ω

Nota:

El módulo del sensor del receptor láser es el nombre genérico aplicado a un módulo común que se encuentra en muchos minoristas de Internet. El dispositivo puede variar en nombre o fabricante, pero debe parecerse a esta imagen.

Imagen de un módulo de sensor receptor láser

Conexión del hardware de tripwire láser

Conecte los componentes como se detalla en el diagrama siguiente.

Diagrama que muestra un circuito que obtiene la entrada de un módulo de sensor de receptor láser.

Preste especial atención a los resistores de 10 kΩ. Estos implementan un divisor de voltaje. Esto se debe a que el módulo receptor láser genera 5V para indicar que el haz está roto. Raspberry Pi solo admite hasta 3.3V para la entrada GPIO. Dado que enviar el 5V completo a la patilla podría dañar la Raspberry Pi, la corriente del módulo receptor se pasa a través de un divisor de voltaje para reducir el voltaje a 2,5V.

Aplicación de actualizaciones de código fuente

Casi puede usar el mismo código que antes, con una excepción. En los otros ejemplos, usamos para que cuando la patilla se desconecte de tierra y el circuito esté abierto, la patilla vuelva a su estado inicial.

Sin embargo, en el caso del módulo receptor láser, no estamos detectando un circuito abierto. En su lugar, queremos que el pin actúe como un sumidero para la corriente procedente del módulo receptor láser. En este caso, abriremos el pin con . De este modo, el pin devuelve [algo] cuando no está recibiendo corriente y [algo más] cuando recibe corriente del módulo receptor láser.

controller.OpenPin(pin, PinMode.InputPullDown);

Importante

Asegúrese de que el código implementado en raspberry Pi incluye este cambio antes de probar un tripwire láser. El programa funciona sin él, pero el uso del modo de entrada incorrecto arriesga daños en su Raspberry Pi!

GIF animado que muestra una demostración del tripwire láser. El emisor láser ilumina el módulo del sensor láser y la aplicación muestra READY. El haz láser está roto y la aplicación muestra ALERT. A continuación, se repite la acción.

Obtención del código fuente

El origen de este tutorial es disponible en GitHub.

Pasos siguientes

Obtenga información sobre cómo leer las condiciones ambientales de un sensor.