Merci à vous !
- Robot Maker
- → Contenu de lacazol
Contenu de lacazol
Il y a 9 élément(s) pour lacazol (recherche limitée depuis 04-mai 13)
Par type de contenu
Voir pour ce membre
#84069 Présentation
Posté par lacazol sur 27 mai 2017 - 03:04 dans Et si vous vous présentiez?
#84019 Présentation
Posté par lacazol sur 26 mai 2017 - 02:03 dans Et si vous vous présentiez?
Bonjour à tous, je suis en classe préparatoire pour les écoles d'ingénieur et j'ai toujours été intéressé par la robotique. Profitant du projet à rendre pour les concours, j'ai décidé de me lancer dans la construction d'un robot aspirateur de toutes pièces. Je suis aussi intéressé par les mathématiques et la physique.
#84032 asservissement deux moteurs carte Romeo
Posté par lacazol sur 26 mai 2017 - 05:25 dans Programmation
c'est le programme que j'utilise pour l'instant asservissement.ino 3,95 Ko 56 téléchargement(s)
#include <FlexiTimer2.h> #include <digitalWriteFast.h> // Codeur incrémental #define codeurInterruptionA 0 #define codeurInterruptionB 1 #define codeurPinA 2 #define codeurPinB 3 volatile long ticksCodeur = 0; // Moteur CC #define directionMoteur 4 #define pwmMoteur 5 // Cadence d'envoi des données en ms #define TSDATA 100 unsigned long tempsDernierEnvoi = 0; unsigned long tempsCourant = 0; // Cadence d'échantillonnage en ms #define CADENCE_MS 10 volatile double dt = CADENCE_MS/1000.; volatile double temps = -CADENCE_MS/1000.; volatile double omega; volatile double commande = 0.; volatile double vref = 6.5; // PID volatile double Kp = 0.29; volatile double Ki = 8.93; volatile double P_x = 0.; volatile double I_x = 0.; volatile double ecart = 0.; // Initialisations void setup(void) { // Codeur incrémental pinMode(codeurPinA, INPUT); // entrée digitale pin A codeur pinMode(codeurPinB, INPUT); // entrée digitale pin B codeur digitalWrite(codeurPinA, HIGH); // activation de la résistance de pullup digitalWrite(codeurPinB, HIGH); // activation de la résistance de pullup attachInterrupt(codeurInterruptionA, GestionInterruptionCodeurPinA, CHANGE); attachInterrupt(codeurInterruptionB, GestionInterruptionCodeurPinB, CHANGE); // Moteur CC pinMode(directionMoteur, OUTPUT); pinMode(pwmMoteur, OUTPUT); // Liaison série Serial.begin(9600); Serial.flush(); // Compteur d'impulsions de l'encodeur ticksCodeur = 0; // La routine isrt est exécutée à cadence fixe FlexiTimer2::set(CADENCE_MS, 1/1000., isrt); // résolution timer = 1 ms FlexiTimer2::start(); } // Boucle principale void loop() { // Ecriture des données sur la liaison série ecritureData(); } void isrt(){ int codeurDeltaPos; double tensionBatterie; // Nombre de ticks codeur depuis la dernière fois codeurDeltaPos = ticksCodeur; ticksCodeur = 0; // Calcul de la vitesse de rotation omega = ((2.*3.141592*((double)codeurDeltaPos))/1632.)/dt; // en rad/s /******* Régulation PID ********/ // Ecart entre la consigne et la mesure ecart = vref - omega; // Terme proportionnel P_x = Kp * ecart; // Calcul de la commande commande = P_x + I_x; // Terme intégral (sera utilisé lors du pas d'échantillonnage suivant) I_x = I_x + Ki * dt * ecart; /******* Fin régulation PID ********/ // Envoi de la commande au moteur tensionBatterie = 7.2; CommandeMoteur(commande, tensionBatterie); temps += dt; } void ecritureData(void) { // Ecriture des données en sortie tous les TSDATA millisecondes tempsCourant = millis(); if (tempsCourant-tempsDernierEnvoi > TSDATA) { Serial.print(temps); Serial.print(","); Serial.print(omega); Serial.print("\r"); Serial.print("\n"); tempsDernierEnvoi = tempsCourant; } } void CommandeMoteur(double tension, double tensionBatterie) { int tension_int; // Normalisation de la tension d'alimentation par // rapport à la tension batterie tension_int = (int)(255*(tension/tensionBatterie)); // Saturation par sécurité if (tension_int>255) { tension_int = 255; } if (tension_int<-255) { tension_int = -255; } // Commande PWM if (tension_int>=0) { digitalWrite(directionMoteur, LOW); analogWrite(pwmMoteur, tension_int); } if (tension_int<0) { digitalWrite(directionMoteur, HIGH); analogWrite(pwmMoteur, -tension_int); } } // Routine de service d'interruption attachée à la voie A du codeur incrémental void GestionInterruptionCodeurPinA() { if (digitalReadFast2(codeurPinA) == digitalReadFast2(codeurPinB)) { ticksCodeur--; } else { ticksCodeur++; } } // Routine de service d'interruption attachée à la voie B du codeur incrémental void GestionInterruptionCodeurPinB() { if (digitalReadFast2(codeurPinA) == digitalReadFast2(codeurPinB)) { ticksCodeur++; } else { ticksCodeur--; } }
#84021 asservissement deux moteurs carte Romeo
Posté par lacazol sur 26 mai 2017 - 02:10 dans Programmation
Autant pour moi je n'avais pas vu la case présentation je viens de le faire !
Mon problème est que mon robot ne roule pas droit ni à la vitesse demandée, je cherche donc à réaliser un asservissement en vitesse sur l'une des roues à l'aide d'un codeur incrémental placé sur le réducteur lié à un des deux moteurs, mais je n'arrive pas à imposer la même vitesse asservie à l'autre moteur... J'utilise une carte Arduino Romeo avec un double pont en H pour contrôler les moteurs. Ce sont des moteurs à courant continu avec un réducteur de rapport 34 et un codeur incrémental 48 CPR.
#84016 asservissement deux moteurs carte Romeo
Posté par lacazol sur 26 mai 2017 - 11:13 dans Programmation
Bonjour à tous, je suis actuellement en train de réaliser mon propre robot aspirateur à l'aide d'une carte Romeo Arduino reliée à deux moteurs à courant continu pour faire tourner les roues.
Je souhaite effectuer un asservissement sur la vitesse des DEUX roues, premièrement pour que celui-ci se déplace tout droit ce qui n'est pas le cas, et aussi car cela est intéressant pour le tracé des courbes de vitesse essentielles pour l'exposé que je prépare. Le problème est que je ne peux que calculer la vitesse d'une seule des deux roues n'ayant qu'une place sur la carte pour brancher les fils d'un des codeurs situés sur les réducteurs liés moteurs , je n'arrive pas à imposer la vitesse d'une des roues à l'autre, ni à obtenir la vitesse souhaitée...
Merci à l'avance pour votre aide !
#84027 asservissement deux moteurs carte Romeo
Posté par lacazol sur 26 mai 2017 - 04:16 dans Programmation
Au temps pour moi les fautes d'expression
Par manque de temps (je dois avoir fini dans deux semaines) je vais plutôt faire un ramasse poussières avec un servomoteur relié à une sorte de rouleau de peinture ou quelque chose dans le style pour envoyer les saletés dans un bac qu'il faudra changer quand il est plein, c'est plus simple qu'un système d'aspiration.
#84068 asservissement deux moteurs carte Romeo
Posté par lacazol sur 27 mai 2017 - 03:00 dans Programmation
En effet j'ai un peu laissé traîner ce projet car la partie asservissement m'intéressait bien moins que la partie conception..
On dit au temps pour moi et non autant pour moi ^^
J'ai mis les deux codeurs sur la carte comme conseillé et je parviens alors à obtenir une même vitesse pour les deux roues, mais je n'arrive pas à calculer cette valeur via le moniteur série ce qui marchait avec un seul des moteurs.
J'utilise toujours la formule omega = ((2.*3.141592*((double)codeurDeltaPos))/1632.)/dt; mais je ne vois pas comment prendre en compte les deux codeurs...
#84031 asservissement deux moteurs carte Romeo
Posté par lacazol sur 26 mai 2017 - 05:24 dans Programmation
ouais je vais prendre un truc dans le style path merci et j'ai déjà bien commencé ashira je bloque surtout sur l'asservissement en vitesse comme j'ai dit précédemment
#84106 asservissement deux moteurs carte Romeo
Posté par lacazol sur 28 mai 2017 - 02:35 dans Programmation
Là le problème est que je n'ai plus de batterie et pas de chargeur sur celle que j'avais installé je ne peux donc plus faire mes essais...
Avant cette panne, j'obtenais des valeurs de vitesse qui variaient beaucoup d'un instant à l'autre alors que la vitesse restait en réalité constante, j'avais donc des erreurs dans mon programme au niveau des calculs de ticks ou bien de vitesse ou je ne sais ou.
- Robot Maker
- → Contenu de lacazol
- Privacy Policy