Train de véhicules

De Wiki de Projets IMA


Vidéo HD


Cahier des charges

Présentation générale du projet

L'objectif de ce projet est de développer une demi-douzaine de robots mobiles capables de se suivre afin de former un train de véhicules. Le véhicule de tête sera téléguidé par WiFi, alors que les autres suivront le véhicule de devant de façon autonome.

Les robots seront des robots roulants à deux roues. Le corps du robot sera monté à partir de châssis à bas coût: les 2WD Robot Car chassis.

Texte alternatif
2WD Robot Car Chassis

Ce châssis comprend déjà deux moteurs 6V, deux roues et un support de 4 piles 1.5V. Il faudra ajouter deux odomètres, un driver de puissance pour les moteurs, ainsi qu'un microcontrôleur. Le véhicule de tête sera commandé par un micro-contrôleur avec WiFi intégré de type ESP8266. Les autres par un Arduino Uno. Le véhicule de tête se comportera comme un point d'accès WiFi et implantera un mini-serveur Web pour permettre le contrôle via un smartphone ou un ordinateur.

Chaque véhicule possède un numéro d'identification N, et doit suivre celui de numéro N-1. Pour cela, il doit détecter et identifier un véhicule dans une zone définie. Le véhicule à suivre émet des ondes infrarouges modulées par son numéro d'identification, donc chaque robot émettra à une fréquence différente. Un capteur infrarouge doit être installé à l'avant du robot suiveur afin de récupérer ces informations tandis que l’émetteur IR sera situé à l'arrière du robot. Le suivi se fera à une distance prédéfinie. Le robot suiveur sera équipé d'un capteur ultrason pour asservir sa distance avec le véhicule suivi. Il faudra que l'arrière des véhicules soit bien plan pour que le télémètre ultra-son puisse prendre une mesure fiable.

Un véhicule suiveur doit tourner sur lui-même pour détecter les balises IR. Si une balise est détectée, on tente de l'identifier. S'il s'agit de la bonne balise, on commence la poursuite, sinon on continue à chercher les balises. Tant que la bonne balise est dans le champ de vision, il faut la garder le plus au centre. Plusieurs capteurs IR seront utilisés pour assurer la bonne direction du robot. La vitesse est régulée par rapport à la distance retournée par le télémètre. Nous utiliserons un régulateur PID pour limiter les oscillations en vitesse des robots.

Train de robots

Liste de matériel

Avant le début du projet, nous avons étudié les objectifs de celui-ci, imaginé et identifié quelques solutions techniques et établi une première liste de matériel.

Matériel Quantité requise Quantité disponible A commander Commentaires
Chassis 2WD 4 4 0 Corps + motoreducteurs 6V + roues + odomètres
Piles / batteries 4x4x1.5V Suffisamment 0
Arduino Uno 3 3 0
ESP8266 1 1 0
LED IR 20 0 20 RS [1], angle de diffusion : 130°, longueur d'onde : 880nm
Phototransistors IR 20 0 20 RS [2], angle de sensibilité : 50°, gamme spectrale de sensibilité : 730-1120nm
Ultrasons SR04 3 3 0
Drivers moteur Pololu 1 0 1 GoTronic [3]
Drivers moteur TB6612FNG 3 0 3 Mouser [4]
Boutons poussoirs 4 4 0
LEDs couleur 10 0 10 RS [5]
Résistances 220 Ohms CMS 6 0 6 Mouser [6]
Résistances 470 kOhms CMS 20 0 20 Mouser [7]
Fils m-m 1 lot de 65 0 1 lot de 65 Farnell [8]
Capacités 10µF CMS 10 0 10 Mouser [9]
Capacités 0.1µF CMS 10 0 10 Mouser [10]
Embases CI 40 contacts 1 rangée 4 0 4 RS [11]
Borniers à vis 15 0 15 Farnell [12]
Cartes électroniques 3 0 3 A faire nous-même

