Utiliser GPIO pour l’entrée binaire
Les broches d’E/S à usage général (GPIO) peuvent être configurées pour recevoir des signaux électriques en tant qu’entrée. Au niveau le plus élémentaire, cela est utile pour les scénarios qui détectent l’ouverture/la fermeture d’un circuit. Ces circuits peuvent inclure des boutons de commande, des commutateurs bascules, des commutateurs magnétiques, des commutateurs à pression et d’autres appareils qui représentent des valeurs binaires (activées/désactivées) en effectuant un circuit.
Dans ce tutoriel, vous allez utiliser .NET et les broches GPIO de votre Raspberry Pi pour détecter l’ouverture et la fermeture d’un circuit.
Prérequis
- Ordinateur à carte unique (SBC) basé sur ARM (ARMv7 ou version ultérieure)
- Câbles de liaison
- Tableau de navigation (facultatif)
- Carte d’évaluation GPIO Raspberry Pi (facultative)
- Kit de développement logiciel (SDK) .NET version 7 ou ultérieure
Notes
Ce tutoriel est écrit en supposant que l’appareil cible est Raspberry Pi. Toutefois, ce tutoriel peut être utilisé pour n’importe quel SBC Linux qui prend en charge .NET, comme Orange Pi, ODROID, etc.
Vérifiez que SSH est activé sur votre appareil. Pour Raspberry Pi, consultez Configuration d’un serveur SSH dans la documentation Raspberry Pi.
Préparer le matériel
Utilisez les composants matériels pour générer le circuit, comme illustré dans le diagramme suivant :
L’image ci-dessus illustre une connexion directe entre une broche de mise à la terre et une broche 21.
Conseil
Le diagramme représente un tableau de navigation et une carte d’évaluation GPIO à des fins d’illustration, mais n’hésitez pas à connecter une broche de mise à la terre et une broche 21 avec un fil de raccordement sur le Raspberry Pi.
Si nécessaire, reportez-vous au schéma de raccordement suivant :
Image avec la permission de Raspberry Pi Foundation.
Créer l’application
Effectuez les étapes suivantes dans votre environnement de développement préféré :
Créez une application console .NET à l’aide de l’interface CLI .NET ou de Visual Studio. Nommez-la InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
Ajoutez le package System.Device.Gpio au projet. Utilisez l’interface CLI .NET du répertoire du projet ou Visual Studio.
dotnet add package System.Device.Gpio --version 2.2.0-*
Remplacez le contenu du fichier Program.cs par le code suivant :
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)}"); }
Dans le code précédent :
- Une déclaration using crée une instance de
GpioController
. La déclarationusing
garantit que l’objet est supprimé et que les ressources matérielles sont correctement libérées.-
GpioController
est instancié sans paramètres, ce qui indique qu’il doit détecter la plateforme matérielle sur laquelle il s’exécute et utiliser le schéma de numérotation logique des broches.
-
- La broche GPIO 21 est ouverte avec
PinMode.InputPullUp
.- Cette opération ouvre la broche avec une résistance PullUp enclenchée. Dans ce mode, lorsque la broche est connectée à la terre, elle retourne
PinValue.Low
. Lorsque la broche est déconnectée de la terre et que le circuit est ouvert, la broche retournePinValue.High
.
- Cette opération ouvre la broche avec une résistance PullUp enclenchée. Dans ce mode, lorsque la broche est connectée à la terre, elle retourne
- L’état initial est écrit dans une console à l’aide d’une expression ternaire. L’état actuel de la broche est lu avec
Read()
. S’il s’agit dePinValue.High
, il écrit la chaîneAlert
dans la console. Sinon, il écrit la chaîneReady
. -
RegisterCallbackForPinValueChangedEvent()
enregistre une fonction de rappel pour les événementsPinEventTypes.Rising
etPinEventTypes.Falling
sur la broche. Ces événements correspondent aux états de brochePinValue.High
etPinValue.Low
, respectivement. - La fonction de rappel pointe vers une méthode appelée
OnPinEvent()
.OnPinEvent()
utilise une autre expression ternaire qui écrit également les chaînesAlert
ouReady
correspondantes. - Le thread principal se met en veille indéfiniment pendant l’attente d’événements de broche.
- Une déclaration using crée une instance de
Générez l'application. Si vous utilisez l’interface CLI .NET, exécutez
dotnet build
. Pour générer dans Visual Studio, appuyez sur Ctrl+Maj+B.Déployez l’application sur le SBC en tant qu’application autonome. Pour obtenir des instructions, consultez Déployer des applications .NET sur Raspberry Pi. Veillez à accorder à l’exécutable l’autorisation exécuter à l’aide de
chmod +x
.Exécutez l’application sur le Raspberry Pi en basculant vers le répertoire de déploiement et en exécutant l’exécutable.
./InputTutorial
La console affiche un texte semblable à ce qui suit :
Initial status (05/10/2022 15:59:25): READY ✅
Déconnectez la broche 21 de la terre. La console affiche un texte semblable à ce qui suit :
(05/10/2022 15:59:59) ALERT 🚨
Rebranchez la broche 21 et la terre. La console affiche un texte semblable à ce qui suit :
(05/10/2022 16:00:25) READY ✅
Terminez le programme en appuyant sur Ctrl+C.
Félicitations ! Vous avez utilisé GPIO pour détecter les entrées à l’aide du package NuGet System.Device.Gpio
! Il existe de nombreuses utilisations pour ce type d’entrée. Cet exemple peut être utilisé avec n’importe quel scénario où un commutateur connecte ou interrompt un circuit. Voici un exemple qui l’utilise avec un commutateur magnétique, qui est souvent utilisé pour détecter les portes ou les fenêtres ouvertes.
Fil de déclenchement laser
En étendant un peu plus loin l’exemple de concept précédent, examinons comment cela peut être appliqué à la création d’un fil de déclenchement laser. La création d’un fil de déclenchement laser nécessite les composants supplémentaires suivants :
- Module émetteur laser KY-008
- Module capteur de récepteur laser (voir la remarque ci-dessous)
- 2 résistances 10K Ω
Notes
Module de capteur de récepteur laser est le nom générique appliqué à un module commun trouvé chez de nombreux détaillants Internet. Le nom ou le fabricant de l’appareil peut varier, mais doit ressembler à cette image.
Connecter le matériel de déclenchement laser
Connectez les composants comme indiqué dans le diagramme suivant.
Prêtez une attention particulière aux résistances de 10K Ω. Celles-ci implémentent un diviseur de tension. Cela est dû au fait que le module récepteur laser génère 5 V pour indiquer que le faisceau est cassé. Raspberry Pi prend uniquement en charge jusqu’à 3,3 V pour l’entrée GPIO. Étant donné que l’envoi de la totalité des 5 V à la broche pourrait endommager le Raspberry Pi, le courant du module récepteur passe à travers un diviseur de tension pour réduire la tension de moitié à 2,5 V.
Appliquer les mises à jour du code source
Vous pouvez presque utiliser le même code que précédemment, à une exception près. Dans les autres exemples, nous avons utilisé PinMode.InputPullUp
pour que, lorsque la broche est déconnectée de la terre et que le circuit est ouvert, la broche retourne PinValue.High
.
Toutefois, dans le cas du module récepteur laser, nous ne détectons pas de circuit ouvert. Au lieu de cela, nous voulons que la broche joue le rôle de récepteur pour le courant provenant du module récepteur laser. Dans ce cas, nous allons ouvrir la broche avec PinMode.InputPullDown
. De cette façon, la broche retourne PinValue.Low
lorsqu’elle ne reçoit pas de courant et PinValue.High
quand elle reçoit le courant du module récepteur laser.
controller.OpenPin(pin, PinMode.InputPullDown);
Important
Assurez-vous que le code déployé sur votre Raspberry Pi inclut cette modification avant de tester un fil de déclenchement laser. Le programme fonctionne sans lui, mais l’utilisation du mauvais mode d’entrée risque d’endommager votre Raspberry Pi !
Obtenir le code source
La source de ce tutoriel est disponible sur GitHub.