Aller au contenu


Photo
- - - - -

Base Alu ( ou la galère 2)

arduino PID tourelle

3 réponses à ce sujet

#1 3721

3721

    Membre

  • Membres
  • 23 messages

Posté 08 janvier 2019 - 04:36

Salut a tous ,

Alors voila j'ai fait une nouvelle base pour mon robot : 300 mm de long ,190 de large et 5 de haut le tout en alu ,avec les moteur et encodeur de la boutique , toujours un moteur pas a pas pour la tourelle et une Arduino Uno classique en microcontrôleur  :

IMG_20190107_160619.jpg IMG_20190107_160626.jpg IMG_20190107_160744.jpg

 

 

Pour couper la plaque d'alu j'ai d'abord décider de la modéliser en 3D sur fusion 360 et après de la faire découper au plasma (je pouvais :beach: :Koshechka_08:) mais trop pas trop le temps je voulais avoir assez vite mon chassie donc j'ai passé le fichier 3D au format PDF et je l'ai imprimer pour après le calquer au pointeau sur ma plaque .

Mais la petit problème, je pense qu'en le mettant en PDF le fichier a diminué de taille donc pratiquement toute les mesure était fausse, c'est pour cela qu'il y a un petit fail sur les troues pour le moteur droit . Avez vous une Idée d’où peut venir cette erreur si elle vous est déjà arrivé??

 

Maintenant que le chassie est découpé, percé, taraudé, que les fils sont branchés ... Il me reste juste a faire un petit adaptateur pour ma Tourelle et un j'ai petit souci d'alimentation (je créerais un autre sujet pour régler ce dernier). Je suis passé sur la programmation et premièrement réussir à implémenter le PID et la je bloque ...... je me suis beaucoup aidée du code de MIKE118 sur son robot de dernière minute pour la coupe de robotique ( désoler j'ai même un "peu" copier"), c'est le seul code assez complet et avec la librairie PID_V1 que je comprenais.

Pour l’instant le voici même s'il est pas du tout terminé:

#include <Stepper.h>
Stepper Motor (200,A0,A1,A2,A3);

const byte MotorRightEnable = 5;
const byte MotorRight1 = 8;
const byte MotorRight2 = 9;
const byte MotorLeftEnable = 6;
const byte MotorLeft1 = 10;
const byte MotorLeft2 = 11;

const byte EncodeurDroitA = 2;
const byte EncodeurDroitB = 4;
const byte EncodeurGaucheA= 3;
const byte EncodeurGaucheB= 7;

const byte TrigPin = 12;
const byte EchoPin = 13;
const byte MaxDist = 200;
#include <NewPing.h>
NewPing Tourelle(TrigPin,EchoPin,MaxDist);

#include <PID_v1.h>
#include <TimerOne.h>
double SetPointDroit, InputDroit, OutputDroit;
double SetPointGauche, InputGauche, OutputGauche;
double Kp = 0,Ki =0, Kd = 0;
PID PIDDroit(&InputDroit, &OutputDroit, &SetPointDroit, Kp, Ki, Kd, DIRECT);
PID PIDGauche(&InputGauche, &OutputGauche, &SetPointGauche, Kp, Ki, Kd, DIRECT);

volatile byte CountDroit = 0;
volatile byte CountGauche = 0;
volatile double SpeedDroit = 0;
volatile double SpeedGauche = 0;

void setup() {
  pinMode(EncodeurDroitA,INPUT_PULLUP);
  pinMode(EncodeurDroitB,INPUT_PULLUP);
  pinMode(EncodeurGaucheA,INPUT_PULLUP);
  pinMode(MotorRightEnable,OUTPUT);
  pinMode(MotorLeftEnable,OUTPUT);
  pinMode(EncodeurGaucheB,INPUT_PULLUP);
  pinMode(MotorRight1,OUTPUT);
  pinMode(MotorRight2,OUTPUT);
  pinMode(MotorLeft1,OUTPUT);
  pinMode(MotorLeft2,OUTPUT);
  pinMode(TrigPin,OUTPUT);
  pinMode(EchoPin,INPUT);
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  
  Serial.begin(9600);
  Motor.setSpeed(240);
  
  attachInterrupt (0, CounterDroit, CHANGE);
  attachInterrupt (1, CounterGauche, CHANGE);
  
  Timer1.initialize (80000);  
  Timer1.attachInterrupt( timerIsr );
  
  InputDroit = 0;
  SetPointDroit = 0;
  InputGauche = 0;
  SetPointGauche = 0;
  
  PIDDroit.SetMode(AUTOMATIC);
  PIDDroit.SetOutputLimits(-255, 255);
  PIDGauche.SetMode(AUTOMATIC);
  PIDGauche.SetOutputLimits(-255, 255);
}
void loop() {


}    
void CounterDroit(){
  byte state =PIND;
(((state >> EncodeurDroitA) & 1)^((state >> EncodeurDroitB) & 1)) ? CountDroit-- : CoutDroit++; 
}
void CounterGauche(){
  byte state =PIND;
(((state >> EncodeurGaucheA) & 1)^((state >> EncodeurGaucheB) & 1)) ? Countgauche++ : CountGauche--; 
}
void timerIsr (){
  SpeedDroit = CountDroit;
  CountDroit = 0;
  Speedgauche = CountGauche;
  CountGauche;
}

Donc le moment des questions :ignat_02: :

1)sur le code de MIKE118, le dernier  code (https://www.robot-ma...upe-de-france)

Il utilise un contrôleur de moteur avec seulement 2entrées alors que moi j'utilise le L293D qui en utile 3 :2 pour la direction et 1en PWM pour la vitesse . Comment pourrais je faire pour adapter mon code?? un truc comme sa :

void setMotorRigh (int speeds,boolean reverse){
  analogWrite(motorRighEnablePin,speeds);
  digitalWrite(motorRighIn1,reverse);
  digitalWrite(motorRighIn2,! reverse);

2) pour avoir la vitesse le code n'a-t-il pas besoin du diamètre des roue ? Je parle uniquement pour l'asservissement en vitesse  ou la vitesse est juste en tours par minute/seconde?

 

3) Est -ce une bonne idée de partir sur le code de la coupe de robotique pour faire mon code??Avez vous des exemples plus explicites même si j'ai très bien compris celui ci ?

 

