Test « MaUWB_DW3000 avec STM32 AT Command » – Utilisation d’Arduino pour tester la portée UWB, la précision et le positionnement en intérieur

Revue "MaUWB_DW3000 avec STM32 AT Command" - Utilisation d'Arduino pour tester la portée UWB, la précision et le positionnement en intérieur

Bonjour, l’appareil que je vais examiner est le MaUWB_DW3000 avec STM32 AT Command. Il s’agit d’un module ultra-large bande (UWB) de MakerFabs. Le module UWB principal de cette carte est l’émetteur-récepteur UWB DW3000, et il est également équipé d’un microcontrôleur ESP32 programmable avec l’IDE Arduino, ainsi que d’un écran OLED. Le fabricant affirme que cette carte UWB résout les conflits mutuels entre plusieurs ancres et balises et prend en charge jusqu’à 8 ancres et 64 balises. De plus, le fabricant a ajouté un microcontrôleur STM32 pour gérer le multiplexage UWB, permettant aux utilisateurs de contrôler le module UWB principal en envoyant simplement des commandes AT d’un microcontrôleur ESP32 au microcontrôleur STM32. Plus d’informations sur cette carte UWB sont disponibles sur le site Web du fabricant.

Déballage de «MaUWB_DW3000 avec commande AT STM32»

MakerFabs m’a envoyé le colis depuis la Chine. À l’intérieur du colis, il y avait 4 ensembles de MaUWB_DW3000 avec commande STM32 AT. Chaque ensemble contient le module, une batterie 3,7 V 600 mAh et 2 connecteurs mâles à 12 broches de 2,54 mm. De plus, il y avait 4 batteries supplémentaires et un ST-LINK V2 pour télécharger le firmware sur le microcontrôleur STM32.

Test MaUWB DW3000 avec STM32 AT Command Utilisation dArduino pour
Les composants reçus.
Carte Arduino DW3000 UWB programmable avec batterie et connecteurs
Les composants dans un emballage scellé.
1713278009 605 Test MaUWB DW3000 avec STM32 AT Command Utilisation dArduino pour
La face supérieure du PCB.
ESP32 AT UWB Pro avec affichage v1.1
La face inférieure du PCB.

Le PCB principal a un masque de soudure rouge. Sur la face supérieure, les composants principaux incluent le module ESP32-WROVER-B et un écran OLED 128×64. Près du connecteur USB Type-C se trouvent les boutons RST et FLASH. Une batterie externe peut être connectée à cette carte à l’aide d’un connecteur JST. Il y a douze trous de 2,54 mm pour souder des broches mâles droites le long du côté de la carte. À chaque coin se trouve un trou M3 pour l’installation des entretoises de colonne de support. Le module MaUWB-DW3000 est soudé sur la face inférieure de la carte avec le texte sérigraphié « ESP32 AT UWB Pro with Display v1.1 ».

Test pour la première fois

J’ai commencé mon test en connectant le module à un ordinateur à l’aide d’un câble USB Type-C, et j’ai constaté que l’appareil démarrait instantanément. La LED verte LD9 sur la face supérieure du PCB est restée fixe, indiquant que l’appareil était alimenté via le port USB. Ensuite, j’ai testé l’alimentation de l’appareil à l’aide de la batterie 3,7 V 600 mAh fournie. Pendant la charge, la LED LD8 (rouge) est restée fixe et s’est éteinte une fois la charge terminée. La LED d’alimentation, étiquetée PWR LED, est installée sur la face inférieure de la carte. De plus, des LED rouges et bleues clignotent lorsqu’il y a une communication avec le module UWB.

Carte MaUWB DW3000 STM32 UWB avec firmware Arduino par défaut
Alimentation de la carte à l’aide d’un câble USB Type-C.

J’ai ensuite ouvert un moniteur série pour observer les données sorties par le firmware par défaut. Lors du démarrage, l’appareil a signalé les versions du micrologiciel matériel et logiciel, ainsi que les paramètres de configuration tels que l’ID de l’appareil et la fréquence de rafraîchissement. Comme le montre le résultat suivant, ce module a été configuré comme une balise où son ID a été défini sur « 0 ». Le AT+SETCAP La commande définit le taux de rafraîchissement à 15 Hz.

