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}} |