Présentation

Une girouette est un dispositif orientable, dont la forme est conçue pour qu'il se place spontanément dans le lit du vent. En gros, c'est une espèce de flèche montée sur un axe, qui bouge toute seule. Déterminer la direction du vent consiste donc à déterminer la position absolue de l'axe sur laquelle elle montée.

On a va recourir à une méthode optique, un disque perforé qui tourne entre des LEDs et des photo-transistors. Les photo-transistors sont reliés aux entrées d'une carte Arduino. A chaque fois qu'un photo-transistor est éclairé par la LED qui se trouve en face, il devient passant. Cet état passant est détectable par la carte Arduino. On associe le bit 1 à l'état passant et le bit 0 à l'état bloquant de chaque photo-transistor. Nous allons utiliser cinq entrées de la carte Arduino, on peut encoder 25 = 32 positions.

Utilisation d'une méthode optique

Il s'agit de disposer des photo-transistors et les trous sur le disque de manière à encoder un maximum de positions dans un minimum de place. Il se trouve qu'un certain Bruce Spedding a imaginé une méthode, plus tard améliorée par Alain P. Hiltgen et Kenneth G. Paterson, appelée « Single Track Gray Code ». Cette méthode présente deux caractéristiques remarquables: d'une part les codes générés ne diffèrent que d'un bit d'une position à l'autre, c'est le principe des codes de Gray (binaire réfléchi), qui limitent ainsi les risques d'erreur de lecture pour les positions intermédiaires. D'autre part les capteurs sont positionnés sur la même piste circulaire, ce qui permet de construire des encodeurs très compacts. Le prix à payer est que le nombre de positions codables est plus petit que 2n. Par exemple, avec 5 photo-transistors, on ne peut encoder que 30 positions, ce qui donne une précision de 12°, largement suffisant quand il s'agit de déterminer la direction du vent.

Fonctionnement de l'encodage optique utilisé (Single Track Grey Code)

B4

B3

B2

B1

B0

CODE

Angle (°)

Angle (°)

0

0

0

0

1

0

0

0

0

0

0

1

1

3

12

348

0

1

0

1

1

11

24

336

1

1

0

1

1

27

36

324

1

0

0

1

1

19

48

312

1

0

0

1

0

18

60

300

0

0

0

1

0

2

72

288

0

0

1

1

0

6

84

276

1

0

1

1

0

22

96

264

1

0

1

1

1

23

96

264

0

0

1

1

1

7

120

240

0

0

1

0

1

5

132

228

0

0

1

0

0

4

144

216

0

1

1

0

0

12

156

204

0

1

1

0

1

13

168

192

0

1

1

1

1

15

180

180

0

1

1

1

0

14

192

168

0

1

0

1

0

10

204

156

0

1

0

0

0

8

216

144

1

1

0

0

0

24

228

132