1

2

3

4

5

6

7

8

9

dix

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

12:57:35.327 -> Bonjour ! Commande ESP32-S3 AT V1.0 TestAT ?

12:57:40.332 -> OK

12:57:40.332 ->

12:57:40.332 -> AT+RESTAURER

12:57:45.393 -> OK

12:57:45.393 -> Flash maître/esclave normal

12:57:45.393 -> ReadCheck MasterCheck��51F44581 SlaverCheck51F44581

12:57:45.393 -> *******************Paramètre système******************

12:57:45.393 -> Compilation du module UWB : 15:25:17 23 février 2024

12:57:45.393 -> Logiciel du module UWB : v01_00_008

12:57:45.393 -> Matériel du module UWB : v01_03_000

12:57:45.393 -> Indicateur du module UWB : AAAA

12:57:45.393 -> Démarrage du module UWB : 1

12:57:45.393 -> Module UWB Error_Bit1:0, Error_Bit2:0, Error_Bit3:0, Error_Bit4:0, Error_Bit5:0

12:57:45.393 -> Rôle du module UWB : Aucun, Id : -1, Débit : 6,8 M, Filtre : 1, AntTx : 16336, AutoRpt : 1, PA : 1

12:57:45.393 -> ******************************************* ***********

12:57:45.393 ->

12:57:45.393 -> portGetTickCnt :1418, échelle :0.850, rtcCount1706

12:57:45.393 ->

12:57:45.393 -> AT+SETCFG=0,0,0,1

12:57:47.370 -> OK

12:57:47.370 ->

12:57:47.370 -> AT+SETCAP=10,15

12:57:49.393 -> OK

12:57:49.393 ->

12:57:49.393 -> AT+SETRPT=1

12:57:51.380 -> OK

12:57:51.380 ->

12:57:51.380 -> AT+ENREGISTRER

12:57:53.391 -> OK

12:57:53.391 ->

12:57:53.391 -> AT+RESTART

12:57:55.427 -> OK

Contrôler le module UWB à l’aide des commandes AT

Nous pouvons contrôler le module UWB en envoyant des commandes AT au module via un port série. Selon l’AT Command Manual version 1.0.7, le module prend actuellement en charge 15 commandes, qui peuvent être classées comme suit :

  • Test du port série
  • Obtenir la version du module
  • Redémarrez le module
  • Obtenir/définir la configuration
  • Obtenir/définir les paramètres de base du module
  • Obtenir/définir le délai d’antenne du module
  • Obtenir/définir la capacité/taux de rafraîchissement
  • Activer/désactiver le rapport de données de distance
  • Réglez l’appareil tag le temps de sommeil

L’une des commandes que j’utilisais fréquemment était AT+SETCFG, qui configure le rôle de l’appareil en tant qu’ancre ou balise. La syntaxe de la commande est AT+SETCFG=x1,x2,x3,x4où:

  • x1: ID de l’appareil (ancre : 0 – 7, balise : 0-63),
  • x2: rôle de l’appareil (balise : 0, ancre : 1),
  • x3: taux de communication (850K : 0, 6,8M : 1), et
  • x4: filtrage de plage (désactivé : 0, activé : 1)

Préparation de l’environnement Arduino

Les instructions d’installation des bibliothèques Arduino requises et des exemples pour la carte UWB sont disponibles sur le Wiki et GitHub et sont faciles à suivre. Bien que les versions suggérées de l’IDE Arduino soient 1.8.10/1.8.19, je n’ai rencontré aucun problème avec la version 2.2.1. J’ai configuré mon environnement de programmation en clonant les codes sources de GitHub et j’ai utilisé la carte ESP32 version 2.0.3, déjà installée sur mon ordinateur. De plus, j’ai modifié l’emplacement par défaut du carnet de croquis de l’IDE Arduino vers un autre emplacement pour déterminer quelles bibliothèques supplémentaires seraient nécessaires. J’ai découvert qu’il me suffisait d’installer la dernière version de la bibliothèque Adafruit SSD1306 et de ses dépendances, qui incluent la bibliothèque Adafruit GFX et Adafruit BusIO. Aucune autre bibliothèque supplémentaire n’était requise. Enfin, j’ai sélectionné la carte cible comme module de développement ESP32, comme suggéré sur le site Web.

