Aller au contenu


Photo
* * * * - 1 note(s)

Bras robot BCN3D Moveo de Donovan

bras robot

348 réponses à ce sujet

#261 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

Posté 07 novembre 2017 - 09:57

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.

 

:clapping:  :king:



#262 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 08 novembre 2017 - 07:29

Bravissimo !

C'est fini ?

#263 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

Posté 08 novembre 2017 - 07:50

Ho non. C'est loin d'être fini !

#264 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 08 novembre 2017 - 08:28

Ho non. C'est loin d'être fini !

C'est quoi ton objectif, maintenant ?

#265 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

Posté 08 novembre 2017 - 08:35

Maintenant que le bras bouge un peu comme je veux, il faut commencer à faire des choses sympa ^^

#266 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

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.



#267 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#268 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

Posté 10 novembre 2017 - 08:13

Pour la précision mais je vais essayer de les mètres tous pareil. 



#269 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

Posté 10 novembre 2017 - 09:00

Je viens de remettre le moteur du second bras en step complet et je n'ai plus le problème ^^



#270 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

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.



#271 tmaroye

tmaroye

    Nouveau membre

  • Membres
  • 4 messages

Posté 11 novembre 2017 - 09:58

Bonjour   Donovandu88 ce que tu as fait est vraiment TOP

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



#272 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

Posté 11 novembre 2017 - 10:53

Salut ! Regardes dans la BOM que BNC3D fournie, ils donnent les liens des pièces, après il suffit de prendre des moteurs ayant les mêmes caractéristiques. En fonction de ton budget, tu sélectionnes la qualité des composants que tu veux. N'hésites pas à ouvrir un sujet, pour présenter tes modifications ou ta manière de faire.

#273 tmaroye

tmaroye

    Nouveau membre

  • Membres
  • 4 messages

Posté 11 novembre 2017 - 04:06

OK merci



#274 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

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) :



#275 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

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];
           }
        }         
    }
}



#276 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

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. 

 

Screenshot_20180113-091348.jpg

 

Screenshot_20180113-091434.jpg

 

Screenshot_20180113-091443.jpg



#277 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

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?



#278 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 13 février 2018 - 06:53

Ça ressemble à une machine à état. Si ça peut taider à formaliser, tu peux déjà te faire une variable état et faire un switch case avec cette variable. Et chaque case met à jour l'état pour switcher sur la boucle suivante.

#279 Donovandu88

Donovandu88

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 680 messages
  • Gender:Male

Posté 13 février 2018 - 07:40

Un switch avec comme variable un true ou false?



#280 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 




Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : bras robot

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users