Merci de vos réponse

j’espère avoir été assez compréhensif :thank_you:

:bye:

 



#2 Mike118

Mike118

    Staff Robot Maker

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

Posté 08 janvier 2019 - 05:39

Salut a tous ,

Alors voila j'ai fait une nouvelle base pour mon robot : 300 mm de long ,190 de large et 5 de haut le tout en alu ,avec les moteur et encodeur de la boutique , toujours un moteur pas a pas pour la tourelle et une Arduino Uno classique en microcontrôleur  :

 

Pour couper la plaque d'alu j'ai d'abord décider de la modéliser ne 3d sur fusion 360 et apres de la faire découper au plasma (je pouvais :beach: :Koshechka_08:) mais trop pas trop le temps je voulais avoir assez vite mon chassie donc j'ai passé le fichier 3D au format PDF et je l'ai imprimer pour après le calquer au pointeau sur ma plaque .

Mais la petit problème, je pense qu'en le mettant en PDF le fichier a diminué de taille donc pratiquement toute les mesure était fausse, c'est pour cela qu'il y a un petit fail sur les troues pour le moteur droit . Avez vous une Idée d’où peut venir cette erreur si elle vous est déjà arrivé??

 

 

Oui malheureusement si tu ne spécifie pas que ça doit  imprimer à l'echelle au moment d'imprimer l'impression peut parfois jouer des tours... 
C'est pour cela que sur les plans à imprimer, l'échelle est souvent indiqué et qu'il y a un repère qu'on peut mesurer qui permet de vérifier que l'impression a respecté l'échelle ... 

Bon l'important c'est que tu t'en es sorti quand même et que tu retiendra ça pour le prochain robot ;)  En plus il a une bonne tête ! 
Il me fait un peu penser au robot hector de Path dommage qu'il y a visiblement un problème avec certaines photo... hésite pas à essayer de modifier ton message pour les remettre !

 

 

 

Je me suis beaucoup aidée du code de MIKE118 sur son robot de dernière minute pour la coupe de robotique ( désoler j'ai même un "peu" copier"), c'est le seul code assez complet et avec la librairie PID_V1 que je comprenais.

 

 

 

C'est tant mieux si ce code peut aider ! Je n'ai jamais eu l'occasion de retoucher ce code depuis que j'ai confié le robot ... Donc je n'ai même pas une version de code complète à proposer c'est une honte ! :) Mais bon on va peut être y remédier avec ton robot et ça aidera sans doute d'autres personnes =) 

 

 

 

 

1)sur le code de MIKE118, le dernier  code (https://www.robot-ma...upe-de-france)

Il utilise un contrôleur de moteur avec seulement 2entrées alors que moi j'utilise le L293D qui en utile 3 :2 pour la direction et 1en PWM pour la vitesse . Comment pourrais je faire pour adapter mon code?? un truc comme sa :

void setMotorRigh (int speeds,boolean reverse){
  analogWrite(motorRighEnablePin,speeds);
  digitalWrite(motorRighIn1,reverse);
  digitalWrite(motorRighIn2,! reverse);
}

 

Alors sur le principe si tu veux tu peux utiliser le L293 exactement comme le driver que j'utilise en branchant le enable toujours sur le 5V et en utilisant uniquement que les in1 et 2  =) 

 

Après si tu reprends le code tu peux aussi directement remplacer les sous fonctions en : 

void avancerMoteurDroit(uint8_t a) // En avant
{
  analogWrite (MOTEURDROITEN, a); // Contrôle de vitesse en PWM, moteur 1
  digitalWrite(MOTEURDROITA, HIGH); 
  digitalWrite(MOTEURDROITB, LOW); 
}
void avancerMoteurGauche(uint8_t a) // En avant
{
  analogWrite (MOTEURGAUCHEEN, a); // Contrôle de vitesse en PWM, moteur 2
  digitalWrite(MOTEURGAUCHEA, HIGH);
  digitalWrite(MOTEURGAUCHEB, LOW);
}

// ...

après avoir ajouté les #define manquant et inverser le sens pour les fonctions reculer, et tout le reste du code marchera ... car les fonctions d'adaptation seront remplacée! Et ainsi pas de changement de nom de fonction ou de fonctionnement

 

Mais sinon : oui  la fonction que tu as fait peut très bien remplacée les miennes, en plus c'est exactement à ça que sert le " ! " ... 
et ces fonctions avancer et reculer n'ont volontairement pas été appelée partout dans le code justement pour cette raison pour qu'elle soit facilement remplacer par une autre fonction =) Donc 0 problèmes ! Tu as l'embarras du choix des solutions !

 

 

 