Carte DW3000 UWB - Installation de la bibliothèque requise dans l'IDE Arduino.
Installation de la bibliothèque requise dans l’IDE Arduino.

Test Arduino UWB 1 : test d’une balise + d’une ancre

J’ai commencé à programmer le module en mode une balise + une ancre. Ce mode nécessite qu’un appareil s’exécute en tant qu’ancre et qu’un autre appareil s’exécute en tant que balise. Pour le module tag, j’ai simplement ouvert le fichier source Arduino examples/esp32_at_t0/esp32_at_t0.ino. Sans apporter aucune modification, j’ai sélectionné le port COM cible et appuyé sur le bouton Télécharger, et le module de balises a fonctionné sans aucun problème. De même, pour le module d’ancrage, j’ai utilisé le fichier source de examples/esp32_at_a0/esp32_at_a0.ino et je l’ai téléchargé sur le périphérique cible sans aucun problème. Les paramètres par défaut définissent l’ID du module d’ancrage sur A0 et l’ID du module de balise sur T0.

Après avoir ouvert le moniteur série, j’ai observé que les deux appareils affichent le même message, comme le montre la figure suivante. L’étiquette T0 était à gauche et l’ancre A0 était à droite. Ces messages étaient le résultat du AT+RANGE commande. Dans chaque ligne, le tid Le paramètre indique l’ID de la balise, tandis que le paramètre range représente les distances (en centimètres) entre la balise et les ancres à proximité. Le rssi Le paramètre indique les valeurs de force du signal (en dBm) de la balise aux ancres. Ces valeurs sont stockées sous forme de liste, classées par ID de l’ancre. Nous pouvons activer et désactiver ces rapports en envoyant AT+SETRPT=1 et AT+SETRPT=0respectivement.

Ancre UWB et sortie de message de balise à l'aide du micrologiciel Arduino par défaut.
Message émis par le firmware par défaut.

Test Arduino UWB 2 : test multi-étiquettes + multi-ancres

Travailler en mode une ancre + une balise nous fournit les distances et la force du signal entre un nœud de balise et les ancres environnantes. Cependant, nous ne sommes pas limités à utiliser une seule balise. Nous pouvons ajouter plus de balises et d’ancres en modifiant les exemples de codes mentionnés ci-dessus afin que tous les appareils aient des identifiants uniques. Pour définir l’ID d’une ancre, nous pouvons modifier le esp32_at_a0.ino à la ligne 57. Le code original, sendData(“AT+SETCFG=0,1,0,1”, 2000, 1);envoie la commande AT pour configurer l’appareil comme ancre avec ID = 0. Pour changer l’ID en 1, j’ai simplement remplacé le premier 0 de la commande par 1, ce qui donne sendData(“AT+SETCFG=1,1,0,1”, 2000, 1);. Pour la balise, j’ai configuré l’ID de la balise en modifiant le UWB_INDEX dans le esp32_at_t0.ino fichier source de 0 à 1 comme indiqué ci-dessous.

Changer l'ID de l'appareil dans l'IDE Arduino
Modification de l’ID de l’appareil.

Si nous avons trois ancres ou plus, nous pouvons calculer la position de la balise en utilisant les distances signalées entre la balise et chacune des ancres. Pour ce faire, vous pouvez suivre l’exemple de développement du positionnement UWB avec Python dans le WiKi. En bref, vous aurez besoin d’une balise et de quatre ancres. Vous devrez peut-être utiliser le croquis Arduino get_range.ino pour configurer l’ancre A0 UWB afin de collecter les distances, de formater et de sortir les données via le port série. Veuillez noter que lors de cet test, le lien vers get_range.ino dans le WiKi pointe vers le mauvais fichier. Ensuite, position.exe ou position.py lira les distances et calculera la position 2D de la balise. J’ai vérifié le script Python et découvert que la fonction three_point suivante est au cœur du calcul. Cette fonction reçoit les positions de deux ancres et les distances aux ancres comme paramètres et renvoie la position estimée de la balise par rapport à ces deux ancres. Ainsi, en utilisant toutes les paires d’ancres, la position finale de la balise est obtenue en faisant la moyenne de toutes les positions estimées. Plus de détails sur les tests de position seront expliqués dans la section suivante.

