summaryrefslogtreecommitdiff
path: root/Arduino__impulsions_ou_fentres.txt
blob: 06b73bae925754ca0923cb96b68437d768c0130d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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)