2) pour avoir la vitesse le code n'a-t-il pas besoin du diamètre des roue ? Je parle uniquement pour l'asservissement en vitesse  ou la vitesse est juste en tours par minute/seconde?

 

 

Alors sur le principe en effet tu n'as pas forcément besoin d'avoir le diamètre des roues pour asservir un moteur en tour/minutes =) Par contre en effet quand tu commenceras à vouloir indiquer un déplacement en mm à ton robot le diamètre des roues sera utile ;) tu peux voir qu'il a commencé à être utilisé ici

 

 

 

3) Est -ce une bonne idée de partir sur le code de la coupe de robotique pour faire mon code??Avez vous des exemples plus explicites même si j'ai très bien compris celui ci ?

 

 

Je ne sais pas si c'est une bonne ou une mauvaise idée, je ne sais même pas si ce code est suffisament bien expliqué pour un débutant, je suppose que c'est plus à toi de le dire en fait, ... Mais je suis intéressé d'avoir l'avis d'autres personnes sur le sujet, débutants comme avancés =) .

Quoi qu'il en soit je pense qu'il est intéressant d'étudier différents codes =) Que cela soit pour en refaire un ou bien te baser dessus ! Et pour ma part si c'est fournis c'est que tu peux te servir pour le copier et le coller, tout ou partie, si il te convient ;) Et tant que tu comprends ce que tu fais je suppose que c'est le principal ! =) 

Comme ça côté code il y a le github de bobox qui contient le code de son robot crabeel =) il mérite un coup d'oeil c'est un joli code avec des classes =) 
La classe " base " qu'il a écrit peut t'intéresser sur le principe =) 

Si il passe à l'occasion tu pourras éventuellement lui poser des questions ! 

Après je suis sûr qu'il y a rien que sur le forum d'autres codes intéressant que je ne pense pas à citer là tout de suite mais que d'autres membres pourront éventuellement t'indiquer ! =) 

 

 

Quoi qu'il en soit ne te décourage pas et bonne continuations pour la suite ! =)



 


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  

 

 

 


#3 3721

3721

    Membre

  • Membres
  • 23 messages

Posté 08 janvier 2019 - 07:57

Merci

Normalement pour les photos la c'est bon.

 

 

 

après avoir ajouté les #define manquant et inverser le sens pour les fonctions reculer, et tout le reste du code marchera ... car les fonctions d'adaptation seront remplacée! Et ainsi pas de changement de nom de fonction ou de fonctionnement

Je pense pas faire avec les #define je suis pas encore assez habitué et je vais simplement  refaire les fonctions reculer,avancer tourner ... a ma sauce en fonction aussi du L293D sa me permettra de mieux comprendre mon code aux lieu de faire un bête copier coller.

 

Par contre pour l'impression j'ai vraiment fait attention de mettre tous mon schéma a l'échelle c'est pour  cela que sa ma autant surpris .

Après j'ai pris ton code car il me paraissait vraiment complet et le comprennait facilement .

 

En attendant l'avis des un ou le passage des autres je retourne essayer de comprendre le PID en version linéaire et angulaire où la c'est le gros trou.... 

Sur ce bonne nuit ou journée :thank_you:



#4 Mike118

Mike118

    Staff Robot Maker

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

Posté 08 janvier 2019 - 08:20

Juste pour info : 

const byte MotorRightEnable = 5;

#define MotorRightEnable 5

sont deux notations "équivalente". 
Mais même si les #define sont une notation un peu plus courte tu as sans doute raison de privilégier la notation " const " ,

Pour plus d'info sur le thème => const et #define

c'est juste que moi je suis trop habitué à utiliser #define 

 

Par contre par convention c'est mieux de mettre les " constantes " en "MAJUSCULE" =) Que cela soit des #define ou de const =) ça permet de mieux comprendre que ce ne sont pas des " variables" au sens "changeantes" =) 


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 : arduino, PID, tourelle

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

0 members, 0 guests, 0 anonymous users