def three_point(self, x1, y1, x2, y2, r1, r2) :

temp_x = 0,0

temp_y = 0,0

p2p = (x1 – x2)*(x1 – x2) + (y1 – y2)*(y1 – y2)

p2p = math.sqrt(p2p)

si r1 + r2 <= p2p :

temp_x = x1 + (x2 – x1) * r1 / (r1 + r2)

temp_y = y1 + (y2 – y1) * r1 / (r1 + r2)

autre:

dr = p2p / 2 + (r1 * r1 – r2 * r2) / (2 * p2p)

temp_x = x1 + (x2 – x1) * dr/p2p

temp_y = y1 + (y2 – y1) * dr/p2p

retourner temp_x, temp_y

Test de portée UWB

Essai en intérieur

J’ai effectué des tests en salle au rez-de-chaussée de la Faculté d’informatique et de technologie de l’information (CSIT), Université Rambhai Barni Rajabhat, comme le montre la figure suivante. Chaque bloc a des dimensions de 4 x 8 m, certaines pièces pouvant s’étendre sur un ou deux blocs. Les textes au-dessus de chaque pièce indiquent le nom de la pièce. Les murs, d’environ 10 cm d’épaisseur, sont représentés par des lignes noires continues, tandis que les lignes bleues pointillées représentent des murs plus fins constitués de cadres en aluminium et de verre transparent. Dans ce test, j’ai placé l’ancre A0 dans le coin inférieur droit de la salle de réunion, marquée par un point rouge. Ensuite, j’ai déplacé la balise T0 vers différentes positions comme illustré par les points jaunes. Les étiquettes bleues et rouges près des points jaunes représentent respectivement la distance signalée en cm et la force du signal en dBm. La distance totale entre A0 et le mur le plus éloigné (le mur gauche de la salle ST) est d’environ 44 m.

Test de télémétrie en salle au bâtiment CSIT.
Test de télémétrie en salle au bâtiment CSIT.

A l’intérieur de la salle de réunion où est placé A0, je pourrais facilement recevoir les valeurs rapportées quelle que soit l’orientation de la balise. En passant aux salles G1 et G2, j’ai quand même reçu le signal sans aucune difficulté. Cependant, en entrant dans la salle D1, même si je pouvais encore capter le signal de A0, la force du signal est tombée à environ -90 dBm. J’ai dû ajuster soigneusement l’orientation du tag pour maintenir la communication avec A0. Les positions les plus éloignées où j’ai pu recevoir des données de mesure se trouvaient à environ 20 m de A0, comme l’indiquent les deux points dans la salle CSIT Office-1. Ici, le RSSI est tombé jusqu’à -121,70 dBm, avec des fluctuations occasionnelles jusqu’à -90,52 dBm.

Les positions les plus éloignées où j’ai pu recevoir les données de mesure se trouvaient à environ 20 m de A0, comme l’indiquent les deux points sur le mur droit de la salle CSIT Office-1. Dans ce cas, il était extrêmement difficile de capter le signal de l’ancre et l’orientation de la balise devait être ajustée très soigneusement. La seule valeur RSSI signalée ici était de -121,70 dBm. Il n’a pas été possible d’obtenir la distance indiquée dans les autres coins de cette pièce ou à d’autres positions, peu importe ce que j’ai essayé.

Essai en extérieur

La figure suivante illustre les tests en extérieur devant le bâtiment de la CSIT. L’ancre A0 était positionnée au marqueur A, à l’extrémité droite de la ligne jaune. Les marqueurs P0 à P4 représentent les positions où j’ai vérifié la force du signal. À P0, ou à des positions proches où la distance jusqu’à A0 était d’environ 20 m, la force du signal était d’environ -81,93 dBm. Je pouvais facilement recevoir les valeurs rapportées et je n’avais pas besoin de prêter beaucoup d’attention à l’ajustement de l’orientation de la balise. Cependant, à mesure que je me rapprochais de P1, soit entre 30 et 50 m du point d’ancrage, la communication devenait plus difficile et j’ai dû ajuster soigneusement l’orientation de la balise. Le RSSI est tombé entre -87,92 dBm et -90,52 dBm. En passant plus loin vers P2 et P3, qui se trouvaient à environ 80 m de A0, la communication entre les deux appareils est devenue extrêmement difficile et l’appareil mettait rarement à jour les données. Le RSSI signalé ici était aussi bas que -121,70 dBm. Au-delà de P4, je n’ai pu recevoir aucun rapport de l’appareil.