Liste des tâches

  • Étudier la partie puissance
    • Déterminer la source d'énergie
    • Régulateur 6 V pour alim driver moteur ?
    • Choix du driver moteur
  • Étudier la communication infrarouge
    • Circuit d'émission: LED IR + résistance
    • Circuit réception: Phototransistor IR + résistance
    • Déterminer la portée du signal ?
    • Étudier l'influence de la lumière ambiante ?
    • Étudier la directivité du signal émis ? De la détection ?
    • En déduire la disposition des détecteurs
    • Programmer cette communication sur Arduino
  • Étude de l'ESP8266
    • Nombre de GPIOs disponibles
    • Comment coder ?
  • Développement d'un code PID numérique
    • Sur IDE, possibilité de faire une classe PID
    • En code C, une librairie

Répartition du travail

Lundi 16-18h Mercredi 14-18h Jeudi 10-12h
Semaine 4 25/01: Organisation du projet 27/01: Etude préalable de l'IR 28/01: Liste de matériel
Semaine 5 01/02: Finalisation de la liste de matériel 03/02: Liste définitive du matériel, test des Pololu 04/02: Suite des tests des Pololu
Semaine 6 08/02: Test des capteurs ultrasons 10/02: Prise en main de l'ESP8266 (1er upload, blink) 11/02: Début conception circuit électronique
Semaine 8 22/02: Recherches et tests Arduino (Timers, PWMs) / Cartes électroniques 24/02: Premiers tests ESP8266 (Access point Wifi, requetes HTTP) / Cartes électroniques 25/02: Recherches sur l'ESP8266 (Timer, Interruptions, PWM)/ Cartes électroniques
Semaine 9 29/02: Tests ESP8266 (PWM, Timers) et Arduino (Définition des fonctions principales)/ Cartes électroniques 02/03: Montage robot tête / Programmation ESP8266 (1er programme fonctionnel) et Arduino (Fonctions principales)/ Cartes électroniques 03/03: Positionnement des phototransistors (Fréquencemètre IR) / Cartes électroniques
Semaine 10 07/03: Finition des PCB 09/03: Test ultrason sur Arduino 10/03: Vérification communication infrarouge
Semaine 11 14/03: Amélioration de la communication infrarouge 16/03: Impression et soudure des PCB 17/03: Finition de la soudure des PCB / Développement du programme de suivi sur Arduino
Semaine 12 21/03: Fixation des cartes au robot / Premiers tests avec le programme Arduino 23/03: Test des cartes et conception PCB pour le robot de tête / Amélioration de la gestion des déplacements pour le suiveur 24/03: PCB robot de tête / Dev interface Web ESP8266
Semaine 13 28/03: Férié 30/03: Finition PCB Robot de tête / Dev interface Web ESP8266 31/03: Dev interface Web ESP8266
Semaine 16 18/04: Recherches pour structure réflexion Ultrason 20/04: Découpe laser de la structure de réflexion / Tests de suivi 21/04: Suite des tests de suivi
Semaine 17 25/04: Réception des cartes (suiveur + tête) et soudure 27/04: Fin soudure + tests 28/04: Suivi de la voiture de tête par une suiveuse : opérationnel
Semaine 18 02/05: Réception de la dernière carte suiveur + test 2 suiveurs : opérationnel 04/05: Suite des tests 05/05: Férié

Avancement du Projet

Travaux Avancement Commentaires
Étude préalable de la communication infrarouge Fait Montages d'émission et de réception déterminés
 Émission: Puissance délivrée par Arduino suffisante, LEDs grande directivité nécessaires (130°)
 Réception: Bonne sensibilité, reste à définir la répartition sur le robot
 Influence relativement importante du bruit IR ambiant, prévoir un "chapeau"
Étude de l'alimentation Fait Deux solutions confrontées:
 Alim 9V (6x1.5V) et linéariseur 6V
 Alim 6V (4x1.5V) directe --> Solution retenue pour sa simplicité. Étude fonctionnelle à prévoir 
Électronique de puissance Fait Utilisation de drivers moteur Pololu TB6612FNG
Montage général Fait Différent selon les robots :
 Plusieurs cartes électroniques pour les robots suiveurs 
 Breadboard pour le robot de tête -> Finalement, cartes électroniques
 Surface de réflexion des ondes ultrason
