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 en 3D sur fusion 360 et après de la faire découper au plasma (je pouvais
) 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 :
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