Test de télémétrie en extérieur au bâtiment de la CSIT.
Test de télémétrie en extérieur au bâtiment de la CSIT.

J’ai également effectué un autre test en extérieur sur Sukhumvit Road, en face de l’université, où la topographie de la zone est constituée de plaines vallonnées. La ligne jaune représente la distance totale sur laquelle j’ai initialement décidé de faire les mesures. J’ai placé l’ancre A0 en position A et j’ai obtenu des résultats similaires au test extérieur précédent. A la position P0, qui se trouvait à environ 50 m du mouillage, les appareils ont pu communiquer, mais c’était assez difficile. La position la plus éloignée d’où je pouvais recevoir des valeurs était à P1, soit à environ 100 m de l’ancre.

Test de télémétrie en extérieur sur Sukhumvit Road.
Test de télémétrie en extérieur sur Sukhumvit Road.

Veuillez noter que tous les tests de portée effectués ci-dessus ont été réalisés dans un environnement non contrôlé et en utilisant des configurations par défaut. Les performances de la télémétrie doivent être soigneusement testées dans des environnements contrôlés et non contrôlés. De plus, toutes les configurations pouvant affecter les portées de communication doivent être prises en compte.

Erreur de plage de réduction

Erreur de vérification de la plage.
Erreur de vérification de la plage.

J’ai remarqué des variations significatives dans les distances signalées entre T0 et chacune des ancres, malgré leur placement très rapproché. La figure ci-dessous illustre les décalages des mesures de chacune des ancres. Les lignes rouges, vertes et bleues représentent respectivement les données des ancres A0, A1 et A2. J’ai positionné les trois ancres sur un trépied aussi près que possible, puis j’ai éloigné T0 des ancres. J’ai constamment constaté des écarts entre les distances signalées et les valeurs réelles. Par exemple, lorsque la balise était positionnée à 200 cm de l’ancre, la distance signalée pourrait être de 240 cm. Bien que les ancres ne soient pas séparées de plus de 5 cm, certaines des distances signalées différaient de 10 à 30 cm les unes des autres.

Étant donné que ces erreurs ont un impact sur la précision de la position estimée de l’étiquette, j’ai effectué un test pour examiner la relation entre les valeurs rapportées et les valeurs réelles. Dans ce test, j’ai placé l’étiquette T0 à 11 distances différentes de l’ancre A0, les distances de test étant de {50, 100, 200, 300, 400, 500, 1 000, 1 500, 2 000, 2 500 et 3 000} cm. Il est important de noter que ces valeurs de référence ont été mesurées manuellement à l’aide d’un ruban à mesurer et que la marge d’erreur dans mes mesures est d’environ ± 10 cm.

J’ai positionné T0 à chaque distance et enregistré les valeurs rapportées pendant environ 3 minutes. Ensuite, j’ai tracé un graphique pour examiner la relation entre les valeurs et j’ai découvert que la relation semblait très linéaire. Par conséquent, j’ai appliqué la technique des moindres carrés pour déterminer les équations des droites qui correspondent le mieux aux données, comme le montre la figure suivante. Les lignes rouges, vertes et bleues représentent les lignes qui correspondent le mieux aux données observées par les ancres A0, A1 et A2, respectivement. La ligne magenta représente la relation entre la valeur réelle. Les coefficients calculés (m, b) pour A0, A1 et A2 étaient les suivants.

m_a0, b_a0 = [1.008906,-61.244514]

m_a1, b_a1 = [1.005860,-50.318821]

m_a2, b_a2 = [1.000626,-53.335105]

