paint-brush
Construire un drone Raspberry Pi + ESP32 : mes premiers pas dans la robotiquepar@tohntobshi
10,379 lectures
10,379 lectures

Construire un drone Raspberry Pi + ESP32 : mes premiers pas dans la robotique

par Anton D2022/04/26
Read on Terminal Reader
Read this story w/o Javascript

Trop long; Pour lire

Anton a écrit sur ses premiers pas dans la robotique et notamment sur son drone Raspberry Pi + ESP32. Anton a conçu des pièces dans Blender puis les a imprimées en 3D sur une imprimante 3D bon marché. Le drone est contrôlé par une application, où les utilisateurs peuvent surveiller et surveiller le drone avec une application de type analogique. Anton a également réalisé une vidéo à ce sujet et l'a jointe à la fin de l'article à l'article.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Construire un drone Raspberry Pi + ESP32 : mes premiers pas dans la robotique
Anton D HackerNoon profile picture

Bonjour à tous! Je m'appelle Anton. Et je veux partager l'histoire de mes premiers pas dans la robotique et particulièrement sur mon drone Raspberry Pi + ESP32. (J'ai aussi fait une vidéo à ce sujet et je l'ai jointe à la fin de l'article)

Préface

Au début de l'histoire, je travaillais en tant que développeur Web (React, Typescript, etc.), j'avais des connaissances en C++, en ce qui concerne les compétences en électronique - je pouvais souder des fils de casque déchirés. Le problème était qu'en tant que développeur Web, j'ai commencé à me sentir insatisfait parce que ce que je fais n'affecte pas le monde physique de manière significative. Bien sûr, il existe de nombreux projets uniquement logiciels qui ont un impact sur le monde réel, mais j'ai décidé d'adopter l'approche la plus simple et de plonger dans la robotique.


J'ai donc lu des livres sur le sujet, regardé des vidéos sur youtube, lu des articles et acheté du matériel de soudure et une imprimante 3D, car les imprimantes 3D sont bon marché et disponibles de nos jours et peuvent m'épargner le mal de tête de fabriquer des pièces à partir de récipients alimentaires et bric-à-brac similaire.

Le premier robot

Mon premier robot était cette plate-forme chenille :


mon premier robot


J'ai conçu des pièces dans Blender, puis je les ai imprimées. J'ai utilisé Raspberry Pi comme cerveau et une banque d'alimentation comme alimentation. J'ai soudé le contrôleur de moteur à partir de relais et de transistors. Dans le processus de fabrication de cette chose, j'ai rencontré un problème, quand j'ai tout assemblé, les moteurs bougeaient à peine. Il s'est avéré que j'ai confondu le collecteur et l'émetteur des transistors, et après les avoir ressoudés, tout a commencé à fonctionner. Il est difficile d'appeler cette chose un robot car il ne fait rien par lui-même et n'est contrôlé qu'à distance. Quoi qu'il en soit, je me sentais bien à l'idée de le faire, j'ai cru en moi et j'ai décidé de faire la même chose mais en volant.

Le deuxième robot

Après quelques recherches, j'ai décidé d'utiliser des pièces de quadrirotor conventionnelles telles que des moteurs sans balais, des contrôleurs de vitesse électroniques et une batterie lipo capable de fournir un courant élevé aux moteurs. En tant que cerveau, j'utilisais toujours le même Raspberry Pi. Après avoir découvert comment interfacer Raspberry Pi avec des ESC, j'ai commencé à concevoir un cadre pour contenir toutes les pièces. Je faisais cela en me basant uniquement sur l'intuition dans l'espoir que les exigences pour un cadre ne soient pas très strictes car j'ai vu des drones de formes si étranges qui étaient encore capables de voler.


J'ai également acheté une carte intégrant un gyroscope, un accéléromètre, un baromètre et un magnétomètre sur le bus i2c. Avant même d'avoir appris ce qu'est un contrôleur PID, ma première approche intuitive était similaire au fonctionnement de son composant P - il suffit d'augmenter ou de diminuer la vitesse du moteur proportionnellement à l'angle auquel le drone diverge du plan horizontal.


Au début, je pensais que ce ne serait pas une tâche très difficile, mais après toutes les tentatives infructueuses, je n'avais aucune idée de la bonne façon de procéder car il y a tellement de choses qui peuvent ne pas fonctionner correctement. Et contrairement à la création de quelque chose de logiciel uniquement, chaque exécution peut entraîner des dommages physiques et le prochain essai ne sera possible qu'après le remplacement des pièces endommagées. De plus, ce n'est pas si simple de tester ce truc dans un petit appartement en location. Si j'avais eu un grand garage, un hangar ou quelque chose comme ça, j'aurais pu faire une construction qui limiterait le mouvement du drone.


le mouvement vertical est limité par les lacets


Au lieu de cela, j'ai dû improviser et utiliser des lacets et mes propres mains, ce qui a parfois entraîné des blessures mineures mais désagréables.


À un moment donné, j'ai pensé qu'il n'était pas pratique de contrôler le drone avec une souris et un clavier et j'ai décidé de créer une application de contrôleur, où je peux modifier les paramètres, surveiller les lectures des capteurs et contrôler progressivement le drone avec une interface utilisateur de type analogique.


capture d'écran de l'application mobile

une autre capture d'écran


Au départ, pour une raison quelconque, je me suis concentré sur le contrôle de nivellement horizontal juste pour réaliser que je ne peux pas le tester en toute sécurité et que ce dont j'avais plus besoin, c'est le contrôle automatique de la hauteur. Ma première pensée a été d'utiliser les relevés du baromètre, mais ils n'étaient pas assez précis pour contrôler la hauteur à l'intérieur (ou peut-être que je les ai simplement utilisés de la mauvaise manière), alors j'ai acheté un capteur à ultrasons dans un magasin de composants électroniques local. En fait, il avait une interface étrange qui faisait tourner l'une des broches vers le haut pendant la mesure et il fallait compter le temps pour en déduire la distance. Lorsque le Raspberry Pi était relativement inactif, il fonctionnait bien, mais sous une charge de calcul, il manquait juste les horaires et les lectures étaient des ordures. J'ai donc dû ajouter un contrôleur AVR supplémentaire au projet uniquement pour mesurer ces délais et produire les résultats sous une forme numérique pratique sur l'interface SPI.


J'ai également acheté deux câbles de frein de vélo et des guides imprimés pour que le drone limite son mouvement de haut en bas afin que je puisse me concentrer sur le contrôle de la hauteur sans penser à contrôler d'autres degrés de liberté.

le mouvement horizontal est limité par le câble de frein


Et cela a un peu fonctionné sauf dans le cas où les hélices fonctionnaient, créant des turbulences qui interféraient avec les lectures des capteurs à ultrasons à des hauteurs supérieures à 40 cm. Quand je l'ai finalement découvert, j'ai dû remplacer le capteur à ultrasons par un laser.


À ce stade, j'avais déjà un contrôle de la hauteur, mais je ne pouvais toujours pas obtenir un nivellement horizontal stable, même si j'avais implémenté un contrôle PID pour cela. J'ai deviné plusieurs raisons à cela et je ne sais pas laquelle d'entre elles a le plus contribué au problème. Mais les voici :


  • Pour le premier et probablement le plus important, j'ai utilisé des hélices bon marché (et j'ai même essayé de les imprimer) et j'ai négligé la nécessité de les équilibrer, ce qui surcharge les capteurs IMU de bruit, ce qui réduit leur précision. Lorsque j'ai finalement décidé de résoudre ce problème, j'ai ajouté une fonctionnalité à mon application pour prendre les 100 dernières lectures de gyroscope et la plage de sortie entre la plus grande et la plus petite valeur. Plus la plage est grande lorsque l'hélice fonctionne, plus elle est déséquilibrée. J'ai collé au hasard du ruban adhésif sur les pales des hélices, puis je les ai fait passer pour vérifier la valeur, si elle est augmentée - probablement un mauvais endroit pour y coller, si le bruit est diminué - je suis sur la bonne voie, alors j'ai essayé de coller plus ou plus près du centre et vérifiez à nouveau, donc de cette façon j'ai réduit le bruit sur chaque hélice.
  • Le deuxième problème possible est que Raspberry Pi n'a que deux canaux PWM, mais il y a quatre ESC contrôlés avec lui, et le logiciel PWM peut ne pas être assez précis et gaspiller également des cycles CPU. J'ai donc décidé d'utiliser ESP32 pour cette tâche car ils sont bon marché, facilement disponibles et disposent de nombreuses interfaces qui manquent à Raspberry Pi. J'ai commencé par contrôler les ESC via ESP32 connecté à Raspberry Pi via SPI et j'ai fini par déplacer toute la logique du contrôleur de vol vers ESP32.
  • Le troisième numéro n'était probablement pas un cadre assez rigide, que j'ai redessiné et imprimé plusieurs fois.
  • Un autre problème concerne les coefficients sous-optimaux pour le filtre complémentaire que j'ai utilisé pour estimer l'angle d'inclinaison. L'optimum est de 0,999 pour l'angle estimé par les lectures du gyroscope intégré et de 0,001 pour l'angle mesuré par l'accéléromètre.
  • Je n'ai pas considéré que le tangage se transforme en roulis et vice versa si le drone incliné tourne autour de son axe z local.
  • Des oscillations très lentes de l'angle d'inclinaison peuvent être corrigées en augmentant plusieurs fois le coefficient P au lieu de le diminuer comme le suggèrent certaines sources.



Quelque part dans le processus de développement, j'ai été frustré par le nombre de fils entre les modules et la façon dont ils étaient placés. J'ai donc décidé d'investir du temps dans la fabrication de PCB personnalisés. J'y ai pensé pendant longtemps mais j'ai été découragé par la nécessité d'acheter des outils coûteux et de traiter avec des produits chimiques.


En fait, cela s'est avéré plus facile que je ne le pensais, j'ai regardé quelques tutoriels sur KiCAD pour créer le design de mon PCB. J'ai acheté une imprimante laser d'occasion pour 40$, j'ai aussi acheté un fer ordinaire sans trous pour 5$, et l'outil le plus cher était une perceuse pour 75$. Les produits chimiques se sont avérés moins dangereux, ils ne dissoudront pas votre peau si vous les touchez.


conception dans KiCAD

après gravure et application du masque de soudure


J'ai donc fait ce PCB à la quatrième tentative. Le plus difficile était en fait d'appliquer le masque de soudure. Ce que fait ce PCB, c'est qu'il interconnecte des capteurs, ESP32 et Raspberry Pi et fournit une tension appropriée à différentes parties.


Les graphiques fantaisistes qui montrent les lectures actuelles des capteurs dans l'application se sont avérés difficiles à analyser tout en essayant d'empêcher le drone de s'écraser. J'ai donc ajouté la possibilité d'enregistrer les données du capteur et j'ai écrit un script python pour l'analyser image par image avec l'enregistrement vidéo du vol.

script d'analyseur de vol


Si j'avais fait cela plus tôt, j'aurais passé beaucoup moins de temps à enquêter sur les problèmes causés par le capteur à ultrasons défectueux que j'ai mentionné précédemment.


À un moment donné, j'ai obtenu un contrôle relativement stable de la hauteur, de la direction et du nivellement horizontal, mais je n'ai toujours pas pu éviter la dérive horizontale. Et si quelqu'un sait qu'il est possible de se débarrasser de la dérive horizontale en utilisant uniquement des capteurs IMU, veuillez me le faire savoir dans les commentaires.


J'ai fait quelques recherches et j'ai découvert que certains drones utilisent le GPS pour le maintien de position et j'ai essayé de mettre en œuvre la même technique. Mais le problème est que cela ne fonctionne qu'à l'extérieur, mais même à l'extérieur, je n'ai pas pu obtenir de résultats satisfaisants. Le temps était terrible cette saison-là avec du vent, de la pluie et de la neige, donc je n'ai pas fait beaucoup de tentatives, j'ai renfloué avec le GPS et j'ai essayé une approche de vision par ordinateur.


esquisse d'un script qui suit la marque bleue


J'ai placé une caméra au bas du drone et j'ai essayé de maintenir cette marque bleue sur le sol à l'aide de la bibliothèque OpenCV. Après plusieurs tentatives et ajustements, voici le résultat :


https://www.youtube.com/watch?v=poqQmvoBlP8

Maintenant, il peut planer à un moment donné sans contrôle manuel et sans aucune corde. C'était mon objectif intermédiaire que j'ai finalement atteint, j'ai donc décidé de documenter et de partager mes progrès.



J'ai également ajouté le transfert d'un flux vidéo du drone vers l'application, donc maintenant je peux expérimenter la vision par ordinateur pour essayer différentes approches pour faire tenir la position générale sans marques spéciales sur le sol et pour faire d'autres fonctionnalités.




Dans la configuration actuelle, le drone est fait comme ceci : ESP32 est responsable du contrôle de la hauteur, de la direction et du nivellement. Il prend les données des capteurs IMU et d'un capteur de distance laser en bas. Il donne des commandes aux contrôleurs de moteur et prend également des commandes de raspberry pi, qui est lui-même responsable de la communication avec l'application et du contrôle de position à l'aide des données de la caméra.


Si quelqu'un est intéressé à voir le code

Partie ESP32

Partie Raspberry Pi

Application Android cliente


Le code n'est pas très propre, car j'ai fréquemment changé d'implémentation en essayant de le faire fonctionner correctement. Je vais peut-être le nettoyer à l'avenir :)


D'ailleurs, j'ai fait une vidéo à ce sujet :

https://www.youtube.com/watch?v=3mAFEW0YOJ0


Merci de votre attention! Acclamations!