Différences entre versions de « Spark-Core-Bouton »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(13 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
{{Spark-Core-Hacking-NAV}}
 
{{Spark-Core-Hacking-NAV}}
 
{{traduction}}
 
  
 
== Introduction ==
 
== Introduction ==
  
{{bloc-etroit|text=Le but de ce tutoriel est pouvoir détecter la pression d'un bouton poussoir branché sur votre Core et de le rapporter sur Spark Cloud.
+
{{bloc-etroit|text=Le but de ce tutoriel est pouvoir détecter la pression d'un bouton poussoir branché sur votre Core et de le rapporter sur Particle Cloud.
  
 
Cette technique est également valide pour tous les composants utilisant un contact électrique franc comme c'est également le cas pour les relais reed ou les contacts magnétiques.
 
Cette technique est également valide pour tous les composants utilisant un contact électrique franc comme c'est également le cas pour les relais reed ou les contacts magnétiques.
Ligne 11 : Ligne 9 :
 
Nous allons également nous attarder sur les contacts parasites et comment contourner ce problème avec une méthode de déparasitage matériel.
 
Nous allons également nous attarder sur les contacts parasites et comment contourner ce problème avec une méthode de déparasitage matériel.
 
}}
 
}}
 +
 +
== Parlons boutons ==
 +
=== Bouton tactile (mini kit) ===
 +
MC Hobby propose un {{pl|39|mini kit "Bouton tactile"}} sur son WebShop.
 +
Ce mini-kit contient tous les éléments nécessaires à la réalisation du montage d'une entrée bouton pour Arduino, Beagle-Bone, Pinguino ou autre plateforme équivalente.
 +
Ce kit contient:
 +
* 3 boutons tactiles
 +
* 3 résistances de 10 KOhms (Brun-Noir-Orange-Or).
 +
* 3 résistances de 100 Ohms (Brun-Noir-Brun-Or).
 +
 +
[[Fichier:Bouton Tactile (Mini Kit) LOW-RES.jpg|250px]]
 +
 +
Le restant de cet article explique, en détail, le montage d'une entrée de type bouton.
 +
 +
Vous pouvez aussi trouvez d'{{cl|25|autre mini-kit ici}}.
 +
 +
=== Entrée digitale ===
 +
Avec votre Particle Core, il est possible de configurer une pin en entrée ou en sortie.
 +
 +
Lorsqu'elle est configurée en entrée, il est possible de lire l'état haut/bas dans le programme.
 +
* Un état "haut" (HIGH) correspond au raccordement vers le +3.3 volts.
 +
* Un état "bas" (LOW) correspond au raccordement à la masse (GND, 0 Volts).
 +
 +
Il est fortement déconseillé d'appliquer plus de 3.3 volts sur une entrée digitale (même si elle est tolérante à 5 Volts... cela évite les accidents, d'endommager l'entrée, voire d'envoyer le Core "Ad Patres").
 +
 +
=== Le bouton tactile du mini kit ===
 +
Dans les montages présentés ci-dessus, le bouton tactile proposé par MC Hobby peut se monter très facilement.
 +
 +
Sa forme carrée peut laisser penser qu'il est facile de monter le bouton "de travers" puisqu'il est facile de le tourner d'un quart de tour, un demi tour.
 +
 +
[[Fichier:Bouton tactile raccordement 1.jpg|150px]]
 +
 +
Il n'est pourtant pas nécessaire d'avoir recourt à un multimètre pour être certain du montage, tout soucis de mauvais raccordement peut facilement être écarté en utilisant le principe suivant:
 +
 +
"'''Toujours utiliser les bornes de deux coins totalement opposés pour effectuer le raccordement'''" (simple et efficace)
 +
 +
[[Fichier:Bouton tactile raccordement 2.jpg]]
 +
 +