UWB - Recherche de relations entre les valeurs rapportées et les valeurs réelles.
Trouver des relations entre les valeurs rapportées et les valeurs réelles.

Les boîtes à moustaches suivantes représentent les distances enregistrées par chaque ancre. On peut observer que lorsque la balise et l’ancre étaient très proches, l’erreur dans la mesure de la distance était plus élevée que lorsqu’elles étaient distantes de 5 mètres ou plus.

UWB - Données de distance signalées par A0 à différentes distances.
Données de distance rapportées par A0 à différentes distances.
UWB - Données de distance signalées par A1 à différentes distances.
Données de distance rapportées par A1 à différentes distances.
Données de distance rapportées par A2 à différentes distances.
Données de distance rapportées par A2 à différentes distances.

Test de positionnement

La vidéo suivante décrit mes tests de positionnement 2D en temps réel. Les positions de A0, A1 et A2 étaient représentées respectivement par les points rouges, verts et bleus. Le tag T0 a été déplacé parmi les positions des ancres. Le cercle blanc creux représentait la position estimée de la balise obtenue à l’aide du three_point fonction décrite précédemment. Le cercle jaune plein représentait la position obtenue en ajustant les distances de mesure brutes avec les coefficients que j’ai indiqués ci-dessus, puis en utilisant ces valeurs ajustées ainsi que les positions connues des ancres pour estimer la position de l’étiquette à l’aide d’une technique des moindres carrés. Le cercle magenta plein a également été obtenu par la technique des moindres carrés, mais en utilisant les valeurs de mesure brutes au lieu des valeurs ajustées. Même s’il y a eu un certain retard dans le tracé, les résultats globaux ont été très satisfaisants. (Veuillez noter que la distance superposée sur la ligne reliant chaque paire d’ancres dans cette vidéo était en unités de pixels, tandis que dans les vidéos suivantes, les unités étaient en centimètres).

YouTube video



J’ai implémenté la fonction suivante pour estimer la position de la balise en utilisant la méthode des moindres carrés. Cette approche est basée sur un article de Mathias Pelka et un article de Han et Poulose, ainsi que sur le code source fourni par James Remington sur GitHub.

1

2

3

4

5

6

7

8

9

dix

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

def cal_tag_position_leastsquares(ancre1, ancre2, ancre3, d1, d2, d3) :

x1 = ancre1[0]

y1 = ancre1[1]

x2 = ancre2[0]

y2 = ancre2[1]

x3 = ancre3[0]

y3 = ancre3[1]

A = numpy.asarray([

    [2*(x2-x1), 2*(y2-y1)],

[2*(x3-x1), 2*(y3-y1)],

])

# au carré

x1_sq = x1**2

y1_sq = y1**2

x2_sq = x2**2

y2_sq = y2**2

x3_sq = x3**2

y3_sq = y3**2

d1_sq = d1**2

d2_sq = d2**2

d3_sq = d3**2

b = numpy.asarray([

    [d1_sq – d2_sq + x2_sq + y2_sq – x1_sq – y1_sq],

[d1_sq – d3_sq + x3_sq + y3_sq – x1_sq – y1_sq],

])

essayer:

p, _, _, _ = numpy.linalg.lstsq(A, b, rcond=Aucun)

sauf numpy.linalg.LinAlgError :

p = Aucun

retour p

Évaluation de la précision

Environnement vide

Comme je n’avais pas assez de temps et d’instruments précis pour effectuer des mesures précises, j’ai décidé de tester la précision des positions estimées de l’étiquette en comparant le décalage de chaque donnée rapportée par rapport à leur valeur moyenne. J’ai donc positionné les ancres A0, A1 et A2 comme indiqué par les cercles rouges, verts et bleus dans la figure suivante. Les coordonnées des ancres ont été mesurées manuellement à l’aide d’un ruban à mesurer, avec une marge d’erreur d’environ ± 10 cm. Les positions du cercle blanc creux, du cercle jaune plein et du cercle magenta plein ont été calculées comme mentionné précédemment. Ensuite, les positions et les valeurs RSSI correspondantes ont été enregistrées pendant environ 3 minutes. Les données suivantes montrent les résultats de l’enregistrement. On voit clairement que les valeurs de distance varient très peu, soit de l’ordre de 1 à 2 cm.

