Je viens de refaire l'essais de la séquence de mouvements de la vidéo la :
et maintenant je n'ai plus de problème comme à la séquence 2 et 5. C'était bien la boucle le problème.
Posté 08 novembre 2017 - 07:29
Ma chaine YouTube : https://www.youtube..../oracid1/videos
Posté 08 novembre 2017 - 08:28
C'est quoi ton objectif, maintenant ?Ho non. C'est loin d'être fini !
Ma chaine YouTube : https://www.youtube..../oracid1/videos
Posté 10 novembre 2017 - 07:10
Petite question :
Pensez-vous que le fait que mes moteurs ne soit pas réglées de la même manière par rapport aux micro-step (1/16, 1/4, 1/2), que ça puisse varier sur le temps d’exécution d'une commande?
Je m'explique, lors de mes mouvements, j'ai toujours le moteur du second bras, qui termine une demi sec plus tard que les autres. Le moteur la est celui qui est le plus démultiplié et il est réglé en 1/2 par rapport aux autres qui sont en 1/4 ou 1/8.
Posté 10 novembre 2017 - 08:03
Je dirais d'essayer de tous les mettre au même réglage de micro-step ...
Pourquoi as tu choisis de faire un réglage différent sur les moteurs ?
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
Posté 11 novembre 2017 - 08:27
Ce matin j'ai finalement remarqué que mon moteur avec un réducteur (https://fr.aliexpres...2311.0.0.gCYmt2) à bien une réduction de 1:14 et non de 1:13.
La description et le titre de l'objet disait 1:13 et le tableau (dans la description également) disait 1:14.
A l’œil l sur le robot on ne voyait pas la différence mais finalement lorsque j'ai refais les calculs en 1:14, la cinématique inverse tombait juste.
J'ai également parfois l'écran LCD qui se met à afficher des caractères spéciaux alors qu'il ne devrait pas.
Posté 11 novembre 2017 - 09:58
C'est décidé, je me lance !
Je commence l'impression ce wend !
Idem pour les commandes de pièces, mais là je galère grave ! Difficile de s'y retrouver
Si tu as le temps de me donner quelques liens utiles, ce serait top !
Je ne sais vraiment pas quel stepper choisir... pouvez vous m'aider
Je poste des photos asap
Posté 11 novembre 2017 - 10:53
Posté 19 novembre 2017 - 04:36
J'ai ajouté du feutre sous le robot et le boitier électro,ique afin de protéger les supports.
J'ai également ajouté un condensateur entre l'alimentation et la masse de l'écran LCD pour éviter les problème d'affichage aléatoire que j'avais de temps en temps. Il a fallu aussi éloigner un peut les fils de l'alimentation principal car il y avait également des perturbations de se côté la.
Démonstration de la cinématique inverse avec un petit Joystick et un quadrillage (un carreau rouge fait 10cm X 10cm et un noir fait 1cm X 1cm) :
Posté 30 novembre 2017 - 07:36
Bon, je suis en train de faire une application Android qui va me permettre de bouger le bras à ma guise, enregistrer la position, le bouger à nouveau, enregistrer la position et ainsi de suite. Après l’application enverra une séquence que le robot reproduira ensuite.
J'ai également modifier la partie de code pour les mouvements en fessant tout les calculs moi-même comme on m'a conseillé et donc en supprimant la fonction "Calculs_step_moteur" :
void Calculs_step_moteur(float angle, int moteur_step){ //fonction qui calcul les steps moteur et évite les hors-limites switch(moteur_step){ case 0: //Rotation 1 calcul_step = (angle/0.1)/0.45; if ((nouvelles_positions[0] < -125) || (nouvelles_positions[0] > 110)){ //limite Rotation 1 à -125° et +110° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 110");lcd.print((char)223);lcd.print("Min -125");lcd.print((char)223); delay(2000); hors_limite = false; return; } break; case 1: //Bras 1 calcul_step = (angle/0.1299)/0.225; if ((nouvelles_positions[1] < -100) || (nouvelles_positions[1] > 100)){ //limite Rotation 1 à -100° et +100° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 100");lcd.print((char)223);lcd.print("Min -100");lcd.print((char)223); delay(2000); hors_limite = false; return; } break; case 2: //Bras 2 calcul_step = (angle/0.0117)/1.8; if ((nouvelles_positions[2] < -120) || (nouvelles_positions[2] > 120)){ //limite Rotation 1 à -120° et +120° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 120");lcd.print((char)223);lcd.print("Min -120");lcd.print((char)223); delay(2000); hors_limite = false; return; } break; case 3: //Rotation 2 calcul_step = angle/0.45; if ((nouvelles_positions[3] < -40) || (nouvelles_positions[3] > 230)){ //limite Rotation 1 à -40° et +230° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 230");lcd.print((char)223);lcd.print("Min -40");lcd.print((char)223); delay(2000); hors_limite = false; return; } break; case 4: //Bras 3 calcul_step = (angle/0.2222)/0.45; if ((nouvelles_positions[4] < -100) || (nouvelles_positions[4] > 100)){ //limite Rotation 1 à -100° et +100° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 100");lcd.print((char)223);lcd.print("Min -100");lcd.print((char)223); delay(2000); hors_limite = false; return; } break; } valeur_Angle = ""; }
J'ai donc maintenant :
int position_moteur[5]; int nouvelles_positions[5]; int vitesse_steppers[5] = {1200, 1200, 1200, 250, 600}; int steps_par_angles[5] = {22.222, 34.214, 47.483, 2.222, 10.001}; void Mouvements_moteurs(float Rotation1, float Bras1, float Bras2, float Rotation2, float Bras3){ if ((Rotation1 < -125) || (Rotation1 > 110)){lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 110");lcd.print((char)223);lcd.print("Min -125");lcd.print((char)223);delay(2000); hors_limite = false;return;}else{nouvelles_positions[0] = Rotation1;hors_limite = true;} //limite Rotation 1 à -125° et +110° if ((Bras1 < -100) || (Bras1 > 100)){ lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 100");lcd.print((char)223);lcd.print("Min -100");lcd.print((char)223);delay(2000);hors_limite = false;return;}else{nouvelles_positions[1] = Bras1;hors_limite = true;}//limite Bras 1 à -100° et +100° if ((Bras2 < -120) || (Bras2 > 120)){lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 120");lcd.print((char)223);lcd.print("Min -120");lcd.print((char)223);delay(2000); hors_limite = false;return;}else{nouvelles_positions[2] = Bras2;hors_limite = true;}//limite Bras 2 à -120° et +120° if ((Rotation2 < -40) || (Rotation2 > 230)){lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 230");lcd.print((char)223);lcd.print("Min -40");lcd.print((char)223);delay(2000);hors_limite = false;return;}else{nouvelles_positions[3] = Rotation2;hors_limite = true;}//limite Rotation 2 à -40° et +230° if ((Bras3 < -100) || (Bras3 > 100)){lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 100");lcd.print((char)223);lcd.print("Min -100");lcd.print((char)223);delay(2000); hors_limite = false;return;}else{nouvelles_positions[4] = Bras3;hors_limite = true;}//limite Bras 3 à -100° et +100° float temps_mouvement[6]; float steps[5]; for (int i = 0; i < 5; i++) { steps[i] = (nouvelles_positions[i] - position_moteur[i]) * steps_par_angles[i]; steppers[i].move(steps[i]); temps_mouvement[i] = abs(steps[i]) / vitesse_steppers[i]; } for(int i = 0; i < 6; i++){ temps_mouvement[6] = max(temps_mouvement[6],temps_mouvement[i]); // Compare les valeurs pour connaitre la plus grande variation. } for (int i = 0; i < 5; i++) { steppers[i].setMaxSpeed(abs(steps[i]) / temps_mouvement[6]); } if(hors_limite == true){ while (steppers[0].distanceToGo() || steppers[1].distanceToGo() || steppers[2].distanceToGo() || steppers[3].distanceToGo() || steppers[4].distanceToGo()){ for (uint8_t i = 0; i < 5; i++) { steppers[i].run(); position_moteur[i] = nouvelles_positions[i]; } } } }
Posté 13 janvier 2018 - 09:20
Juste un petit message pour dire que le projet avance toujours gentillement. J'ai refondu l'application sur MIT App inventor 2 pour que tout tienne sur une seule page pour faciliter la gestion du bluetooth et la gestion des fichiers.
Posté 13 février 2018 - 11:38
Salut!
J'avance vraiment gentillement sur mon application mais je bute sur un problème de communication.
J'aimerais que lorsque l’application envoie une trame sous cette forme : 25,18,10,56,47,90f (interprétée par le robot comme ceci, rotation 1 : 25°, bras 1 : 18°, bras 2 : 10°, etc... et le f pour la fin de la trame), le robot face le mouvement et ensuite qu'il renvoie un message comme quoi il serai prêt à recevoir une autre trame.
Sans cela, l'application envoie les trames à la suite et il y a donc des erreurs.
Voici le code que j'ai mais qui ne fonctionne pas :
void Bluetooth(){ String trame = ""; boolean transmission = false; if (Serial1.available()){ // regarde si il y a une trame disponible trame = Serial1.read();Serial.print(trame);} if (trame == "1") {Serial1.write("Go");Serial.println(" Go");transmission = true;trame ="";delay(200);} else if (trame == "2"){Serial1.write("Attend un peut");Serial.println(" Attend!");trame ="";delay(200);} while(transmission = true){ trame = Serial1.readStringUntil(','); nouvelles_positions[0] = trame.toFloat(); trame = Serial1.readStringUntil(','); nouvelles_positions[1] = trame.toFloat(); trame = Serial1.readStringUntil(','); nouvelles_positions[2] = trame.toFloat(); trame = Serial1.readStringUntil(','); nouvelles_positions[3] = trame.toFloat(); trame = Serial1.readStringUntil(','); nouvelles_positions[4] = trame.toFloat(); trame = Serial1.readStringUntil('f'); nouvelle_position_pince = trame.toFloat(); if ((position_moteur[0] != nouvelles_positions[0]) || (position_moteur[1] != nouvelles_positions[1]) || (position_moteur[2] != nouvelles_positions[2]) || (position_moteur[3] != nouvelles_positions[3]) || (position_moteur[4] != nouvelles_positions[4]) || (nouvelle_position_pince != position_pince)){ Mouvements_moteurs(nouvelles_positions[0], nouvelles_positions[1], nouvelles_positions[2], nouvelles_positions[3], nouvelles_positions[4]); position_pince = nouvelle_position_pince; servo_pince.write(position_pince); } transmission = false; delay(100); } }
J'ai essayé de faire une trame "1" avec l'application qui demande au robot s'il est prêt. Si c'est le cas, il renvoi "Go" qui annonce à l'application qu'elle peut envoyer la trame avec les angles.
Avez-vous une idée de comment gérer cela?
Posté 13 février 2018 - 07:48
En fait il y a deux problèmes complètement distincts ...
=> La gestion de la communication ( Trame de communication )
=> La gestion des états du système ( Mise en place d'une machine à état )
Je veux bien aider sur l'un ou l'autre des points (ou les deux ) mais je vais être relou dans ce cas je veux que tu crées un sujet dédié dans la catégorie " programmation " du forum =)
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
Projets et réalisations, robots et machines en tout genre →
Bras robots, pinces, tourelles, et autres manipulateurs →
Bras Robot pouvant porter jusqu'à 8Kg ?Débuté par Adri, 09 déc. 2020 ![]() |
|
![]() |
||
Découvertes →
Projets collaboratifs →
Bras 6 axes BCN3D Moveo →
BCN3D Moveo et OpenCVDébuté par Kristoff, 22 oct. 2020 ![]() |
|
![]() |
||
Découvertes →
Projets collaboratifs →
Bras 6 axes BCN3D Moveo →
Bcn3d firmwareDébuté par theo-paul, 05 juil. 2018 ![]() |
|
![]() |
||
Découvertes →
Présentations de produits robotique →
Robots en kits →
Kit bras rotatif et pince robot [testé par mthibs]Débuté par mthibs, 31 mars 2017 ![]() |
|
![]() |
0 members, 1 guests, 0 anonymous users