***
Mise à jour le 26/02/2017
Sommaire :
- Présentation de l’article .
- Les différentes étapes pour pouvoir appréhender le fonctionnement .
- étape 1 : le but étant est de faire apparaître sur l’écran des mots,on devra actionner un potentiomètre et c’est cette valeur analogique qui nous déterminera l’action à entreprendre.
- Présentation de l’exercice
- Schéma de raccordement de l’afficheur et de la carte Arduino 2560
- Programme
- étape 2 : Le but est de faire apparaître sur l’écran les yeux suivant : le premier étend attentif, le second penaud et enfin d’effacer l’écran.
- étape 1 : le but étant est de faire apparaître sur l’écran des mots,on devra actionner un potentiomètre et c’est cette valeur analogique qui nous déterminera l’action à entreprendre.
Retour au sommaire |
Présentation de l’article . |
Dans cet article, nous allons étudier comment les yeux et la bouche de Maya sont pilotés, mais je pense qu’il est important de faire un petit rappel des objectifs de fonctionnement et du résultat à obtenir.
***
Comment transposer des expressions humaines à un robot ?
Nous avons donc pensé que les yeux étaient un bon départ pour déterminer des expressions humaines transposées à la machine .Ces expressions seront de plusieurs natures, un regard attentif, penaud, en colère etc. et même quelques expressions comme un clin d’œil .Nous avons donc développé rapidement quelques expressions, puis nous avons mis côte à côte 2 écrans pour imaginer le reste de la tête de Maya. Évidemment au premier coup d’œil il manquait quelque chose, la bouche, eh ! Oui c’est une partie du visage qui peut définir énormément d’expression ne serait-ce que déjà simulé la parole.
Enfin si on regarde l’ensemble de la tête de notre futur robot les deux yeux et la bouche sont d’un couple parfait comme chez l’humain d’ailleurs. Et oui de ce couple on peut créer des expressions un peu plus complexes avec des paliers.
Je m’explique dans la phase bonheur on peut avoir plusieurs types de bonheur comme par exemple être simplement souriant, avoir un petit sourire mignon qui pourrait être par exemple une bouche un peu plus ouverte ou un sourire heureux, ou très heureux.
Dans le désarroi, on peut avoir le boudeur, le déçu, mécontent, très mécontent.
Enfin on peut greffer d’autres types d’expression humaine comme l’admiration, la maladie, blasé, espiègle, une fausse innocente, divers types de gènes, brefs, tout un ensemble que l’on va pouvoir créer. Plus cette machine possédera d’expression humaine, plus sa différence nous surprendra.
Passons maintenant à la configuration de cet ensemble. Chaque œil est représenté par un écran LCD, qui est lui-même relié à une carte Arduino méga 2560 (cette carte a été choisie pour ne pas restreindre les applications futures). Ces deux cartes seront pilotées par une carte mère qui enverra les informations aux deux cartes esclaves par l’intermédiaire d’un bus I2C, cette même carte mère aura aussi la double fonction de piloter le mouvement des lèvres.
Nous allons donc étudier tout au long de cet article comment arriver au fonctionnement final, mais pour cela nous allons passer par des étapes intermédiaires.
Retour au sommaire |
Etape n°1 |
Présentation de l’exercice
Le but est de faire apparaître sur l’écran des mots, le premier étend attentif, le second penaud et enfin d’effacer l’écran. Pour pouvoir passer d’un message à l’autre ou d’effacer l’écran, on devra actionner un potentiomètre et c’est cette valeur analogique qui nous déterminera l’action à entreprendre.
Schéma de raccordement de l’afficheur et de la carte Arduino 2560
Pour connecter l’écran LCD A000096 à une carte Arduino Mega, utilisez cette configuration de broche.
Programme
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
/* * * * * le but est de faire apparaître sur l’écran des mots, le premier étend * attentif, le second penaud et enfin d’effacer l’écran. Pour pouvoir * passer d’un message à l’autre ou d’effacer l’écran, on devra actionner * un potentiomètre et c’est cette valeur analogique qui nous déterminera * l’action à entreprendre. * * * code projet : Affichage_texte * * Herve Mazelin - RedOhm * 17/01/2017 */ // je charge la librairie SPI // Cette librairie vous permet de communiquer avec des périphériques SPI // La carte Arduino en tant que "maitre" #include <SPI.h> // je charge la librairie TFT // Cette bibliothèque permet à une carte Arduino de communiquer à // l'écran LCD TFT #include <TFT.h> // Affectation des pins pour la communication Arduino-> afficheur #define cs 10 #define dc 9 #define rst 8 TFT screen = TFT(cs, dc, rst); // déclaration de l'entrée analogique int analogPin = 0; // variable de type int pour stocker la valeur du potentiometre int val = 0; // variable du type int pour stocker la valeur de passage dans le controle // si la valeur val et strictement inférieure à 100 int cont1= 0; // variable du type int pour stocker la valeur de passage dans le controle // si la valeur val et strictement comprise de 105 a 200 int cont2= 0; // Un programme Arduino doit impérativement contenir la fonction "setup" // Elle ne sera exécuter une seule fois au démarrage du microcontroleur // Elle sert à configurer globalement les entrées sorties void setup() { // initialisation de l'écran screen.begin(); // Efface l'écran LCD avec la couleur indiquée. // Peut être utilisée dans loop () pour effacer l'écran. // Couleur du fond noir screen.background(0,0,0); } // Le programme principal s’exécute par une boucle infinie appelée Loop () void loop() { // lit la valeur de la tension analogique présente sur la broche val = analogRead(analogPin); // si la valeur val et strictement inférieure à 100 // on affiche le texte Attentif if ((val<100) &&(cont1==0)){ // Efface l'ecran couleur du fond noir screen.background(0,0,0); // Dans ce cas defini la couleur du texte screen.stroke(255,255,255); // Définit la taille du texte qui suit. La taille par défaut // est "1". Chaque changement de taille augmente le texte // par 10 pixels en hauteur. Autrement dit, la taille 1 = 10 // pixels, taille 2 = 20 pixels, et ainsi de suite. screen.setTextSize(2); // Écrire un texte à l'écran aux coordonnées données. screen.text("Attentif", 0, 0); // mise de la variable cont1 a 1 pour la confirmation du // passage dans la boucle de test attentif cont1=1; // Remise a zero de la variable de controle Penaud 1 cont2=0; } // si la valeur val et strictement inférieure à 100 // on affiche le texte Penaud 1 else if (((val>105)&&(val<200))&&(cont2==0)){ // Efface l'ecran couleur du fond noir screen.background(0,0,0); // Dans ce cas defini la couleur du texte screen.stroke(255,255,255); // Définit la taille du texte qui suit. La taille par défaut // est "1". Chaque changement de taille augmente le texte // par 10 pixels en hauteur. Autrement dit, la taille 1 = 10 // pixels, taille 2 = 20 pixels, et ainsi de suite. screen.setTextSize(2); // Écrire un texte à l'écran aux coordonnées données. screen.text("Penaud 1 ", 0, 0); // mise de la variable cont2 a 1 pour la confirmation du // passage dans la boucle de test Penaud 1 cont2=1; // Remise a zero de la variable de controle attentif cont1=0; } // si la valeur val et strictement superieure a 1000 // on efface l'ecran avec la commande -> screen.background(0,0,0) else if (val>1000){ // on efface l ecran screen.background(0,0,0); // Remise a zero de la variable de controle attentif cont1=0; // Remise a zero de la variable de controle penaud cont2=0; } } |
Etape n°2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 |
/* * * * * le but est de faire apparaître sur l’écran les yeux suivant : le premier * étend attentif, le second penaud et enfin d’effacer l’écran. Pour pouvoir * passer d’un dessin à l’autre ou d’effacer l’écran, on devra actionner * un potentiomètre et c’est cette valeur analogique qui nous déterminera * l’action à entreprendre. * * * code projet : 0001-Affichage dessin attentif et penaud * * Herve Mazelin - RedOhm * 22/01/2017 */ // je charge la librairie SPI // Cette librairie vous permet de communiquer avec des périphériques SPI // La carte Arduino en tant que "maitre" #include <SPI.h> // je charge la librairie TFT // Cette bibliothèque permet à une carte Arduino de communiquer à // l'écran LCD TFT #include <TFT.h> // Affectation des pins pour la communication Arduino-> afficheur #define cs 10 #define dc 9 #define rst 8 TFT screen = TFT(cs, dc, rst); // déclaration de l'entrée analogique int analogPin = 0; // variable de type int pour stocker la valeur du potentiometre int val = 0; // variable du type int pour stocker la valeur de passage dans le controle // si la valeur val et strictement inférieure à 100 int cont1= 0; // variable du type int pour stocker la valeur de passage dans le controle // si la valeur val et strictement comprise de 105 a 200 int cont2= 0; // variable du type int pour la boucle creation de l'oeil int x; // Un programme Arduino doit impérativement contenir la fonction "setup" // Elle ne sera exécuter une seule fois au démarrage du microcontroleur // Elle sert à configurer globalement les entrées sorties void setup() { // initialisation de l'écran screen.begin(); // Efface l'écran LCD avec la couleur indiquée. // Peut être utilisée dans loop () pour effacer l'écran. // Couleur du fond noir screen.background(0,0,0); } // Le programme principal s’exécute par une boucle infinie appelée Loop () void loop() { // lit la valeur de la tension analogique présente sur la broche val = analogRead(analogPin); // si la valeur val et strictement inférieure à 100 // on affiche le dessin de l'oeil attentif if ((val<100) &&(cont1==0)){ // Appel de la fonction -> creation_de_oeil creation_de_oeil(); // Mise a 1 de la variable cont1 qui determine que // l’on a déjà traversé cette instruction enfin // d’éviter le clignotement de l’œil cont1=1; // Remise a zero de la variable de controle Penaud 1 cont2=0; } // si la valeur val et strictement inférieure à 200 // et superieur a 105 on affiche le texte Penaud 1 else if (((val>105)&&(val<200))&&(cont2==0)){ // Appel de la fonction -> creation_de_oeil creation_de_oeil(); // Appel de la fonction -> creation_penaud creation_penaud(); // Mise a 1 de la variable cont2 qui determine que // l’on a déjà traversé cette instruction enfin // d’éviter le clignotement de l’œil cont2=1; // Remise a zero de la variable de controle attentif cont1=0; } // si la valeur val et strictement superieure a 1000 // on efface l'ecran avec la commande -> screen.background(0,0,0) else if (val>1000){ // on efface l ecran screen.background(0,0,0); // Remise a zero de la variable de controle attentif cont1=0; // Remise a zero de la variable de controle penaud cont2=0; } } /* * la creation de la fonction -> creation_de_oeil * * a savoir : la creation d'une fonction est independante du programme * principal.Elle sera donc en dehors du programme principal * */ void creation_de_oeil() { // Efface l'ecran et met le fond en noir screen.background(0,0,0); //defini la couleur pour tracer l'objet a dessiner screen.stroke(255,255,255); // 1 anneau exterieure bleu // définition de la couleur de remplissage exemple bleu -> 128,255,255 screen.fill(128,255,255); // je dessine un annneau exterieur dans le centre de l'écran // je prend la largeur de l'ecran que je divise par 2 // je prend la hauteur de l'ecran que je divise par 2 screen.circle(screen.width()/2, screen.height()/2, 60); //dessine le trait horizontal et vertical //defini la couleur pour tracer l'objet a dessiner en noir screen.stroke(0,0,0); // Trace trois lignes horizontale qui traverse l'ecran for (x=0;x<3;x++) { screen.line(1,63+x,159,63+x); } // Trace une ligne verticale qui traverse l'ecran d'une epaisseur de // 3 pixels for (x=0;x<3;x++) { screen.line (79+x,1,79+x,127); } // 2 cercle // définit la couleur de remplissage exemple gris 127.127.127 screen.fill(0,0,0); // je dessine un cercle dans le centre de l'écran screen.circle(screen.width()/2, screen.height()/2, 45); // 3 cercle // définit la couleur de remplissage exemple gris 127.127.127 screen.fill(136,136,136); // je dessine un cercle dans le centre de l'écran screen.circle(80, 64, 35); // 4 cercle // définit la couleur de remplissage exemple noir 0.0.0 screen.fill(0,0,0); // je dessine un cercle dans le centre de l'écran screen.circle(screen.width()/2, screen.height()/2, 25); } /* * la creation de la fonction -> Dessin de l'oeil penaud * * a savoir : la creation d'une fonction est independante du programme * principal.Elle sera donc en dehors du programme principal * */ void creation_penaud() { // je dessine un triangle // Boucle comptant de 0 a 80 avec un increment de 1 // for (initialisation ; condition ; increment) // entre crochet { instructions executees dans la boucle } for( x=0;x<80;x++){ // définit la couleur de remplissage exemple noir 255.255.255 screen.fill(255,255,255); // dessine une ligne entre deux points les parametres : // xStart) int, la position horizontale où la ligne commence // ystart) int, la position verticale où la ligne commence // xEnd) int, la position horizontale où la ligne se termine // yEnd) int, la position verticale où les extrémités de la ligne // screen.line (xStart,ystart,xEnd,yEnd); screen.line (0,0,160,x); } // je dessine le 2eme triangle je modifie la position verticale // ou la ligne commence // Boucle comptant de 0 a 20 avec un increment de 1 // for (initialisation ; condition ; increment) // entre crochet { instructions executees dans la boucle } for( x=0;x<20;x++){ // définit la couleur de remplissage exemple noir 255.255.255 screen.fill(255,255,255); // dessine une ligne entre deux points les parametres : // xStart) int, la position horizontale où la ligne commence // ystart) int, la position verticale où la ligne commence // xEnd) int, la position horizontale où la ligne se termine // yEnd) int, la position verticale où les extrémités de la ligne // screen.line (xStart,ystart,xEnd,yEnd); screen.line (0,x,160,79); } } |
Retour au sommaire |