Accueil

sept. 14, 2016

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.

Catégorie : Logiciel embarqué
Posté par : Simon Loubiou

 

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.