Partilhar via


Usar GPIO para entrada binária

Os pinos de E/S de uso geral (GPIO) podem ser configurados para receber sinais elétricos como entrada. No seu nível mais básico, isso é útil para cenários que detetam a abertura/fechamento de um circuito. Esses circuitos podem incluir botões de pressão, interruptores de comutação, interruptores de palheta, pressostatos e outros dispositivos que representam os valores binários (ligado/desligado) ao completarem um circuito.

Neste tutorial, você usará o .NET e os pinos GPIO do Raspberry Pi para detetar a abertura e o fechamento de um circuito.

Pré-requisitos

  • Computador de placa única (SBC) baseado em ARM (ARMv7 ou superior)
  • Fios de ligação
  • Placa de ensaio (opcional)
  • Placa de expansão GPIO para Raspberry Pi (opcional)
  • .NET SDK 8 ou posterior

Observação

Este tutorial foi escrito assumindo que o dispositivo alvo é o Raspberry Pi. No entanto, este tutorial pode ser usado para qualquer SBC baseado em Linux que suporte .NET, como Orange Pi, ODROID e muito mais.

Certifique-se de que o SSH está ativado no seu dispositivo. Para o Raspberry Pi, consulte Configurando um servidor SSH na documentação do Raspberry Pi.

Preparar o hardware

Use os componentes de hardware para construir o circuito conforme descrito no diagrama a seguir:

Um diagrama mostrando um circuito que conecta um pino de terra ao pino 21.

A imagem acima mostra uma conexão direta entre um pino de terra e o pino 21.

Sugestão

O diagrama mostra uma placa de ensaio e uma expansão GPIO para fins ilustrativos, mas pode simplesmente conectar um pino de terra com o pino 21 com um fio de ligação no Raspberry Pi.

Consulte o diagrama de pinagem abaixo, conforme necessário.

Um diagrama mostrando a pinagem do cabeçalho GPIO do Raspberry Pi. Imagem cedida pela Raspberry Pi Foundation.
Imagem cedida pela Raspberry Pi Foundation.

Criar a aplicação

Conclua as seguintes etapas em seu ambiente de desenvolvimento preferido:

  1. Crie um novo aplicativo de console .NET usando a CLI do .NET ou o Visual Studio. Nomeie-o InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Adicione o pacote System.Device.Gpio ao projeto. Utilize o CLI do .NET no diretório do projeto ou o Visual Studio.

    dotnet add package System.Device.Gpio --version 3.2.0-*
    
  3. Substitua o conteúdo do ficheiro Program.cs pelo seguinte código:

    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)}");
    }
    

    No código anterior:

    • Uma declaração de uso cria uma instância de GpioController. A using declaração garante que o objeto seja descartado e que os recursos de hardware sejam liberados corretamente.
    • O pino GPIO 21 é aberto com PinMode.InputPullUp.
      • Isso abre o pino com um resistor PullUp em modo ativado. Neste modo, quando o pino estiver conectado ao solo, ele retornará PinValue.Low. Quando o pino é desconectado da terra e o circuito está aberto, o pino retorna PinValue.High.
    • O status inicial é gravado em um console usando uma expressão ternária. O estado atual do pino é lido com Read(). Se for PinValue.High, escreve a cadeia de caracteres Alert na consola. Caso contrário, ele escreve a Ready cadeia de caracteres.
    • RegisterCallbackForPinValueChangedEvent() regista uma função de retorno de chamada para os eventos PinEventTypes.Rising e PinEventTypes.Falling no pino. Estes eventos correspondem aos estados dos pinos de PinValue.High e PinValue.Low, respetivamente.
    • A função de callback aponta para um método chamado OnPinEvent(). OnPinEvent() usa outra expressão ternária que também escreve as cadeias Alert ou Ready correspondentes.
    • O fio principal dorme indefinidamente enquanto espera por eventos de pinos.
  4. Crie o aplicativo. Se estiver usando a CLI do .NET, execute dotnet build. Para criar no Visual Studio, pressione Ctrl+Shift+B.

  5. Implante o aplicativo no SBC como um aplicativo independente. Para obter instruções, consulte Implantar aplicativos .NET no Raspberry Pi. Certifique-se de dar permissão de execução ao ficheiro executável usando chmod +x.

  6. Execute a aplicação no Raspberry Pi mudando para o diretório de implantação e executando o executável.

    ./InputTutorial
    

    O console exibe texto semelhante ao seguinte:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Desconecte o pino 21 da terra. O console exibe texto semelhante ao seguinte:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Reconecte o pino 21 e conecte-o à terra. O console exibe texto semelhante ao seguinte:

    (05/10/2022 16:00:25) READY ✅
    
  9. Encerre o programa pressionando Ctrl+C.

