MThardPWM: Exemple 2

Ce programme va faire clignoter LED_BUILTIN avec des flashs

On va utiliser le PWM hard pour faire une succession de flashs. Un double métronome va allumer et éteindre ces flashs. C'est le PWM qui fera donc les flashs et le double métronome qu donnera globalement le clignotement. Sur une Mega, LED_BUILTIN correspond à une broche acceptant ce PWM hard, il n'y a rien à faire de plus. Sur une Uno/Nano, la broche LED_BUILTIN ne l'acceptant pas, on peut utiliser la sortie 9 pour faire le PWM et mettre un fil de pontage entre la broche 9 et la broche 13. Si on ne dit rien, la broche 13 sera en entrée ce qui est parfait.

Le PWM

Cet objet va, quand il est actif, faire continuellement des flashs (0,05s allumé, 0,05s éteint). Nous allons prendre un objet MThardPWM. Avec une Uno/Nano, le signal va sortir sur la broche 9:

MThardPWM CinqFlash(9, ...

Avec une Mega, on mettra directement LED_BUILTIN à la place de 9.

Cela va créer un objet (en gros une variable) de type MThardPWM. Je l'ai appelé CinqFlash car il ne fonctionnera que pendant 0,5s et fera donc 5 flashs.

Si l'on veut un cycle allumé pendant 0,05s et éteint pendant 0,05s en prenant un MThardPWM, il faut donner le temps de l'impulsion (état HIGH ou led allumée) et la période. Le temps à HIGH est de 0,05s et doit être exprimée en microsecondes. On peut écrire:

MThardPWM CinqFlash(... 50000, ...

Mais pour documenter le code et pour rajouter des commentaires, nous allons donc écrire:

MThardPWM CinqFlash(... impulsions_de 50000 micro_secondes, ...

Ainsi, nous saurons d'une part que c'est le temps de l'impulsion, et d'autre part que le temps est exprimé en microsecondes. Les mots impulsions_de et micro_secondes sont des mots commentaires ignorés par le compilateur. On reconnaît ces mots à la présence d'un caractère "_" au milieu de plein de lettres minuscules sans avoir ce caractère en début.

De même pour donner la période, on préférera l'écriture:

MThardPWM CinqFlash(... periodes_de 100000 micro_secondes);

La définition complète de notre PWM est donc (pour une Uno/Nano):

MThardPWM CinqFlash(9, impulsions_de 500000 micro_secondes, periodes_de 1000000 micro_secondes);

Il faut comme dans tous les programmes qui utilisent MTobjets, inclure la bibliothèque utile. Ici on utilise comme seul objet un PWM (le nom de l'objet est MThardPWM):

#include "MThardPWM.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects

Je conseille fortement de laisser le commentaire, si une autre personne voulait essayer le programme, elle aurait directement un lien de téléchargement. C'est valable pour toutes les bibliothèques que vous utilisez.

Le clignotement global

On va utiliser un métronome double, un événement sur deux va mettre en marche le PWM, un événement sur deux va l'arrêter.

Voici comment on peut définir une fonction qui met en marche le PWM et une fonction qui l'arrête:

void marche(void)
{
  CinqFlash.attach();
}

void arret(void)
{
  CinqFlash.detach();
}

Si on "detach" un PWM, la broche va être en entrée. Avec une Uno/Nano, si la broche est en entrée, la led LED_BUILTIN est allumée. Pour l'éteindre, on peut passer la broche en sortie. La fonction arrêt devient donc:

void marche(void)
{
  CinqFlash.attach();
}

void arret(void)
{
  CinqFlash.detach();
  pinMode(9, OUTPUT); // Après un detach, la broche est en INPUT, et la BUITLIN_LED s'allume alors
}

Notre métronome va donc appeler alternativement chacune des deux fonctions. Si l'on veut un cycle allumé pendant 0,5s et éteint pendant 1s il faut bien prendre un MTdoubleClock qui permet de différentier les deux temps différents:

MTdoubleClock Metronome( ...

Cela va créer un objet (en gros une variable) de type MTdoubleClock.

Au début la led flashe. Il faut donc une première action (un appel à la fonction arret) au bout de 0,5s:

MTdoubleClock Metronome(500 milli_secondes, ... , arret, ...

Les temps étant exprimés obligatoirement en millisecondes, on a donc le nombre 500. Le milli_secondes est un mot commentaire ignoré par le compilateur.

Et pour la deuxième action, ce sera au bout de 1000ms. La définition complète de notre métronome est donc:

MTdoubleClock Metronome(500 milli_secondes, 1000 milli_secondes, arret, marche);

Il faut comme dans tous les programmes qui utilisent MTobjets, inclure la bibliothèque utile. Ici on utilise comme seul objet un double métronome (le nom de l'objet est MTdoubleClock):

#include "MTdoubleClock.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects

setup() et loop()

Il n'y a rien à faire de plus, setup() et loop() ne nous servent à rien. Il vont rester vide. Mais vous pouvez y mettre un autre programme, celui que nous avons fait est indépendant. Donc:

void setup(){}

void loop(){}

J'ai tout mis sur la même ligne mais vous pouvez en prendre deux ou trois. Même si les fonctions sont vides et ne nous servent à rien apparemment, il faut les définir. En fait, loop() va servir de boucle d'attente car notre programme ne fait pus rien après initialisation.

Démarrage du clignotant

Le clignotant ne peut être mis en place lors de sa définition car juste avant le setup() Arduino initialise ses propres valeurs pour les PWM et cela effacerait les nôtres. Pour contrer cela, les bibliothèques utilisent souvent une fonction begin() qui met en place manuellement certaines fonctions (on connaît par exemple Serial.begin). Pour MTobjects, ce choix n'a pas été retenu, l'objet s'initialise tout seul 16ms après sa définition.

Programme complet

Voici donc le programme complet:

// Ce programme fait clignoter une led avec des flashs. Il faut un pontage
// (fil) entre la broche 9 et 13 pour une Uno/Nano

#include "MTdoubleClock.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects
#include "MThardPWM.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects

// Sur Uno/Nano les broches utilisables sont: 9, 10 et le pontage 9-13
MThardPWM CinqFlash(9, impulsions_de 50000 micro_secondes, periodes_de 100000 micro_secondes);
// Sur Mega: 2, 3, 5, 6, 7, 8, 11, 12, 13, 44, 45, 46
//MThardPWM CinqFlash(13, impulsions_de 50000 micro_secondes, periodes_de 100000 micro_secondes);


void marche(void)
{
  CinqFlash.attach();
}

void arret(void)
{
  CinqFlash.detach();
  pinMode(9, OUTPUT); // Après unn detach, la broche est en INPUT, et la BUITLIN_LED s'allume alors
}

MTdoubleClock Metronome(500 milli_secondes, 1000 milli_secondes, arret, marche);


void setup(){}

void loop(){}