Prise en main de ESP8266 Fait
Développement programme Arduino Fait
Pilotage du robot de tête par WIFI / Interface Web Fait


1. Étude de la communication infrarouge

Émission

Nous déterminons ici le schéma de l'émission infrarouge:

Montage émetteur

La tension de commande de ce montage sera délivrée par un pin numérique de l'Arduino. Celui-ci accepte un courant max de sortie de 30mA. Nous fixons donc le courant dans le montage à environ 20mA afin de conserver une bonne puissance d'émission sans risquer d'endommager l'Arduino.

On a Ud = 1V,Ve = 5V, donc Vr = 4V. Nous avons Ir =\frac{Vr}{R}, en choisissant R à 220 Ohms, nous obtenons un courant de 18mA.

Afin que le signal infrarouge puisse être capté le mieux possible par un véhicule suiveur, nous choisissons d'émettre le signal avec une directivité très large. Les LEDS IR que nous avons sélectionnées ont donc un angle de diffusion de 130°.


Réception

Nous déterminons ici le schéma de la réception infrarouge:

Montage récepteur

La tension au collecteur du transistor est proportionnelle à l'intensité IR captée par le phototransistor. La valeur de la résistance de pull-up permet de régler le gain du montage. Celui-ci doit rester raisonnable afin de rejeter le bruit ambiant, et suffisant pour capter le signal utile, même à bonne distance. Nous avons expérimentalement déterminé R à 470 kOhms. Néanmoins, le bruit ambiant représente toujours un partie non négligeable du signal (rapport S/B ~ 2). Ce bruit étant principalement issu de l'éclairage, nous prévoyons de positionner une protection opaque au dessus de chaque récepteur.

Cette tension sera lue sur un convertisseur Analogique/Numérique de l'Arduino.

Nous choisissons cette fois-ci une directivité restreinte pour la réception infrarouge. L'objectif étant de situer le robot à suivre, plusieurs récepteurs sont placés à l'avant. En fonction du ou desquels reçoivent le signal, il sera possible de connaître la position approximative du robot à suivre. Nous avons donc sélectionné des récepteur dont l'angle de détection est d'environ 50°.

Voici un schéma de disposition des récepteurs à l'avant du robot:

Disposition des photoransistors IR

Grâce à cette disposition, la position du robot émetteur sera déterminée en fonction du ou des récepteurs qui reçoivent le signal émis. Celui ci pourra se trouver dans 6 zones différentes: En face, modérément de côté, complètement de côté (gauche et droite), ou hors de portée. Le robot suiveur sera commandé de façon à rectifier l'angle le plus précisément possible.

Principe de communication

Afin de différencier les robots suiveurs entre eux et le robot de tête, il est nécessaire de moduler le signal infrarouge d'émission en fonction de l'identifiant du robot. Le premier robot suiveur sera donc sensible uniquement au signal infrarouge du robot de tête, et ainsi de suite.
Le signal sera de type pulsé (Voir figure suivante).

Singal d'émission infrarouge


L'information sur l'identifiant du robot sera déduite de la fréquence de ce signal. La détection de la fréquence se fait par le microcontrôleur selon le principe suivant:

  • Détection d'un front montant sur le récepteur infrarouge, on lance un compteur qui s'incrémente périodiquement
  • A chaque nouveau front montant, on vérifie si la valeur du compteur correspond à la période d'émission du robot à suivre
    • Si c'est le cas, on réinitialise le compteur
    • Sinon, on attend la détection d'un nouveau front montant

L'avantage principal de ces choix est de minimiser l'influence d'un signal sur un autre. En choisissant des fréquences peu corrélées, les signaux n'ont que peu d'influence les uns sur les autres. Le défaut principal est que le système de détection est sensible au bruit de plus haute fréquence (risque de détection non justifiée) et à la saturation du capteur.

