summaryrefslogtreecommitdiff
path: root/Arduino__impulsions_ou_fentres.txt
diff options
context:
space:
mode:
Diffstat (limited to 'Arduino__impulsions_ou_fentres.txt')
-rw-r--r--Arduino__impulsions_ou_fentres.txt122
1 files changed, 122 insertions, 0 deletions
diff --git a/Arduino__impulsions_ou_fentres.txt b/Arduino__impulsions_ou_fentres.txt
new file mode 100644
index 0000000..06b73ba
--- /dev/null
+++ b/Arduino__impulsions_ou_fentres.txt
@@ -0,0 +1,122 @@
+Titre: Arduino & impulsions (ou fenêtres)
+Auteur: Bruno
+Date: Mon 02 Apr 2012 15:17:07 +0200
+Lien: https://blog.spyou.org/wordpress-mu/2012/04/02/arduino-impulsions-ou-fenetres/
+
+Continuons la série avec de l’arduino.
+
+Voilà l’exemple typique du montage basique pouvant servir à plein de choses.
+Moi, il me sert d’une part à compter les impulsions de mes sous-compteurs
+électriques (Voltcraft Geco32) pour connaître la conso précise de chaque ligne
+de l’installation et sera, plus tard, également dévolu à la surveillance des
+fenêtres et plus généralement de tout objet communiquant en fermant ou en
+ouvrant un contact (détecteur de mouvement, d’inondation, sonnette…)
+
+[image 2: Détecteur d'impulsion][2]
+
+Le principe est tout bête. Il faut surveiller les broches de l’arduino très
+rapidement en boucle pour détecter les changements (impulsions dans le premier
+cas ou évènement plus long si on détecte une ouverture de fenêtre). Mes tests
+ont montré que l’arduino parvient sans encombre à compter des impulsions de
+250ms.
+
+Matériellement comment ça se passe ? On va utiliser toutes les broches
+imaginables (sauf 10, 11, 12 et 13 qui vont servir plus tard) ce qui, en
+gardant 0 et 1 de côté, nous fait quand même 16 lignes et on va les brancher, à
+travers une résistance pour chacune (j’ai pris du 10kohm en deux réseaux de 8),
+vers la GND de l’arduino pour s’assurer que lorsqu’il n’y a pas de courant elle
+sont bien à 0. De l’autre côté, on va les relier au +5v par l’intermédiaire du
+montage détectant les évènements, montage qu’on peut bêtement considérer comme
+étant un interrupteur.
+
+Du coup, quand l’interrupteur est en position fermée, le +5v passe jusqu’à la
+broche avant d’aller mourir dans la GND à travers la résistance (si on ne la
+met pas, PAF l’arduino) et la broche intercalée au milieu détecte un état haut.
+Si on ouvre l’interrupteur, la broche descend au niveau bas.
+
+Sur la photo ci-dessus, vous voyez les borniers de chaque côté avec 8 entrées
+et la sortie +5v commune tout à droite sur le dernier bornier. L’arduino (nano
+v3) vient s’enficher sur les deux connecteurs horizontaux, et entre les deux,
+vous voyez les deux réseaux de résistances.
+
+Le connecteur sur la droite vient recevoir un module ethernet (utilisant les
+fameuses broches 10 à 13 de tout à l’heure) pour rendre le montage communiquant
+sur un réseau IP. J’en parlerais dans un futur article.
+
+Un peu de programmation avancée maintenant. Pour détecter des ouvertures, une
+simple boucle for vous suffira, vous devriez vous en sortir avec le site 
+arduino.cc[3] pour avancer. Pour compter de courtes impulsions, c’est peut-être
+un peu plus coton. Voici le code (sale) que j’ai pondu rapidement :
+unsigned long count[16];
+byte recvN;
+byte recvA;
+byte prevN;
+byte prevA;
+byte buff;
+byte pbuff;
+
+void setup(void) {
+ Serial.begin(9600);
+}
+
+void loop(void) {
+ byte charac;
+ byte prevcharac;
+ int shoot = 0;
+
+ recvN = PIND >;>; 2;
+ charac = PINB <> ; ;>; 1;
+ buff = buff >;>; 1;
+ }
+ prevN = recvN;
+ }
+
+ recvA = PINC;
+ if (recvA != prevA) {
+ buff = recvA;
+ pbuff = prevA;
+ for (int i = 8 ; i <> ; 16 ; i++) {
+ charac = buff & 1;
+ prevcharac = pbuff & 1;
+ if ( (charac == 0) && (prevcharac == 1) ) {
+ count[i]++;
+ shoot=1;
+ }
+ pbuff = pbuff >;>; 1;
+ buff = buff >;>; 1;
+ }
+ prevA = recvA;
+ }
+ if (shoot == 1) {
+ Serial.print("(");
+ for (int i = 0 ; i <> ; 16 ; i++) {
+ Serial.print(count[i]);
+ Serial.print(";");
+ }
+ Serial.println(")");
+ }
+}
+
+Quelques explications. Il y a trois grandes parties dans le code : la gestion
+de la volée de broches numériques, la volée analogique et la notification sur
+le port série de l’arduino. Pour aller plus vite et ne pas lire une par une les
+broches, je me suis servi des variables PINB, PINC et PIND qui contiennent
+chacune un octet rassemblant l’état de 8 broches, une sur chaque bit. Quelques
+rotations de bit et additions sont nécessaires sur PIND et PINB pour éliminer
+les broches 0 et 1 et les broches 10 à 13. On se retrouve finalement avec les
+broches de 2 à 9 ce qui tombe bien puisque dans un octet nous avons 8 bits.
+
+On fait la même chose avec la variable PINC qui contient l’état des broches
+analogiques. Le fonctionnement est simple, on observe l’état de chaque bit et
+s’il était avant à 1 et qu’il vient de passer à 0 (front descendant) on
+incrémente le compteur et on positionne la variable shoot à 1 ce qui permet de
+n’en mettre sur le port série de l’arduino que lorsqu’il y a effectivement une
+impulsion.
+
+Au prochain épisode j’essaie de vous toucher deux mots du module ENC28J60 qui
+permet de faire causer l’arduino sur un réseau IP pour deux francs six sous.
+
+Liens:
+[1]: http://blog.spyou.org/wordpress-mu/files/2012/04/photo.jpg (lien)
+[2]: http://blog.spyou.org/wordpress-mu/files/2012/04/photo-300x224.jpg (image)
+[3]: http://arduino.cc/ (lien)