BTS Mesure BTS Mesure
DébutTP 01TP 02Trouve NombreCourbesCTNPT100VISABT VISAArduinoCp et CpkNI6009ChenillardRé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);
}