IMA5 2019/2020 P11 : Différence entre versions
(→Programme sur le contrôleur PI) |
(→Documents Rendus) |
||
(77 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 141 : | Ligne 141 : | ||
| | | | ||
|style="text-align:center;" bgcolor="#B0F2B6" | 3 | |style="text-align:center;" bgcolor="#B0F2B6" | 3 | ||
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 2 |
| | | | ||
| | | | ||
Ligne 161 : | Ligne 161 : | ||
| | | | ||
| | | | ||
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 2 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 2 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 2 |
| | | | ||
| | | | ||
Ligne 177 : | Ligne 177 : | ||
| | | | ||
| | | | ||
+ | |style="text-align:center;" bgcolor="#B0F2B6" | 3 | ||
| | | | ||
| | | | ||
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 2 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 4 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 3 |
− | | | ||
|style="text-align:center;" | | |style="text-align:center;" | | ||
|- | |- | ||
Ligne 191 : | Ligne 191 : | ||
| style="text-align:center;" bgcolor="#B0F2B6" | 1 | | style="text-align:center;" bgcolor="#B0F2B6" | 1 | ||
| style="text-align:center;" bgcolor="#B0F2B6" | 1 | | style="text-align:center;" bgcolor="#B0F2B6" | 1 | ||
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 1 |
|style="text-align:center;" | 5 | |style="text-align:center;" | 5 | ||
|- | |- | ||
Ligne 207 : | Ligne 207 : | ||
|style="text-align:center;" bgcolor="#B0F2B6" | 2 | |style="text-align:center;" bgcolor="#B0F2B6" | 2 | ||
|style="text-align:center;" bgcolor="#B0F2B6" | 2 | |style="text-align:center;" bgcolor="#B0F2B6" | 2 | ||
+ | |style="text-align:center;" bgcolor="#B0F2B6" | 1 | ||
|style="text-align:center;" bgcolor="#B0F2B6" | 1 | |style="text-align:center;" bgcolor="#B0F2B6" | 1 | ||
| | | | ||
| | | | ||
+ | |style="text-align:center;" bgcolor="#B0F2B6" | 2 | ||
| | | | ||
+ | |style="text-align:center;" bgcolor="#B0F2B6" | 1 | ||
| | | | ||
− | | | + | |style="text-align:center;" bgcolor="#B0F2B6" | 2 |
− | + | |style="text-align:center;" bgcolor="#B0F2B6" | 2 | |
− | | | ||
− | | | ||
− | | | ||
|style="text-align:center;" |7 | |style="text-align:center;" |7 | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
!scope=col style="text-align:center;" | Total | !scope=col style="text-align:center;" | Total | ||
Ligne 242 : | Ligne 226 : | ||
!scope=col style="text-align:center;" | 12 | !scope=col style="text-align:center;" | 12 | ||
!scope=col style="text-align:center;" | 11 | !scope=col style="text-align:center;" | 11 | ||
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 6 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 2 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 3 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 6 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 3 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 4 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 5 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 7 |
− | !scope=col style="text-align:center;" | | + | !scope=col style="text-align:center;" | 6 |
|style="text-align:center;" bgcolor="#A1D4E5" | | |style="text-align:center;" bgcolor="#A1D4E5" | | ||
|} | |} | ||
Ligne 675 : | Ligne 659 : | ||
Je me réfère au projet IMA4 de 2015 concernant la commande de servos bioloid pilotés par Arduino. J‘utilise un buffer permettant de commander les servos. | Je me réfère au projet IMA4 de 2015 concernant la commande de servos bioloid pilotés par Arduino. J‘utilise un buffer permettant de commander les servos. | ||
− | |||
− | |||
===Tester les servos avec l'Arduino=== | ===Tester les servos avec l'Arduino=== | ||
Ligne 700 : | Ligne 682 : | ||
Après avoir ajouté l'inverseur, j'ai réessayé de tester le circuit avec un exemple de code. Le moteur a tourné avec succès. J'ai ouvert le moniteur série en même temps, on peut voir les informations imprimées et connaître la rotation du moteur. On peut utiliser des programmes pour ajuster différents moteurs, y compris le sens de rotation, la vitesse de rotation et l'angle de rotation. | Après avoir ajouté l'inverseur, j'ai réessayé de tester le circuit avec un exemple de code. Le moteur a tourné avec succès. J'ai ouvert le moniteur série en même temps, on peut voir les informations imprimées et connaître la rotation du moteur. On peut utiliser des programmes pour ajuster différents moteurs, y compris le sens de rotation, la vitesse de rotation et l'angle de rotation. | ||
− | ==Semaine | + | ==Semaine 15 :16 Décembre - 22 Décembre (soutenance 1)== |
==Semaine 16 & 17 :06 Janvier - 19 Janvier== | ==Semaine 16 & 17 :06 Janvier - 19 Janvier== | ||
Ligne 756 : | Ligne 738 : | ||
Pour cette semaine, j'ai vérifié le circuit pour voir si les broches de chaque composant étaient correctement connectées. Ensuite, j’ai dessiné le PCB, comme ci-dessus : | Pour cette semaine, j'ai vérifié le circuit pour voir si les broches de chaque composant étaient correctement connectées. Ensuite, j’ai dessiné le PCB, comme ci-dessus : | ||
− | [[Fichier: | + | [[Fichier:deux.jpeg]] |
===Rendez-vous avec M.Blaise CONRARD - 06/01/2020=== | ===Rendez-vous avec M.Blaise CONRARD - 06/01/2020=== | ||
Ligne 820 : | Ligne 802 : | ||
[[Fichier:mm.jpeg]] | [[Fichier:mm.jpeg]] | ||
− | Enfin, en raison d'un temps insuffisant, on a choisi d'utiliser le plaque d'essai pour réaliser la partie électronique. J’ai ajouté les broches pour le connecter avec l’Arduino. Après j’ai fini la soudure, je l’ai testé. Les moteurs tournent bien avec les commandes de Arduino. La carte soudée est comme ci-dessous : | + | Enfin, en raison d'un temps insuffisant et des raisons techniques, après avoir écouté les conseils du encadrant et du département électronique, on a choisi d'utiliser le plaque d'essai pour réaliser la partie électronique. Après avoir fait la soudure, je l’ai testé mais j’ai fait une erreur. En fait, les composants sont alimentés par l’Arduino, l’Arduino et les servomoteurs sont alimentés par le batterie 9V. Il faut connecter la pôle positive à Vin sur l’Arduino. Je l’ai connecté à 5V sur l’Arduino. Donc il est court-circuité. L’inverseur 74HC04N est tombé en panne. Je l’ai remplacé par le composant 74LS86AN, c’est un composant logique XOR. |
+ | |||
+ | [[Fichier:xor.jpeg]] | ||
+ | |||
+ | Selon le principe, la deuxième broche est comme l’entrée et la troisième broche est comme la sortie. Il faut connecter la première broche à Vcc. Dans ce cas, selon le logique, l’entrée et la sortie sont inverses. Et puis j’ai ajouté le composant 74LS86AN et réalisé la soudure. J’ai ajouté les broches pour le connecter avec l’Arduino. Après j’ai fini la soudure, je l’ai testé. Les moteurs tournent bien avec les commandes de Arduino. La carte soudée est comme ci-dessous : | ||
[[Fichier:mnb.jpeg]][[Fichier:bnm.jpeg]] | [[Fichier:mnb.jpeg]][[Fichier:bnm.jpeg]] | ||
Ligne 861 : | Ligne 847 : | ||
Dynamixel.move(1, 654.7); | Dynamixel.move(1, 654.7); | ||
− | |||
Dynamixel.move(2, 716.7); | Dynamixel.move(2, 716.7); | ||
Ligne 896 : | Ligne 881 : | ||
[[Fichier:4f.jpeg]] [[Fichier:2f.jpeg]] | [[Fichier:4f.jpeg]] [[Fichier:2f.jpeg]] | ||
− | Enfin, la structure mécanique est terminée, comme la suivante : | + | Enfin, j'ai ajouté les mûrs pour limiter le mouvement de la balle. La structure mécanique est terminée, comme la suivante : |
− | [[Fichier: | + | [[Fichier:zong.jpeg]] |
===Programme sur le contrôleur P (proportion)=== | ===Programme sur le contrôleur P (proportion)=== | ||
Ligne 904 : | Ligne 889 : | ||
P : Effet d'ajustement proportionnel : l'écart du système est reflété de manière proportionnelle.Une fois qu'un écart se produit dans le système, l'ajustement proportionnel produit immédiatement un effet d'ajustement pour réduire l'écart. Le grand effet proportionnel peut accélérer le réglage et réduire l'erreur, mais une proportion trop grande réduira la stabilité du système et même rendra le système instable. | P : Effet d'ajustement proportionnel : l'écart du système est reflété de manière proportionnelle.Une fois qu'un écart se produit dans le système, l'ajustement proportionnel produit immédiatement un effet d'ajustement pour réduire l'écart. Le grand effet proportionnel peut accélérer le réglage et réduire l'erreur, mais une proportion trop grande réduira la stabilité du système et même rendra le système instable. | ||
− | Le principe de | + | Le principe de P est comme ci-dessous : |
− | + | U(t) = Kp * Err(t) | |
Plus la bille est éloigné de la position cible, plus le moteur tourne; plus la bille est proche de la position cible, plus le moteur est proche de la position initiale. Sur le principe, il faut définir plusieurs variables. | Plus la bille est éloigné de la position cible, plus le moteur tourne; plus la bille est proche de la position cible, plus le moteur est proche de la position initiale. Sur le principe, il faut définir plusieurs variables. | ||
Ligne 912 : | Ligne 897 : | ||
void Pid_controlClass :: PID_init(){ | void Pid_controlClass :: PID_init(){ | ||
printf("PI_init begin \n"); | printf("PI_init begin \n"); | ||
− | pi. | + | pi.SetPositionX=0.0; |
− | pi. | + | pi.ActualPositionX=0.0; |
− | pi. | + | pi.errX=0.0; |
− | pi. | + | pi.voltageX=0.0; |
− | pi. | + | pi.SetPositionY=0.0; |
− | pi. | + | pi.ActualPositionY=0.0; |
+ | pi.errY=0.0; | ||
+ | pi.voltageY=0.0; | ||
pi.Kp=0.2; | pi.Kp=0.2; | ||
− | pi. | + | pi.angleX=0.0; |
− | pi. | + | pi.angleY=0.0; |
printf("PI_init end \n"); | printf("PI_init end \n"); | ||
} | } | ||
− | L'erreur est la distance entre la position actuelle et la position cible. Définissez une valeur intégrale pour additionner chaque erreur. Utilisez ensuite le principe de contrôle | + | L'erreur est la distance entre la position actuelle et la position cible. Définissez une valeur intégrale pour additionner chaque erreur. Utilisez ensuite le principe de contrôle P pour stocker les résultats du calcul dans pi.voltage. Les servomoteurs étant fixés sur la planche du bas, la plage de rotation est limitée. Et j'ai déjà déterminé la plage haute et basse de rotation du moteur. J'ai donc fixé les valeurs maximales et minimales pour limiter la plage de rotation du moteur. J'ai écrit deux fonctions pour contrôler les axes X et Y respectivement. Prenons l'exemple de l'axe des X : |
+ | |||
+ | float Pid_controlClass :: PID_realizeX(float PositionX){ | ||
+ | pi.SetPositionX=PositionX; | ||
+ | pi.errX=pi.SetPositionX-pi.ActualPositionX; | ||
+ | pi.integralX+=pi.errX; | ||
+ | pid.voltage=pid.Kp*pid.err; | ||
+ | pi.angle1=-3*pi.voltageX+624.7; | ||
+ | if (pi.angle1>757) pi.angle1=757; | ||
+ | if (pi.angle1<450) pi.angle1=450; | ||
+ | return pi.angle1; | ||
+ | } | ||
+ | |||
+ | Ensuite, dans le programme principal. Il faut ajouter des instructions à la fonction d'initialisation afin que le moteur puisse revenir à sa position initiale avant que le système ne fonctionne à chaque fois. | ||
+ | |||
+ | Dynamixel.move(1,654.7); | ||
+ | Dynamixel.move(2,716.7); | ||
− | + | Avant le test, j'ai défini la position cible sur le point central de la planche du haut (170, 80). La bille doit se rapprocher du point central à n'importe quelle position. La position actuelle de la bille est mise à jour en temps réel en fonction des coordonnées collectées par la caméra. La position où le moteur tourne est la valeur de retour de la fonction de contrôleur P. | |
− | + | Pid_control.pi.ActualPositionX = x; | |
+ | Pid_control.pi.ActualPositionY = y; | ||
+ | Serial.println(Pid_control.PID_realizeX(Px)); | ||
+ | Serial.println(Pid_control.PID_realizeY(Py)); | ||
+ | //Serial.println(Pid_control.pi.voltageX); | ||
+ | Dynamixel.moveSpeed(1,Pid_control.PID_realizeX(Px),200); | ||
+ | Dynamixel.moveSpeed(2,Pid_control.PID_realizeY(Py),200); | ||
+ | |||
+ | Le résultat du test est que la bille se déplace dans un mouvement circulaire autour du point central. Mais parce que la structure n'est pas stable, les résultats des tests ne sont pas précis et stables. | ||
===Rendez-vous avec M.Blaise CONRARD - 04/02/2020=== | ===Rendez-vous avec M.Blaise CONRARD - 04/02/2020=== | ||
Ligne 949 : | Ligne 960 : | ||
==Semaine 21 :10 Février - 16 Février== | ==Semaine 21 :10 Février - 16 Février== | ||
+ | |||
+ | ===Carte électronique (PCB)=== | ||
+ | |||
+ | Avant, en raison du composant manquant 74LS241N, j'ai choisi de remplacer ce composant par un buffer non inverseur 74LS244N. M.REDON a acheté un composant 74LS241N beaucoup plus adapté que le LS244 qui m'a été fourni et que du coup mon PCB était plus difficile à router. M.REDON a dessiné un PCB avec le composant 74LS241N comme ci-dessous : | ||
+ | |||
+ | [[Fichier:241N.jpeg]] | ||
+ | |||
+ | Sur ce PCB, il y a des LEDs pour afficher l'état du système, et il y a un bouton et un interrupteur pour contrôler le système. M.REDON a aussi ajouté les broches qui sont pour connecter avec les servomoteurs et la caméra. La carte est comme suivante : | ||
+ | |||
+ | [[Fichier:pingg.jpeg]][[Fichier:xie.jpeg]] | ||
+ | |||
+ | ===Réaliser la trajectoire carée=== | ||
+ | |||
+ | À base du programme avant, l'objectif prochain est de réaliser un trajectoire en carré. D'abords, j'ai mis quatre set-points au coin de la planche. | ||
+ | |||
+ | typedef struct cible_position{ | ||
+ | uint16_t x; | ||
+ | uint16_t y; | ||
+ | }point_parcours; | ||
+ | point_parcours *parcours; | ||
+ | |||
+ | parcours = (point_parcours*)malloc(4 * sizeof(struct cible_position)); | ||
+ | parcours[0].x=108; | ||
+ | parcours[0].y=138; | ||
+ | parcours[1].x=108; | ||
+ | parcours[1].y=33; | ||
+ | parcours[2].x=233; | ||
+ | parcours[2].y=33; | ||
+ | parcours[3].x=233; | ||
+ | parcours[3].y=138; | ||
+ | |||
+ | Dans le même temps, car la position de la balle est sensible au changement, et il faut un certain temps à la caméra pour récupérer la balle. Par conséquent, si la position cible que nous définissons est des coordonnées de point, il n'y a aucune garantie que la caméra puisse collecter des données lorsque la balle atteint la position cible. Dans ce cas, j'ai décidé de définir la position cible à un intervalle. Lorsque la balle atteint l'intervalle cible désigné, l'intervalle cible est automatiquement changé pour le suivant. | ||
+ | |||
+ | void Pid_controlClass :: position_cible(){ | ||
+ | if((pi.X_reel<=parcours[pi.i].x+15)&(pi.X_reel>=parcours[pi.i].x-15)&(pi.Y_reel<=parcours[pi.i].y+15)&(pi.Y_reel>=parcours[pi.i].y-15)){ | ||
+ | pi.i++; | ||
+ | if(pi.i==4){ | ||
+ | pi.i=0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Après les tests, j'ai constaté que le ballon accélère toujours en se déplaçant vers la position cible. En effet, sous le contrôle du contrôleur P, lorsque la petite balle se déplace du côté de la position cible, la direction d'inclinaison de la tablette est toujours la même. Cela fait que le ballon continue d'accélérer, et lorsqu'il atteint la position cible, la vitesse est trop élevée pour s'arrêter. Par conséquent, j'ai changé la position cible dans la fonction de commande P au milieu de la longueur du côté carré. Cela maintient le ballon proche de 0 lorsqu'il atteint les 4 zones cibles définies précédemment, ce qui est plus stable. | ||
+ | |||
+ | if (pi.i==3){ | ||
+ | pi.X_cible=(parcours[0].x+parcours[3].x)/2; | ||
+ | }else{ | ||
+ | pi.X_cible=(parcours[pi.i].x+parcours[pi.i+1].x)/2; | ||
+ | } | ||
+ | if (pi.i==3){ | ||
+ | pi.Y_cible=(parcours[0].y+parcours[3].y)/2; | ||
+ | }else{ | ||
+ | pi.Y_cible=(parcours[pi.i].y+parcours[pi.i+1].y)/2; | ||
+ | } | ||
+ | |||
+ | Pour que le ballon se déplace en ligne droite, il faut assurer qu'un seul moteur est actionné par mouvement. L'autre moteur reste en position initiale. Par conséquent, en fonction de la relation définie entre les moteurs et l'axe x et l'axe y, le moment où les deux moteurs reviennent à la position initiale peut être déterminé. Pour le moteur qui fonctionne, l'angle de rotation est contrôlé selon le principe du contrôle proportionnel. | ||
+ | |||
+ | if(pi.i==1|pi.i==3){ | ||
+ | pi.angleX=640.7; | ||
+ | }else{ | ||
+ | if(pi.voltageX>=0){ | ||
+ | pi.angleX=640.7-2*pi.voltageX; | ||
+ | } | ||
+ | else if(pi.voltageX<0){ | ||
+ | pi.angleX=640.7-1*pi.voltageX; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Selon les tests, lorsque le moteur monte et descend à la même angle, l'inclinaison de la planche dans les deux sens opposés est différente. Grâce à l'analyse géométrique, les résultats sont les suivants : | ||
+ | |||
+ | [[Fichier:incli.jpeg]] | ||
+ | |||
+ | J'ai donc besoin d'ajuster le coefficient d'inclinaison de la plaque des deux côtés. Le coefficient du côté où la pente est faible est grand et le coefficient du côté où la pente est élevée est petit. Cela garantit que l'inclinaison est presque la même lorsque la plaque est inclinée des deux côtés. | ||
+ | |||
+ | if(pi.voltageX>=0){ | ||
+ | pi.angleX=640.7-2*pi.voltageX; | ||
+ | } | ||
+ | else if(pi.voltageX<0){ | ||
+ | pi.angleX=640.7-1*pi.voltageX; | ||
+ | } | ||
+ | |||
+ | ===Répéter la trajectoire spécifiée === | ||
+ | |||
+ | Après avoir mis en œuvre le mouvement carré de la balle, j'ai changé la position cible. Puisque le carré est un chemin régulier, mais notre objectif est que le ballon effectue un mouvement répétant selon la trajectoire prescrit. J'ai donc défini une trajectoire irrégulier et défini plusieurs positions cibles. De plus, il y a une ligne droite entre les deux positions cibles pour garantir que la balle se déplace dans une seule direction. De cette façon, le principe que j'ai utilisé pour implémenter le mouvement carré s'applique également ici. On a juste besoin de changer les positions cibles. | ||
+ | |||
+ | parcours = (point_parcours*)malloc(8 * sizeof(struct cible_position)); | ||
+ | parcours[0].x=250; | ||
+ | parcours[0].y=167; | ||
+ | parcours[1].x=140; | ||
+ | parcours[1].y=165; | ||
+ | parcours[2].x=140; | ||
+ | parcours[2].y=120; | ||
+ | parcours[3].x=93; | ||
+ | parcours[3].y=120; | ||
+ | parcours[4].x=115; | ||
+ | parcours[4].y=36; | ||
+ | parcours[5].x=170; | ||
+ | parcours[5].y=50; | ||
+ | parcours[6].x=170; | ||
+ | parcours[6].y=10; | ||
+ | parcours[7].x=237; | ||
+ | parcours[7].y=27; | ||
+ | |||
+ | ==Semaine 22 :17 Février - 23 Février (soutenance final)== | ||
+ | |||
+ | =Livrables= | ||
+ | |||
+ | Bibliothèques et le programme principe : [[Média:Code_P11.zip]] | ||
+ | |||
+ | Partie électronique PCB : [[Média:PCB_P11.zip]] | ||
+ | |||
+ | Les vidéos de démonstration : | ||
+ | |||
+ | https://drive.google.com/file/d/1Dw6dcIpvcyDvMNwRDHGagZCpeI22-JDE/view | ||
+ | |||
+ | https://drive.google.com/open?id=1UI3WCJysErJphsi8ACB-jSLM3eMKYFFG | ||
=Documents Rendus= | =Documents Rendus= | ||
− | [[Fichier:P11_Rapport intermédiaire.pdf]] | + | Rapport intermédiaire : [[Fichier:P11_Rapport intermédiaire.pdf]] |
+ | |||
+ | Diapo intermédiaire : [[Fichier:diapo_intermédiaire.pdf]] | ||
+ | |||
+ | Rapport final : [[Fichier:Rapport_final_P11.pdf]] | ||
− | [[Fichier: | + | Diapo final : [[Fichier:diapo_final.pdf]] |
Version actuelle datée du 21 février 2020 à 03:26
Sommaire
- 1 Présentation générale
- 2 Préparation du projet
- 3 Etat de l'art
- 4 Réalisation du Projet
- 4.1 Semaine 1&2 :09 - 22 Septembre
- 4.2 Semaine 3 :23 - 29 Septembre
- 4.3 Semaine 4 :30 Septembre - 06 Octobre
- 4.4 Semaine 5 :07 - 13 Octobre
- 4.5 Semaine 6 :14 - 20 Octobre
- 4.6 Semaine 7&8 :21 Octobre - 03 Novembre
- 4.7 Semaine 9 & 10 :04 Novembre - 17 Novembre
- 4.8 Semaine 11 :18 Novembre - 24 Novembre
- 4.9 Semaine 12 & 13 :25 Novembre - 08 Décembre
- 4.10 Semaine 15 :16 Décembre - 22 Décembre (soutenance 1)
- 4.11 Semaine 16 & 17 :06 Janvier - 19 Janvier
- 4.12 Semaine 18 & 19 :20 Janvier - 02 Février
- 4.13 Semaine 20 :03 Février - 09 Février
- 4.14 Semaine 21 :10 Février - 16 Février
- 4.15 Semaine 22 :17 Février - 23 Février (soutenance final)
- 5 Livrables
- 6 Documents Rendus
Présentation générale
Etudiants : Xuelu YAN
Encadrant : Blaise Conrard
Objectifs
Destinée comme démonstrateur des compétences IMA le projet vise à construire une réalisation de labyrinthe à bille autonome où un système de commande contrôle le parcours d'une bille sur un plateau mobile avec des obstacles.
Description
Pour cette réalisation, les suggestions suivantes sont proposées : - création de l'équipement à la découpe laser - utilisation d'un arduino comme système de traitements - utilisation d'une caméra comme capteur de position - utilisation de servo-moteurs pour le contrôle de l'inclinaison du plan.
Préparation du projet
Cahier des charges
Contexte
C'est le projet de IMA5. Ce projet vise à réaliser un démonstration où une bille parcourt un labyrinthe. Il doit se déplacer en douceur vers la position désignée en fonction de l’itinéraire spécifié. Une fois le projet terminé, il sera exposé lors de la journée portes ouvertes.
Objectif
L'objectif du projet est de créer un labyrinthe dans lequel une bille doit suivre une trajectoire de la surface. L'un des systèmes de contrôle assure le mouvement de la bille grâce au contrôle de la pente de la surface.
Fonctionnement
1. La bille se déplace en douceur
La bille doit éviter les obstacles et se déplacer en douceur dans le labyrinthe.
2. Déterminer les coordonnées de la bille
Pendant le mouvement de la bille, le système doit surveiller ses informations de position en temps réel et obtenir les coordonnées de la bille.
3. La bille se déplace selon la trajectoire spécifiée
Nous utilisons le programme pour définir la trajectoire de la bille. La bille peut répéter le mouvement en fonction de la trajectoire spécifié.
Ressources
Sous la direction de mon tuteur Blaise Conrard, ce système est réalisé par moi personnellement. Le matériel informatique, les composants et le support technique requis dans ce système sont fournis par l’école.
Delai
Il est prévu de mettre en place le fonctionnement et l’utilisation du système au début du mois de février 2020. La date de livraison est fin février 2020.
Choix techniques : matériel et logiciel
Liste des tâches à effectuer
Tâche | Heures S1 | Heures S2 | Heures S3 | Heures S4 | Heures S5 | Heures S6 | Heures S7 | Heures S8 | Heures S9 | Heures S10 | Heures S11 | Heures S12 | Heures S13 | Heures S14 | Total |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Déterminer le cahier de charges | 2 | 2 | 1 | 5 | |||||||||||
Choisir et étudier sur les matériaux | 1 | 2 | 4 | 2 | 9 | ||||||||||
Chercher les informations sur le projet | 1 | 1 | 2 | 2 | 2 | 8 | |||||||||
Dessiner le schéma de conception | 2 | 2 | 4 | ||||||||||||
Equipement - Labyrinthe (3D) | 1 | 1 | 2 | 1 | 5 | ||||||||||
Tester les machines | 3 | 1 | 2 | 3 | |||||||||||
Circuit électrique | 2 | 1 | 2 | 2 | 2 | 3 | |||||||||
Code Arduino | 3 | 2 | 4 | 3 | |||||||||||
Rencontre avec M.Blaise CONRARD | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 5 |
Remplissage du wiki | 1 | 1 | 2 | 2 | 1 | 1 | 2 | 1 | 2 | 2 | 7 | ||||
Total | 5 | 6 | 13 | 12 | 11 | 6 | 2 | 3 | 6 | 3 | 4 | 5 | 7 | 6 |
Calendrier prévisionnel
Etat de l'art
Réalisation du Projet
Semaine 1&2 :09 - 22 Septembre
* Rendez-vous avec M.Blaise CONRARD - 19/09/2019
Cahier des charges (voir https://cahiersdescharges.com/comment-faire-cahier-des-charges/)
⇒ 1er version pour jeudi 26/9 (par mail)
Réfléchir sur la gestion de projet : méthode employée (WBS, GANTT, quels jalons, forme des livrables à chaque jalon...)
⇒ quelques notes pour le Je 26/9
Prochain RDV : Je 26/9 13h20
Semaine 3 :23 - 29 Septembre
Pour cette semaine, après de déterminer le cahiers de charges et les tâches du projet, j'ai réfléchi que comment dessiner la figure de mécanique. Ce n’est qu’en déterminant au préalable la figure de mécanique, que nous pourrons analyser plus avant la technologie nécessaire au système.
Le principe de la mécanique de la machine
Premièrement, deux moteurs sont placés en bas pour contrôler les axes x et y dans deux directions. J'ai utilisé une structure de support à bascule orthogonale. La rotation du moteur provoque le mouvement de va-et-vient de la bielle pour contrôler la déflexion de la plaque. Ensuite, au milieu de la planche, je souhaite utiliser un joint universel et une tige de joint universel pour construire la structure de support. Au niveau de la connexion inférieure, trois fils de fer peuvent être ajoutés pour renforcer la structure. Enfin, nous devons fixer la caméra sur le poteau directement au-dessus du tableau. Et la caméra et les pièces de connexion Arduino sont également fixées sur le poteau. Cela garantit la stabilité de la caméra. La figure de mécanique est comme ci-dessous:
Rendez-vous avec M.Blaise CONRARD - 26/09/2019
Une décomposition du projet est proposée
Une 1ère version du cahier des charges ⇒ A améliorer, il doit décrire les fonctions de l'objet à développer
⇒ A envoyer par mail
Proposition : définir des livrables (forme = doc., photo, dessin...., volume...) pour chaque tâche du projet
⇒ https://www.manager-go.com/gestion-de-projet/glossaire/les-livrables
A Faire :
Améliorer cahier des charges
Développer la décomposition du projet en ajoutant livrables et jalons
Commencer l'analyse technique de certaines fonctions (opt.)
Semaine 4 :30 Septembre - 06 Octobre
Diagramme de processus
Pour cette semaine, j'ai cherché des informations sur ce projet. Et j'ai enfin dessiné le schéma de processus. Le schéma de processus définit les étapes du projet. Et pour chaque étape, je dois étudier les technologies connexes.
choix des matériaux
Après déterminer le processus du projet, j'ai abord choisi les matériaux appropriés.
1. Labyrinthe
Pour la conception du labyrinthe, il faut ajouter quelques déflecteurs et plusieurs obstacles au labyrinthe. C’est aussi l’objectif du projet, le balle doit éviter les obstacles pour atteindre l’emplacement désigné. Il faut d’abord dessiner un labyrinthe sur le logiciel Onshape. Ensuite, je vais utiliser la technique de coupe 3D pour faire le labyrinthe.
2. Servomoteur
Principe:
Le système servo est un système de contrôle automatique qui permet à une quantité de sortie contrôlée d'un objet (comme la position, l'orientation, le statut...) de suivre un changement arbitraire d'une cible d'entrée. Le servomoteur est principalement positionné par impulsions. Lorsque le servomoteur reçoit une impulsion, il fait pivoter l'angle correspondant à une impulsion pour obtenir un déplacement. Le servo-moteur lui-même a pour fonction d'émettre une impulsion. Ainsi, chaque fois que le servo-moteur tourne d'un angle, un nombre correspondant d'impulsions est émis. De cette manière, l'impulsion reçue par le servomoteur forme un écho ou une boucle fermée. En conséquence, le système sait combien d'impulsions ont été envoyées au servomoteur et combien d'impulsions ont été reçues. De cette manière, la rotation du moteur peut être contrôlée avec une très grande précision, ce qui permet d'obtenir un positionnement précis pouvant atteindre 0,001 mm.
Avantage:
1. Précision: réalise un contrôle en boucle fermée de la position, de la vitesse et du couple, résout le problème du moteur pas à pas en déséquilibre;
2, Vitesse: la performance à haute vitesse est bonne, la vitesse nominale générale peut atteindre 2000 ~ 3000 tr / min;
3. Adaptabilité: il possède une forte capacité anti-surcharge et peut résister à trois fois le couple nominal.Il est particulièrement adapté aux occasions avec des fluctuations de charge transitoires et un démarrage rapide.
4. Stabilité: Il fonctionne sans heurts à basse vitesse et ne produit pas d'opération pas à pas similaire à celle d'un moteur pas à pas lorsqu'il tourne à basse vitesse. Convient pour les occasions avec des exigences de réponse à grande vitesse;
5. Rapidité d'exécution: La dynamique d'accélération et de décélération motrices est courte, généralement en quelques dizaines de millisecondes.
6, Confort: la chaleur et le bruit sont considérablement réduits.
3. Arduino UNO
Arduino Uno est une carte à microcontrôleur basée sur l’ATmega328P. Il possède 14 broches d'entrée / sortie numériques (dont 6 peuvent être utilisées en tant que sorties PWM), 6 entrées analogiques, un quartz 16 MHz, une connexion USB, une prise d'alimentation, un en-tête ICSP et un bouton de réinitialisation. Il contient tout le nécessaire pour prendre en charge le microcontrôleur. Connectez-le simplement à un ordinateur avec un câble USB ou alimentez-le avec un adaptateur AC / DC ou une batterie pour commencer.
4. Caméra (pixycam)
Pixy est un capteur de reconnaissance d'image open source qui prend en charge la reconnaissance de couleur multi-objet et multicolore et prend en charge jusqu'à 7 couleurs. Vous pouvez lui dire la couleur que vous voulez et lui apprendre à trouver quelque chose. Pixy prend en charge plusieurs méthodes de communication, telles que SPI, I2C, etc., qui peuvent être directement connectées à la carte de commande Arduino. Installez-le sur votre robot et ajoutez une paire d'yeux à votre petit robot. Il est équipé d'un capteur d'image doté d'un matériel puissant pouvant être utilisé avec un PC pour suivre et analyser des données multicolores. Pixy peut communiquer directement avec l'Arduino. Il envoie des informations de bloc à l'Arduino à 1 Mbit / s, ce qui signifie que le Pixy peut envoyer plus de 6 000 objets identifiés par seconde ou 135 objets identifiés par frame (Pixy peut traiter 50 images par seconde).
Rendez-vous avec M.Blaise CONRARD - 03/10/2019
Avis documents fournis :
Gantt : trés bien
Cahier des charges ⇒ à améliorer
1. Context en premier, mais il décrit les besoins de Polytech, c-à-d., une machine de démonstration
2. Théoriquement pas de solution technique (sauf, éventuellement, dans un paragraphe anexe)
Prochaines étapes :
liste matériel (générique)
bibliographie sur des projets similaires
Questions/Avis :
comment dessiner une pièce 3D ⇒ OnShape
choix moteur ⇒ Un servomoteur est peut-être mieux adapté
choix caméra ⇒ proposé camera pixycam
A chaque fois :
remettre à jour le planning ou le Gantt
transmettre les nouveaux documents ou ceux corrigés
Semaine 5 :07 - 13 Octobre
Pour cette semaine, j'ai obtenu la caméra 'Pixycam' et une chute de bois pour les tester.
Tester la caméra
Avant de tester la caméra, il faut installer le logiciel ‘PixyMon’. Et puis, je l’ai connecté sur le ordinateur pour le tester. Lorsque je l'ai connecté, l'image capturée par la caméra est très floue. J'ai essayé d'ajuster la caméra pour la faire la mise au point. Ensuite, j'ai commencé à apprendre à Pixy à reconnaître un objet. Dans pixymon, j'ai choisi ‘Signature 1’ pour enregistrer la cible du suivi de la caméra. J'ai utilisé le trousseau à titre d'exemple pour tester l'appareil photo. Après l'objet est sélectionné, la caméra suit la position de l'objet bleu sur le trousseau.
Découper le plateau
J’ai réservé la machine ‘Découpeuse Laser’ et le professeur m’a appris comment utiliser la machine. J’ai installé le logiciel ‘Inscape’ pour créer une image d’objet que je veux imprimer. J’ai fait un objet facile pour l’essayer. La circonférence de cet objet est coupée. Le cercle au milieu est gravé.
Rendez-vous avec M.Blaise CONRARD - 10/10/2019
Tuteur :
Corriger/Valider nouvelle version du cahier des charges
Proposer des servomoteurs
Vous :
Tester la caméra => Objectif : exemple de mesure de la position d'un objet
Apprendre à utiliser la découpeuse Laser ⇒ Fabriquer un petit objet
1. rencontrer les FabManager
2. peut être réservation sur http://fabricarium-old.polytech-lille.fr/#!/machines
3. une chute de bois a été donnée
Dessiner un 1er plan de la mécanique de la machine (logiciel libre)
Semaine 6 :14 - 20 Octobre
Dessin du labyrinthe version 1.0
Après j'ai fait la formation de Découpeuse Laser, je comprends comment utiliser la machine pour créer le labyrinthe. Et donc pour cette semaine, j'ai commencé à dessiner la première version du labyrinthe. Comme indiqué ci-dessous, c'est le labyrinthe précis. Il y a quelques murs et obstacles. Je mets la largeur du mur sur 1cm et le diamètre de l'obstacle circulaire sur 1.5cm. La trajectoire de la bille est montrée et il répétera la trajectoire.
La rapport d'image est 1:5
Et ensuite, je l'ai dessiné avec le logiciel 'Inscape'. J'ai ajouté le symbole 'Polytech-Lille'. La taille du labyrinthe est de 30cm x 30cm. Et il faut encore faire un autre planche comme le planche du bas pour mettre les moteurs et les autres matériaux. La taille est de 40cm x 40cm. Cette planche est une simple planche de bois qui ne nécessaire pas de gravure. J'ai aussi ajouté le symbole 'Polytech-Lille'.
Le plan précis du schéma de principe
1). La première partie est la planche du haut. Cette planche est le labyrinthe. Je utilise un joint universel et une tige de joint universel comme support dans la partie centrale inférieure de la planche. De cette façon, la planche peut être plus stable. Et avec le joint universel, la planche peut tourner plus facilement pour incliner. Les deux moteurs contrôlent respectivement l'axe de X et l'axe de Y. Je mets le moteur au milieu du bord du labyrinthe et du point central. Parce que si il est proche du centre, elle a besoin de suffisamment de force pour supporter l'inclinaison de la planche. Si il est loin du centre, il est difficile à contrôler car la planche change rapidement. Donc, les moteurs doivent être placé au milieu.
2). La deuxième partie est la planche du bas. Elle est utilisée pour mettre les machines et Arduino. Le centre de la planche est une tige de joint universel. Je veux utiliser de la colle de verre pour coller trois fils de fer à la planche du bas afin de rendre la structure plus stable. Les moteurs, l'Arduino et d'autres équipements sont placés sur la planche du bas.
3). La troisième partie est la structure détaillée du moteur. J'ajoute un culbuteur à la partie où le moteur tourne. En ajoutant du fil de fer au culbuteur, lorsque le moteur tourne, le culbuteur déplace le fil de fer de haut en bas, de sorte que la plaque supérieure soit inclinée lorsque le fil de fer se déplace.
4). La quatrième partie est la caméra. Je place la caméra sur le pilier pour le séparer du labyrinthe. Parce que la caméra doit être placée dans une position stable. De cette manière, l'image acquise peut être rendue plus précise et les coordonnées de position précises de la bille peuvent être obtenues.
Rendez-vous avec M.Blaise CONRARD - 18/10/2019
Cahier des charges
10/10/2019 : p1 du CR3 ⇒ le texte est à améiolorer (18/10/2019)
Acquisition position
test de la camera : Fini (18/10/2019) : note dans le CR4, p3
Réalisation du labyrinthe/machine
1. Labyrinthe
Formation découpeuse Laser : Fait et fini (18/10/2019), CR3 p.4
A FAIRE (S43) : dessiner un labyrinthe précis (taille, motif, parcours...)
2. Machine
architecture matériel générale : Fait (18/10/2019) : un schéma de principe, CR4, p1-2
A FAIRE : Plan précis
A FAIRE (S43) : un permier plan
3. moteur
Sélectionner moteurs
A FAIRE (S43) : tester l'utilisation (possible ou pas) servomoteur bioloid
A FAIRE (plus tard) : Fixation des moteurs
Semaine 7&8 :21 Octobre - 03 Novembre
Après la réunion avec mon tuteur, j'ai amélioré quelques parties.
Envisager une autre version 2.0 du labyrinthe
Le symbole de Polytech de la première version du labyrinthe est trop petit, donc je l'ai modifié. Et je mets la sortie de la bille à l'intérieur du symbole. Je mets quelques murs, le largeur de la mur est 1.5cm et la longueur de la mur est 6cm. Le trajectoire de la bille est affiché dans le dessin en papier. La rapport est 1:6, l’image réel est de 30cm x 30cm. Après j'ai déterminé le dessin en papier, je l'ai crée dans le logiciel 'Inkscape'.
Tester l'utilisation de servomoteur Bioloid
Cette semaine, j'ai obtenue les servomoteurs. Pour tester les servomoteurs, je m’ai abord référé aux instructions d’utilisation et puis j’ai connecté les deux moteurs avec la source. Et ensuite pour les programmer, il faut installer le logiciel ‘Behavior Control Programmer’ avec le disque. J’ai essayé de réaliser l’action facile, le programme est comme ci-dessous.
Je règle séparément la vitesse et l'angle des deux moteurs, puis observe leur comportement. Il y a deux problèmes :
- Le premier moteur tourne à la vitesse spécifiée, mais le deuxième moteur ne tourne pas. J'ai essayé de changer l'ordre des connexions ou de changer le programme, mais il y a rien qui change.
- Le premier moteur tourne éternellement, l'angle cible j'ai défini est invalide.
Rendez-vous avec M.Blaise CONRARD - 24/10/2019
Matériel en prêt
Caméra Pixy (10/10/2019)
Kit bioloid (18/10/2019)
Un arduino (24/10/2019)
Cahier des charges
10/10/2019 : p1 du CR3 ⇒ le texte est à améiolorer (18/10/2019)
A FAIRE (S45) : ajouter description IHM (bouton, LED... fonction de chacun)
A FAIRE (S45) : préciser rangement ou pas de la caméra
A FAIRE (S45) : préciser l'alimentation
Acquisition position
test de la camera :Fini (18/10/2019) : note dans le CR4, p3
Réalisation du labyrinthe/machine
1. Labyrinthe
Formation découpeuse Laser :Fait et fini (18/10/2019), CR3 p.4
2. Concevoir le labyrinthe
(S43) dessiner un labyrinthe précis (taille, motif, parcours...) :Fait CR5 p1-2
A FAIRE (S45) proposition : envisager/tester une autre version avec Polytech en motif
3. Machine
architecture matériel générale :Fait (18/10/2019) : un schéma de principe, CR4, p1-2
Plan précis
(S43) : un permier schéma
A FAIRE (S45) : préciser les hauteurs, largeur, fixation des moteurs, de la caméra... plus de détails
PLUS TARD : plan de chaque pièce + mode de fixation
4. moteur
Sélectionner moteurs
A FAIRE (S45) : tester l'utilisation (possible ou pas) servomoteur bioloid
PLUS TARD : Fixation des moteurs
PLUS TARD : connexion moteur/arduino + commande des moteurs par arduino
Semaine 9 & 10 :04 Novembre - 17 Novembre
Résoudre les problèmes des moteurs
Avant, j'ai rencontré deux problèmes lors du test du moteur.
J'ai consulté le livre de référence et demandé à mon mentor. J'ai trouvé que la raison pour laquelle le moteur n°2 ne tournait pas était que son numéro de série était devenu le n°6. Ensuite, le programme a changé son numéro en n°2. Testez à nouveau et le moteur n°2 fonctionne correctement. Deuxièmement, nous avons précédemment défini la vitesse de rotation et l'angle de rotation du moteur en sélectionnant différentes fonctions.
Speed
Position
Cependant, j'ai découvert plus tard que le moteur ne tournait pas à la vitesse et à l'angle spécifiés. J'ai ensuite essayé de contrôler la rotation des deux moteurs via les boutons. Les deux boutons de haut et bas sont pour contrôler le moteur n°1, les deux de gauche et droite sont pour contrôler le moteur n°2. Et le programme est comme ci-dessous :
Découper le labyrinthe
Ensuite, j'ai réservé la machine ‘Découpeuse Laser’ pour faire ma planche de labyrinthe. Avant de couper, je dois ajuster divers paramètres. J'ai importé le fichier conçus à l'ordinateur. Avant de couper, je dois ajuster divers paramètres. Le rouge représente la coupe et le noir représente le gravure. Donc, j'ai défini la bordure en rouge , le chemin du milieu et la zone du logo en noir. Le labyrinthe résultant est le suivant :
Rendez-vous avec M.Blaise CONRARD - 15/11/2019
1. Contenu du rendez-vous
CR : description de la fonction des boutons et des voyants trop floue
Prochaines actions : Tester les moteurs commandés par arduino
Conseils de poursuite du projet :
a). Un vrai schéma éléctronique
b). Commencer à réaliser la partie mécanique
2. Tuteur :
matériel de test (câble + plaque d'essai) +composant LS241 ou CI avec 2-portes 3états: A trouver pour le Me 20/11
Accès à une salle de TP
planche de bois pour la suite
Semaine 11 :18 Novembre - 24 Novembre
Tester la caméra avec Arduino
Dans cette semaine, j’ai connecté la caméra avec Arduino. J’ai téléchargé la bibliothèque Arduino sur le site : https://pan.baidu.com/s/1dDpDlvV#list/path=%2F et puis j’ai ouvert le logiciel Arduino et importé le fichier de bibliothèque Pixy correspondant. Pour tester le programme, il faut le compiler et l’importer.
Ensuite j’ai ouvert le moniteur série et il a affiché :
Detected 1: block 0: sig: 1 x: 159 y: 109 width: 61 height: 61Detected 1: block 0: sig: 1 x: 173 y: 114 width: 60 height: 61Detected 1: block 0: sig: 1 x: 146 y: 111 width: 70 height: 65…
Il faut communiquer les informations d’objet identifiées par pixy à Arduino via le port série. Arduino analysera ensuite ces informations pour contrôler les moteurs.
getBlocks () : Cette fonction retournera le nombre d'objets reconnus par Pixy.
Ensuite, on peut obtenir les données de chaque objet identifié via le tableau de pixy.blocks [ ] (chaque membre du tableau correspond à un objet identifié). Chaque membre (i) contient les éléments suivants:
pixy.blocks [i] .signature: le numéro d'étiquette de l'objet identifié;
pixy.blocks [i] .x: les coordonnées de la position centrale de l'objet identifié dans la direction x;
pixy.blocks [i] .y: les coordonnées de la position centrale de l'objet identifié dans la direction y;
pixy.blocks [i] .width: la largeur de l'objet identifié (1 à 320);
pixy.blocks [i] .height: hauteur de l'objet identifié (1 200);
pixy.blocks [i] .print (): une fonction membre utilisée pour imprimer les informations de l'objet identifié sur le port série.
Semaine 12 & 13 :25 Novembre - 08 Décembre
Pour ces deux semaines, J‘ai travaillé sur la partie électronique et j'ai testé les servomoteurs avec l'Arduino.
IHM de chaque composant
Tout d'abord, j'ai déterminé les fonctions que le schéma doit réaliser.
1). LEDs
- LED rouge: indique si le programme est mis en pause.
- LED orange: indique si le système est alimenté (couplée à l'interrupteur).
- LED vert: indique si le programme tourne.
2). Bouton
Le bouton à contact temporaire contrôle la mise en route du système. Une fois le bouton appuyé le programme de gestion du labyrinthe se met en marche. Si le bouton est appuyé à nouveau le programme se met en pause.
3). Interrupteur
L'interrupteur contrôle l'alimentation du système. Activer l'interrupteur signifie que le système est déjà en place et que le courant circule.
4). Servomoteurs
Je me réfère au projet IMA4 de 2015 concernant la commande de servos bioloid pilotés par Arduino. J‘utilise un buffer permettant de commander les servos.
Tester les servos avec l'Arduino
Pour ce projet, je dois remplacer le CM5 par une carte Arduino, ceci afin d'avoir des possibilités de programmation étendue. Avant toute chose , étudie les caractéristiques électroniques du CM5. Après avoir étudié ces caractéristiques, j'ai remarqué que l'on pourrait directement passer par les ports RX et TX de l'Arduino pour le contrôle des servomoteurs, il suffirait juste d'ajouter un composant 74LS241N pour les contrôles alternatifs de TX et RX. En effet ce buffer trois états permettrait de faire passer alternativement Rx ou Tx en état d'haute impédance, ceci dans le but de n'avoir qu'une unique information sur le bus data vers le servo.
En raison du composant manquant 74LS241N, j'ai choisi de remplacer ce composant par un buffer non inverseur 74LS244N. J'ai réalisé les branchements entre l'Arduino et les servos via ce composant en nous aidant de les datasheets des ces composants. De cette façon, il sera possible de se substituer du CM5 et de commander directement les servos via l'Arduino. J'ai effectué quelques tests en connectant les ports TX et RX de l'Arduino sur les différentes entrées du buffer 3 états. Le test a échoué et la connexion entre les servos et Arduino n'a pas été établie avec succès.
En recherchant les informations, j'ai trouvé que la différence entre 74LS241N et 74LS244N est que le port 2G de ce dernier doit être inversé. En d'autres termes, 74LS241N est un buffer non inverseur et ne peut pas être remplacée directement. Cela signifie que je dois ajouter un inverseur pour obtenir le même effet. J'ai donc ajouté l'inverseur 74HC04N, le schéma des broches est le suivant:
74LS244N & 74HC04N
Ce qui donne pour notre circuit, la figure ci-dessous :
Après avoir ajouté l'inverseur, j'ai réessayé de tester le circuit avec un exemple de code. Le moteur a tourné avec succès. J'ai ouvert le moniteur série en même temps, on peut voir les informations imprimées et connaître la rotation du moteur. On peut utiliser des programmes pour ajuster différents moteurs, y compris le sens de rotation, la vitesse de rotation et l'angle de rotation.
Semaine 15 :16 Décembre - 22 Décembre (soutenance 1)
Semaine 16 & 17 :06 Janvier - 19 Janvier
Commander les moteurs par ordinateur
Il y a un programme pour Arduino, ça c’est pour déterminer la rotation du moteur. Et il y a un autre programme dans l’ordinateur pour contrôler le fonctionnement du programme.
J’ai essayé d’ajouter des commandes pour que pouvoir imposer une position aux moteurs, commandée par l'ordinateur :
⇒ w tourne le moteur 1 dans le sens horaire
⇒ z tourne le moteur 1 dans le sens anti-horaire
⇒ a et d, pareil pour le moteur 2
Après fonctionner la programme, le résultat est comme ci-dessous :
Mouvement des moteurs commandé par la position d'un objet vu par la caméra
1. Apprend à Pixy un objet
Dans le logiciel PixyMon, j'utilise signature1 pour marquer un objet. Exécutez ensuite le firmware par défaut dans le logiciel. À ce moment, le contenu affiché à l'écran devient un fond noir et une zone carrée où se trouve l'objet.
2. Connecter la caméra avec Arduino
Après avoir réussi à identifier l'objet et à exécuter le firmware, nous avons connecté la caméra et l'Arduino. Exécutez ensuite un programme de base, le port série imprimera toutes les informations de l'objet. Comme indiqué ci-dessous :
3. Commander les moteurs par la position d’un objet
camera_info():Cette fonction permet d'extraire les coordonnées x et y de l’objet reconnu par la caméra.
sport():Dans cette fonction, imprimez les informations de coordonnées de l'objet. Le moteur changera le sens de rotation en fonction du changement des coordonnées de l’objet. J'ai écrit les commandes simples pour le tester. Lorsque la coordonnée x est supérieure à zéro, le moteur 1 tourne à gauche. Le code est le suivant :
Les résultats et les informations d'impression obtenus après l'exécution du programme sont les suivants :
Dessiner le PCB
Avant, j’ai déterminé les fonctions que la carte électronique doit réaliser. Et après j’ai testé le schéma et le dessiné dans le logiciel Fritzing.
Pour cette semaine, j'ai vérifié le circuit pour voir si les broches de chaque composant étaient correctement connectées. Ensuite, j’ai dessiné le PCB, comme ci-dessus :
Rendez-vous avec M.Blaise CONRARD - 06/01/2020
Objectifs pour Ve 10/1 :
Finaliser la commande des moteurs par l'Arduino
pouvoir imposer une position aux moteurs, commandée par l'ordinateur :
⇒ 8 tourne le moteur 1 dans le sens horaire
⇒ 2 tounre le moteur 1 dans le sens antihoraire
⇒ 4 et 6, pareil pour le moteur 2
Donc : 1 programme pour l'arduino (commande des moteurs et écoute de liaison USB/Série)
Pour l'ordi :
soit développer un programme de lecture clavier/transmission USB/Série
soit utiliser un programme standard (ex. : Robot Terminal)
Anticiper étape suivante : réalisation plateau mobile dirigé par les moteurs
Rendez-vous avec M.Blaise CONRARD - 13/01/2020
Rendre le compte-rendu de la semaine S2 (6/1 au 11/1)
Propositons de l'étudiant :
Dessiner le PCB
Poursuite du programme ⇒ Définir un objectif précis (1 ou 2j)
Propositions Encadrant :
Réalisation du plateau mobile commandé par servo-moteur
1) Réfléchir aux élements d'assemblage
2) Usiner plateau, côté de la machine
3) Faire le montage
Avancer le développement informatique
Mouvement des moteurs commandé par la position d'un objet vu par la caméra
Planning et jalons du reste du projet
Demain soir (ma 14/1) : par mail, retourner vos choix de réalisations pour cette semaine
Prochain RdV : Lu 20/1 13h30 (ou avant)
Semaine 18 & 19 :20 Janvier - 02 Février
Carte électronique
Dans la semaine dernière, j’ai dessiné le PCB sur deux face. Mais après avoir consulté l'encadrant, car la carte doit être empilée avec Arduino, on doit concevoir le PCB sur une seule face avec des pistes plus larges. Dans ce cas, afin d'éviter les croix, il faut souder les cavaliers en quelques connexions. Le dessin de conception est le suivant :
Enfin, en raison d'un temps insuffisant et des raisons techniques, après avoir écouté les conseils du encadrant et du département électronique, on a choisi d'utiliser le plaque d'essai pour réaliser la partie électronique. Après avoir fait la soudure, je l’ai testé mais j’ai fait une erreur. En fait, les composants sont alimentés par l’Arduino, l’Arduino et les servomoteurs sont alimentés par le batterie 9V. Il faut connecter la pôle positive à Vin sur l’Arduino. Je l’ai connecté à 5V sur l’Arduino. Donc il est court-circuité. L’inverseur 74HC04N est tombé en panne. Je l’ai remplacé par le composant 74LS86AN, c’est un composant logique XOR.
Selon le principe, la deuxième broche est comme l’entrée et la troisième broche est comme la sortie. Il faut connecter la première broche à Vcc. Dans ce cas, selon le logique, l’entrée et la sortie sont inverses. Et puis j’ai ajouté le composant 74LS86AN et réalisé la soudure. J’ai ajouté les broches pour le connecter avec l’Arduino. Après j’ai fini la soudure, je l’ai testé. Les moteurs tournent bien avec les commandes de Arduino. La carte soudée est comme ci-dessous :
Construire la partie mécanique
1. Pour la partie mécanique, j’ai coupé les deux planches (labyrinthe et la planches du bas). J’ai acheté un tube, son diamètre intérieur est 5mm, son diamètre extérieur est 16mm et son longueur est 30cm. J'ai mis l’universel joint dessus le tube. J'ai placé l‘universel joint et la tube au centre du labyrinthe. Percez un trou au centre de la plaque supérieure et fixez le joint universel avec un écrou. Ceci complète la structure de base.
2. J’utilise les composants du servomoteur Bioloid comme la bascule. Et ajouter du fil de fer au milieu. Pour pouvoir contrôler précisément l'inclinaison du labyrinthe, il faut limiter la zone de mouvement du fil, j'ai donc mis un anneau en plastique.
3. Pour fixer le fil de fer sur le labyrinthe, j'ai collé un anneau sur la face dessous.
Calculs de position des servomoteurs
Avant fixer et commencer à commander les servomoteurs, il faut déterminer les trois positions du moteur: la valeur de position initiale, la valeur de position la plus élevée et la valeur de position la plus basse. Je les testé en utilisant la commande :
Dynamixel.move(ID, Position);
- Pour la moteur 1 : 450 (élevée), 757 (basse)
- Pour la moteur 2 : 512 (élevée), 819 (basse)
Enfin, il faut déterminer la valeur de position initiale. Il faut assurer que le moteur tourne pour incliner la plaque, et que la hauteur de sa montée et de sa descente doit être la même, afin que l'inclinaison soit la même dans les deux sens. L'angle entre les positions haute et basse que je fixe est de 90 degrés. Donc, dans la plus grande mesure, l'ascension est la longueur du rayon r de la bascule. Ensuite, la position initiale du moteur doit être à 1 / 2r du sol. Calculé comme suit :
Donc, sur la rapport, les positions initiales des deux moteurs peuvent être déterminées :
- Pour la moteur 1 : 757 - (757-450)/3 = 654.7
- Pour la moteur 2 : 819 - (819-512)/3 = 716.7
Avant fonctionner le système, il faut initialiser chaque fois les positions des deux servomoteurs.
Dynamixel.move(1, 654.7); Dynamixel.move(2, 716.7);
Rendez-vous avec M.Blaise CONRARD - 20/01/2020
Retour du 14/1 sur objectifs :
- Dessiner le PCB
- Mouvement des moteurs commandé par la position d'un objet vu par la caméra
- Réfléchir et commencer la partie d'assemblage
Etat :
Freiné par problème : pas de commande des moteurs
Mesure de la position d'un objet ⇒ opérationnel
Objectifs pour cette semaine :
Remettre en marche la commande d'au moins 1 moteur
Etudiant : si besoin correction du PCB si défaut identifié
Dessiner les plans des pièces pour le montage
Semaine 20 :03 Février - 09 Février
Assemblage de mécanique
Après construire la structure de base, j'ai fixé les servomoteurs sur la planche du bas. En même temps, j'ai ajouté un fil de fer épais pour mettre la caméra.
Enfin, j'ai ajouté les mûrs pour limiter le mouvement de la balle. La structure mécanique est terminée, comme la suivante :
Programme sur le contrôleur P (proportion)
P : Effet d'ajustement proportionnel : l'écart du système est reflété de manière proportionnelle.Une fois qu'un écart se produit dans le système, l'ajustement proportionnel produit immédiatement un effet d'ajustement pour réduire l'écart. Le grand effet proportionnel peut accélérer le réglage et réduire l'erreur, mais une proportion trop grande réduira la stabilité du système et même rendra le système instable.
Le principe de P est comme ci-dessous :
U(t) = Kp * Err(t)
Plus la bille est éloigné de la position cible, plus le moteur tourne; plus la bille est proche de la position cible, plus le moteur est proche de la position initiale. Sur le principe, il faut définir plusieurs variables.
void Pid_controlClass :: PID_init(){ printf("PI_init begin \n"); pi.SetPositionX=0.0; pi.ActualPositionX=0.0; pi.errX=0.0; pi.voltageX=0.0; pi.SetPositionY=0.0; pi.ActualPositionY=0.0; pi.errY=0.0; pi.voltageY=0.0; pi.Kp=0.2; pi.angleX=0.0; pi.angleY=0.0; printf("PI_init end \n"); }
L'erreur est la distance entre la position actuelle et la position cible. Définissez une valeur intégrale pour additionner chaque erreur. Utilisez ensuite le principe de contrôle P pour stocker les résultats du calcul dans pi.voltage. Les servomoteurs étant fixés sur la planche du bas, la plage de rotation est limitée. Et j'ai déjà déterminé la plage haute et basse de rotation du moteur. J'ai donc fixé les valeurs maximales et minimales pour limiter la plage de rotation du moteur. J'ai écrit deux fonctions pour contrôler les axes X et Y respectivement. Prenons l'exemple de l'axe des X :
float Pid_controlClass :: PID_realizeX(float PositionX){ pi.SetPositionX=PositionX; pi.errX=pi.SetPositionX-pi.ActualPositionX; pi.integralX+=pi.errX; pid.voltage=pid.Kp*pid.err; pi.angle1=-3*pi.voltageX+624.7; if (pi.angle1>757) pi.angle1=757; if (pi.angle1<450) pi.angle1=450; return pi.angle1; }
Ensuite, dans le programme principal. Il faut ajouter des instructions à la fonction d'initialisation afin que le moteur puisse revenir à sa position initiale avant que le système ne fonctionne à chaque fois.
Dynamixel.move(1,654.7); Dynamixel.move(2,716.7);
Avant le test, j'ai défini la position cible sur le point central de la planche du haut (170, 80). La bille doit se rapprocher du point central à n'importe quelle position. La position actuelle de la bille est mise à jour en temps réel en fonction des coordonnées collectées par la caméra. La position où le moteur tourne est la valeur de retour de la fonction de contrôleur P.
Pid_control.pi.ActualPositionX = x; Pid_control.pi.ActualPositionY = y; Serial.println(Pid_control.PID_realizeX(Px)); Serial.println(Pid_control.PID_realizeY(Py)); //Serial.println(Pid_control.pi.voltageX); Dynamixel.moveSpeed(1,Pid_control.PID_realizeX(Px),200); Dynamixel.moveSpeed(2,Pid_control.PID_realizeY(Py),200);
Le résultat du test est que la bille se déplace dans un mouvement circulaire autour du point central. Mais parce que la structure n'est pas stable, les résultats des tests ne sont pas précis et stables.
Rendez-vous avec M.Blaise CONRARD - 04/02/2020
Objectif pour prochaine RdV
- Carte éléctronique
Faire un PCB 1 face
- Construire la partie mécanique
Réfléchir et choisir la place et la liaison mécanique des moteurs
si pièce manquante ⇒ voir Laura Medina (ass. ingé, C-005)
- Poursuivre le programme
objectif : code de génération d'une trajectoire
Semaine 21 :10 Février - 16 Février
Carte électronique (PCB)
Avant, en raison du composant manquant 74LS241N, j'ai choisi de remplacer ce composant par un buffer non inverseur 74LS244N. M.REDON a acheté un composant 74LS241N beaucoup plus adapté que le LS244 qui m'a été fourni et que du coup mon PCB était plus difficile à router. M.REDON a dessiné un PCB avec le composant 74LS241N comme ci-dessous :
Sur ce PCB, il y a des LEDs pour afficher l'état du système, et il y a un bouton et un interrupteur pour contrôler le système. M.REDON a aussi ajouté les broches qui sont pour connecter avec les servomoteurs et la caméra. La carte est comme suivante :
Réaliser la trajectoire carée
À base du programme avant, l'objectif prochain est de réaliser un trajectoire en carré. D'abords, j'ai mis quatre set-points au coin de la planche.
typedef struct cible_position{ uint16_t x; uint16_t y; }point_parcours; point_parcours *parcours;
parcours = (point_parcours*)malloc(4 * sizeof(struct cible_position)); parcours[0].x=108; parcours[0].y=138; parcours[1].x=108; parcours[1].y=33; parcours[2].x=233; parcours[2].y=33; parcours[3].x=233; parcours[3].y=138;
Dans le même temps, car la position de la balle est sensible au changement, et il faut un certain temps à la caméra pour récupérer la balle. Par conséquent, si la position cible que nous définissons est des coordonnées de point, il n'y a aucune garantie que la caméra puisse collecter des données lorsque la balle atteint la position cible. Dans ce cas, j'ai décidé de définir la position cible à un intervalle. Lorsque la balle atteint l'intervalle cible désigné, l'intervalle cible est automatiquement changé pour le suivant.
void Pid_controlClass :: position_cible(){ if((pi.X_reel<=parcours[pi.i].x+15)&(pi.X_reel>=parcours[pi.i].x-15)&(pi.Y_reel<=parcours[pi.i].y+15)&(pi.Y_reel>=parcours[pi.i].y-15)){ pi.i++; if(pi.i==4){ pi.i=0; } } }
Après les tests, j'ai constaté que le ballon accélère toujours en se déplaçant vers la position cible. En effet, sous le contrôle du contrôleur P, lorsque la petite balle se déplace du côté de la position cible, la direction d'inclinaison de la tablette est toujours la même. Cela fait que le ballon continue d'accélérer, et lorsqu'il atteint la position cible, la vitesse est trop élevée pour s'arrêter. Par conséquent, j'ai changé la position cible dans la fonction de commande P au milieu de la longueur du côté carré. Cela maintient le ballon proche de 0 lorsqu'il atteint les 4 zones cibles définies précédemment, ce qui est plus stable.
if (pi.i==3){ pi.X_cible=(parcours[0].x+parcours[3].x)/2; }else{ pi.X_cible=(parcours[pi.i].x+parcours[pi.i+1].x)/2; } if (pi.i==3){ pi.Y_cible=(parcours[0].y+parcours[3].y)/2; }else{ pi.Y_cible=(parcours[pi.i].y+parcours[pi.i+1].y)/2; }
Pour que le ballon se déplace en ligne droite, il faut assurer qu'un seul moteur est actionné par mouvement. L'autre moteur reste en position initiale. Par conséquent, en fonction de la relation définie entre les moteurs et l'axe x et l'axe y, le moment où les deux moteurs reviennent à la position initiale peut être déterminé. Pour le moteur qui fonctionne, l'angle de rotation est contrôlé selon le principe du contrôle proportionnel.
if(pi.i==1|pi.i==3){ pi.angleX=640.7; }else{ if(pi.voltageX>=0){ pi.angleX=640.7-2*pi.voltageX; } else if(pi.voltageX<0){ pi.angleX=640.7-1*pi.voltageX; } }
Selon les tests, lorsque le moteur monte et descend à la même angle, l'inclinaison de la planche dans les deux sens opposés est différente. Grâce à l'analyse géométrique, les résultats sont les suivants :
J'ai donc besoin d'ajuster le coefficient d'inclinaison de la plaque des deux côtés. Le coefficient du côté où la pente est faible est grand et le coefficient du côté où la pente est élevée est petit. Cela garantit que l'inclinaison est presque la même lorsque la plaque est inclinée des deux côtés.
if(pi.voltageX>=0){ pi.angleX=640.7-2*pi.voltageX; } else if(pi.voltageX<0){ pi.angleX=640.7-1*pi.voltageX; }
Répéter la trajectoire spécifiée
Après avoir mis en œuvre le mouvement carré de la balle, j'ai changé la position cible. Puisque le carré est un chemin régulier, mais notre objectif est que le ballon effectue un mouvement répétant selon la trajectoire prescrit. J'ai donc défini une trajectoire irrégulier et défini plusieurs positions cibles. De plus, il y a une ligne droite entre les deux positions cibles pour garantir que la balle se déplace dans une seule direction. De cette façon, le principe que j'ai utilisé pour implémenter le mouvement carré s'applique également ici. On a juste besoin de changer les positions cibles.
parcours = (point_parcours*)malloc(8 * sizeof(struct cible_position)); parcours[0].x=250; parcours[0].y=167; parcours[1].x=140; parcours[1].y=165; parcours[2].x=140; parcours[2].y=120; parcours[3].x=93; parcours[3].y=120; parcours[4].x=115; parcours[4].y=36; parcours[5].x=170; parcours[5].y=50; parcours[6].x=170; parcours[6].y=10; parcours[7].x=237; parcours[7].y=27;
Semaine 22 :17 Février - 23 Février (soutenance final)
Livrables
Bibliothèques et le programme principe : Média:Code_P11.zip
Partie électronique PCB : Média:PCB_P11.zip
Les vidéos de démonstration :
https://drive.google.com/file/d/1Dw6dcIpvcyDvMNwRDHGagZCpeI22-JDE/view
https://drive.google.com/open?id=1UI3WCJysErJphsi8ACB-jSLM3eMKYFFG
Documents Rendus
Rapport intermédiaire : Fichier:P11 Rapport intermédiaire.pdf
Diapo intermédiaire : Fichier:Diapo intermédiaire.pdf
Rapport final : Fichier:Rapport final P11.pdf
Diapo final : Fichier:Diapo final.pdf