Institut National des Sciences Appliquées de Toulouse BE Systèmes Autonomes FOLLOW THE LINE an autonomous robot project Badr Bouaddi <[email protected]> Simon Bouvot <[email protected]> Brice Cavelier <[email protected]> Yassine Chemchoum <[email protected]> Héléna Creixell <[email protected]> Florent Dallet <[email protected]> Encadrant : Christophe Escriba Fonctions Noms Date Software Bouaddi/Dallet 12/01/14 US Bouvot/Cavelier 11/01/14 IR Chemchoum/Creixell 12/01/14 Signature Table des matières 1 Ultrason 1.1 Emission . . . . . . . . . . . . . . . . 1.1.1 Montage oscillateur à base de 1.1.2 Dimensionnement . . . . . . 1.2 Réception . . . . . . . . . . . . . . . 1.2.1 Chaine amplificatrice . . . . . 1.2.2 Détecteur de crête . . . . . . 1.2.3 Le comparateur . . . . . . . . 1.2.4 Conditionnement du signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 4 4 4 6 6 2 Infrarouge 2.1 Présentation . . . . . . . . . . . . . . . . . . . . 2.2 Principe de fonctionnement . . . . . . . . . . . 2.3 Emission . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Générateur du signal carré . . . . . . . 2.3.2 Amplification et conversion du signal . . 2.4 Réception . . . . . . . . . . . . . . . . . . . . . 2.4.1 Conversion, filtrage et écrêtage du signal 2.4.2 Comparateur hystérésis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 7 7 8 9 9 10 . . . . NE555 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Software côté microcontrôleur PIC18f2580 4 Software embarqué sur le PC 4.1 Une IHM . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Développement de driver des commandes de 4.1.2 Développement d’IHM sous python . . . . . 4.2 Commandes du robot . . . . . . . . . . . . . . . . 2 11 . . . . . . . . . . robot portables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 13 15 16 Chapitre 1 Ultrason 1.1 1.1.1 Emission Montage oscillateur à base de NE555 Le montage émetteur doit osciller à 40kHz, pour cela on utilise un NE555 (ou équivalent LM555) monté en astable qui génère un signal rectangulaire d’amplitude 5V. Le montage suivant a été réalisé. Figure 1.1 – Montage astable La documentation constructeur nous propose les 2 relations suivantes afin de calculer le rapport cyclique et la fréquence d’oscillation. f= 1.1.2 1.44 (RA + 2 · RB ) · C D= RB RA + 2 · RB Dimensionnement On veut une fréquence f = 40kHz et un rapport cyclique de D = 50%. En utilisant les formules proposées, on trouve le compromis suivant : D= 22k = 48.2% 1.65k + 2 · 22k f= 3 1.44 = 38.5kHz (1.65k + 2 · 22k) · (820p) BE Systèmes Autonomes INSA Toulouse Figure 1.2 – Montage oscillateur à 40kHz On note qu’après avoir réglé manuellement grâce à un potentiomètre la valeur de RA = 1.65kΩ, on met 2 résistances de 3.3kΩ en parallèle. On installe en sortie de l’oscillateur un montage émetteur commun pour amplifier le signal émis. 1.2 1.2.1 Réception Chaine amplificatrice Le récepteur capte le signal à 40kHz émis. Un suiveur est installé ensuite pour adapter l’impédance. S’en suit deux amplificateurs inverseurs de gains : G1 = − 220 = 11 20 G2 = − 47k = 47 1k Soit une amplification de 517 (54dB). On a placé 2 AOP pour respecter le produit gain-bande G · B ≤ 3M , en effet : G1 · B1 = 11 · 40k = 440k < 3M G2 · B2 = 47 · 40k = 1.88M < 3M Figure 1.3 – Chaine amplificatrice 1.2.2 Détecteur de crête Après la chaîne d’amplification se trouve un détecteur de crêtes, montage composé d’une diode et de la mise en parallèle d’une résistance et d’un condensateur. Le principe consiste détecter la valeur maximale du signal sinusoïdale. Cette valeur sera exploitée en sortie du montage avec un comparateur. 5ESE - groupe 2 Page 4/ 27 20 janvier 2014 BE Systèmes Autonomes INSA Toulouse Pourquoi ce montage ? Si le signal de l’émetteur rencontre un obstacle, il sera réfléchit puis capté par le récepteur. En sortie de la chaîne d’amplification, on aura alors un signal identique au signal émit mais avec une amplitude différente. L’amplitude sera en fait l’image de la distance de l’obstacle. Plus l’obstacle est loin, plus l’amplitude sera petite. Étant donné que nous souhaitons réaliser un détecteur tout ou rien (un obstacle ou pas d’obstacle), nous allons prélever la valeur de l’amplitude du signal, puis la comparer à une valeur Vref, qui sera réglable avec un potentiomètre. Ainsi, on pourra régler la distance de détection. Figure 1.4 – Détecteur de crête Voici le signal avant et après le détecteur de crêtes : Figure 1.5 – Signal avant et après détection On remarque que pour une amplitude de 12V, on obtient un signal constant de 11,3V. La différence est due à la tension de seuil de la diode. Pour confirmer le fonctionnement de notre détecteur, on change la valeur du signal d’entrée. 5ESE - groupe 2 Page 5/ 27 20 janvier 2014 BE Systèmes Autonomes INSA Toulouse Figure 1.6 – Signal plus faible (5V) : impact de la diode Là encore on remarque une différence due à la diode, cependant Vsortie a bien suivie le changement d’amplitude. 1.2.3 Le comparateur La comparaison est réalisée avec un simple pont diviseur pour obtenir Vref , et un AOP pour comparer les deux valeurs. L’AOP étant alimenté en sysmétrique avec des tension de ±12V , nous aurons en sortie : – +12V si Vsortie > Vref – -12V si Vsortie < Vref Etant donné que notre signal va être exploité par un pic, nous devons le reconditionner pour obtenir : – 5V si Vsortie > Vref (si un obstacle est détecté) – 0V si Vsortie < Vref (s’il n’y a pas d’obstacle) 1.2.4 Conditionnement du signal Pour cela nous réalisons un montage non inverseur à base de transistors (la résistance de 470Ω en sortie du montage sert à limiter le courant en entrée du pic). Sur la figure ci dessous on remarque l’effet des transistors : Figure 1.7 – Effet des transistors sur le signal Avant les transistors le signal varie entre 0 et 12V. Après, il est adapté à l’entrée d’un pic, il varie entre 0 et 5V. Remarque : le retard de 1µs n’a pas été observé en réel. Il est certainement dû à un réglage du simulateur. 5ESE - groupe 2 Page 6/ 27 20 janvier 2014 Chapitre 2 Infrarouge 2.1 Présentation Cette partie consiste à interfacer les capteurs IR connecté à une carte de commande par Microcontrôleur, de sorte qu’on peut faire distinction entre surface noire et blanche pour garantir que le robot suit la ligne. Le principe de la détection est de pouvoir avoir une tension, en front montant ou descendant lors du franchissement de ligne. En effet il apparait que c’est compliqué d’utiliser les tensions analogiques générées par les capteurs IR, du coup il fallait utiliser une chaine d’instrumentation vu la facilité de traiter des niveaux logique. Il a donc été prévu de fournir directement à la carte de commande une tension qui vaut soit 0 ou 5V en sortie de la carte IR. L’acquisition de cette tension par le microcontrôleur permettra de prendre les décisions nécessaires pour le suivie de la ligne. 2.2 Principe de fonctionnement Ce détecteur infrarouge est sensible à la couleur pour caractériser les lignes, donc on se sert des différences de coefficients d’absorption des ondes infra-rouge pour les deux couleurs blanc et noire. On peut considérer que le blanc reflète entièrement les ondes émises alors que le noir absorbe plus. Le principe des capteurs est le suivant : ils sont composés d’une diode émettrice et une autre réceptrice, disposés de sorte que le faisceau émis, le capteur étant perpendiculaire à une surface plane, soit réfléchi sur la diode réceptrice. Pour éviter d’être trop sensible à la lumière ambiante que peut être forte en intensité, il ne faut pas utiliser une émission continue, mais plutôt une émission par porteuse. Le récepteur peut alors être accordé sur la fréquence d’émission et on atteint des sensibilités importantes. 2.3 2.3.1 Emission Générateur du signal carré Pour pouvoir émettre, il est intéressant d’émettre en train d’onde plutôt qu’une émission continue pour éviter l’impact de la lumière ambiante dans la réception. De plus, la diode infrarouge accepte des courants maximums pendant un temps très court, et il nous intéresse aussi d’émettre à grande puissance vu que la distance de détection est lié à l’énergie émission. Cette distance se limite à quelques centimètres. Elle peut être nettement augmentée si l’on met les trois leds IR en série. Dans cette optique, et pour rendre notre circuit optimal on a choisi de mettre les trois diodes émettrices en série pour n’utiliser qu’un seul générateur de signal carré. 7 BE Systèmes Autonomes INSA Toulouse Pour ce faire, on a adopté un montage oscillateur à base d’un NE555 en mode astable pour générer un signal carré (comme pour le capteur à ultrason), on voulait cadencer l’émission à une fréquence de 1kHz, et pour avoir un rapport cyclique de 50% on a dimensionné nos composants comme suit : Figure 2.1 – Générateur de signal carré à 1kHz f= 1 1 1 = = 1kHz = T TH + TB 0.7 · (RA + RB ) · C RA + RB = 0.7 · f · C Pour une valeur de C=10nF, on obtient : RA + RB = 142.85kΩ Par la suite, on a choisi les valeurs des résistances suivantes : RA = 56kΩ RB = 82kΩ On obtient en sortie : Figure 2.2 – Signal en sortie de l’oscillateur 2.3.2 Amplification et conversion du signal A la sortie du NE555 on a un courant faible par rapport à ce qu’on voulait pour émettre à grande puissance. Donc on décidait d’utiliser un montage amplificateur de courant. Ainsi, d’après la Datasheet de la diode IR émettrice SFH 4585, on a un courant de 100 mA "Forward curent ; If" qui correspond à un "Forward Voltage ; Vf" de 1.5V. 5ESE - groupe 2 Page 8/ 27 20 janvier 2014 BE Systèmes Autonomes INSA Toulouse Ce montage donc avec un transistor NPN 2N1711, permet d’amplifier le courant de sorte que les diodes IR puissent émettre avec une grande puissance et convertit le signal électrique en signal optique. Un calcul rapide dans cette branche nous donne les valeurs suivantes des résistances coté base et émetteur : R1 = 18kΩ R3 = 2.2kΩ 2.4 2.4.1 Réception Conversion, filtrage et écrêtage du signal La conversion Optique/électrique se fait par l’intermédiaire d’une photodiode. Le principe est de détecter le courant inverse traversant la photodiode, qui varie en fonction de l’intensité du signal reçu. Figure 2.3 – Chaine de réception IR La réception du signal calé sur 1KHz permet, se fait à l’aide des photodiodes SFH2500FA et est suivi par un filtrage pour d’éliminer le bruit dans le signal délivré par la photodiode après conversion. Ensuite, on commence par redresser la tension de sortie du filtre VS. Le redressement se fait par une diode D, une résistance Rr et un condensateur Cr. La tension VS charge le condensateur Cr lorsque VS est positif, et le condensateur se décharge à travers Rr lorsque VS est négatif, la diode protégeant la charge de Cr. C’est en utilisant la décharge de Cr qu’on peut obtenir un signal quasi constant, un signal écrêté. Figure 2.4 – Chaine de réception IR 5ESE - groupe 2 Page 9/ 27 20 janvier 2014 BE Systèmes Autonomes 2.4.2 INSA Toulouse Comparateur hystérésis On peut se contenter d’un simple comparateur à seuil pour décider si la zone visée est noire ou blanche. Le principe est de comparer le signal reçu redressé (la tension VR) avec une tension de référence Vref , à l’aide d’un comparateur. Pour cela, nous utilisons l’amplificateur opérationnel LM311P : il contient 4 AOP. Pour créer la tension de référence, on utilise un pont diviseur de tension réglable par une résistance variable. Cette dernière est en parallèle avec une capacité pour pouvoir utiliser le maximum de la course de l’ajustable qui permet un réglage précis. Figure 2.5 – Pas de détection : 0V transmis au pic Figure 2.6 – Détection : 5V transmis au pic 5ESE - groupe 2 Page 10/ 27 20 janvier 2014 Chapitre 3 Software côté microcontrôleur PIC18f2580 Le microcontrôleur PIC18f2580 joue le rôle d’intermédiaire entre les capteurs et le PC. Le but de son utilisation est ici de sérialiser les données issues des capteurs pour les envoyer par UART au PC. Il a donc fallu se mettre d’accord sur le nombre de capteurs utilisés dans le but de définir un format de trame envoyé par l’UART adéquat. Nous avons 4 capteurs : 3 capteurs infrarouges pour le suivi de ligne et un capteur pour la détection d’obstacle. Le format suivant des trames a donc été choisi : Stop 1 1 1 CAP1US CAP3IR CAP2IR CAP1IR Start On dénombre 9 bits car l’UART utilisé sur le PIC18f2580 envoie 9 bits et permet de mettre ce 9ème bit à une valeur caractéristique. Dans notre cas, nous n’utilisons pas ce bit, il n’est donc pas actif ce qui se traduit par un ’0’ logique lorsqu’il n’est affecté à aucune valeur caractéristique. Nous utiliserons donc ce bit (qui est envoyé avant les 8 autres) comme bit de START. Les informations des capteurs sont ensuite envoyé mais suivi par 3 bits mis à ’1’. Le dernier bit sera mis à 0 et pourra faire office de bit de STOP. Le chronogramme suivant témoigne de ce qu’il se passe en sortie de notre microcontrôleur PIC : Figure 3.1 – Chronogramme d’une trame série émise par PIC18f2580 Les trames séries maintenant définies, il ne reste qu’à définir deux choses : – Les pins d’entrées choisies pour accueillir l’information issue des capteurs – L’algorithme applicatif pour exploiter correctement ces "drivers" Intéressons nous dans un premier temps aux pin I/O à configurer. Nous choisissons de prendre les pattes d’entrées RA.0 à RA.3 comme entrées digitales. Ces entrées marchant à un niveau TTL, nous aurons donc un ’0’ logique lorsqu’on appliquera 0V à leurs bornes et un ’1’ logique lorsque 5V sera appliqué. De plus nous avons précédemment établi qu’un UART était nécessaire pour la transmission des data séries, nous choisissons donc l’UART0 qui est configuré pour émettre sur la patte PORTC.6 11 BE Systèmes Autonomes INSA Toulouse Voici donc la configuration choisie des I/O : Fonction Port Numéro de patte Capteur Infrarouge 1 A 0 Capteur Infrarouge 2 A 1 Capteur Infrarouge 3 A 2 Capteur Ultrason 1 A 3 UART en transmission(TX) C 6 Remarque : Lors de l’initialisation du microcontrôleur certaines pattes (comme RA.0 à RA.3) sont par défaut initialisées pour fonctionner avec l’ADC donc avec des signaux analogiques et non digitales. Il faut donc modifier le registre ADCON1 dans le but d’utiliser ces pattes comme "digital input" et non "analog input". Il ne reste maintenant qu’à définir l’algorithme de notre programme. Figure 3.2 – Schéma fonctionnel du programme principal Le programme principal ne fait que scruter l’état des capteurs puis toutes les 65ms un Timer entre en interruption pour envoyer les données sérialisées vers le PC. Par exemple, lorsque le capteur ultrason détecte un obstacle, celui-ci met quelques fois quelques µs avant de se stabiliser à 5V, d’où la nécessité de ne pas envoyer une trame série à chaque fois que l’état d’un capteur change. Ce problème pouvait également être réglé par l’ajout d’un filtre anti-rebond avec le PIC mais cette solution était plus confortable à mettre en pratique. De plus le PC ne doit pas recevoir en permanence des trames séries car toute l’intelligence du robot est exécuté dessus, il faut donc qu’il reçoive des trames séries espacées dans le temps. Ces 2 nécessités nous ont conduit à mettre un temps d’échantillonnage compris entre 65µs et 250µs. 5ESE - groupe 2 Page 12/ 27 20 janvier 2014 Chapitre 4 Software embarqué sur le PC Sur la partie software, l’objectif fixé en début de projet, est que l’ordinateur fourni permette de contrôler le robot grâce aux informations reçues par le microcontrôleur, il doit également permettre d’afficher une interface homme/machine. Nous disposons du matériel suivant afin d’attendre cet objectif : – Un ordinateur DELL sous Windows XP avec un port série et plusieurs ports USB. – Une bibliothèque de commande du robot, fourni par le constructeur, compilé sous WINDOWS XP sans fichier source. – UneUn boitier « ER1 ROBOT CONTROL MODULE », qui reçoit en entrée des données séries grâce à une puce FTDI « FT2332AM ». Il envoie des signaux PWM avec drivers « ALLEGRO A3959SLB » 4.1 Une IHM Nous disposons de la bibliothèque « TKINTER » pour développer une IHM sur la machine fournie. TKINTER est une bibliothèque graphique libre d’origine pour le langage Python, permettant la création d’interface graphique. L’inconvénient de cette bibliothèque est que la version installée sur notre machine est très limitée graphiquement comparée à des bibliothèques graphiques récentes comme "Qt". Ce langage donne de meilleurs résultats qu’une bibliothèque graphique. C’est un ensemble de bibliothèques qui met à disposition un ensemble d’outils pour développer des IHM efficaces et modernes. Cependant pour ce projet nos droits sur la machine sont très limités, on ne peut pas installer de nouvelle bibliothèque sans être administrateur. C’est pour cette raison que j’ai décidé de tenter de développer le projet sur ma machine afin de pouvoir utiliser QT, pour cela il fallait d’abord créer le driver de commandes du robot car la bibliothèque fournie sur la machine initiale est non portable. 4.1.1 Développement de driver des commandes de robot portables Afin de vérifier que cela est possible, il faut chercher la liste des valeurs de commande du robot à envoyer au boitier ER1. Un article trouvé sur internet a permis de lister toutes ces commandes par un travail de reverse engineering (en observant les commandes envoyées par les drivers fournis par le constructeur) (voir Annexe). A cette étape, il suffit de savoir comment ouvrir une communication série avec une puce FTDI pour pouvoir communiquer avec le robot. Les fonctions importantes de mon code sont les suivantes : – Ouverture de la liaison – Paramétrage de la liaison – Envoi des commandes Première fonction : Ouverture de la liaison Sous Linux, chaque port série de notre machine est représenté par un fichier de périphérique situé dans le répertoire /dev à côté de dizaines d’autres : 13 BE Systèmes Autonomes – – – – /dev/ttyS0 /dev/ttyS1 /dev/ttyS2 /dev/ttyS3 correspond correspond correspond correspond INSA Toulouse à à à à COM1 COM2 COM3 COM4 Grâce à la bibliothèque « Termios » sur linux, on peut ouvrir un port COM comme un fichier : Open(”/dev/ttyU SB0”, O_RDW R | O_N ON BLOCK | O_N DELAY ); Une fois que le port est ouvert, on peut y lire et y écrire des caractères au moyen des primitives read() et write(). Deuxième fonction : Paramétrage de la liaison Dans la norme POSIX, tous les paramètres d’une liaison sont regroupés dans une structure appelée termios et définie dans le fichier < termios.h > qu’il nous faut donc inclure. Cette structure comporte les champs suivant : struct termios { tcflag_t c_iflag; /* input mode flags */ tcflag_t c_oflag; /* output mode flags */ tcflag_t c_cflag; /* control mode flags */ tcflag_t c_lflag; /* local mode flags */ cc_t c_line; /* line discipline */ cc_t c_cc[NCCS]; /* control characters */ }; La fonction tcgetattr permet d’obtenir les paramètres actuels d’une liaison. En voici le prototype, extrait du man : int tcgetattr ( int fd, struct termios *termios_p ); De plus, avec l’article de reverse engineering nous avons pu récupérer tous les paramètres de la liaison : Paramètre Mode Bit de Parité SANS Bit de Stop 1 bit de stop Taille de trame 8 bit Flow control Sans Timeout 0.5 seconds Vitesse de réception 9600 bits/s Vitesse d’émission 9600 bits/s Troisième fonction : Envoi des commandes Pour envoyer une commande, je me suis servi de deux types de fonction, d’une part une méthode qui remplit une structure de commande, d’autre part celle qui l’envoi. Les paramètres de cette structure sont : typedef struct PWDCmd_struct { BYTE address; // Choix de la roue (gauche « 1 », ou droite « 0 ») . BYTE checksum; // formule de calcul :checksum = ~(adresse + code) + 1; BYTE axis; //Initiaisé par le constructeur souvent a zero. BYTE code; //Valeurs des commandes présentés dans le tableau d’annexe 1. BYTE data [6]; //Peut indiquer vitesse position ... BYTE size; // La taille de la trame envoyé. } PWDCmd; 5ESE - groupe 2 Page 14/ 27 20 janvier 2014 BE Systèmes Autonomes INSA Toulouse Par la suite on envoi la commande grâce à la fonction write, la trame est de la forme suivante : adress checksum axis command name parameters Motion Processor answer Résultat Toutes ces fonctionnalités ont été testées avec la fonction perror() de la bibiliotheque « erno » de linux. Perror est une fonction qui affiche un message d’erreur standard en cas de problème, elle décrit la dernière erreur rencontrée durant un appel système ou une fonction de bibliothèque. La chaîne de caractères retournée contient généralement le nom de la fonction où s’est produite l’erreur. Le numéro d’erreur est obtenu à partir de la variable externe errno, qui contient le code d’erreur lorsqu’un problème survient. A l’exécution de mes fonction la fonction perror ne me retourne aucune erreur, l’ouverture de la liaison et l’envoie se passent sans aucune erreur. Malgré cela, le driver du robot ne répond pas. Mes doutes sont orientés sur une piste de temporisation d’envoi de commande ou un problème d’ordre d’envoi cependant ces pistes d’erreur ne peuvent pas être vérifiées sans installer un snifer sur la machine initiale afin de voir les bonnes temporisations et le bon ordre d’envoi des commandes. 4.1.2 Développement d’IHM sous python Malgré les essais de faire fonctionner le driver sur mon ordinateur, cela n’a pas fonctionné, je me suis rabattu au python et à l’utilisation de la bibliothèque "TKINTER" disponible sur la machine fournie. Pour ce faire, on a créé une class interface qui permet d’initialiser une fenêtre composé d’une image et de boutons. Exemple de création de fenêtre : f1 = Frame(self); Création de self l’objet lié à la fenêtre de l’IHM ; Exemple de création de bouton : self.Start = Button(f1,text="START",fg = "white", bg = "green", command=self.OnStart) ; Le paramètre f1 associe le bouton à la fenêtre f1. Fg et bg correspondent aux couleurs du texte du bouton et le bouton même. Command correspond à la fonction qui se déclenche au clic du bouton. Exemple de fonction associée à un bouton : def Avancer(self): //Définition de la méthode avancer. print("avancer") //affiche au terminal le message avancer. ersp.task.navigation.Move(10,0) //la commande envoyé au robot pour avancer. On utilisant ces trois fonctions, on a développé un pad manuel qui permet de contrôler le robot. Le but est de prendre en main le langage python et les commandes associées au mouvement du robot : Figure 4.1 – Pad de contrôle manuel 5ESE - groupe 2 Page 15/ 27 20 janvier 2014 BE Systèmes Autonomes 4.2 INSA Toulouse Commandes du robot La commande du robot se base sur les informations envoyées en série par le pic, le langage python dispose d’une bibliothèque serial qui nous permet de récupérer facilement les données. Le robot dispose de 3 capteurs infrarouge afin de pouvoir suivre une ligne noire et un capteur d’obstacle. Le tout est disposé de la manière suivante : Figure 4.2 – Disposition des capteurs Selon les informations reçues par le pic, le programme en python engage une action associée : 5ESE - groupe 2 Etats des capteurs (Action, vitesse) du Robot Valeurs des commandes IR-DROIT DROIT FORT V=0, W=-0.5 IR-GAUCHE GAUCHE FORT V=0, W=+0.5 IR-DROIT CENTRE Droit MOYEN V=0, W=-0.2 IR-GAUCHE CENTRE GAUCHE MOYEN V=0, W=+0.2 IR –DROITGAUCHECENTRE TOURNE (le sens selon l’état précédent) Si W<0 : V=3, .W=-0.4 sinon : V=3 , W=0.4 IR-AUCUN TOUT DROIT V=10, W=0 ULTRA SON S’ARRETE V=0, W=0 Page 16/ 27 20 janvier 2014 Table des figures 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Montage astable . . . . . . . . . . . Montage oscillateur à 40kHz . . . . Chaine amplificatrice . . . . . . . . . Détecteur de crête . . . . . . . . . . Signal avant et après détection . . . Signal plus faible (5V) : impact de la Effet des transistors sur le signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 4 5 5 6 6 2.1 2.2 2.3 2.4 2.5 2.6 Générateur de signal carré à 1kHz . . Signal en sortie de l’oscillateur . . . . Chaine de réception IR . . . . . . . . . Chaine de réception IR . . . . . . . . . Pas de détection : 0V transmis au pic Détection : 5V transmis au pic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 9 9 10 10 3.1 3.2 Chronogramme d’une trame série émise par PIC18f2580 . . . . . . . . . . . . . . . . . . . Schéma fonctionnel du programme principal . . . . . . . . . . . . . . . . . . . . . . . . . . 11 12 4.1 4.2 3 4 5 Pad de contrôle manuel Disposition des capteurs Schematic de l’ultrason PCB : vue top . . . . . PCB : vue bottom . . . 15 16 23 24 24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . diode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Annexe A - Schématic et PCB du détecteur IR 18 D C B 9 GND GND Res1 GND 3 GND Cap 10nF PIC1102 8 U3C LM324N D5 COD5 GND 1 PIU101 5 PIU105 3 PIU103 7 PIU107 PIR20 2 GND GND COR3 R3 PIQ101 Cap 1uF C9 COC9 GND PIC702 PIC701 Q1 UJT-N COD9 D9 LED0 COD8 D8 LED0 COD1 D1 LED0 BAL V- 2 LM311P PIU604 6 PIU606 OUT44 NLOUT4 GND PIU601 1 PIU602 2 7 VCC 8 PIU608 PIU607 3 V+ GND R15 COR15 GND GND PIR2701 R27 COR27 Res1 6.8K PIR2702 PIR2601 GND GND GND 2 GND PIC1002 3 Cap 10nF PIC1001 C10 COC10 Res1 10K 7 PIU307 COC5 C5 Cap 100nF COC3 C3 Cap 1uF PID402 PIR1602 Date: File: A4 Size Title PIR1201 PIR1202 1 2 P4 COP4 C8 COC8 Cap 1uF GND PIC802 PIC801 GND GND PIP502 PIP501 1 2 V- 4 Res1 COR5 R5 GND GND GND 1 2 Revision PIP302 PIP301 OUT3 PIP202 1 2 2 OUT2 NLOUT2 PIP201 1 PIP102 PIP101 GND 1 PIU401 7 PIU407 VCC 8 PIU408 OUT1 V+ NLOUT1 OUT1 PIR5011K PIR502 VCC Sheet of Drawn By: P5 COP5 LM311P PIU404 OUT4 4 6 PIU406 2 PIU402 3 PIU403 4 BAL/STB BAL PIU405 U4 COU4 5 GND 1 PIU201 7 PIU207 Cap 100nF V+ VCC 8 PIU208 COC6 C6 -VCC PIC602 PIC601 R12 COR12 3RPot 10K PIR1203 VCC 16/01/2014 C:\Users\..\IR_BOARD.SchDoc Number GND PIP402 PIP401 VCC GND V- BAL/STB LM311P OUT4PIU204 4 6 PIU206 2 PIU202 3 PIU203 COU2 U2 5 PIU205 BAL R16 Diode 1N4148 COR16 Res1 PIR1601 100K PID401 U3B LM324ND4 COD4 GND PIC302 PIC301 GND PIC501 COR10 R10 RPot 1K PIC502 PIR1003 COR8 R8 Res1 PIR801100K PIR802 PIR10 1 PIR10 2 VCC GND PIR1902 R19 COR19 PIR1901 R24 COR24 Res1 PIR2401680 PIR2402 5 PIU305 6 VCC Diode 1N4148 PID301 PID302 PIU306 R18 COR18 Res1 15K PIR1801 PIR1802 D6 COD6 Photo Sen R17 COR17 Res1 10K PIR1701 PIR1702 PID602 PID601 VCC Cap 10nF 1 3 COD3 LM324N D3 COU3 U3A PIU301 PIR902 PIC401 PIC402 COR11 R11 Res1 PIR1 01 680 PIR1 02 Res1 10K C4 COC4 GND PIU301 1 PIU304 VCC COR9 R9 PIR901 PIU303 3 2 PIU302 R26 COR26 Res1 15K OUT4 PIR2602 -VCC Res1 PIR1501 1K OUT3 NLOUT3 PIR1502 VCC GND COR7 R7 Res1 PIR70115K PIR702 COD2 D2 Photo Sen COR6 R6 Res1 PIR60110K PIR602 PID20 PID201 VCC PIU603 BAL/STB U6 COU6 PIU605 Cap 100nF 5 GND PIQ102 PIQ103COQ1 PID902 PID901 PID802 PID801 PID102 PID10 C7 COC7 R14 COR14 PIR302 RPot PIR1403 10K GND PIC902 PIC901 PIR1401 PIR1402 VCC Cap 10nF Res1 2.2K PIR301 C1 COC1 GND PIC102 PIC101 R20 Diode 1N4148 COR20 Res1 PIR20 1 100K PIU3014 PID501 PID502 PIU308 PIR2302 C11 COC11 Res1 10K PIC1101 1 VCC R23 COR23 PIR2301 R25 COR25 PIR2501680 PIR2502 Res1 PIR2 01 15K Res1 10 PIU3012 PIU3010 R22 COR22 PIR210110K PIR2 02 Photo Sen COD7 D7 R21 COR21 PIR2102 PID701 PID702 VCC GND 10nF PIU3013 PIU309 +VCC LM555CM TRIG 8 PIU108 PIR40182K PIC202 C2 COC2 PIC201 Cap Res1 2 PIU102 CVOLT OUT THR PIU106 6 DIS COU1 U1 4 PIU104 RST R4 COR4 PIR402 Res1 PIR20156K COR2 R2 PIR202 VCC Res1 PIR10118 COR1 R1 PIR102 VCC 2 4 11 A 1 4 11 4 11 2 1 P3 COP3 P2 COP2 P1 COP1 COR13 R13 Res1 PIR13011K OUT2 PIR1302 VCC D C B A PAC201 COC2 PAR202 PAR902 PAC402 PAD301 PAD302 PAR802 PAC302 COD3 COR8 COC3 COR10 COC5 PAU201 PAU202 COU2 PAU208 PAU207 PAR502 COR5 Comment Cap Description Designator C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11 Footprint LibRef Quantity RAD-0.2 Cap LED-0 LED0 3 PIN2 Photo Sen 3 DO-35 Diode 1N4148 3 CON2 Header 2 5 TO-39 UJT-N 1 Res1 Capacitor Typical INFRARED GaAs LED D1, D8, D9 Photosensitive Diode D2, D6, D7 High Conductance Fast Diode D3, D4, D5 P1, P2, P3, P4, Header, 2-Pin P5 Unijunction Transistor with N-Type Base Q1 R1, R2, R3, R4, R5, R6, R7, R8, R9, R11, R13, R15, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, Resistor R27 AXIAL-0.3 Res1 24 RPot Potentiometer R10, R12, R14 POT RPot 3 LM555CM U1 P008 LM555CM 1 LM311P Timer Differential Comparator with Strobes U2, U4, U6 P008 LM311P 3 LM324N Quad Differential U3 Input, Low-Power646-06 Operational Amplifier LM324N 1 LED0 Photo Sen Diode 1N4148 Header 2 UJT-N 11 22 BE Systèmes Autonomes INSA Toulouse Annexe B - Schématic et PCB du détecteur US Figure 3 – Schematic de l’ultrason 5ESE - groupe 2 Page 23/ 27 20 janvier 2014 BE Systèmes Autonomes INSA Toulouse Figure 4 – PCB : vue top Figure 5 – PCB : vue bottom 5ESE - groupe 2 Page 24/ 27 20 janvier 2014 Annexe C - Software AdjustActualPostion 0xF5 ClearPositionError 0x47 GetActivityStatus 0xA6 GetActualVelocity 0xAD GetCaptureValue 0x36 GetChecksum 0xF8 GetCommandedAcceleration 0xA7 GetCommandedPostion 0x1D GetCommandedVelocity 0x1E GetCurrentMotorCommand 0x3A GetDerivative 0x9B GetEventStatus 0x31 GetHostIOError 0xA5 GetIntegral 0x9A GetInterruptAxis 0xE1 GetPhaseCommand 0xEA GetPositionError 0x99 GetSignalStatus 0xA4 GetTime 0x3E GetTraceCount 0xBB GetTraceStatus 0xBA GetVersion 0x8F InitializPhase 0x7A NoOperation 0x00 ReadAnalog 0xEF ReadBuffer 0xC9 ReadIO 0x83 Reset 0x39 ResetEventStatus 0x34 SetAcceleration 0x90 GetAcceleration 0x4C SetActualPostion 0x4D GetActualPostion 0x37 SetActualPostionUnits 0xBE GetActualPostionUnits 0xBF SetAutoStopMode 0xD2 GetAutoStopMode 0xD3 SetAxisMode 0x87 GetAxisMode 0x88 SetAxisOutSource 0xED GetAxisOutSource 0xEE SetBreakpoint 0xD4 GetBreakpoint 0xD5 SetBreakpointValue 0xD6 GetBreakpointValue 0xD7 SetBufferFunction 0xCA GetBufferFunction 0xCB SetbufferLength 0xC2 GetBufferLength 0xC3 SetBufferReadIndex 0xC6 25 BE Systèmes Autonomes INSA Toulouse GetBufferReadIndex 0xC7 SetBufferStart 0xC0 GetBufferStart 0xC1 SetBufferWriteIndex 0xC4 GetBufferWriteIndex 0xC5 SetCaptureSource 0xD8 GetCaptureSource 0xD9 SetCommutationMode 0xE2 GetCommutationMode 0xE3 SetDeceleration 0x91 GetDeceleration 0x92 SetDerivativeTime 0x9C GetDerivativeTime 0x9D SetDiagnosticPortMode 0x89 GetDiagnosticPortMode 0x8A SetEncoderModulus 0x8D GetEncoderModulus 0x8E SetEncoderSource 0xDA GetEncoderSource 0xDB SetEncoderToStepRatio 0xDE GetEncoderToStepRatio 0xDF SetIntegrationLimit 0x95 GetIntegrationLimit 0x96 SetInterruptMask 0x2F GetInterruptMask 0x56 SetJerk 0x13 GetJerk 0x58 SetKaff 0x93 GetKaff 0x94 SetKd 0x27 GetKd 0x52 SetKi 0x26 GetKi 0x51 SetKout 0x9E GetKout 0x9F SetKp 0x25 GetKp 0x50 SetKvff 0x2B GetKvff 0x54 SetLimitSwitchMode 0x80 GetLimitSwitchMode 0x81 SetMotionCompleteMode 0xEB GetMotionCompleteMode 0xEC SetMotorBias 0x0F GetMotorBias 0x2D SetMotorCommand 0x77 GetMotorCommand 0x69 SetMotorLimit 0x06 GetMotorLimit 0x07 SetMotorMode 0xDC GetMotorMode 0xDD SetNumberPhases 0x85 GetNumberPhases 0x86 SetOutputMode 0xE0 GetOutputMode 0x6E SetPhaseAngle 0x84 GetPhaseAngle 0x2C SetPhaseCorrectionMode 0xE8 GetPhaseCorrectionMode 0xE9 SetPhaseCounts 0x75 SetPhaseInitializeMode 0xE4 5ESE - groupe 2 Page 26/ 27 20 janvier 2014 BE Systèmes Autonomes INSA Toulouse GetPhaseInitializeMode 0xE5 SetPhaseInitializeTime 0x72 GetPhaseInitializeTime 0x7C SetPhaseOffset 0x76 GetPhaseOffset 0x7B SetPhasePrescale 0xE6 GetPhasePrescale 0xE7 SetPostion 0x10 GetPostion 0x4A SetPostionErrorLimit 0x97 GetPostionErrorLimit 0x98 SetProfileMode 0xA0 GetProfileMode 0xA1 SetSampleTime 0x38 GetSampleTime 0x61 SetSerialPortMode 0x8B GetSerialPortMode 0x8C SetSettleTime 0xAA GetSettleTime 0xAB SetSettleWindow 0xBC GetSettleWindow 0xBD SetSignalSense 0xA2 GetSignalSense 0xA3 SetStartMode 0xCC GetStartMode 0xCD SetStartVelocity 0x6A GetStartVelocity 0x6B SetStopMode 0xD0 GetStopMode 0xD1 SetSynchronizationMode 0xF2 GetSynchronizationMode 0xF3 SetTraceMode 0xB0 GetTraceMode 0xB1 SetTracePeriod 0xB8 GetTracePeriod 0xB9 SetTraceStart 0xB2 GetTraceStart 0xB3 SetTraceStop 0xB4 GetTraceStop 0xB5 SetTraceVariable 0xB6 GetTraceVariable 0xB7 SetTrackingWindow 0xA8 GetTrackingWindow 0xA9 SetVelocity 0x11 GetVelocity 0xAB Update 0x1A WriteBuffer 0xC8 WriteIO 0x82 5ESE - groupe 2 Page 27/ 27 20 janvier 2014