Afin d'améliorer la détection des pulses infrarouge, l'acquisition des valeurs des phototransistors se fait en analogique. De cette manière, on peut détecter des fronts montant dans un environnement relativement lumineux, ce qui nous permet d'augmenter la sensibilité des phototransistors et ainsi d'augmenter la portée de la communication infrarouge. La figure suivante illustre les valeurs acquises par le microcontrôleur en analogique:

Signal infrarouge reçu

On voit bien sur cette figure qu'une acquisition binaire n'aurait pas permis de détecter les pulses infrarouges. Grâce à ce fonctionnement, nous arrivons à détecter un émetteur infrarouge à une quarantaine de centimètres.


2. Étude de l'alimentation et de l'électronique de puissance

Les moteurs à courant continu fonctionnent sous une tension nominale de 6V. L'Arduino peut de même être alimentée sous une tension 6V. L'alimentation par 4 piles 1.5V est donc adaptée.
Une solution alternative consistant à utiliser une source de tension plus élevée (9V) et un linéariseur 6V a été étudiée, mais rejetée car la stabilité de la tension des piles est suffisante pour notre application.

Afin de commander les moteurs en tension, nous avons sélectionné le driver Toshiba TB6612FNG, constitué de 2 hacheurs 4 cadrants. IL est particulièrement bien adapté à notre application:

  • Courant < 1A
  • Plage de tension d'entrée 3-13V
  • Faible coût
  • Faible encombrement

3. Montage général

Nous avons convenu de réaliser des cartes électroniques pour les robots suiveurs, de façon à avoir un montage plus propre et plus stable. Les composants du robot de tête seront, quant à eux, montés sur une breadboard et reliés par des fils.


Montage des robots suiveurs

Nous allons donc réaliser plusieurs cartes électroniques, en fonction de la disposition des éléments.

A l’arrière du robot, se trouve la LED infrarouge, avec une résistance afin de limiter le courant. Cela constituera une première petite carte.

A l’avant, nous allons mettre le dispositif de détection infrarouge, avec le microcontrôleur et le driver moteur. Ce sera la carte principale. Nous y ajouterons les LEDs qui permettent de connaitre le numéro du robot, ainsi que le bouton poussoir pour en changer, et les codeuses. Initialement, le driver moteur choisi est vendu sur une carte comprenant un circuit TB6612FNG et des capacités. Nous allons recréer ce montage et l’intégrer à notre carte. Le capteur ultrason sera surélevé, de façon à ne pas être gêné par d’autres composants. Il faut donc une autre petite carte électronique.

Nous obtenons ainsi les montages suivants, réalisés sur Altium Designer :

Schéma de la carte infrarouge
Schéma de la carte ultrason
Schéma de la carte principale


Après avoir créé les empreintes de tous les composants, nous pouvons dessiner les PCB de chaque carte.

PCB de la carte infrarouge
PCB de la carte ultrason
PCB de la carte principale



Nous avons imprimé ces cartes. Lors des phases de test, nous nous sommes rendus compte d'un certain nombre d'erreurs sur la carte principale, que nous avons corrigées. Nous obtenons ainsi ces cartes finales :

Schéma de la carte principale corrigé
PCB de la carte principale corrigé




Montage du robot de tête

Le montage de tête nécessite moins de composants. Nous pouvons utiliser juste une breadboard et des fils. Les composants nécessaires sont un ESP8266, un driver moteur Pololu, une LED infrarouge et sa résistance. Nous utiliserons aussi les codeuses, afin de mieux diriger notre robot.

Nous nous sommes rendus compte que les piles ne délivraient pas assez de puissance pour alimenter l'ESP8266 et le driver moteur Pololu de manière optimale. Nous avons donc décidé d'utiliser deux boîtiers de piles : chacun alimentant l'un des composants.

Voici le schéma du montage:

Câblage du robot de tête



