 // Batterie
 const int batterie = A4;
 
+// Convertisseur analogique a numerique
+const float adc_vref = 3.4f;
+const float adc_max_f32 = 1023.0f;
+const float adc_to_volts = adc_vref / adc_max_f32;
+
 // Capteurs de distance
 const int ir_avant   = A3;
 const int ir_arriere = A2;
+const float ir_fonction_coeff[5] = { 0.034f, 
+                                    -0.424f, 
+                                     1.760f, 
+                                    -3.127f, 
+                                     2.388f};
 
 // Bouton 
 const int bouton = 19;

  }
}  

void controle_moteurs() {
  
  // Lire l'état des controles sur la manette
  int commande_avance = digitalRead(mannette_avant);
  int commande_recule = digitalRead(mannette_arriere);
  
  // Lire la phase de la roue
  long roue_phase_courante = lire_phase();
  vitesse_tic_par_cycle = roue_phase_courante - roue_phase_precedente;
  
  // PWM entre 20% et 100%
  int vitesse_moteur_min = int(0.2f * 255.0f);
  int vitesse_moteur_nom = int(0.2f * 255.0f);
  if(digitalRead(bouton) == LOW) {
    // Vitesse basée sur la distance arriere
    vitesse_cmd = map(ir_arriere_filtre, 184, 850, 20, 255);
  }
  else if(commande_avance == HIGH && commande_recule == HIGH) {
    // Freinage
    vitesse_cmd = constrain((int)pid(moteur_integrale_erreur, 
                                     moteur_erreur_prec,
                                     0,
                                     vitesse_tic_par_cycle,
                                     moteur_gain_pid), -255, 255);
  }
  else {   
    if(commande_avance == LOW) {
      // Activer le moteur avant
       vitesse_cmd = vitesse_moteur_nom;
    }
    else if(commande_recule == LOW) {
      // Activer le moteur arrière
       vitesse_cmd = -vitesse_moteur_nom;
    }
  }
  
  // Mise a jour de la commande PWM
  if(abs(vitesse_cmd) < vitesse_moteur_min) vitesse_cmd = 0;
  if(vitesse_cmd > 0) {
    // Activer le moteur avant
    analogWrite(moteur_avant, vitesse_cmd);
    analogWrite(moteur_arriere, 0);
  }
  else if(vitesse_cmd < 0) {
    // Activer le moteur arrière
    analogWrite(moteur_avant, 0);
    analogWrite(moteur_arriere, -vitesse_cmd);
  }
  else {    
    analogWrite(moteur_avant, 0);
    analogWrite(moteur_arriere, 0);
  }
  // Mise a jour de la phase précédente
  roue_phase_precedente = roue_phase_courante;
}  



// Controle de la vitesse
long vitesse_tic_par_cycle = 0;
long vitesse_av_cmd;
long roue_phase_precedente = 0;
long moteur_integrale_erreur = 0;
long moteur_erreur_prec = 0;

// Controle de la direction
long moteur_gd_integrale_erreur = 0;
long moteur_gd_erreur_prec = 0;
long vitesse_gd_cmd;

// État de la mannette
direction_t interrupteur_mannette_precedent = centre; 
mouvement_t mannette_mouvement_precedent  = arrete; 
bool interrupteur_mannette_modifiee = false; 

// Communication avec le cerveau RPi
//CmdMessenger cerveau = CmdMessenger(Serial, ',',';','/');

// Sequenceur de fonctions
Timer sequenceur;

/////////////////////////////////////////////////////////////
