Présentation du projet
Ce projet, aussi appelé ‘projet balise’, ‘projet tourelle’ ou ‘projet 66’, est un projet compagnon de celui concernant le développement du robot pour la Coupe de France Robotique Eurobot.
En effet, chaque année Télécom Bretagne participe à cette compétition qui consiste à faire effectuer différentes opérations par deux robots autonomes. Une des difficultés principales est la détection des robots adverses: une collision entre deux robots entraîne la disqualification de l’équipe responsable. Ainsi, notre projet consiste en la réalisation d’un module permettant la détection à moyenne distance de balises mobiles posées sur les robots présents sur l’aire de jeu.
Le rapport technique du projet est disponible ici.
Dans la solution que nous avons adoptée, un capteur optique (SICK WL-100 P3409) tourne à 360° sur un axe vertical et détecte un certain nombre (entre 3 et 6) de balises réfléchissantes posées à une hauteur connue sur les autres robots présents sur l’aire de jeu. Le signal est traité par un microcontrôleur (Arduino Mini) afin d’en extraire la position des balises détectées, en coordonnées polaires.
Caractéristiques techniques
- Taille : 80x80x80mm
- Masse : +/- 200g
- Masse supportée : > 500g
- Alimentation : 12V (< 150mA) et 5V (< 20mA) plus masse
- Connectique : série (deux fils: TX et RX)
Protocole de communication
La communication se fait en UART, les messages se composent donc d’un bit de start toujours à 0, des 8 bits de données, et d’un bit de stop à 1, avec un niveau logique de repos à 1. Nous n’utilisons pas de bit de parité.
Ce schéma illustre le protocole de lecture des informations en réceptions.
La tourelle envoie à chaque objet détecté un message composé d’un drapeau d’ouverture, un octet contenant la distance, puis deux octets contenants l’angle, et un drapeau de fermeture.
Lorsqu’elle achève son tour, elle envoie un simple drapeau afin d’indiquer qu’elle a terminé une rotation.
Électronique
Utilisation du code Arduino
Pré-requis
Logiciel Arduino : https://www.arduino.cc/en/Main/Software
Le firmware de l’Arduino est disponible ici.
Ouvrir le fichier code.ino dans l’éditeur.
Téléversement sur la Arduino mini
Connexions :
TX (blanc) ↔ USB RX (jaune)
RX (gris) ↔ USB TX (orange)
Ne pas oublier la masse (noir des deux côtés)
On peut aussi utiliser l’alim +5V donnée par l’usb (rouge de chaque côté)
Attention, il y a une manipulation manuelle particulière pour flasher la Arduino mini car le reset (vert) n’est pas connectable sur la carte V1.
Pour que le téléversement réussisse, il est nécessaire que la Arduino Mini soit en état Reset au début du téléversement (en non au début de la compilation).
Démarche conseillée pour le téléversement :
1. Compiler le code seul
1. bis. Corriger les erreurs si besoin
2. Presser 2 secondes puis relâcher le bouton Reset
3. Lancer immédiatement le téléversement. (plus rapide si la compilation est déjà faite)
Si cela ne fonctionne pas, recommencer plusieurs fois les étapes 2&3 jusqu’à avoir le bon timing.
Utilisation du code Processing
Documentation et logiciel : https://processing.org/
Le code est disponible ici.
Ouvrir le fichier VisualPoint.ide dans Processing
Les détails concernant le choix du port série sont en commentaire du code (pour Ubuntu 14.04).
Il suffit ensuite de lancer le logiciel à l’aide du bouton « Run ».
À noter : ce code a été conçu pour le protocole V1 : sans balise de reset.
Pour pouvoir l’utiliser, il est donc nécessaire de désactiver l’envoi des balises de reset dans le code arduino, faute de saturer le buffer avec les flags de reset et de faire cracher le programme.
Partie électronique
Schémas de la carte
Les fichiers Eagle sont disponibles ici.
Notice pour les connexions :
Les fils soudés ont été utilisé pour les connexions ne nécessitant pas de montage/démontage complexe, en l’occurrence pour les 2 liaisons avec le reste du robot.
Des connecteurs souples maisons ont été réalisés pour les connexions avec les éléments interne au système (compte-tour, moteur et capteur Sick), qui ne sont pas évident à mettre en place.
Fils soudés
Alimentation : Noir (masse) + Rouge (+5V) + Jaune (+12V)
Liaison série : Blanc (TX Arduino) + Gris (RX Arduino)
Connecteurs souples
Moteur : Violet + Gris (indifférent)
Compte-tour : Noir (masse) + Rouge (alim diode) + Blanc (Retour photodiode)
Capteur Sick : Noir (masse) + Rouge (+12V) + Blanc (signal)
Notes sur la carte :
Les liaisons sont inutilement fines ce qui complique les soudures sans présenter d’intérêt. Si une nouvelle version de la carte est réalisée, il serait préférable de les élargir.
Interface C++
Une API C++ a été développée pour utilisation avec un microcontrôleur de type STM32. Le code complet est disponible ici.
Il est compatible avec les STM32 h107 ou h405, et est présentement configuré pour fonctionner avec un baudrate de 9600, et pour utiliser les ports USART1 sur un H405 et l’USART2 sur un H107. Le code s’adapte automatiquement au processeur sur lequel il est déposé, et il suffit pour le reconfigurer de changer le numero de la config USART/UART dans le header correspondant.
La fonction update de la classe DistanceSensor doit être appelée régulièrement afin de lire les données dans le buffer USART et de les stocker en mémoire.
Les données sont fournies au processeur sous la forme de l’attribut m_closedList la classe DistanceSensor qui est la liste des objets détectés lors de la dernière rotation de la tourelle, sous la forme d’un vecteur de doublets (angle en degrés, distance en centimètres).
Réalisation
Matériel
- Capteur SICK WL-100 P3409
- Moteur N20, 12V, 600rpm
- Transistor MOSFET FQP 13N10
- Résistances 0.25W: 380Ω x1, 4.6kΩ x1, 1kΩ x2, 1.5kΩ x1
- Capacités: 68nF x1, 10nF x1 (voir schéma électronique pour les dimensions)
- Diode 1N4004
- Arduino Mini (V4 ou ultérieur)
- Interrupteur optique HY870P (ou similaire)
- Collecteur tournant 12.5mm, 6 fils, 300rpm (Seinring SNM012-06)
- Roulements à bille 6900-2RS x2
- Tube aluminium, diamètre extérieur 10mm, longueur +/- 70mm
- Fils (connecteurs type Dupont)
- Tube Plexiglas (acrylique) transparent, diamètre extérieur 80mm, diamètre intérieur 70mm, longueur +/- 70mm
- Bout de plastique opaque, env. 10x10x3mm
- Boulons 3x20mm, x2
- Boulons 3x30mm, x4
- Écrous 3mm, x14
- Boulon 2x10mm, x1
- Écrou 2mm, x1
Outils
- Scie à métaux
- Papier de verre, limes fines
- Perceuse colonne de précision (type Dremel)
- Imprimante 3D (volume minimum 80x80x50mm), plastique adapté à l’imprimante (PLA, ABS…)
- Pistolet à colle ou superglue
- Fer à souder (précis, pour l’électronique), étain adapté
- Ruban adhésif d’électricien, gaines thermorétractables…
- (Optionnel) Perceuse, gants de protection de qualité industrielle
- (Optionnel) Marteau, pour le travail de précision
Autres
Il vous faudra réaliser un circuit imprimé de dimensions 80x80mm, avec pistes de chaque coté.
Construction
Impression des pièces
Commencez par télécharger et imprimer toutes les pièces. Vous pouvez trouver une archive des modèles ici.
Vous devez avoir:
- Une pièce inférieure (base)
- Une pièce médiane (support médian)
- Une pièce supérieure (support supérieur)
- Un engrenage de diamètre intérieur 10mm (engrenage axe)
- Un engrenage dont l’axe a un méplat (engrenage moteur)
- Le support du capteur
- (Optionnellement) Un support pour les contrepoids
Préparation des tubes
Découpez le tube d’aluminium (axe) et le tube de Plexiglass aux bonnes dimensions ().
Faites à la scie une encoche verticale de 8mm sur une des parois de l’axe. Elle doit être suffisamment large pour laisser passer trois fils du collecteur tournant.
Ce coté de l’axe est maintenant le coté supérieur.
Préparation du moteur
Soudez deux fils (peu importe les couleurs) et un condensateur céramique (une dizaine de millifarad) en parallèle sur les branches du moteur.
Préparation du capteur
Cette partie est quelque peu polémique. Initialement, nous comptions utiliser un connecteur M8 3 pins adapté au capteur. Cependant, après achat, nous nous sommes rendu compte que, outre le prix exorbitant (une dizaine d’euro pour quelque chose qui vaut trois centimes), les conventions absurdes et la construction sans queue ni tête (pas de vis… inutilisable, parce que les pins empêchent la rotation), l’espace pris par le connecteur était inadmissible (+20% sur la longueur du capteur).
[Image]
La solution adoptée est directe est brutale:
- Sciez le pas de vis du capteur à raz du plastique
- Soudez trois fils sur les pins qui dépassent maintenant
Attention! Vous aurez besoin de trois fils de couleurs (dans le sens horaire) se terminant par des connecteurs Dupont femelles :
- Rouge pour le 12V
- Blanc/Jaune pour le capteur
- Noir pour la masse
Par rapport aux conventions utilisées par les connecteurs, cela correspond aux couleurs et aux notations:
- Marron (L+) pour le 12V
- Noir (Q) pour le capteur
- Bleu (M) pour la masse
N’hésitez pas à tester, ces capteurs sont solides. Si vous branchez le rouge au 12V et le noir à la masse, des LEDs doivent s’allumer sur le capteur.
Vérification des dimensions
Vérifiez que:
- Le capteur SICK et le support du capteur sont bien de dimensions compatibles. Utilisez les boulons 3x20mm, il vous faudra normalement forcer pour traverser les trous du capteur
- La base et le support médian ont bien des trous de 3mm adaptés aux boulons
- Le collecteur tournant rentre bien dans la base
- Les roulements à bille rentrent bien (et tiennent) dans les supports médian et supérieur d’un coté
- Le tube en Plexiglass rentre bien (et tient) dans les supports médian et supérieur
- Le moteur rentre bien dans son emplacement dans le support médian
Si nécessaire, limez légèrement les pièces imprimées, ou ré-imprimez-les avec des dimensions plus adaptées aux marges de votre imprimante.
[Images]
Montage de l’axe
Vérifiez que:
- L’axe passe (et tient) dans l’engrenage axe et le support du capteur
- L’axe rentre (et tient) dans les deux roulements à bille
Attention! Idéalement, il faut rentrer l’axe en force dans ces éléments. Réfléchissez bien avant de le faire, et insérez les pièces dans l’ordre.
Du haut vers le bas, l’axe traverse: un roulement, le support capteur (partie plate vers le haut), l’engrenage (partie lisse vers le bas), et un second roulement.
Les deux roulements sont aux extrémités de l’axe. Leur anneau extérieur doit pouvoir tourner sans aucun frottement.
Pensez à laisser quelques millimètres entre le support du capteur et le roulement supérieur, pour que les vis et les fils ne frottent pas sur le support supérieur.
Vérifiez qu’il est possible de passer les fils du collecteur sur le dessus, puis au travers le support du capteur.
Si l’axe est trop gros, et que vous utilisez un métal mou (type aluminium), nous préconisons d’utiliser du papier de verre pour ôter la matière en trop.
Technique efficace mais dangereuse: mettez des gants (épais, de travail), placez le tube au bout d’une perceuse, tenez là d’une main et de l’autre utilisez le papier de verre sur le tube.
Si l’axe est trop fin, utilisez du ruban adhésif d’électricien pour augmenter son diamètre d’une fraction de millimètre.
Interrupteur du compte-tour
Soudez les deux pattes de masse (2 & 4 sur la datasheet) du HY870P ensemble. Rajoutez dessus un fil noir (connecteur Dupont mâle) de 7-8cm.
Soudez sur la patte restante de la diode (anode en 1) un fil rouge (même taille, même connecteur).
Soudez sur la patte restante du phototransistor (3, dernière patte) un fil blanc (idem).
Isolez tout ça.
Vérifiez que toutes ces soudures, fils, etc. ne dépassent pas du coté de l’interrupteur, c’est-à-dire que, de face, seul le boitier plastique est visible.
Percez, sur le support médian, un trou de 2mm correspondant à l’emplacement du boulon de l’interrupteur (à la base de l’espèce de fourche verticale).
Fixez l’interrupteur sur le support, passez les fils à travers la paroi inférieure.
Fanion du compte-tour
Placez le moteur dans le support médian, puis le montage de l’axe, puis l’engrenage du moteur.
Arrangez l’ensemble pour qu’il y ait un espace entre les engrenages et le haut du réducteur, et que cet espace corresponde à la fente de l’interrupteur.
Marquez cette position sur l’engrenage de l’axe. Démontez le tout.
Avec la scie à métaux, faites une encoche profonde de quelques millimètres au niveau de la marque. Vérifiez qu’elle est suffisamment large pour accommoder le bout de plastique opaque.
Remontez le tout. Vérifiez que le bout de plastique passe entre les branches de l’interrupteur, mais ne touche absolument rien (ni moteur, ni engrenage). Le raccourcir si nécessaire.
NB: Il n’est pas nécessaire que ce bout de plastique interrompe complètement le faisceau optique, mais plus il le fait, mieux c’est.
Collez le bout de plastique en place.
Optionnellement, vérifiez le fonctionnement du compte-tour en utilisant une résistance de 380Ω pour la LED et de 4.6Ω pour le transistor.
Montage du collecteur tournant
Vous aurez besoin des fils noir, rouge et jaune (blanc). Coupez court les autres.
Soudez sur les fils du stator des connecteurs Dupont mâles.
Passez les trois fils de la partie supérieur du collecteur dans l’axe (inutile de les connecter pour le moment).
Vous remarquerez qu’il y a un vide entre la paroi intérieure de l’axe et le rotor du collecteur. Comme les dimensions exactes dépendent du tube que vous avez utilisé, c’est à vous de trouver une solution pour le combler. Il est possible d’utiliser du ruban adhésif autour du stator, ou encore d’imprimer une petite pièce en plastique pour servir de cale.
Une fois le rotor du collecteur solidaire de l’axe, passez les fils le long du tube, au travers l’encoche supérieure, sous le roulement et finalement à travers le support du capteur.
Soudez sur ces fils des connecteurs Dupont mâles, les connecter à ceux du capteur SICK.
Optionnellement, alimentez (progressivement! Commencez à 1V) le moteur pour vérifier que rien ne frotte.
Montage du circuit imprimé
Soudez les composants sur le circuit imprimé suivant le schéma électronique. Notez que vous aurez besoin de faire au préalable tous les trous indiqués sur ce schéma.
Rajoutez l’Arduino Mini.
Sur les emplacements marqués ‘SICK’ et ‘Compteur’, soudez des fils (courts) terminés par des connecteurs Dupont femelles. Vous aurez besoin de fils rouges, noirs et blancs, faites attention à utiliser les bons aux bons endroits.
Sur les emplacements ‘Alim’ et ‘STM’, utilisez des fils noir (masse x2), rouge (5V), jaune (12V), blanc et gris (RX/TX) d’une vingtaine de cm.
Placez le circuit sur le support inférieur. Vérifiez que les boulons passent bien par les trous et ne touchent que la masse du circuit.
Assemblage
Assemblez le montage précédent avec le support inférieur à l’aide des boulons 3x30mm. Utilisez trois écrous par boulon: un pour tenir le circuit, un au-dessous le support médian, et un au-dessus du support médian.
Passez les fils du stator du collecteur au-travers le support inférieur et la carte.
Connectez les fils en respectant le code couleur et les indications sur la carte. Les pins du moteur sont interchangeables mais ne les connectez pas tout de suite.
Placez le tube en Plexiglass sur le support médian. Vous aurez surement à découper une partie du tube pour faire passer des fils ou l’Arduino.
Placez le support supérieur sur le tube en Plexiglass. Il doit tenir le roulement à bille supérieur.
Vérifiez que tout tourne correctement en utilisant les pins du moteur.
Ajustements
A partir d’ici, il s’agit d’ajuster légèrement les dimensions et les caractéristiques du montage pour assurer un fonctionnement optimal.
Commencez par jeter un œil critique sur la façon dont les pièces s’emboitent et aux dimensions finales. Fort de votre expérience nouvellement acquise, n’hésitez pas à en réusiner quelques unes…
Ensuite, le point le plus urgent est l’équilibrage de l’axe. La masse du capteur n’étant pas centrée, l’axe va secouer l’ensemble de manière inacceptable. Utilisez les trous à l’arrière du support du capteur pour rajouter un contrepoids, dont la masse est à votre discrétion. Vous pouvez utiliser le support imprimé donné avec les autres pièces. Pour information, le capteur en lui-même pèse environ 9g.
Un second point important est l’angle du capteur. Rajoutez des cales entre le capteur et son support pour obtenir l’angle désirée; une fois encore, l’expérimentation s’impose car cela va dépendre intimement de l’utilisation que vous comptez en faire. Vérifiez que vos cales n’ont pas une fois encore déséquilibré l’axe.
Dernières remarques
Votre détecteur est maintenant terminé! Comme vous avez pu le remarquer, le processus de fabrication n’est pas particulièrement simple. C’est celui que nous avons suivit pour la fabrication de nos premiers prototypes.
Quelques remarques:
- L’ensemble du module est fixé par quatre trous de 6mm sur la face inférieure
- L’API C++ est conçue pour être utilisée dans un STM32. Cependant, utilisez l’interface Processing pour tester le bon fonctionnement du système
- Vous aurez besoin de balises avec ce détecteur. Nous avons utilisé des réflecteurs souples adhésifs, collés sur un tube PVC de 80mm.
- Adaptez la vitesse de rotation! Demandez vous si vous avez vraiment besoin d’un rafraichissement de 10Hz… et si vous avez envie de risquer la désintégration du détecteur…
- Il est possible d’utiliser différents moteurs de type N20 de couple/vitesse différents. Nous avons également essayé avec un moteur 1000rpm mais nous ne recommandons pas de dépasser les 600rpm.
Conclusion
Ce projet est un bon moyen de combiner à la fois des connaissances en mécanique, électronique et informatique.
De plus, cela nous a permis de nous rendre compte de l’importance de la contrainte de place (80x80x80 mm) dans le choix des solutions adoptées. Enfin, la contrainte de coût (faire un système de détection à un coût quasi nul) a été déterminante dans le choix de la solution adoptée, car cela nous a forcé à réutiliser du matériel déjà présent (comme le capteur).