1

2

3

4

5

6

7

8

9

dix

11

12

13

14

15

16

17

D0, D1, D2, RSSI0, RSSI1, RSSI2

409 362 381,-83,77,-82,89,-79,51

408 362 382,-80,95,-82,38,-79,31

408 363 383,-80,76,-82,89,-79,31

408 362 383,-80,97,-82,11,-81,35

408 363 383,-81.32,-82.38,-81.13

407 362 382,-81,55,-82,11,-79,51

407 362 382,-79,51,-82,38,-81,35

407 363 383,-81,32,-82,52,-79,51

407 362 384,-81.13,-83.29,-79.24

407 363 383,-81,32,-82,71,-79,51

407 363 383,-81.13,-82.71,-81.35

406 363 382,-80,41,-83,29,-81,35

406 363 383,-81.13,-82.71,-81.35

406 363 383,-84,33,-82,71,-79,51

406 364 383,-80,41,-82,71,-79,51

Position estimée de la balise UWB.
Position estimée de la balise.

Erreur de position UWB 2D dans un environnement vide.
Erreur de position 2D dans un environnement vide.

Ensuite, j’ai calculé les valeurs DRMS ​​(distance root moyenne carrée) et 2DRMS (deux fois la distance root moyenne carrée). La figure suivante représente l’erreur de position 2D par rapport à la valeur moyenne. Le DRMS ​​est représenté par un cercle rouge tandis que le 2DRMS est représenté par un cercle noir. Dans ce cas, le DRMS ​​de la position obtenue par les valeurs de distance brutes et celui des valeurs ajustées étaient respectivement de 1,20 cm et 1,04 cm. De plus, le 2DRMS de la position obtenue par les valeurs de distance brutes et celui des valeurs ajustées étaient respectivement de 2,41 cm et 2,08 cm. Je pense que c’était un résultat très précis. Cependant, ce test a été réalisé un jour férié, alors que toutes les classes étaient fermées et qu’il n’y avait personne à moins de 100 m, à part moi.

Test de jour ouvrable

Erreur de position UWB 2D dans une journée ouvrable.
Erreur de position 2D dans une journée de travail.

Après le test précédent, j’en ai effectué un autre où tous les appareils étaient à l’arrêt. Cependant, dans ce cas, je me suis déplacé de manière aléatoire sur la scène et j’ai enregistré les données pendant environ 1 minute et demie. Le DRMS ​​de la position obtenue par les valeurs de distance brutes et celui des valeurs ajustées étaient respectivement de 2,65 cm et 2,31 cm. De plus, le 2DRMS de la position obtenue par les valeurs de distance brutes et celui des valeurs ajustées étaient respectivement de 5,31 cm et 4,62 cm. Cette fois, l’erreur de position 2D a augmenté, comme le montre la figure suivante.

Comment l’objet affecte les valeurs mesurées

Les résultats du test précédent indiquaient que mes mouvements influençaient l’erreur de position globale. J’ai également remarqué que lorsque je déplaçais ma main ou mon corps entre l’étiquette et l’ancre, les distances signalées variaient. J’ai donc répété le test un jour de travail dans une pièce de 8 mx 8 m, en positionnant les appareils comme illustré dans la figure suivante. Les données ont été enregistrées pendant environ 2 minutes et l’erreur globale est restée constante, autour de 2 à 3 cm, similaire aux tests effectués pendant les vacances.

Positions des appareils.
Positions des appareils.
Traçage en temps réel.
Traçage en temps réel.

Au cours de ce test, je suis entré dans la scène au hasard, essayant parfois d’obstruer la ligne de vue entre certaines paires de balises et d’ancres. Le DRMS ​​de la position obtenu à partir des valeurs de distance ajustées est passé de 2,34 cm lors du test précédent à environ 17,25 cm, soit environ 7 fois supérieur à celui du test précédent.

YouTube video



Les figures suivantes comparent les erreurs de position observées dans les deux tests.

Erreur de position alors que là je n'étais pas dans la scène.
Erreur de position alors que je n’étais pas sur place.
Erreur de position lorsque je marchais entre la ligne de mire de l'appareil.
Erreur de position lorsque je marchais entre la ligne de mire de l’appareil.