Nous avons finalement décidé de faire aussi une carte électronique pour le robot de tête, afin d'avoir un rendu plus propre et plus stable. Pour la LED infrarouge, qui se situera à l'arrière du robot, nous utiliserons le même PCB que pour les robots suiveurs. Cependant, l'ESP8266 ne peut délivrer qu'un courant de 10 mA environ, nous ajouterons donc un transistor au montage afin de fournir suffisamment de courant à la LED infrarouge. Pour le montage général, qui comporte les autres composants, nous créons un nouveau schématique et un nouveau PCB :

Schéma de la carte du robot de tête
PCB de la carte du robot de tête


4. Programmation de l'ESP8266

  • Prise en main

Il existe plusieurs manières de programmer l'ESP. Directement en C, mais aussi via l'IDE Arduino. Une librairie est disponible sur l'IDE pour programmer et flasher le microcontrôleur. Nous préférerons cette solution car elle est plus simple d'utilisation, et la plupart des fonctions que nous utilisons sont disponibles.

  • Principe de communication par WIFI:

L'utilisateur se connecte sur le robot en AccessPoint WIFI et se rend à l'adresse "192.168.4.1/interface" dans sa barre de navigateur. Ce dernier envoie des requêtes http au robot, qui exécute les ordres, et renvoie la page d'interface de commande. Depuis cette page, l'utilisateur peut contrôler le robot via une interface rudimentaire.

Singal infrarouge reçu
  • Fonctions principales du programme:
    • Recevoir des instructions de déplacement via des paquets http, puis renvoyer des paquets contenant du html/javaScript
    • Réaliser les déplacements demandés
    • Émettre un identifiant via Infrarouge
Singal infrarouge reçu

Ce programme a été réalisé et est fonctionnel, il est disponible dans la partie "Fichiers Rendus".

5. Programmation de l'Arduino

Les robots suiveurs sont contrôlés par une Arduino Uno (Atmega 328p). La programmation se fera en C grâce à l'outil avr-gcc, qui permet de compiler et de flasher le microcontrôleur Arduino. Voici la liste des fonctions que doit assurer le microcontrôleur

  • Gestion de l'ID du robot:
    • Incrément de l'ID à l'appui d'un bouton poussoir (Solution: interruption)
    • Affichage de l'ID du robot sur deux LEDS
  • Acquisition de la mesure de distance grâce au capteur Ultrason HC-SR04
    • Emission d'un signal de déclenchement
    • Interruption sur le signal d'écho
  • Réception Infrarouge
    • Acquisition des mesures infrarouges des 3 capteurs en continu grâce au convertisseur Analogique Numérique
    • Scrutation des pulses infrarouges (timer)
    • Vérification de la fréquence des pulses. La fréquence de détection est définie par l'ID du robot
  • Emission Infrarouge
    • Emission de pulses de 1ms à la fréquence d'émission définie par l'ID du robot
  • Asservissement de la vitesse du robot
    • Orientation du robot en fonction de la détection infrarouge
    • Vitesse linéaire en fonction de la distance. Celle-ci n'est active que lorsque le robot à suivre est détecté à l'avant du robot.
  • Application des commandes aux moteurs
    • Utilisation du timer2 en modulation de largeur d'impulsion
Singal infrarouge reçu

Ce programme a été réalisé et est fonctionnel, il est disponible dans la partie "Fichiers Rendus".

Fichiers Rendus

Rapport de projet

Fichier:Rapport projet P4 BUENO GILLET.pdf

Codes

Code robot de tête: Fichier:2016P4RobotTete.zip

Code robots suiveurs: Fichier:2016P4ArduinoRobotsSuiveur.zip

Références

Datasheets

Drivers moteurs TB6612FNG: https://www.pololu.com/file/0J86/TB6612FNG.pdf

Capteur ultrason SR04: http://www.micropik.com/PDF/HCSR04.pdf

Atmega 328P: http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf

ESP8266 Adafruit breakout: https://cdn-learn.adafruit.com/downloads/pdf/adafruit-huzzah-esp8266-breakout.pdf

Tutoriels

Installation, programmation ESP8266:
https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide/installing-the-esp8266-arduino-addon
https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/using-arduino-ide
https://www.arduino.cc/en/Reference/WiFi