BTS Mesure BTS Mesure
DébutTP 01TP 02Trouve NombreCourbesCTNPT100VISABT VISAArduinoNI6009ChenillardMétrologieRégulationMPUCodeurC2IEtalon

MPU6050 fonction moteur

Cette fonction utilise le shield Balance Car de Keyestudio.

Placer les variables globales en début de programme,
et les fonctions dans un nouvel onglet :

// Variables Globales à placer au début du programme
const int right_R1=7; // Selon montage robot   
const int right_R2=6; // droite et gauche peuvent être inversés   
const int PWM_R=9;
const int left_L1=8;
const int left_L2=12;
const int PWM_L=10;
const int BP=13;      // Bouton Poussoir shield V3
const int buz = 11;    // set the buzzer pin 
const int Hall_G_A1= 5; // Capteur effet Hall gauche A1 D5
const int Hall_G_A2 = 2; // B pour déterminer de sens de rotation
const int Hall_D_A1 = 4; // Capteur effet Hall droite A1  D4
const int Hall_D_A2 = 3; 

float Kp=??,Kd=??;      //Correction proportionnelle et dérivée
float consigne=-1;       // Consigne 0° en théorie   
int P,D,PWM ;             // action Proportionnelle, Dérivée

bool balancing=false;
unsigned long t0;
long i, iBP, recu;

/* Pour plus de lisibilité placer les fonctions
   dans un nouvel onglet fonction.*/
void iniPin(){
  // Bouton Poussoir : commute balancing
  pinMode(13,INPUT_PULLUP);
  //set the control motor’s pin to OUTPUT
  pinMode(right_R1,OUTPUT);       
  pinMode(right_R2,OUTPUT);
  pinMode(left_L1,OUTPUT);
  pinMode(left_L2,OUTPUT);
  pinMode(PWM_R,OUTPUT);
  pinMode(PWM_L,OUTPUT);
  // pinMode(buz,OUTPUT);  // commenté pour moins de bruit...
  pinMode(Hall_G_A1,INPUT);  
  pinMode(Hall_G_A2,INPUT);
  pinMode(Hall_D_A1,INPUT);  
  pinMode(Hall_D_A2,INPUT);

  //Initial state value
  digitalWrite(right_R1,1);
  digitalWrite(right_R2,0);
  digitalWrite(left_L1,0);
  digitalWrite(left_L2,1);
  analogWrite(PWM_R,0);
  analogWrite(PWM_L,0);
}

https://wiki.keyestudio.com/images/thumb/7/71/KS0193-%E5%9B%BE%E7%89%8746.png/800px-KS0193-%E5%9B%BE%E7%89%8746.pngvoid moteur(int droite,int gauche) {
  droite=-droite;gauche=-gauche;   // Selon montage robot
  if (droite> 255) droite= 255;
  if (droite<-255) droite=-255;
  if (gauche> 255) gauche= 255;
  if (gauche<-255) gauche=-255;
  
  if(angle_gyro>50 || angle_gyro<-50) {
    droite=0;gauche=0;  // Arrêt moteur si θ>50 
    balancing=false;  }  

if(gauche>=0)  {
    digitalWrite(left_L1,LOW);
    digitalWrite(left_L2,HIGH);
    analogWrite(PWM_L,gauche);}
  else {
    digitalWrite(left_L1,HIGH);
    digitalWrite(left_L2,LOW);
    analogWrite(PWM_L,-gauche);}

  if(droite>=0){
    digitalWrite(right_R1,LOW);
    digitalWrite(right_R2,HIGH);
    analogWrite(PWM_R,droite);}
  else  {
    digitalWrite(right_R1,HIGH);
    digitalWrite(right_R2,LOW);
    analogWrite(PWM_R,-droite);}    
  }

void reception() {   // Labview envoi : mode;consigne;Kp;Kd;
    int mode=Serial.parseInt();
    digitalWrite(buz,HIGH);
    // Si on fonctionne en autonomie sans liaison série
    // Rx potentiel flottant => reçoit des caractères aléatoires
    // on ferme la liaison à la première erreur
    if (mode<1 || mode>4){Serial.end();recu=i+20;return;}
    recu=i;
    consigne=Serial.parseFloat();
    if (Serial.available()){
      double x=Serial.parseFloat();
      if (x>0) {Kp=x;Serial.print("0;0;0;0;Kp=");Serial.print(Kp);}}
    if (Serial.available()){
      double x=Serial.parseFloat();
      if (x>0) {Kd=x;Serial.print(";Kd=");Serial.print(Kd);}}
    Serial.println();
    while (Serial.available()) Serial.read();  
    if (mode==1) {balancing=!balancing;}
    if (mode==2) {balancing=true;}
    if (mode==3) {balancing=false;}
}

void commute() {    // Commute à chaque appui du Bouton Poussoir 13
  iBP=i;recu=i;
  balancing=!balancing;   // de balancing à !balancing
  digitalWrite(buz,HIGH);
}