Parabéns! Você usou o GPIO para detetar entradas usando o System.Device.Gpio pacote NuGet! Existem muitas utilizações para este tipo de entrada. Este exemplo pode ser usado com qualquer cenário em que um switch se conecta ou quebra um circuito. Aqui está um exemplo de usá-lo com um interruptor de palheta magnética, que é frequentemente usado para detetar portas ou janelas abertas.

GIF animado demonstrando um interruptor de palheta magnética abrindo e fechando. O interruptor é exposto a um íman e a aplicação apresenta READY. O ímã é removido e o aplicativo exibe ALERT. A ação é então repetida.

Fio disparador a laser

Expandindo um pouco mais o conceito do exemplo anterior, vamos dar uma olhada em como isso poderia ser aplicado à criação de um tripwire de laser. A construção de um laser tripwire requer os seguintes componentes adicionais:

  • KY-008 módulo transmissor laser
  • Módulo de sensor recetor laser (ver nota abaixo)
  • 2 resistências Ω 10K

Observação

Módulo de sensor recetor laser é o nome genérico aplicado a um módulo comum encontrado em muitos varejistas de internet. O dispositivo pode variar em nome ou fabricante, mas deve se assemelhar a esta imagem.

Imagem de um módulo de sensor recetor laser

Conecte o equipamento sensor laser de disparo

Conecte os componentes conforme detalhado no diagrama a seguir.

Um diagrama mostrando um circuito que recebe entrada de um módulo de sensor recetor laser.

Preste muita atenção aos resistores de 10K Ω. Estes implementam um divisor de tensão. Isso ocorre porque o módulo recetor a laser emite 5V para indicar que o feixe está quebrado. O Raspberry Pi suporta apenas até 3,3 V para entrada GPIO. Uma vez que enviar o 5V completo para o pino pode danificar o Raspberry Pi, a corrente do módulo recetor é passada através de um divisor de tensão para reduzir pela metade a tensão para 2,5V.

Aplicar atualizações de código-fonte

Você pode quase usar o mesmo código que anteriormente, com uma exceção. Nos outros exemplos, usamos PinMode.InputPullUp para que, quando o pino é desconectado do solo e o circuito está aberto, o pino retorna PinValue.High.

No entanto, no caso do módulo recetor laser, não estamos detetando um circuito aberto. Em vez disso, queremos que o pino atue como um dissipador de corrente proveniente do módulo recetor a laser. Neste caso, abriremos o pino com PinMode.InputPullDown. Desta forma, o pino retorna PinValue.Low quando não está recebendo corrente e PinValue.High quando recebe corrente do módulo recetor a laser.

controller.OpenPin(pin, PinMode.InputPullDown);

Importante

Certifique-se de que o código implantado no seu Raspberry Pi inclua essa alteração antes de testar um laser tripwire. O programa funciona sem ele, mas usar o modo de entrada errado corre o risco de danificar o seu Raspberry Pi!

GIF animado mostrando uma demonstração do laser tripwire. O emissor de laser acende o módulo do sensor laser e o aplicativo exibe READY. O feixe de laser está quebrado e o aplicativo exibe ALERT. A ação é então repetida.

Obter o código-fonte

A fonte deste tutorial está disponível no GitHub.

Próximos passos