Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tinyclros:gpio:esnum [2020/04/08 10:31] – [6. Les interruptions] philippe | tinyclros:gpio:esnum [2023/05/19 09:36] (Version actuelle) – [4.1 Précautions d'utilisation] phil | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | [[tinyclros: | ||
+ | ===== TinyCLR OS - GPIO ===== | ||
+ | |||
+ | ** Rédacteur** : Philippe Mariano | ||
+ | {{ : | ||
+ | |||
+ | [Mise à jour le 8/4/2020] | ||
+ | |||
+ | * **Sources** | ||
+ | * Site GHI : < | ||
+ | ==== 1. Généralités ==== | ||
+ | « //Dans un système à base de **microcontrôleur**, | ||
+ | |||
+ | Pour éviter de faire référence à des valeurs électriques (tension ou intensité), | ||
+ | - **true** (« 1 » logique) correspondra par exemple à 5V ou 3,3V \\ | ||
+ | - **false** (« 0 » logique) correspondra à 0V. | ||
+ | |||
+ | {{ : | ||
+ | Un **microcontrôleur** dispose de broches pouvant être contrôlées par un logiciel. Elles peuvent se comporter comme des entrées ou des sorties, d'où le nom " | ||
+ | |||
+ | Le nombre de broches d’un microcontrôleur étant limité, il est fréquent d’avoir plusieurs fonctionnalités sur une même broche. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== 2. Les entrées, sorties numériques des cartes FEZ ==== | ||
+ | |||
+ | === 2.1 GPIO accessibles sur la carte FEZ === | ||
+ | Les connexions **D13** à **D0** peuvent être configurées en **entrée** ou en **sortie numérique**. On voit sur la copie d’écran ci-dessous qu’elles partagent la connectique avec d’autres fonctionnalités (PWM, SPI etc.). | ||
+ | {{ : | ||
+ | |||
+ | === 2.2 Bibliothèques à installer === | ||
+ | Un programme implanté dans une carte FEZ accède à ses entrées, sorties numériques par l’intermédiaire des **bibliothèques** (assemblys) \\ suivantes : \\ | ||
+ | {{ : | ||
+ | - **GHIElectronics.TinyCLR.Devices.Gpio** (les entrées, sorties)\\ | ||
+ | - **GHIElectronics.TinyCLR.Pins** (les définitions des broches) | ||
+ | |||
+ | Ces bibliothèques sont installées dans le projet sous la forme de paquets **NuGet** comme dans l' | ||
+ | |||
+ | L' | ||
+ | |||
+ | * // | ||
+ | * **Etape 2 : Installer des bibliothèques dans le projet** | ||
+ | |||
+ | === 2.3 Espaces de noms === | ||
+ | L' | ||
+ | <code csharp *.cs> | ||
+ | using GHIElectronics.TinyCLR.Pins; | ||
+ | using GHIElectronics.TinyCLR.Devices.Gpio; | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | ==== 3. Les entrées numériques ==== | ||
+ | Les entrées numériques permettent de détecter un état logique « 0 » ou « 1 ». | ||
+ | |||
+ | === 3.1 Précautions d' | ||
+ | > | ||
+ | |||
+ | {{ : | ||
+ | __Remarque__ : le processeur de la carte FEZ dispose de **résistances de rappel internes** pouvant être connectées par le logiciel. | ||
+ | |||
+ | === 3.2 Configuration d'une broche en entrée === | ||
+ | L’accès à une entrée numérique " | ||
+ | - Créer un objet de la classe **GpioController** et lui affecter le contrôleur GPIO de la carte ciblée avec la méthode **GetDefault**. | ||
+ | - Créer un objet de la classe **GpioPin** et lui affecter la broche à contrôler; ouvrir cette broche avec la méthode **OpenPin**. | ||
+ | - Configurer la broche en entrée ou en sortie (avec résistance de pull-up, etc.) en appliquant la méthode **SetDriveMode** à l' | ||
+ | |||
+ | {{ : | ||
+ | Les différentes configurations possibles pour une broche sont énumérées dans // | ||
+ | |||
+ | __Exemple__ : configuration de la broche connectée au bouton-poussoir BTN1 de la carte FEZ. | ||
+ | |||
+ | <code csharp *.css> | ||
+ | // 1. Création de l' | ||
+ | // contrôleur GPIO de la carte ciblée (à déclarer une seule fois). | ||
+ | var gpio = GpioController.GetDefault(); | ||
+ | // 2. Création de l' | ||
+ | // la broche associée au bouton-poussoir BTN1, | ||
+ | // broche ouverte par OpenPin, | ||
+ | var btn1 = gpio.OpenPin(FEZ.GpioPin.Btn1); | ||
+ | // 3. Configuration de la broche reliée à BTN1 en entrée avec | ||
+ | // une résistance de rappel | ||
+ | btn1.SetDriveMode(GpioPinDriveMode.InputPullUp); | ||
+ | </ | ||
+ | |||
+ | === 3.3 Lecture d'une broche === | ||
+ | La lecture d'une entrée numérique se fait avec une méthode **Read**() de la classe GpioPin. | ||
+ | |||
+ | __Exemple__ : Le bouton-poussoir BTN1 est utilisé pour commander la led LED1 de la carte FEZ. | ||
+ | <code csharp *.css> | ||
+ | if (btn1.Read()== GpioPinValue.High) | ||
+ | { | ||
+ | LED1.Write(GpioPinValue.Low); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | LED1.Write(GpioPinValue.High); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | ==== 4. Les sorties numériques ==== | ||
+ | === 4.1 Précautions d' | ||
+ | {{: | ||
+ | {{ : | ||
+ | === 4.2 Configuration d'une broche en sortie === | ||
+ | L’accès à une sortie numérique " | ||
+ | - Créer un objet de la classe **GpioController** et lui affecter le contrôleur GPIO de la carte ciblée avec la méthode **GetDefault**. | ||
+ | - Créer un objet de la classe **GpioPin** et lui affecter la broche à contrôler; ouvrir cette broche avec la méthode **OpenPin**. | ||
+ | - Configurer la broche sortie en appliquant la méthode **SetDriveMode** à l' | ||
+ | |||
+ | {{ : | ||
+ | Les différentes configurations possibles pour une broche sont énumérées dans // | ||
+ | |||
+ | __Exemple__ : configuration de la broche connectée à la LED1 de la carte FEZ. | ||
+ | |||
+ | <code csharp *.css> | ||
+ | // 1. Création de l' | ||
+ | // contrôleur GPIO de la carte ciblée (à déclarer une seule fois). | ||
+ | var gpio = GpioController.GetDefault(); | ||
+ | // 2. Création de l' | ||
+ | // la broche associée à LED1. | ||
+ | // broche ouverte par OpenPin, | ||
+ | var btn1 = gpio.OpenPin(FEZ.GpioPin.LED1); | ||
+ | // 3. Configuration de la broche reliée à LED1 en sortie. | ||
+ | btn1.SetDriveMode(GpioPinDriveMode.OutPut); | ||
+ | </ | ||
+ | |||
+ | === 4.3 Ecriture sur une broche === | ||
+ | Une sortie numérique peut prendre l’état **true** ou **false**. Cet état est contrôlé avec la méthode Write. | ||
+ | |||
+ | __Exemple__ : Le bouton-poussoir BTN1 est utilisé pour commander la led LED1 de la carte FEZ. | ||
+ | <code csharp *.css> | ||
+ | if (btn1.Read()== GpioPinValue.High) | ||
+ | { | ||
+ | LED1.Write(GpioPinValue.Low); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | LED1.Write(GpioPinValue.High); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== 5. BTN1 contrôle Led1 ! ==== | ||
+ | |||
+ | <code csharp *.cs> | ||
+ | using GHIElectronics.TinyCLR.Devices.Gpio; | ||
+ | using GHIElectronics.TinyCLR.Pins; | ||
+ | using System.Threading; | ||
+ | |||
+ | namespace TCLR_FEZ_LED1_Btn1 | ||
+ | { | ||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | var gpio = GpioController.GetDefault(); | ||
+ | var LED1 = gpio.OpenPin(FEZ.GpioPin.Led1); | ||
+ | LED1.SetDriveMode(GpioPinDriveMode.Output); | ||
+ | var btn1 = gpio.OpenPin(FEZ.GpioPin.Btn1); | ||
+ | btn1.SetDriveMode(GpioPinDriveMode.InputPullUp); | ||
+ | |||
+ | while (true) | ||
+ | { | ||
+ | if (btn1.Read() == GpioPinValue.High) | ||
+ | { | ||
+ | LED1.Write(GpioPinValue.Low); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | LED1.Write(GpioPinValue.High); | ||
+ | } | ||
+ | Thread.Sleep(10); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | <note tip>Le projet **TCLR_FEZ_LED1_Btn1** pour **Visual Studio Community 2017** est téléchargeable < | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | ==== 6. Les interruptions ==== | ||
+ | Une **interruption** est un arrêt temporaire de l' | ||
+ | |||
+ | L’interruption est provoquée par une cause externe (action sur un bouton-poussoir, | ||
+ | |||
+ | On utilise les interruptions afin de permettre des **communications non bloquantes** avec des périphériques externes. | ||
+ | |||
+ | Une interruption tient compte de l’état logique présent sur une broche. Couramment, on la déclenchera sur **le front montant, le front descendant, ou chacun des fronts** d’un signal logique. | ||
+ | |||
+ | === 6.1 Précautions d' | ||
+ | Une interruption sera reconnue si le signal présente des fronts " | ||
+ | Les figures ci-dessous représentent un signal transmis à la fermeture du contact d’un anémomètre. Le signal de gauche n’est pas utilisable, car, à cause du rebondissement du contact, il contient quatre fronts montants au lieu d’un seul comme dans le cas du signal de droite. | ||
+ | {{ : | ||
+ | |||
+ | === 6.2 Configuration d'une entrée comme source d' | ||
+ | La configuration en entrée de la broche destinée à recevoir un évènement est identique à celle du paragraphe 4. | ||
+ | |||
+ | === 6.3 Evènement et gestionnaire d' | ||
+ | Un évènement est attaché à un gestionnaire (service d' | ||
+ | |||
+ | <code csharp *.cs> | ||
+ | using GHIElectronics.TinyCLR.Devices.Gpio; | ||
+ | using GHIElectronics.TinyCLR.Pins; | ||
+ | using System.Threading; | ||
+ | |||
+ | |||
+ | namespace TCLR_FEZ_LED1_Btn1_INT | ||
+ | { | ||
+ | class Program | ||
+ | { | ||
+ | private static GpioPin LED1; | ||
+ | |||
+ | private static void Main() | ||
+ | { | ||
+ | var gpio = GpioController.GetDefault(); | ||
+ | LED1 = gpio.OpenPin(FEZ.GpioPin.Led1); | ||
+ | LED1.SetDriveMode(GpioPinDriveMode.Output); | ||
+ | var btn1 = gpio.OpenPin(FEZ.GpioPin.Btn1); | ||
+ | btn1.SetDriveMode(GpioPinDriveMode.InputPullUp); | ||
+ | // Prise en compte de l' | ||
+ | btn1.ValueChanged += Btn1_ValueChanged; | ||
+ | |||
+ | Thread.Sleep(-1); | ||
+ | // d' | ||
+ | |||
+ | } | ||
+ | |||
+ | private static void Btn1_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) | ||
+ | { | ||
+ | if (e.Edge == GpioPinEdge.RisingEdge) | ||
+ | LED1.Write(GpioPinValue.Low); | ||
+ | else | ||
+ | LED1.Write(GpioPinValue.High); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | <note tip>Le projet **TCLR_FEZ_LED1_Btn1_INT** pour **Visual Studio Community 2017** est téléchargeable < | ||
+ | |||
+ | |||
+ | |||
+ | ==== 7. Tous les exemples ==== | ||
+ | * Exemples codés en C# pour la carte **Panda 3 (G80)** [[tinyclros: |