Windows 10 IOT + Raspberry PI + une led + un interrupteur

Avant de commencer, il te faudra un peu de matériel et de logiciel. Scott t’explique tout ici dans son billet. Pour le billet, je vais parler d’un montage simple, mais c’est une bonne base pour bien comprendre comment fonctionne le port GPIO et comment on l’attaque avec Windows 10 IOT. Le principe du montage est le suivant : changer la luminosité de la led en fonction de l’appui sur un interrupteur sachant que la led est toujours alimentée en 3.3 V à partir d’un port GPIO.

WP_20150525_15_06_05_Pro

Sans appuyer…

 

WP_20150525_15_06_09_Pro

En appuyant..

Le GPIO du Raspberry

C’est l’élément le plus simple à piloter : chaque PIN possède 2 niveaux, haut et bas et peut être soit mis à jour à partir du code, soit sa valeur est lue dans le code. Pour notre montage, nous allons utiliser les 2 :

  • Un pin va servir à allumer la led
  • Un autre pin va servir à connaître le statut de interrupteur.

Comment changer la luminosité de la led?

Comme je disais au départ, la led est toujours alimentée en 3.3V. Le seul moyen de faire varier son intensité sur ce montage est de la faire clignoter suffisamment vite pour tricher avec la persistance rétinienne.

Initialisation du GPIO

Cette partie est super simple, j’en profite au passage pour récupérer 2 variables pour manipuler les 2 pins dont j’ai besoin :

  • Le PIN 0 pour la led, en mode OUTPUT : nous allons écrire la valeur du PIN
  • Le PIN 5 pour l’interrupteur en mode INPUT : nous allons lire la valeur d’un événement à chaque fois que la valeur changera
private void SetupLeds()
{
	var gpio = GpioController.GetDefault();

	_redLed = gpio.OpenPin(0);
	_redLed.SetDriveMode(GpioPinDriveMode.Output);
	_switch = gpio.OpenPin(5);
	_switch.ValueChanged += _switch_ValueChanged;
	_switch.SetDriveMode(GpioPinDriveMode.Input);
}

L’ »algo »

Ensuite, j’ai besoin de 2 valeurs : une variable de boucle et un seuil. J’ai choisi ces valeurs arbitrairement:

  • la valeur de boucle est comprise entre 0 et 20
  • le seuil d’allumage vaut soit 1 ou 13 en fonction de l’appui sur l’interrupteur

 

Le changement de statut de l’interrupteur est très simple :

private void _switch_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
	_threshold = args.Edge == GpioPinEdge.FallingEdge ? 13 : 1;
}

Le code de la boucle n’est pas plus compliqué :

private void BlinkLeds()
{
	_loop++;

	if (_loop > 20)
	{
		_loop = 0;
	}

	var gpioPinValue = _loop < _threshold ? GpioPinValue.High : GpioPinValue.Low;

	_redLed.Write(gpioPinValue);

}

C’est bien gentil mais après ?

Ce système est la base de l’interaction avec le PI via GPIO. Une fois cela maîtrisé, il suffit d’utiliser des composants avec des sorties toujours numériques (par exemple des rotary encoders) pour faire des montages plus complexes.

Pour une lecture plus simple, voici le code en entier:

public sealed partial class MainPage : Page
{

	private int _loop = 13;
	private int _threshold;
	private GpioPin _redLed;
	private GpioPin _switch;

	public MainPage()
	{
		this.InitializeComponent();
		SetupLeds();

		while (true)
		{
			BlinkLeds();
		}
	}	

	private void SetupLeds()
	{
		var gpio = GpioController.GetDefault();

		_redLed = gpio.OpenPin(0);
		_redLed.SetDriveMode(GpioPinDriveMode.Output);
		_switch = gpio.OpenPin(5);
		_switch.ValueChanged += _switch_ValueChanged;
		_switch.SetDriveMode(GpioPinDriveMode.Input);
	}

	private void _switch_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
	{
		_threshold = args.Edge == GpioPinEdge.FallingEdge ? 13 : 1;
	}

	private void BlinkLeds()
	{
		_loop++;

		if (_loop > 20)
		{
			_loop = 0;
		}

		var gpioPinValue = _loop < _threshold ? GpioPinValue.High : GpioPinValue.Low;

		_redLed.Write(gpioPinValue);

	}

}

 

@+

Pas de commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *