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)
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.
Mon premier robot était cette plate-forme chenille :
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.
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.
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.
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é.
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 :
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.
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.
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.
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
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!