Modifications

Sauter à la navigation Sauter à la recherche
652 octets supprimés ,  24 octobre 2015 à 13:17
aucun résumé de modification
Ligne 1 : Ligne 1 :  
{{Spark-Core-Hacking-NAV}}
 
{{Spark-Core-Hacking-NAV}}
   −
== Switch Magnétique ==
+
== Senseur PIR ==
   −
Aussi appelé contact magnétique, {{pl|60|disponible ici}}, ce contact utilise un [http://fr.wikipedia.org/wiki/Interrupteur_reed interrupteur reed] <small>(''Wikipédia'')</small> et un aimant pour activer un contact.  
+
Savoir lire l'état d'une entrée du port GPIO du Raspberry PI est une action fondamentale en hacking électronique.<br />
 +
Nous l'avions déjà abordé avec la lecture de l'état un bouton.<br />
 +
Dans cet article, nous allons détecter l'activation d'un senseur de proximité PIR à l'aide d'un Raspberry PI.
   −
Un contact magnétique est constitué de deux parties.
+
[[Fichier:SenseurPir.jpg]]
# Un aimant
  −
# Le contact magnétique (aussi appelé Reed switch).
     −
[[Fichier:ReedSwitch.jpg]]
+
Voici un exemple qui vous propose de lire l'état du senseur PIR placé sur la broche le D4.<br />
 +
Une Led rouge est placée sur le D1, elle est allumée dans lorsque le senseur PIR détecte un mouvement.
   −
Ces contacts,faciles à mettre en oeuvre, servent généralement à détecter l'ouverture d'une porte ou d'une fenêtre.
+
== Matériel ==
Si vous disposez d'un système d'alarme à la maison vous avez probablement noté ces petits boitiers blancs à proximité des fenêtres.
+
* Un {{pl|53|breadboard}} et {{pl|34|des fils extra souples}}
 
+
* Un {{pl|61|senseur PIR}}
Les contacts magnétiques sont généralement ouvert au repos (c'est a dire "non sollicité par un aimant").<br />
+
* 1 x {{pl|128|résistance de 1K Ohms}} (Brun, Noir, Rouge)
Lorsque l'on place l'aimant à proximité, le contact se ferme. En étant attentif, il est parfois même possible d'entendre le contact se fermer.
+
* 1 x Led Rouge
 
+
* 1 x {{pl|518|Spark Core}}
Le principe physique d'un contact reed est identique à celui d'un bouton poussoir... c'est un contact!.  
+
== Montage ==
 +
La sortie du senseur PIR est une '''sortie active''' qui place le potentiel à GND/Masse ou 3.3V en fonction de l'état du senseur PIR.
   −
Par conséquent, nous vous recommandons fortement [[Spark-Core-Bouton|la lecture de notre tutoriel sur le bouton poussoir]] et la section décrivant la protection d'une entrée digitale et le déparasitage logiciel.
+
Cette sortie est donc compatible avec un système 3.3v, même si le senseur a besoin de 5 volts pour fonctionner correctement. En branchant l'alimentation du senseur sur la broche VIN, nous y récupérons une tension de 5V lorsque le Particle Core est alimenté via USB (5V) ou via {{underline|une source de tension externe 5V}} branchée directement sur VIN.
   −
== Logique inversée ==
+
[[fichier:SPARK-PIR_bb.jpg|480px]]
Le principe de lecture d'un bouton poussoir et d'un contact magnétique est identique.
  −
 
  −
Il y a cependant une différence de logique:
  −
* Lorsque la porte est fermée, l'aimant active l'interrupteur reed et le contact est fermé.
  −
* Lorsque la porte est ouverte, l'aimant s'éloigne de l'interrupteur reed et le contact s'ouvre.
  −
 
  −
Dans le cas ci-présent, il ne faut pas détecter la fermeture d'un contact (comme le bouton poussoir) '''mais l'ouverture d'un contact'''.
  −
 
  −
== Montage ==
  −
Comme pour le bouton poussoir, le montage est élémentaire et utilise une résistance pull-down de 10 KOhms (brun, noir, orange) et une résistance de protection de 100 Ohms (brun, noir, brun).
     −
[[fichier:SPARK-MAGNETIC-SWITCH_bb.jpg|640px]]
+
Lorsque le senseur PIR détecte une activité, il active sa sortie, ce qui applique 3.3V sur la broche D4. Cette sortie PIR reste active pendant plusieurs secondes... à la suite de quoi le potentiel est ramené la masse (broche D4 est donc à 0 volt).
   −
Lorsque le contact est fermé (la porte fermée), 3.3V est appliqué sur la broche D4... lorsque la porte est ouverte, le contact reed s'ouvre et la broche D4 est ramenée à la masse par la résistance pull-down.
  −
   
== Code ==
 
== Code ==
 
Voici le petit bout de code pour votre Core
 
Voici le petit bout de code pour votre Core
    
  <nowiki>// -------------------------------------------------
 
  <nowiki>// -------------------------------------------------
// Internet Magnetic - Détection d'ouverture de contact Reed
+
// Internet PIR - Détection de mouvement avec senseur PIR
 
// -------------------------------------------------
 
// -------------------------------------------------
 
//
 
//
 
// Exemple didactique dont le but est:
 
// Exemple didactique dont le but est:
// 1) De détecter l'ouverture de contact reed (switch magnetic) avec
+
// 1) De détecter l'activation d'un senseur PIR avec
 
//    avec déparasitage logiciel.
 
//    avec déparasitage logiciel.
// 2) Reporte cette information dans une variable "counter" sur Spark Cloud
+
// 2) Reporte cette information dans une variable "counter" sur Particle Cloud
//    (le nombre d'ouverture) permettant à un autre logiciel comme
+
//    (le nombre de détection) permettant à un autre logiciel comme
 
//    un SmartPhone de détecter l'événement.
 
//    un SmartPhone de détecter l'événement.
// 3) Reporte le statut actuel du senseur dans la variable "close".
+
// 3) Reporte le statut actuel du senseur dans la variable "actif".
//    Permet de savoir si le contact/porte est fermé.  
+
//    Permet de savoir si le senseur est actuellement actif.  
//    Pratique par exemple pour la cabane de jardin, chambre froide,
+
//    Pratique par exemple pour savoir s'il y a de l'activité dans une
//    box du cheval (s'il est de sortie... donc porte ouverte), etc
+
//    pièce (ex: surveiller un stock en pleine nuit).
// 3) Offrir une fonction "reset" sur Spark Cloud permettant
+
// 3) Offrir une fonction "reset" sur Particle Cloud permettant
 
//    a un autre logiciel de remettre le compteur "counter" à zéro.
 
//    a un autre logiciel de remettre le compteur "counter" à zéro.
 
//    Force la relecture de l'entrée digital et la mise à jour
 
//    Force la relecture de l'entrée digital et la mise à jour
//    de la variable "open"
+
//    de la variable "actif"
 
//
 
//
 
// Voyez le tutoriel MCHobby
 
// Voyez le tutoriel MCHobby
//  http://wiki.mchobby.be/index.php?title=Spark-Core-Switch-Magnetic
+
//  http://wiki.mchobby.be/index.php?title=Spark-Core-PIR
 
// Produit disponible chez MCHobby:
 
// Produit disponible chez MCHobby:
//  http://shop.mchobby.be/product.php?id_product=60
+
//  http://shop.mchobby.be/product.php?id_product=61
 
//
 
//
// contact magnétique/contact reed branché sur la broche D4
+
// Sortie du senseur PIR branché sur la broche D4
#define btnPin 4
+
#define pirPin 4
    
// Créer une variable qui pour stocker la valeur
 
// Créer une variable qui pour stocker la valeur
Ligne 72 : Ligne 62 :     
// Créer les variables internes au programme
 
// Créer les variables internes au programme
int contactState; // etat du bouton
+
int pirState; // etat du senseur PIR
    
/* Exécuté une fois au démarrage */
 
/* Exécuté une fois au démarrage */
 
void setup()
 
void setup()
 
{
 
{
   // Enregistrer la variable compteur sur Spark Cloud
+
   // Enregistrer la variable compteur sur Particle Cloud
 
   Spark.variable("counter", &counter, INT );
 
   Spark.variable("counter", &counter, INT );
   // Publie l'état du contact  dans la variable "close" sur Spark Cloud
+
   // Publie l'état du contact  dans la variable "close" sur Particle Cloud
   Spark.variable("close", &contactState, INT );
+
   Spark.variable("actif", &pirState, INT );
 
    
 
    
   // Enregistrer la fonction "reset compteur" sur Spark Cloud
+
   // Enregistrer la fonction "reset compteur" sur Particle Cloud
 
   Spark.function("reset", resetCounter );
 
   Spark.function("reset", resetCounter );
 
    
 
    
 
   // Active la broche D4 comme entrée
 
   // Active la broche D4 comme entrée
   pinMode(btnPin, INPUT);
+
   pinMode(pirPin, INPUT);
 
   // lecture de l'état initial
 
   // lecture de l'état initial
   contactState = digitalRead( btnPin );
+
   pirState = digitalRead( pirPin );
 
}
 
}
   Ligne 96 : Ligne 86 :  
   int val, val2; // variable pour stocker la valeur lue sur la broche D4
 
   int val, val2; // variable pour stocker la valeur lue sur la broche D4
 
    
 
    
   val = digitalRead( btnPin );
+
   val = digitalRead( pirPin );
 
   delay( 10 ); // delai de 10ms pour déparasitage logiciel
 
   delay( 10 ); // delai de 10ms pour déparasitage logiciel
   val2 = digitalRead( btnPin );
+
   val2 = digitalRead( pirPin );
 
    
 
    
 
   // si val = val2 --> lecture de l'entrée est consistante
 
   // si val = val2 --> lecture de l'entrée est consistante
Ligne 106 : Ligne 96 :  
        
 
        
 
       // Si le contact a changé d'état? (passe du HIGH->LOW ou de LOW->HIGH)
 
       // Si le contact a changé d'état? (passe du HIGH->LOW ou de LOW->HIGH)
       if( val != contactState ){
+
       if( val != pirState ){
 
            
 
            
           // Si le contact est ouvert
+
           // Si le PIR est actif
           if( val == LOW ){
+
           if( val == HIGH ){
 
                
 
                
 
               counter = counter +1; // incrémenter le compteur
 
               counter = counter +1; // incrémenter le compteur
Ligne 115 : Ligne 105 :  
            
 
            
 
           // Se souvenir du nouvel état de l'entrée
 
           // Se souvenir du nouvel état de l'entrée
           contactState = val;  
+
           pirState = val;  
 
       }
 
       }
 
    
 
    
Ligne 125 : Ligne 115 :  
// Pas de chaine de commande.
 
// Pas de chaine de commande.
 
// a) Réinitialise le compteur "counter" à zéro.
 
// a) Réinitialise le compteur "counter" à zéro.
// b) mise-à-jour de la variable open.
+
// b) mise-à-jour de la variable actif.  
 
int resetCounter( String command ){
 
int resetCounter( String command ){
 
     counter = 0;
 
     counter = 0;
 
      
 
      
 
     // relecture de l'entrée
 
     // relecture de l'entrée
     contactState = digitalRead( btnPin );
+
     pirState = digitalRead( pirPin );
 
     delay( 10 ); // déparasitage logiciel
 
     delay( 10 ); // déparasitage logiciel
     contactState = digitalRead( btnPin );
+
     pirState = digitalRead( pirPin );
 
      
 
      
 
     return 1; // retour de valeur pour l'API
 
     return 1; // retour de valeur pour l'API
Ligne 138 : Ligne 128 :     
== Faire un appel d'API avec CURL ==
 
== Faire un appel d'API avec CURL ==
Nous allons maintenant tester notre programme... nous allons donc faire des appels d'API sur Spark Cloud.
+
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:
 
Pour rappel, nous avons deux API dans notre programme:
* '''counter''' (variable) - permet de savoir combien de fois le contact magnétique à été ouvert.
+
* '''counter''' (variable) - permet de savoir combien de fois le senseur PIR à été activé.
* '''close''' (variable) - permet de savoir si le contact magnétic est fermé (close=1).
+
* '''actif''' (variable) - permet de savoir si le le senseur PIR est actif.
 
* '''reset''' (function) - sans paramètre, permet de réinitialiser le compteur à 0 mais aussi de reforcer la lecture de l'entrée :-)
 
* '''reset''' (function) - sans paramètre, permet de réinitialiser le compteur à 0 mais aussi de reforcer la lecture de l'entrée :-)
   Ligne 151 : Ligne 141 :  
  <nowiki>curl -G https://api.spark.io/v1/devices/0123456789abcdef/counter -d access_token=123412341234</nowiki>
 
  <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 ouvert 5 fois le contact:
+
Ce qui produit le résultat ci-dessous, où vous pouvez constater que nous avons activé 5 fois le senseur PIR:
    
  <nowiki>{
 
  <nowiki>{
Ligne 165 : Ligne 155 :  
}</nowiki>
 
}</nowiki>
   −
=== L'état du contact ===
+
=== L'état du senseur ===
Pour commencer, nous allons récupérer l'état du contact magnétique en utilisant curl (voyez nos précédents tutoriels concernant CURL).
+
Pour commencer, nous allons récupérer l'état du senseur PIR en utilisant curl (voyez nos précédents tutoriels concernant CURL).
   −
  <nowiki>curl -G https://api.spark.io/v1/devices/0123456789abcdef/close -d access_token=123412341234</nowiki>
+
  <nowiki>curl -G https://api.spark.io/v1/devices/0123456789abcdef/actif -d access_token=123412341234</nowiki>
   −
Ce qui produit le résultat ci-dessous, où vous pouvez constater que le contact est actuellement ouvert (a priori, la porte est ouverte):
+
Ce qui produit le résultat ci-dessous, où vous pouvez constater que le senseur est actuellement actif (a priori, quelqu'un est passé dans le champs de détection):
    
  <nowiki>{
 
  <nowiki>{
 
   "cmd": "VarReturn",
 
   "cmd": "VarReturn",
   "name": "close",
+
   "name": "actif",
 
   "result": 1,
 
   "result": 1,
 
   "coreInfo": {
 
   "coreInfo": {
Ligne 185 : Ligne 175 :     
=== Réinitialiser le compteur ===
 
=== Réinitialiser le compteur ===
Idéalement votre programme utilisant l'API Spark devrait prendre la valeur du compteur... puis surveiller le changement de cette valeur.
+
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 ouvert le contact (la porte) :-)
+
Si le compteur augmente... c'est qu'il détecte des mouvement (des personnes passent par là) :-)
    
Restons pragmatique... cette façon de faire n'est pas forcement confortable.  
 
Restons pragmatique... cette façon de faire n'est pas forcement confortable.  
   −
En conséquence, nous avons ajouté une fonction '''reset''' sur Spark Cloud pour réinitialiser le compteur (ps: j'ai volontairement laissé le paramètre "params", même s'il est vide).
+
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>  
 
  <nowiki>curl https://api.spark.io/v1/devices/0123456789abcdef/reset -d access_token=123412341234 -d params=</nowiki>  
Ligne 205 : Ligne 195 :  
}</nowiki>
 
}</nowiki>
   −
La valeur 1 est retournée par l'exécution de la fonction sur le Spark... mais le compteur sera bien à zéro!  
+
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}}
29 910

modifications

Menu de navigation