Vous constaterez dans l'exemple ci-dessus que même si le bouton est tourné d'un quart de tour (à droite de l'image), la position des points de raccordements (en bleu) font que ce dernier opère toujours correctement. Il n'y a ni court-circuit, ni dysfonctionnement :-) .
 +
 +
{{underline|protéger l'entrée digitale:}}
 +
 +
Comme précisé, l'entrée digitale est configurée dans le programme.
 +
 +
Si par malheur cette entrée est raccordée au +3.3 volts et que le programme configure la pin en sortie (OUTPUT), on a toutes les chances de produire un court-circuit franc!
 +
 +
Le micro-contrôleur n'appréciera pas et encore une fois, il a de forte chance de rendre visite à Saint Pierre.
 +
 +
Pour protéger l'entrée d'un tel risque, l'on insère généralement une résistance de 100 Ohms entre l'entrée et le reste du circuit.
  
 
== Montage ==
 
== Montage ==
[[Fichier:SPARK-BUTTON-00.jpg]]
+
Pour ce montage, nous allons utiliser un bouton poussoir, une résistance pull-down de 10 KOhms (noir, brun, orange) et une résistance de protection de 100 Ohms (brun, noir, brun).
 +
 
 +
[[Fichier:SPARK-BUTTON-00.jpg|480px]]
 +
 
 +
Lorsque l'on presse le bouton, 3.3V est appliqué sur la broche D4... si le bouton n'est pas pressé, la broche D4 est ramenée à la masse par la résistance pull-down.
 +
 
 +
La vue schématique présente le montage sous une autre forme...
 +
 
 +
[[Fichier:SPARK-BUTTON-01.jpg|480px]]
 +
 
 +
== Déparasitage des boutons ==
 +
{{ambox-stop|text=Lorsque l'on presse/relâche un bouton, il y a souvent l'apparition de parasites pendant quelques milisecondes.
 +
Ce parasites n'apparaissent que durant les moments où l'on enfonce/relâche le bouton poussoir.}} 
 +
 
 +
[[Fichier:switchbounce.jpg|400px]]
 +
 
 +
Source: [http://www.ladyada.net/learn/arduino/lesson5.html AdaFruit]
 +
 
 +
Si l'on compte le nombre de pressions (pour faire un compteur), ces parasites viennent justement perturber le bon fonctionnement du logiciel. Le problème est matériel... et les parasites viennent ajouter des "pressions" fantômes (voir leçon 5 ci-avant).
 +
 
 +
Il y a deux façons de corriger le problème:
 +
# Utiliser une capacité de déparasitage (déparasitage matériel).<br />Pour le déparasitage matériel, [[Entr%C3%A9e_Bouton#D.C3.A9parasitage_mat.C3.A9riel_-_version_1|voyez cet article pour plus d'information]]
 +
# Introduire un délai logiciel dans le programme (déparasitage logiciel).<br />Simple et efficace, ce point est abordé ci-dessous
 +
 
 +
=== Déparasitage logiciel ===
 +
Puisque le phénomène transitoire ne dure que quelques micro-secondes, il suffirait de faire deux lectures successives de l'entrée (après un délai de quelques millisecondes) et de s'assurer qu'il ne s'agit pas d'une phase transitoire.
 +
S'il ne s'agit pas d'une phase transitoire, la lecture de l'état de l'entrée 10 ms plus tard doit être identique à celle 10 ms plus tôt.
 +
''Personne n'arrivant à presser et relâcher un bouton en moins de 10 ms''.
 +
 
 +
== Code ==
 +
Voici le petit bout de code pour votre Core
 +
 
 +
<nowiki>// -------------------------------------------------
 +
// Internet ButtonCounter - Compteur Bouton Internet
 +
// -------------------------------------------------
 +
//
 +
// Exemple didactique dont le but est:
 +
// 1) De détecter la pression d'un bouton, relais reed ou autre senseur
 +
//    a contact franc (avec déparasitage logiciel).
 +
// 2) Reporte cette information dans une variable "counter" sur Particle Cloud
 +
//    (le nombre de pressions) permettant à un autre logiciel comme
 +
//    un SmartPhone de détecter l'événement.
 +
// 3) Offrir une fonction "reset" sur Particle Cloud permettant
 +
//    a un autre logiciel de remettre le compteur "counter" à zéro?
 +
//
 +
// Voyez le tutoriel MCHobby
 +
//  http://wiki.mchobby.be/index.php?title=Spark-Core-Bouton
 +
 
 +
// bouton branché sur la broche D4
 +
#define btnPin 4
 +
 
 +
// Créer une variable qui pour stocker la valeur
 +
// du compteur de pression
 +
int counter = 0;
 +
 
 +
// Créer les variables internes au programme
 +
int buttonState; // etat du bouton
 +
 
 +
/* Exécuté une fois au démarrage */
 +
void setup()
 +
{
 +
  // Enregistrer la variable compteur sur Particle Cloud
 +
  Spark.variable("counter", &counter, INT );
 +
 
 +
  // Enregistrer la fonction "reset compteur" sur Particle Cloud
 +
  Spark.function("reset", resetCounter );
 +
 
 +
  // Active la broche D4 comme entrée
 +
  pinMode(btnPin, INPUT);
 +
  // lecture de l'état initial
 +
  buttonState = digitalRead( btnPin );
 +
}
 +
 
 +
/* la fonction loop() est executée encore et encore */
 +
void loop()
 +
{
 +
  int val, val2; // variable pour stocker la valeur lue sur la broche D4
 +
 
 +
  val = digitalRead( btnPin );
 +
  delay( 10 ); // delai de 10ms pour déparasitage logiciel
 +
  val2 = digitalRead( btnPin );
 +
 
 +
  // si val = val2 --> lecture de l'entrée est consistante
 +
  // l'état de l'entrée est définit avec certitude... ce n'est pas
 +
  // un parasite.
 +
  if( val == val2 ){
 +
     
 +
      // Si le bouton a changé d'état? (passe du HIGH->LOW ou de LOW->HIGH)
 +
      if( val != buttonState ){
 +
         
 +
          // Si le bouton est pressé
 +
          if( val == HIGH ){
 +
             
 +
              counter = counter +1; // incrémenter le compteur
 +
          }
 +
         
 +
          // Se souvenir du nouvel état du bouton
 +
          buttonState = val;
 +
      }
 +
 
 +
  }
 +
 
 +
}
 +
 
 +
// Cette fontion est appelée lorqu'il y a un appel correspondant sur l'API
 +
// Pas de chaine de commande.
 +
// Réinitialise le compteur "counter" à zéro
 +
int resetCounter( String command ){
 +
    counter = 0;
 +
    return 1; // retour de valeur pour l'API
 +
}</nowiki>
 +
 
 +
== Faire un appel d'API avec CURL ==
 +
Nous allons maintenant tester notre programme... nous allons donc faire des appels d'API sur Particle Cloud.
 +
 
 +
Pour rappel, nous avons deux API dans notre programme:
 +
* '''counter''' (variable) - permet de savoir combien de fois le bouton à été pressé.
 +
* '''reset''' (function) - sans paramètre, permet de réinitialiser le compteur à 0.
 +
 
 +
Dans les exemples Curl ci-dessous, le Core_ID est fixé à 0123456789abcdef et l'Access Token fixé à 123412341234, notre tuto sur la LED internet explique [[Spark-Core-NetLED#Faire_une_requ.C3.AAte_sur_l.27API|comment identifier votre CORE_ID et votre ACCESS TOKEN]].
 +
=== Le compteur ===
 +
Pour commencer, nous allons récupérer le résultat du compteur en utilisant curl (voyez nos précédents tutoriels concernant CURL).
 +
 
 +
<nowiki>curl -G https://api.spark.io/v1/devices/0123456789abcdef/counter -d access_token=123412341234</nowiki>
 +
 
 +
Ce qui produit le résultat ci-dessous, où vous pouvez constater que nous avons pressé 5 fois le bouton:
 +
 
 +
<nowiki>{
 +
  "cmd": "VarReturn",
 +
  "name": "counter",
 +
  "result": 5,
 +
  "coreInfo": {
 +
    "last_app": "",
 +
    "last_heard": "2014-12-31T15:53:55.238Z",
 +
    "connected": true,
 +
    "deviceID": "0123456789abcdef"
 +
  }
 +
}</nowiki>
 +
 
 +
=== Réinitialiser le compteur ===
 +
Idéalement votre programme utilisant l'API Particle devrait prendre la valeur du compteur... puis surveiller le changement de cette valeur.
 +
 
 +
Si le compteur augmente... c'est que l'on a pressé le bouton :-)
 +
 
 +
Restons pragmatique... cette façon de faire n'est pas forcement confortable.
 +
 
 +
En conséquence, nous avons ajouté une fonction '''reset''' sur Particle Cloud pour réinitialiser le compteur (ps: j'ai volontairement laissé le paramètre "params", même s'il est vide).
 +
 
 +
<nowiki>curl https://api.spark.io/v1/devices/0123456789abcdef/reset -d access_token=123412341234 -d params=</nowiki>
 +
 
 +
Ce qui produit le résultat suivant:
 +
 
 +
<nowiki>{
 +
  "id": "0123456789abcdef",
 +
  "name": "mch-demo",
 +
  "last_app": null,
 +
  "connected": true,
 +
  "return_value": 1
 +
}</nowiki>
  
 +
La valeur 1 est retournée par l'exécution de la fonction sur le Particle... mais le compteur sera bien à zéro!
  
 
{{Spark-Core-Hacking-TRAILER}}
 
{{Spark-Core-Hacking-TRAILER}}

Version actuelle datée du 24 octobre 2015 à 13:16


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Introduction

Le but de ce tutoriel est pouvoir détecter la pression d'un bouton poussoir branché sur votre Core et de le rapporter sur Particle Cloud.

Cette technique est également valide pour tous les composants utilisant un contact électrique franc comme c'est également le cas pour les relais reed ou les contacts magnétiques.

Nous allons également nous attarder sur les contacts parasites et comment contourner ce problème avec une méthode de déparasitage matériel.

Parlons boutons

Bouton tactile (mini kit)

MC Hobby propose un mini kit "Bouton tactile" sur son WebShop. Ce mini-kit contient tous les éléments nécessaires à la réalisation du montage d'une entrée bouton pour Arduino, Beagle-Bone, Pinguino ou autre plateforme équivalente. Ce kit contient:

  • 3 boutons tactiles
  • 3 résistances de 10 KOhms (Brun-Noir-Orange-Or).
  • 3 résistances de 100 Ohms (Brun-Noir-Brun-Or).

Bouton Tactile (Mini Kit) LOW-RES.jpg

Le restant de cet article explique, en détail, le montage d'une entrée de type bouton.

Vous pouvez aussi trouvez d'autre mini-kit ici.

Entrée digitale

Avec votre Particle Core, il est possible de configurer une pin en entrée ou en sortie.

Lorsqu'elle est configurée en entrée, il est possible de lire l'état haut/bas dans le programme.

  • Un état "haut" (HIGH) correspond au raccordement vers le +3.3 volts.
  • Un état "bas" (LOW) correspond au raccordement à la masse (GND, 0 Volts).

Il est fortement déconseillé d'appliquer plus de 3.3 volts sur une entrée digitale (même si elle est tolérante à 5 Volts... cela évite les accidents, d'endommager l'entrée, voire d'envoyer le Core "Ad Patres").

Le bouton tactile du mini kit

Dans les montages présentés ci-dessus, le bouton tactile proposé par MC Hobby peut se monter très facilement.

Sa forme carrée peut laisser penser qu'il est facile de monter le bouton "de travers" puisqu'il est facile de le tourner d'un quart de tour, un demi tour.

Bouton tactile raccordement 1.jpg

Il n'est pourtant pas nécessaire d'avoir recourt à un multimètre pour être certain du montage, tout soucis de mauvais raccordement peut facilement être écarté en utilisant le principe suivant:

"Toujours utiliser les bornes de deux coins totalement opposés pour effectuer le raccordement" (simple et efficace)

Bouton tactile raccordement 2.jpg

Vous constaterez dans l'exemple ci-dessus que même si le bouton est tourné d'un quart de tour (à droite de l'image), la position des points de raccordements (en bleu) font que ce dernier opère toujours correctement. Il n'y a ni court-circuit, ni dysfonctionnement :-) .

protéger l'entrée digitale:

Comme précisé, l'entrée digitale est configurée dans le programme.

Si par malheur cette entrée est raccordée au +3.3 volts et que le programme configure la pin en sortie (OUTPUT), on a toutes les chances de produire un court-circuit franc!

Le micro-contrôleur n'appréciera pas et encore une fois, il a de forte chance de rendre visite à Saint Pierre.

Pour protéger l'entrée d'un tel risque, l'on insère généralement une résistance de 100 Ohms entre l'entrée et le reste du circuit.

Montage

Pour ce montage, nous allons utiliser un bouton poussoir, une résistance pull-down de 10 KOhms (noir, brun, orange) et une résistance de protection de 100 Ohms (brun, noir, brun).

SPARK-BUTTON-00.jpg

Lorsque l'on presse le bouton, 3.3V est appliqué sur la broche D4... si le bouton n'est pas pressé, la broche D4 est ramenée à la masse par la résistance pull-down.

La vue schématique présente le montage sous une autre forme...

SPARK-BUTTON-01.jpg

Déparasitage des boutons

Switchbounce.jpg

Source: AdaFruit

Si l'on compte le nombre de pressions (pour faire un compteur), ces parasites viennent justement perturber le bon fonctionnement du logiciel. Le problème est matériel... et les parasites viennent ajouter des "pressions" fantômes (voir leçon 5 ci-avant).

Il y a deux façons de corriger le problème:

  1. Utiliser une capacité de déparasitage (déparasitage matériel).
    Pour le déparasitage matériel, voyez cet article pour plus d'information
  2. Introduire un délai logiciel dans le programme (déparasitage logiciel).
    Simple et efficace, ce point est abordé ci-dessous

Déparasitage logiciel

Puisque le phénomène transitoire ne dure que quelques micro-secondes, il suffirait de faire deux lectures successives de l'entrée (après un délai de quelques millisecondes) et de s'assurer qu'il ne s'agit pas d'une phase transitoire. S'il ne s'agit pas d'une phase transitoire, la lecture de l'état de l'entrée 10 ms plus tard doit être identique à celle 10 ms plus tôt. Personne n'arrivant à presser et relâcher un bouton en moins de 10 ms.

Code

Voici le petit bout de code pour votre Core

// -------------------------------------------------
// Internet ButtonCounter - Compteur Bouton Internet
// -------------------------------------------------
//
// Exemple didactique dont le but est:
// 1) De détecter la pression d'un bouton, relais reed ou autre senseur
//    a contact franc (avec déparasitage logiciel).
// 2) Reporte cette information dans une variable "counter" sur Particle Cloud
//    (le nombre de pressions) permettant à un autre logiciel comme
//    un SmartPhone de détecter l'événement.
// 3) Offrir une fonction "reset" sur Particle Cloud permettant
//    a un autre logiciel de remettre le compteur "counter" à zéro?
//
// Voyez le tutoriel MCHobby
//   http://wiki.mchobby.be/index.php?title=Spark-Core-Bouton

// bouton branché sur la broche D4
#define btnPin 4

// Créer une variable qui pour stocker la valeur
// du compteur de pression
int counter = 0; 

// Créer les variables internes au programme
int buttonState; // etat du bouton

/* Exécuté une fois au démarrage */
void setup()
{
  // Enregistrer la variable compteur sur Particle Cloud
  Spark.variable("counter", &counter, INT );
  
  // Enregistrer la fonction "reset compteur" sur Particle Cloud
  Spark.function("reset", resetCounter );
  
  // Active la broche D4 comme entrée
  pinMode(btnPin, INPUT);
  // lecture de l'état initial
  buttonState = digitalRead( btnPin );
}

/* la fonction loop() est executée encore et encore */
void loop()
{
  int val, val2; // variable pour stocker la valeur lue sur la broche D4
  
  val = digitalRead( btnPin );
  delay( 10 ); // delai de 10ms pour déparasitage logiciel
  val2 = digitalRead( btnPin );
  
  // si val = val2 --> lecture de l'entrée est consistante
  // l'état de l'entrée est définit avec certitude... ce n'est pas 
  // un parasite.
  if( val == val2 ){ 
      
      // Si le bouton a changé d'état? (passe du HIGH->LOW ou de LOW->HIGH)
      if( val != buttonState ){
          
          // Si le bouton est pressé
          if( val == HIGH ){
              
              counter = counter +1; // incrémenter le compteur
          }
          
          // Se souvenir du nouvel état du bouton
          buttonState = val; 
      }
  
  }
  
}

// Cette fontion est appelée lorqu'il y a un appel correspondant sur l'API
// Pas de chaine de commande.
// Réinitialise le compteur "counter" à zéro
int resetCounter( String command ){
    counter = 0;
    return 1; // retour de valeur pour l'API
}

Faire un appel d'API avec CURL

Nous allons maintenant tester notre programme... nous allons donc faire des appels d'API sur Particle Cloud.

Pour rappel, nous avons deux API dans notre programme:

  • counter (variable) - permet de savoir combien de fois le bouton à été pressé.
  • reset (function) - sans paramètre, permet de réinitialiser le compteur à 0.

Dans les exemples Curl ci-dessous, le Core_ID est fixé à 0123456789abcdef et l'Access Token fixé à 123412341234, notre tuto sur la LED internet explique comment identifier votre CORE_ID et votre ACCESS TOKEN.

Le compteur

Pour commencer, nous allons récupérer le résultat du compteur en utilisant curl (voyez nos précédents tutoriels concernant CURL).

curl -G https://api.spark.io/v1/devices/0123456789abcdef/counter -d access_token=123412341234

Ce qui produit le résultat ci-dessous, où vous pouvez constater que nous avons pressé 5 fois le bouton:

{
  "cmd": "VarReturn",
  "name": "counter",
  "result": 5,
  "coreInfo": {
    "last_app": "",
    "last_heard": "2014-12-31T15:53:55.238Z",
    "connected": true,
    "deviceID": "0123456789abcdef"
  }
}

Réinitialiser le compteur

Idéalement votre programme utilisant l'API Particle devrait prendre la valeur du compteur... puis surveiller le changement de cette valeur.

Si le compteur augmente... c'est que l'on a pressé le bouton :-)

Restons pragmatique... cette façon de faire n'est pas forcement confortable.

En conséquence, nous avons ajouté une fonction reset sur Particle Cloud pour réinitialiser le compteur (ps: j'ai volontairement laissé le paramètre "params", même s'il est vide).

curl https://api.spark.io/v1/devices/0123456789abcdef/reset -d access_token=123412341234 -d params= 

Ce qui produit le résultat suivant:

{
  "id": "0123456789abcdef",
  "name": "mch-demo",
  "last_app": null,
  "connected": true,
  "return_value": 1
}

La valeur 1 est retournée par l'exécution de la fonction sur le Particle... mais le compteur sera bien à zéro!


Source: Particle Core Examples créé par Particle.IO.

Traduction (et augmentation de contenu) réalisée par Meurisse D pour MCHobby.be - Translated (and enhanced) by Meurisse D. for MCHobby.be

Traduit avec l'autorisation de Particle.IO - Translated with the permission from Particle.IO - Particle.IO

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.