Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
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.
Imagem cedida pela Raspberry Pi Foundation.
Criar a aplicação
Conclua as seguintes etapas em seu ambiente de desenvolvimento preferido:
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
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-*
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
. Ausing
declaração garante que o objeto seja descartado e que os recursos de hardware sejam liberados corretamente.-
GpioController
é instanciado sem parâmetros, indicando que ele deve detetar em qual plataforma de hardware está sendo executado e usar o esquema de numeração de pinos lógicos.
-
- 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 retornaPinValue.High
.
- Isso abre o pino com um resistor PullUp em modo ativado. Neste modo, quando o pino estiver conectado ao solo, ele retornará
- O status inicial é gravado em um console usando uma expressão ternária. O estado atual do pino é lido com
Read()
. Se forPinValue.High
, escreve a cadeia de caracteresAlert
na consola. Caso contrário, ele escreve aReady
cadeia de caracteres. -
RegisterCallbackForPinValueChangedEvent()
regista uma função de retorno de chamada para os eventosPinEventTypes.Rising
ePinEventTypes.Falling
no pino. Estes eventos correspondem aos estados dos pinos dePinValue.High
ePinValue.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 cadeiasAlert
ouReady
correspondentes. - O fio principal dorme indefinidamente enquanto espera por eventos de pinos.
- Uma declaração de uso cria uma instância de
Crie o aplicativo. Se estiver usando a CLI do .NET, execute
dotnet build
. Para criar no Visual Studio, pressione Ctrl+Shift+B.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
.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 ✅
Desconecte o pino 21 da terra. O console exibe texto semelhante ao seguinte:
(05/10/2022 15:59:59) ALERT 🚨
Reconecte o pino 21 e conecte-o à terra. O console exibe texto semelhante ao seguinte:
(05/10/2022 16:00:25) READY ✅
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.
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.
Conecte o equipamento sensor laser de disparo
Conecte os componentes conforme detalhado no diagrama a seguir.
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!
Obter o código-fonte
A fonte deste tutorial está disponível no GitHub.