Longer les murs de la salle test

Mon dernier test pour cette test impliquait de déplacer T0 vers les coins des tables, comme illustré par les points magenta étiquetés P0 à P3 dans la vidéo suivante. Ensuite, j’ai déplacé T0 et j’ai longé les murs de la pièce. J’ai été très satisfait de ce résultat, surtout vers la fin de la vidéo où T0 se déplaçait le long des murs et la piste estimée sortait en lignes droites comme prévu.

YouTube video



Autres

Je n’ai trouvé aucun problème majeur lors de cet test, à l’exception de quelques mineurs. Par exemple, j’ai remarqué que certains composants CMS d’une de mes cartes n’étaient pas correctement soudés. Plus précisément, les LED D2 et D5, comme le montre l’image, étaient mal alignées. D2 n’était pas dans sa position correcte et est presque entré en contact avec des composants à proximité tels qu’une résistance et un condensateur.

Problème de soudure MaUWB DW3000 LED D2
De plus, tant le site Web que les pages GitHub d’un autre module UWB du fabricant, l’ESP32 UWB (Ultra Wideband), mentionnent qu’il utilise également le DW3000 UWB qui est interopérable avec la puce Apple U1 et potentiellement compatible avec l’écosystème Apple. Cependant, au cours de cet test, je n’ai pu trouver aucun exemple de code permettant de vérifier cette interopérabilité.

Si vous êtes intéressé, le fabricant fournit également la disposition du PCB et les diagrammes schématiques sur GitHub. J’ai pu les ouvrir à l’aide d’Autodesk Eagle 9.6.2, comme le montrent les figures suivantes.

Mauwb DW3000 St PCB matériel les deux couches couche inférieure de carte PCB matérielle Mauwb DW3000 ST Mauwb DW3000 ST Couches supérieures de carte PCB matérielle schémas matériels mauwb dw3000 st

Conclusions

Comme mentionné précédemment, tous mes tests ont été effectués à l’aide d’un ruban à mesurer générique et j’ai utilisé les configurations par défaut fournies dans les fichiers d’exemple. Cependant, il est important de noter que je n’ai mesuré que la précision, ce qui impliquait de trouver le décalage par rapport à l’écart moyen. Je n’ai pas effectué de tests pour mesurer la précision, ce qui impliquerait de déterminer la distance entre la position signalée et la position cible. Ce type de test nécessiterait plus de temps et de meilleurs instruments. Tout au long de cette test, j’ai pu réduire l’erreur de position en utilisant la méthode d’ajustement des moindres carrés linéaires. Alternativement, l’étalonnage du retard d’antenne à l’aide d’un équipement spécialisé pourrait également être effectué pour obtenir de meilleurs résultats. Une autre approche consisterait à utiliser la technique de recherche binaire pour trouver la valeur appropriée pour le retard d’antenne, comme décrit par James Remington sur son GitHub et également dans l’exemple de code du module ESP32 UWB (Ultra Wideband).

Je tiens à remercier MakerFabs de m’avoir fourni les appareils pour cette test. Ils se sont révélés très utiles tant pour mes projets d’enseignement que de recherche. À mon avis, ce module UWB est un excellent choix pour les développeurs ayant besoin d’une alternative au système de positionnement intérieur et extérieur. Il offre également une meilleure précision par rapport aux récepteurs GNSS génériques. Pour les personnes intéressées, le MaUWB_DW3000 avec STM32 AT Command peut être acheté pour 54,80 $ sur la boutique Markerfabs.

Retrouvez l’histoire de Raspberry Pi dans cette vidéo :

YouTube video

  • St Link V2 pour STM32 STM8 Ulegqin St-Link/V2(CN) Débogueur et Programmateur avec Câble USB et Câble de Connexion Compatible avec STM32 & STM8 pour STM8 Swim STM32 GTAG/SWD, USB 2.0 High-Spee0d
  • Vklopdsh 2 modules de sonde de programmation STM32 2,54 mm 5P STM32 Programmation STM8 Pogo Pin XH2.54 Câble femelle Test DIY Test 2,54 mm 5P