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, utilizará .NET y los pines GPIO de su Raspberry Pi para detectar la apertura y el cierre de un circuito.

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)
  • .NET SDK 10 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 distribución de pines del conector GPIO de Raspberry Pi. Imagen con autorización de Raspberry Pi Foundation.
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 package add System.Device.Gpio --version 4.0.1
    
  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 using crea una instancia de GpioController. La using declaración garantiza que el objeto se elimina y los recursos de hardware se liberan correctamente.
      • GpioController es instanciado sin ningún parámetro, lo que indica que debe detectar en qué plataforma de hardware se ejecuta y utilizar el esquema de numeración de patillas lógicas.
    • El pin 21 de GPIO se abre con PinMode.InputPullUp.
      • Esto abre el pin con un resistor PullUp activado. En este modo, cuando el pin está conectado a tierra, devolverá PinValue.Low. Cuando el pin está desconectado de tierra y el circuito está abierto, el pin retorna PinValue.High.
    • El estado inicial se escribe en una consola mediante una expresión ternaria. El estado actual del pin se lee con Read(). Si es PinValue.High, escribe la cadena de texto Alert en la consola. De lo contrario, escribe la Ready cadena.
    • RegisterCallbackForPinValueChangedEvent() registra una función de devolución de llamada para los eventos PinEventTypes.Rising y PinEventTypes.Falling en el pin. Estos eventos corresponden a los estados de anclaje de PinValue.High y PinValue.Low, respectivamente.
    • La función de devolución de llamada apunta a un método denominado OnPinEvent(). OnPinEvent() usa otra expresión ternaria que también escribe las cadenas Alert o Ready 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 chmod +x.

  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 Ctrl+C.

¡Felicidades! Ha utilizado GPIO para detectar la entrada de datos utilizando el paquete NuGet System.Device.Gpio. 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

Puede usar casi el mismo código que antes, con una excepción. En los otros ejemplos, usamos PinMode.InputPullUp para que cuando el pin se desconecte de tierra y el circuito esté abierto, el pin vuelva a PinValue.High.

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 PinMode.InputPullDown. De este modo, el pin devuelve PinValue.Low cuando no recibe corriente y PinValue.High 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