Bon attendons les nouveaux tests =)

#221
Posté 02 novembre 2017 - 11:37
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!
#222
Posté 02 novembre 2017 - 09:04
Bon, j'ai refais de nombreux essais, pour pouvoir utiliser steppers[i] en tant qu'objet pour faire des .setAcceleration ou .moveTo ou autre mais sur mon programme ça ne marche pas alors que sur le tiens ça fonctionne. J'ai pourtant mis exactement les mêmes choses. Je me replongerais dedans se week-end car je commence à en avoir marre de bloquer la dessus.
#include <AccelStepper.h> AccelStepper stepper_Rotation1(AccelStepper::DRIVER,2,5); // Driver X CNC Shield AccelStepper stepper_Bras1(AccelStepper::DRIVER,9,10); //Limit X Axis et Limite Y Axis AccelStepper stepper_Bras2(AccelStepper::DRIVER,3,6); // Driver Y CNC Shield AccelStepper stepper_Rotation2(AccelStepper::DRIVER,4,7); // Driver Z CNC Shield AccelStepper stepper_Bras3(AccelStepper::DRIVER,12,13); // Driver A CNC Shield AccelStepper steppers[5] = {stepper_Rotation1, stepper_Bras1, stepper_Bras2, stepper_Rotation2, stepper_Bras3}; int position_moteur[5]; int vitesse_steppers[5] = {1000, 1000, 1500, 250, 500}; void setup() { initialisation(); } void loop() { // reste du programme avec les .run et tout et tout.... } void initialisation(){ for (int i = 0; i < 5; i++) { steppers[i].setMaxSpeed(vitesse_steppers[i]); steppers[i].setAcceleration(8000); position_moteur[i] = 0; } }
en mettant tout manuellement genre :
stepper_Rotation1.setAcceleration(8000); stepper_Bras1.setAcceleration(8000); stepper_Bras2.setAcceleration(8000); etc...
Le programme fonctionne mais pas lorsque que j'utilise le steppers[i].
Je tiens à pouvoir l'utiliser car c'est bien pratique pour la suite.
#223
Posté 03 novembre 2017 - 02:08
#include <AccelStepper.h> const int enablePin = 8; //activer les moteurs du CNC Shield AccelStepper stepper_Rotation1(1,2,5); // Driver X CNC Shield AccelStepper stepper_Bras1(1,9,10); //Limit X Axis et Limite Y Axis AccelStepper stepper_Bras2(1,3,6); // Driver Y CNC Shield AccelStepper stepper_Rotation2(1,4,7); // Driver Z CNC Shield AccelStepper stepper_Bras3(1,12,13); // Driver A CNC Shield AccelStepper steppers[5] = {stepper_Rotation1, stepper_Bras1, stepper_Bras2, stepper_Rotation2, stepper_Bras3}; (...)
Le code déclare les objects stepper_*, instances de la classe AccelStepper. Ce sont directement les objects, pas des pointeurs. Aucun des paramètres passés au constructeur n'est un pointeur (que des int).Ce ne sont pas des copies mais les pointeurs des objets qui sont passés en paramètre.
En créant le tableau, on réserve l'emplacement pour la taille de 5 objets AccelStepper. On remplit ensuite le tableau en faisant copiant aux différents emplacements les objets créés précédemment.
Une modification d'un objet dans la liste ne modifie pas les objets initiaux. Pour s'en convaincre, voir l'exemple suivant (à compiler avec: g++ programmeprincipal.cpp -o monprogramme):
//programmeprincipal.cpp //----- #include <iostream> #include <vector> #include <string> class DummyClass { private: float dummyFloat; int dummyInteger; std::string dummyString; public: DummyClass(float fv=0.0, int iv=0, std::string sv=""): dummyFloat(fv), dummyInteger(iv), dummyString(sv) {} ~DummyClass(){} void set(float v){ dummyFloat = v; } void set(int v){ dummyInteger = v; } void set(std::string v){ dummyString = v; } void get(){ std::cout << dummyString << ", " << dummyFloat << ", " << dummyInteger << std::endl; } }; int main(int argc, char** argv) { DummyClass elem0(0.,0, "apple"); DummyClass elem1(0.0, 1, "banana"); DummyClass elem2(23.18, -9, "cheese"); DummyClass elem3(-3., 7, "coffee"); DummyClass dummyList[4] = {elem0, elem1, elem2, elem3}; std::cout << "------" << std::endl; std::cout << "elems:" << std::endl; elem0.get(); elem1.get(); elem2.get(); elem3.get(); std::cout << "------" << std::endl; std::cout << "dummyList:" << std::endl; for(int i=0 ; i < 4 ; i++) { dummyList[i].get(); } std::cout << "------" << std::endl; std::cout << "elems:" << std::endl; elem0.get(); elem1.get(); elem2.get(); elem3.get(); std::cout << "------" << std::endl; std::string newname = "noname"; std::cout << "set list strings to " << newname << std::endl; for(int i=0 ; i < 4 ; i++) { dummyList[i].set(newname); dummyList[i].set(0); dummyList[i].set(float(0.)); } std::cout << "------" << std::endl; std::cout << "dummyList:" << std::endl; for(int i=0 ; i < 4 ; i++) { dummyList[i].get(); } std::cout << "------" << std::endl; std::cout << "elems:" << std::endl; elem0.get(); elem1.get(); elem2.get(); elem3.get(); return 1; }Fin de la parenthèse.
Ça par contre, je suis tout à fait d'accord !Je ne pense pas que l'erreur soit à chercher de ce côté =)
J'utilise cette méthode perso et j'ai jamais vu de problèmes jusqu'à maintenant =)
Comme l'a suggéré Path sur le Discord, il y a un enable à mettre à true dans l'appel au constructeur pour que les pins soient en mode OUTPUT. Où est-ce que ça apparaît dans ton code, Donovan ? Il est possible que selon les versions d'AccelStepper que vous utilisez, il y ait des différences de comportement (ref: http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html )
#224
Posté 03 novembre 2017 - 02:51
déjà j'ai repéré une différence dans l'initialisation des objets stepper , j'ai plus de paramètres, que j'ai mis à 0 par défaut ...
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!
#226
Posté 04 novembre 2017 - 04:13
Depuis ce matin j'ai réussi à utiliser le steppers[i], j'ai simplement ouvert un nouveau croquis, copié/collé mon programme par étape sans rien modifier et en essayant si ça fonctionne toujours et sa a re-fonctionné.
Donc je me suis re-penché sur le problème des vitesses pour que tous les mouvements arrivent en même temps.
J'ai toujours plus ou moins les mêmes résultats.
J'ai tenté une autre méthode qui fonctionne ainsi :
- Calcul des steps pour chaque moteur
- Calcul des temps pour arriver aux steps voulus en fonction de la vitesse max de l'articulation.
- Mise en tableau des temps et sélection du temps le plus long
- Assignation des nouvelles vitesses
La vitesse des autres articulations est fixée par rapport à la vitesse la plus longue. Donc la vitesse est réduite sur les autres.
Les calculs :
void Mouvements_moteurs(int Rotation1, int Bras1, int Bras2, int Rotation2, int Bras3){ int nouvelles_positions[5]; nouvelles_positions[0] = Rotation1; nouvelles_positions[1] = Bras1; nouvelles_positions[2] = Bras2; nouvelles_positions[3] = Rotation2; nouvelles_positions[4] = Bras3; float temps_mouvement[6]; for (int i = 0; i < 5; i++) { // Calcul nouvelle position et temps de mouvement pour chaque articulation Calculs_step_moteur(nouvelles_positions[i], i); steppers[i].moveTo(calcul_step); temps_mouvement[i] = abs(calcul_step / vitesse_steppers[i]); position_moteur[i] = nouvelles_positions[i]; } for(int i = 0; i <= 7; i++){ // trouve l'articulation qui mettra le plus de temps à faire le mouvement temps_mouvement[6] = max(temps_mouvement[6],temps_mouvement[i]); } for (int i = 0; i < 6; i++) { // assigne la vitesse aux moteurs Calculs_step_moteur(nouvelles_positions[i], i); steppers[i].setMaxSpeed(abs(calcul_step / temps_mouvement[6])); } if(hors_limite == true){ // met en route le mouvement while (steppers[0].isRunning() || steppers[1].isRunning() || steppers[2].isRunning() || steppers[3].isRunning() || steppers[4].isRunning()){ for (uint8_t i = 0; i < 5; i++) { steppers[i].run(); } } } }
Je lance avec une suite de fonctions comme ceci :
Mouvements_moteurs(-100, 70, 20, 0, -80); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(120, -25, 42, 0, 50); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(-50, 10, -18, 0, -3); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3
Dans la première fonction, tout arrive en même temps (résultat voulu) et ensuite pour les deux autres, les mouvements vont bien comme il faut mais n'arrivent pas en même temps.
#227
Posté 04 novembre 2017 - 04:36
Je peux me tromper mais je crois que j'ai cerné le problème =) .
Est ce que ça ne serait pas par ce que tu te bases uniquement sur les valeurs envoyé en paramètre de ta fonction et pas de la position courante du robot .
Hors le moveTo est une commande " absolue " et non pas relative !
Et du coup ton premier calcul de vitesse qui se fait sur " position souhaité - position_courante=0 " est "juste", mais dans le deuxième calcul, la position courante n'est plus égale à 0 Je te laisse trouver la méthode dans la librairie pour récupérer la position courante
Sinon autre remarque comme ça :
vitesse_steppers[i] => il doit être locale a cette fonction =) Pas global ça sera plus propre. Il doit donc être initialisé. =)
car faut éviter une possible division par zéro.
Si tu veux vraiment réutilisé la même valeur que la valeur précedement utilisée/calculée dans le tour précédent tu laisses ta variable locale mais tu la déclare stactic ! =)
Allez t'y est presque lâche rien !
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!
#229
Posté 04 novembre 2017 - 05:24
Avec mon code, le bras robot exécute parfaitement la première fonction en finissant toutes les articulations en même temps
Mouvements_moteurs(-100, 70, 20, 0, -80); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3
et ensuite pour les autres fonctions
Mouvements_moteurs(120, -25, 42, 0, 50); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(-50, 10, -18, 0, -3); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3
le robot ne termine pas les mouvements en même temps
#230
Posté 04 novembre 2017 - 05:30
Tu as compris ma réponse ? =)
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!
#231
Posté 04 novembre 2017 - 05:35
Oui, je cherche du côté des distanceToGo () ou currentPosition ()
Je vais aller prendre ma douche pour réfléchir la dessus en me vidant le cerveau
#232
Posté 04 novembre 2017 - 06:14
Tu peux utiliser l'un ou l'autre, tout dépend de si tu veux que les déplacements de ton bras soient absolus ou relatifs =)
Si tu veux que les déplacements soient relatif tu remplaces juste moveTo par distanceToGo() move() =)
Si tu veux que ça soit absolue tu as juste à faire Nouvelleposition- positionCourante dans ton code actuelle au lieu de juste nouvelle position quand tu calculs les pas à faire =)
EDIT : j'ai corrigé mon message pour corriger la petite bêtise que j'avais dit
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!
#233
Posté 04 novembre 2017 - 07:17
C'est plutôt, moveTo() (absolu) et move() (relatif) je crois ==> http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html
En relatif j'ai de bons résultats mais va falloir que je modifie la manière de comment interpréter les angles.
Le problème avec le calcul Nouvelleposition- positionCourante, c'est que lorsque l'on mélange les angles positif et négatif, c'est merdique.
#234
Posté 04 novembre 2017 - 07:57
Pourquoi c'est merdique avec des angles négatifs ?
ça marche bien ...
exemple
si tu es à -10 et que du dois aller à 50 => 50 - (-10 ) = 60
si tu es à -10 et que du dois aller à -20 => -20 - (-10 ) = -10
si tu es à 10 et que du dois aller à 50 => 50 - (10 ) = 40
si tu es à 10 et que du dois aller à 20 => 20 -(10 ) = 10
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!
#236
Posté 04 novembre 2017 - 09:05
Souvent la difficulté c'est pas de résoudre le problème mais c'est de comprendre le problème
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!
#237
Posté 04 novembre 2017 - 09:15
Voici la vidéo (en cours d'upload) :
La séquence 2 et 5 bug un peu et lorsque je met des delay entre les séquences, le robot s’arrête quelque fois.
Voici mon code :
//Lancement des séquences comme ceci : Mouvements_moteurs(-100, 70, 20, 0, -80); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(120, -25, 42, 0, 50); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(-50, 10, -18, 0, -3); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(-80, 28, -50, 0, 33); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(122, -42, 52, 0, 90); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(50, 4, 23, 0, -80); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(70, 20, -22, 0, -85); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 Mouvements_moteurs(0, 0, 0, 0, 0); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 void Mouvements_moteurs(int Rotation1, int Bras1, int Bras2, int Rotation2, int Bras3){ int nouvelles_positions[5]; nouvelles_positions[0] = Rotation1; nouvelles_positions[1] = Bras1; nouvelles_positions[2] = Bras2; nouvelles_positions[3] = Rotation2; nouvelles_positions[4] = Bras3; float temps_mouvement[6]; for (int i = 0; i < 5; i++) { Calculs_step_moteur((nouvelles_positions[i] - position_moteur[i]), i); steppers[i].move(calcul_step); temps_mouvement[i] = abs(calcul_step / vitesse_steppers[i]); } for(int i = 0; i <= 7; 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 < 6; i++) { Calculs_step_moteur((nouvelles_positions[i] - position_moteur[i]), i); steppers[i].setMaxSpeed(abs(calcul_step / temps_mouvement[6])); } if(hors_limite == true){ while (steppers[0].isRunning() || steppers[1].isRunning() || steppers[2].isRunning() || steppers[3].isRunning() || steppers[4].isRunning()){ for (uint8_t i = 0; i < 5; i++) { steppers[i].run(); position_moteur[i] = nouvelles_positions[i]; } } } }
Je regarderais pourquoi il se comporte comme ça des fois (séquence 2 et 5)
#238
Posté 04 novembre 2017 - 10:02
Tu comptes lui faire jouer la Marche Impériale avec le bruit que font ses moteurs ?

Répondre à ce sujet

Aussi étiqueté avec au moins un de ces mots-clés : bras robot
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 ![]() |
|
![]() |
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users