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

Piloter le moteur à l'aide de son codeur

Cette fonction utilise le shield Balance Car de Keyestudio.

Selon le montage du robot il faudra peut-être inverser
 les pattes droites (right) et gauches (left) ...

/* Déclaration des constantes et variables
   à placer au début du programme
   Pour plus de lisibilité placer les fonctions
   dans un nouvel onglet fonction.*/

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; 

//TB6612 pins
const int right_R1=7;    
const int right_R2=6;
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 

unsigned long t0;
long i, iBP, recu;
float dt=0.005;

bool Had,Had0,Hag,Hag0;
int Cd,Cg,Cd0,Cg0;
int consigne,vmax=255;

/* 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);
  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 cablage robot
  if (droite> vmax) droite= vmax;
  if (droite<-vmax) droite=-vmax;
  if (gauche> vmax) gauche= vmax;
  if (gauche<-vmax) gauche=-vmax;
  
//  if(angle_gyro>50 || angle_gyro<-50) {
//    droite=0;gauche=0;
//    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 raz() {    // RAZ à chaque appui du Bouton Poussoir 13
  iBP=i;recu=i;
  consigne=0;
  moteur(0,0);
  delay(500);
  Cd=0;Cd0=0;Cg=0;Cg0=0;  
  digitalWrite(buz,HIGH);
}