Accueil
Geolocalisation: Integration Arduino / DW1000
Un client m’a demandé de regarder ce que l’on pouvait faire en intégrant un Arduino avec la puce DW1000 de chez Decawave. Il avait l’idée de montrer que l’on pouvait faire à moindre cout un système de géolocalisation assez précis (à 10 ou 20 cm près) et fonctionnant dans un hangar.
1) La prise en main de la puce DW1000
La puce DW1000 a été développée pour résoudre certains problème de géolocalisation actuels comme :
- Précision de la localisation : précision de 10 cm sur une distance de 300 m
- Puissance consommée : elle consomme 12 fois moins que les concurrents en émission et 7 fois moins en réception
- Prix : puce à moins de 25€ (import des Etats-Unis)
- Interférences et chemins multiples : la puce est capable d’identifier plus de 11000 autres puces dans un rayon de 20m, et d’identifier le signal direct d’un signal qui a rebondi contre un mur
- Echange d’information : les puces peuvent échanger des informations entre elles
Voilà pourquoi cette puce a un bel avenir !
La puce DW1000 communique en SPI avec le microcontrôleur. La puce arrive nue, il a donc fallu que je la câble.
Apres consultation des différents forums, j’ai décidé de la câbler de la manière suivante :
Pin DWM1000 |
Pin Arduino M0 |
Function |
1 (EXTON) |
Non câblé |
see DW1000 manual |
2 (WAKEUP) |
Non câblé |
see DW1000 manual |
3 (RSTn) -> 3 |
9 |
Resetting the chip (by pulling low) |
4 (GPIO7) |
Non câblé |
see DW1000 manual |
5 (VDDAON) |
VCC |
3.3V power supply |
6 (VDD3V3) |
VCC |
3.3V power supply |
7 (VDD3V3) |
VCC |
3.3V power supply |
8 (VSS) |
Non câblé |
see DW1000 manual |
9 (GPIO6) |
Non câblé |
see DW1000 manual |
10 (GPIO5) |
Non câblé |
see DW1000 manual |
11 (GPIO4) |
Non câblé |
see DW1000 manual |
12 (GPIO3) |
Non câblé |
see DW1000 manual |
13 (GPIO2) |
Non câblé |
see DW1000 manual |
14 (GPIO1) |
Non câblé |
see DW1000 manual |
15 (GPIO0) |
Non câblé |
see DW1000 manual |
16 (VSS) |
Non câblé |
see DW1000 manual |
17 (SPICSn) |
10 (SPICSn) |
SPI chip select line (pulling low to activate chip) |
18 (SPIMOSI) |
11 (SPIMOSI) |
SPI communication towards chip |
19 (SPIMISO) |
12 (SPIMISO) |
SPI communication towards controller |
20 (SPICLK) |
13 (SPICLK) |
SPI clock (at most 3MHz in init phase, afterwards up to 20MHz) |
21 (VSS) |
Non câblé |
see DW1000 manual |
22 (GPIO8) |
3 (INPUT) |
interrupt asserted line, see DW1000 manual |
23 (VSS) |
Non câblé |
see DW1000 manual |
24 (VSS) |
GND |
Ground |
Voici le câblage fini (c’est un prototype pour une démonstration ! ) :
Très vite j’ai pu :
- accéder aux registres de la puce
- mesurer des distances entres 2 puces (certes avec un offset mais linéaire une fois cet offset supprimé)
- échanger des informations entre 2 puces
2) La géolocalisation
Pour pouvoir géolocaliser un élément dans un environnement il faut se créer un repère cartésien avec un axe X et un axe Y. Pour cela j’ai utilisé trois ensembles Aduino-DW1000 pour me créer un point 0 (ensemble A) et un axe X (droite A-C) et un axe Y (droite A-Y). Ces trois points sont appelés des Ancres ou Anchors en Anglais.
Pour localiser mon ensemble (appelé TAG=T) dans ce repère, il faut que je récupère les 3 distances TA, TB et TC et par triangulation calculer les coordonnées en X et en Y.
J’ai décidé par facilité de connecter mon TAG à localiser dans le repère à mon PC pour recevoir les 3 distances et pouvoir faire la triangulation sur mon PC. Il serait plus intéressant de connecter une Ancre au PC et de recevoir les informations de distance envoyées par le TAG via cette Ancre mais je n’ai pas eu le temps.
A noter que certaines mesures fausse me faisaient sauter mon point dans le repère, j’ai donc mis en place une moyenne glissante pour limiter les impacts de ces erreurs de mesure.
Voici le résultat : Je vois mon point bouger dans le repère quand je me promène avec mon PC et mon TAG connecté.
Bientot une vidéo de démonstration.