Réglage de deux DAC par un tableau de valeur

Bonjour à tous,

Je suis sur un projet de pilotage d'un véhicule à faible vitesse qui aura les fonctions suivantes :

  • Arrêt du véhicule.
  • Relance en avant du véhicule.
  • Variation de la vitesse d'avancement.

Ce post porte essentiellement sur la partie variation de vitesse car le reste fonctionne déjà bien.

Le véhicule fonctionne avec un encodeur d'une tension de 5V sur deux canaux. A chaque cran de molette, je change ma tension de 0.13V.
J'ai réalisé un tableau qui répertorie les tensions du canal 1 / canal 2 sur un cycle entier. J'ai converti ces tensions afin d'obtenir les valeurs correspondantes à injecter sur deux DAC 4725.
Lorsque j'allume mon arduino UNO sur ce véhicule via un contacteur, je bascule la variation de vitesse sur mon programme qui prend le relai.
J'aimerais pouvoir rentrer dans les deux tableaux ( canal1 / canal2 ) que j'ai créer à un endroit précis qui correspond aux valeurs que le véhicule comprend dans la fonction :
arretDuVehiculeAuDemarrageDuProgramme();
Et pouvoir lors de l'appel des fonctions simpleClickMonterVitesse(); simpleClickDescenteVitesse(); faire les choses suivantes :

  • Monter de 5 valeurs les deux canaux avec la monter de vitesse.
  • Descendre de 5 valeurs les deux canaux avec la descente de vitesse.
  • Avoir un système qui sait à n'importe quel moment ou il en est.
    J'ai commencé à intégrer des éléments tableau et deux boucle For mais je ne pense pas que la syntaxe soit bonne ni le process.

Pouvez vous me donner quelques pistes à exploiter ?

Voici le programme :

#include "OneButton.h"

//------------------  Déclaration du DAC  ---------------------------------------

const float tensionVoulueEnSortieCanalUn =   4.95;     // Tension souhaitée en sortie du MCP4725, exprimée en volts (entre 0 et 5V)
const float tensionVoulueEnSortieCanalDeux =   4.99;     // Tension souhaitée en sortie du MCP4725, exprimée en volts (entre 0 et 5V)

#define adresseI2CduMCP4725CanalUn    0x60
#define adresseI2CduMCP4725CanalDeux  0x61

#define memorisationTensionDeSortieUn     false     // Si "false", le DAC ajustera sa tension de sortie sans la mémoriser ; si "true", cette valeur sera dispo, même après coupure de courant
#define memorisationTensionDeSortieDeux   false     // Si "false", le DAC ajustera sa tension de sortie sans la mémoriser ; si "true", cette valeur sera dispo, même après coupure de courant

#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dacSignalUn;
Adafruit_MCP4725 dacSignalDeux;

OneButton boutonMonterVitesseVehicule;
OneButton boutonDescenteVitesseVehicule;
OneButton boutonArretVehicule;
OneButton boutonRelanceVehicule;

const int relaisMonterDescente = 7;
const int relaisInverseur = 2;
const int relaisCanal_A_B_PedaleAccelerateur = 12;
const int relaisParking = 13;

const int valeurFilVertInverseur = 8;
const int valeurFilBlancInverseur = 3;
const int valeurFilBleuInverseur = 4;
const int valeurCanal_A = 5;
const int valeurCanal_B = 6;

// ----------------  Déclaration du tableau de valeur des DAC un et deux ----------------

const int tabeauValeurCanalUn[33] = {400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600};
const int tableauValeurCanalDeux[33] = {3600, 3500, 3400, 3300, 3200, 3100, 3000, 2900, 2800, 2700, 2600, 2500, 2400, 2300, 2200, 2100, 2000, 1900, 1800, 1700, 1600, 1500, 1400, 1300, 1200, 1100, 1000, 900, 800, 700, 600, 500, 400};

// _______________________________________________________  SETUP  ___________________________________________________________

void setup() {

  Serial.begin(115200);

  // ------------------  Initialisation des boutons  ---------------------

  boutonMonterVitesseVehicule.setup(9, INPUT);    // PullUp installé sur les quatre boutons
  boutonDescenteVitesseVehicule.setup(10, INPUT);
  boutonArretVehicule.setup(11, INPUT);
  boutonRelanceVehicule.setup(1, INPUT);

  boutonMonterVitesseVehicule.attachClick(simpleClickMonterVitesse);
  boutonDescenteVitesseVehicule.attachClick(simpleClickDescenteVitesse);
  boutonArretVehicule.attachClick(simpleClickArretVehicule);
  boutonRelanceVehicule.attachClick(simpleClickRelanceVehicule);

  // ------------------  Initialisation des DAC(s)  ---------------------

  dacSignalUn.begin(0x60);               // Démarrage du DAC externe Canal un (le MCP 4725)
  dacSignalDeux.begin(0x61);             // Démarrage du DAC externe Canal deux (le MCP 4725)

  pinMode(relaisMonterDescente, OUTPUT);

  pinMode(relaisInverseur, OUTPUT);

  pinMode(valeurFilVertInverseur, OUTPUT);
  pinMode(valeurFilBlancInverseur, OUTPUT);
  pinMode(valeurFilBleuInverseur, OUTPUT);

  pinMode(relaisCanal_A_B_PedaleAccelerateur, OUTPUT);

  pinMode(relaisParking, OUTPUT);

  pinMode(valeurCanal_A, OUTPUT);
  pinMode(valeurCanal_B, OUTPUT);

  arretDuVehiculeAuDemarrageDuProgramme();

}
// ___________________________________________________________  LOOP  _______________________________________________________________________


void loop() {

  boutonMonterVitesseVehicule.tick();
  boutonDescenteVitesseVehicule.tick();
  boutonArretVehicule.tick();
  boutonRelanceVehicule.tick();

}

// _________________________________________________________________  FONCTION(S) _____________________________________________________________

void simpleClickMonterVitesse() {

  for ( int i = 0; i <= 5; i++ ) {
    delay(250);
    dacSignalUn.setVoltage(tabeauValeurCanalUn[], true);
    dacSignalDeux.setVoltage(tabeauValeurCanalDeux[], true);
  }
}

void simpleClickDescenteVitesse() {

  for ( int i = 0; i <= 5; i-- ) {
    delay(250);
    dacSignalUn.setVoltage(tabeauValeurCanalUn[], true);
    dacSignalDeux.setVoltage(tabeauValeurCanalDeux[], true);
  }
}

void simpleClickArretVehicule() {

  analogWrite(valeurCanal_A, 205);
  analogWrite(valeurCanal_B, 50);

  delay(2000);

  digitalWrite(relaisParking, HIGH);
  delay(500);
  digitalWrite(relaisParking, LOW);

}

void simpleClickRelanceVehicule() {

  digitalWrite(relaisInverseur, HIGH);

  digitalWrite(valeurFilVertInverseur, LOW);
  digitalWrite(valeurFilBlancInverseur, LOW);
  digitalWrite(valeurFilBleuInverseur, HIGH);

  delay(1000);

  digitalWrite(relaisInverseur, LOW);

  delay(500);

  analogWrite(valeurCanal_A, 205);
  analogWrite(valeurCanal_B, 50);
  delay(200);
  analogWrite(valeurCanal_A, 175); //analogWrite(Valeur_canal_A, 175);
  analogWrite(valeurCanal_B, 80);  //analogWrite(Valeur_canal_B, 80);

}

void arretDuVehiculeAuDemarrageDuProgramme() {

  digitalWrite(relaisInverseur, LOW);

  analogWrite(valeurCanal_A, 205);
  analogWrite(valeurCanal_B, 50);

  digitalWrite(relaisCanal_A_B_PedaleAccelerateur, HIGH);

  dacSignalUn.setVoltage(tabeauValeurCanalUn[23], true);     // Valeur par défault au démarrage du système ( valeur 2700 du tableau )
  dacSignalDeux.setVoltage(tabeauValeurCanalDeux[5], true);   // Valeur par défault au démarrage du système ( valeur 3100 du tableau )

  digitalWrite (relaisMonterDescente, HIGH);

  digitalWrite(relaisParking, HIGH);
  delay(2000);
  digitalWrite(relaisParking, LOW);

}

Merci par avance pour votre aide.

il faut créer une variable qui va contenir la valeur actuelle de la vitesse (ou plutôt la valeur actuelle de l'index dans le tableau)


Entre les crochet il faut un index qui va désigner un emplacement dans le tableau.
Si j'ai bien compris, c'est pour faire vitesse actuelle + 5.
Donc ta boucle for devrait ressembler à quelque chose comme ça.
On admet qu'il existe une variable globale nommée vitesseActuelle qui pointe sur la vitesse courante dans le tableau.

  for ( int i = 0; i <= 5; i++ ) {
    if (vitesseActuelle > = 32)  break;
    vitesseActuelle++;
    delay(250);
    dacSignalUn.setVoltage(tabeauValeurCanalUn[vitesseActuelle], true);
    dacSignalDeux.setVoltage(tabeauValeurCanalDeux[vitesseActuelle], true);
  }

J'ai mis la valeur max de l'index en dur dans le code mais il serait plus propre de déclarer une constante qui contiendrait cette valeur pour simplifier la maintenance du code au cas ou la taille du tableau changerait.

Pour la descente de vitesse c'est le même principe avec un index qui est décrémenté bien sûr.

Bonjour udina

Oui la syntaxe, tu as des fois tabeauValeur et des fois tableauValeur.
Ensuite, dans tes boucles:

void simpleClickMonterVitesse() {

  for ( int i = 0; i <= 5; i++ ) {
    delay(250);
    dacSignalUn.setVoltage(tabeauValeurCanalUn[], true);
    dacSignalDeux.setVoltage(tabeauValeurCanalDeux[], true);
  }
}

tu as omis les indices des tableaux:

void simpleClickMonterVitesse() {

  for ( int i = 0; i <= 5; i++ ) {
    delay(250);
    dacSignalUn.setVoltage(tabeauValeurCanalUn[i], true);
    dacSignalDeux.setVoltage(tabeauValeurCanalDeux[i], true);
  }
}

A+
Cordialement
jpbbricole

Donc, si je déclare une variable int vitesseActuelle; en début de programme, faut il l'étalonner à 0 ?

Après augmentation de mes deux canaux de 5 valeurs, ma variable sera mémorisée même dans la fonction de descente des vitesses ? Pas besoin de mémoriser dans l'eprom de l'arduino ?

Tu bloques la boucle à 32 car la première valeur du tableau compte pour 0 ?

Excuse moi, j'ai effectivement des erreurs de frappe ;)
Je n'avais rien mis volontairement dans les crochets car je ne savais pas manipuler le tableau, si une variable fait le travail, c'est top.

Je test tout ça demain en réelle, je vous tiendrais au courant.

Merci à vous

Il me parait prudent de l'initialiser de telle manière que le moteur soit à l'arrêt.


C'est une variable globale donc elle est visible de partout

Ce n'est nécessaire que si tu veux retrouver sont état après une coupure de l'alimentation.


exactement

Bonjour,

Un peu d'information sur l'avancé des tests, lorsque le programme démarre, le basculement véhicule / Arduino fonctionne bien au niveau de l'encodeur par l'entrée dans le tableau par ces deux lignes dans le void SETUP :

dacSignalUn.setVoltage(tableauValeurCanalUn[23], true);     // Valeur par défault au démarrage du système ( valeur 2700 du tableau )
dacSignalDeux.setVoltage(tableauValeurCanalDeux[5], true);   // Valeur par défault au démarrage du système ( valeur 3100 du tableau )

Ensuite tout fonctionne bien pour la fonction :

void simpleClickMonterVitesse() {

  for ( int i = 0; i <= 3; i++ ) {
    if (vitesseActuelle >= 32) break;
    vitesseActuelle++;
    delay(250);
    dacSignalUn.setVoltage(tableauValeurCanalUn[vitesseActuelle], true);
    dacSignalDeux.setVoltage(tableauValeurCanalDeux[vitesseActuelle], true);
  }
}

La vitesse lu sur le moniteur du véhicule monte bien de plusieurs valeurs à chaque impulsion du bouton et s'arrête bien en bout de tableau.

Par contre, lorsque j'appui sur le bouton qui gère la fonction suivante :

void simpleClickDescenteVitesse() {

  for ( int i = 0; i <= 3; i-- ) {
    if (vitesseActuelle >= 32) break;
    vitesseActuelle--;
    delay(250);
    dacSignalUn.setVoltage(tableauValeurCanalUn[vitesseActuelle], true);
    dacSignalDeux.setVoltage(tableauValeurCanalDeux[vitesseActuelle], true);
  }

Ça ne fonctionne pas et ça fait même planter le véhicule qui ne reprend ses esprits qu'en le redémarrant.
J'ai peut être loupé quelques choses dans la fonction ?

Tu crois vraiment que la borne à tester lorsque tu décrémentes vitesseActuelle c'est 32.

Ça sera surement mieux avec :

if (vitesseActuelle <= 0) break;
    vitesseActuelle--;

Tout à fait.

Merci, des fois, plus c'est logique, moins ça vient vite :upside_down_face:

Bonsoir,

J'ai réessayé le programme complet et après plusieurs modification de tableau pour coller au mieux aux tensions réelles du véhicule, la fonction de montée des vitesses incrémente correctement de quelques valeurs puis s'arrête jusqu'au prochain clic sur le bouton.
Par contre, des que je rentre dans ma fonction de descente, le programme décrémente tout le tableau d'un coup, il ne tient pas compte de la boucle FOR.
Voici le programme remis à jour :

#include "OneButton.h"

// -----------------  Déclaration des lectures de tension  ----------------------

int pinCanalUn = A3;
int pinCanalDeux = A4;

int valeurCanalUn = 0;
int valeurCanalDeux = 0;

float tensionCanalUn = 0;
float tensionCanalDeux = 0;

//------------------  Déclaration du DAC  ---------------------------------------

const float tensionVoulueEnSortieCanalUn =   4.95;     // Tension souhaitée en sortie du MCP4725, exprimée en volts (entre 0 et 5V)
const float tensionVoulueEnSortieCanalDeux =   4.99;     // Tension souhaitée en sortie du MCP4725, exprimée en volts (entre 0 et 5V)

#define adresseI2CduMCP4725CanalUn    0x60
#define adresseI2CduMCP4725CanalDeux  0x61

#define memorisationTensionDeSortieUn     false     // Si "false", le DAC ajustera sa tension de sortie sans la mémoriser ; si "true", cette valeur sera dispo, même après coupure de courant
#define memorisationTensionDeSortieDeux   false     // Si "false", le DAC ajustera sa tension de sortie sans la mémoriser ; si "true", cette valeur sera dispo, même après coupure de courant

#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dacSignalUn;
Adafruit_MCP4725 dacSignalDeux;

OneButton boutonMonterVitesseVehicule;
OneButton boutonDescenteVitesseVehicule;
OneButton boutonArretVehicule;
OneButton boutonRelanceVehicule;

const int relaisMonterDescente = 7;
const int relaisInverseur = 2;
const int relaisCanal_A_B_PedaleAccelerateur = 12;
const int relaisParking = 13;

const int valeurFilVertInverseur = 8;
const int valeurFilBlancInverseur = 3;
const int valeurFilBleuInverseur = 4;
const int valeurCanal_A = 5;
const int valeurCanal_B = 6;

// ----------------  Déclaration du tableau de valeur des DAC un et deux ----------------

const int tableauValeurCanalUn[32] = {500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600};
const int tableauValeurCanalDeux[32] = {2200, 2100, 2000, 1900, 1800, 1700, 1600, 1500, 1400, 1300, 1200, 1100, 1000, 900, 800, 700, 3700, 3600, 3500, 3400, 3300, 3200, 3100, 3000, 2900, 2800, 2700, 2600, 2500, 2400, 2300, 2200};

int vitesseActuelle = 0;

// _______________________________________________________  SETUP  ___________________________________________________________

void setup() {

  Serial.begin(115200);

  // ------------------  Initialisation des boutons  ---------------------

  boutonMonterVitesseVehicule.setup(9, INPUT);    // PullUp installé sur les quatre boutons
  boutonDescenteVitesseVehicule.setup(10, INPUT);
  boutonArretVehicule.setup(11, INPUT);
  boutonRelanceVehicule.setup(14, INPUT);

  boutonMonterVitesseVehicule.attachClick(simpleClickMonterVitesse);
  boutonDescenteVitesseVehicule.attachClick(simpleClickDescenteVitesse);
  boutonArretVehicule.attachClick(simpleClickArretVehicule);
  boutonRelanceVehicule.attachClick(simpleClickRelanceVehicule);

  // ------------------  Initialisation des DAC(s)  ---------------------

  dacSignalUn.begin(0x60);               // Démarrage du DAC externe Canal un (le MCP 4725)
  dacSignalDeux.begin(0x61);             // Démarrage du DAC externe Canal deux (le MCP 4725)

  pinMode(relaisMonterDescente, OUTPUT);

  pinMode(relaisInverseur, OUTPUT);

  pinMode(valeurFilVertInverseur, OUTPUT);
  pinMode(valeurFilBlancInverseur, OUTPUT);
  pinMode(valeurFilBleuInverseur, OUTPUT);

  pinMode(relaisCanal_A_B_PedaleAccelerateur, OUTPUT);

  pinMode(relaisParking, OUTPUT);

  pinMode(valeurCanal_A, OUTPUT);
  pinMode(valeurCanal_B, OUTPUT);

  pinMode(pinCanalUn, INPUT);
  pinMode(pinCanalDeux, INPUT);

  arretDuVehiculeAuDemarrageDuProgramme();

}
// ___________________________________________________________  LOOP  _______________________________________________________________________


void loop() {

  boutonMonterVitesseVehicule.tick();
  boutonDescenteVitesseVehicule.tick();
  boutonArretVehicule.tick();
  boutonRelanceVehicule.tick();

  valeurCanalUn = analogRead(pinCanalUn);
  valeurCanalDeux = analogRead(pinCanalDeux);

  tensionCanalUn = valeurCanalUn * (5 / 1023.0);
  Serial.print("La tension du Canal un est de : ");
  Serial.println(tensionCanalUn);

  tensionCanalDeux = valeurCanalDeux * (5 / 1023.0);
  Serial.print("La tension du canal deux est de : ");
  Serial.println(tensionCanalDeux);

}

// _________________________________________________________________  FONCTION(S) _____________________________________________________________

void simpleClickMonterVitesse() {

  for ( int i = 0; i <= 2; i++ ) {
    if (vitesseActuelle >= 31) break;
    vitesseActuelle++;
    delay(150);
    dacSignalUn.setVoltage(tableauValeurCanalUn[vitesseActuelle], true);
    dacSignalDeux.setVoltage(tableauValeurCanalDeux[vitesseActuelle], true);
  }
}

void simpleClickDescenteVitesse() {

  for ( int i = 0; i <= 2; i-- ) {
    if (vitesseActuelle <= 0) break;
    vitesseActuelle--;
    delay(150);
    dacSignalUn.setVoltage(tableauValeurCanalUn[vitesseActuelle], true);
    dacSignalDeux.setVoltage(tableauValeurCanalDeux[vitesseActuelle], true);
  }
}

void simpleClickArretVehicule() {

  analogWrite(valeurCanal_A, 205);
  analogWrite(valeurCanal_B, 50);

  delay(2000);

  digitalWrite(relaisParking, HIGH);
  delay(500);
  digitalWrite(relaisParking, LOW);

}

void simpleClickRelanceVehicule() {

  digitalWrite(relaisInverseur, HIGH);

  digitalWrite(valeurFilVertInverseur, LOW);
  digitalWrite(valeurFilBlancInverseur, LOW);
  digitalWrite(valeurFilBleuInverseur, HIGH);

  delay(1000);

  digitalWrite(relaisInverseur, LOW);

  delay(500);

  analogWrite(valeurCanal_A, 205);
  analogWrite(valeurCanal_B, 50);
  delay(200);
  analogWrite(valeurCanal_A, 175); //analogWrite(Valeur_canal_A, 175);
  analogWrite(valeurCanal_B, 80);  //analogWrite(Valeur_canal_B, 80);

}

void arretDuVehiculeAuDemarrageDuProgramme() {

  digitalWrite(relaisInverseur, LOW);

  analogWrite(valeurCanal_A, 205);
  analogWrite(valeurCanal_B, 50);
  delay(500);
  digitalWrite(relaisCanal_A_B_PedaleAccelerateur, HIGH);

  dacSignalUn.setVoltage(tableauValeurCanalUn[17], true);     // Valeur par défault au démarrage du système ( valeur 2700 du tableau )23
  dacSignalDeux.setVoltage(tableauValeurCanalDeux[17], true);   // Valeur par défault au démarrage du système ( valeur 3100 du tableau )5
  delay(500);
  digitalWrite (relaisMonterDescente, HIGH);

  digitalWrite(relaisParking, HIGH);
  delay(2000);
  digitalWrite(relaisParking, LOW);

}

Avez vous une idée de pourquoi ?

J'ai également ajouté une lecture des tensions du Canal1 et Canal2 coté véhicule avec les deux variables tensionCanalUn et tensionCanalDeux car je souhaiterais faire une comparaison dans la fonction void arretDuVehiculeAuDemarrageDuProgramme() ; avant le basculement du circuit " Véhicule / arduino " et ainsi ne pas créer de différence de tension sur les deux canaux.
J'ai dans les deux tableaux les valeurs à entrer dans les DAC pour obtenir les bonnes tensions mais comment faire la comparaison et ainsi sélectionner automatiquement les deux valeurs à entrer ici :

dacSignalUn.setVoltage(tableauValeurCanalUn[17], true);
dacSignalDeux.setVoltage(tableauValeurCanalDeux[17], true);

C'est réalisable à votre avis ?
Merci,

Personne n'a une petite idée ?

Bonjour udina

Il te faut afficher les valeurs dans ton simpleClickDescenteVitesse(), ainsi tu pourra peut être remonter au problème:

	for ( int i = 0; i <= 2; i-- ) {
		Serial.println(String(i) + "\t" + String(vitesseActuelle));
		
		if (vitesseActuelle <= 0) break;
		vitesseActuelle--;
		delay(150);
		Serial.println(String(tableauValeurCanalUn[vitesseActuelle]) + "\t" + String(tableauValeurCanalDeux[vitesseActuelle]));
		
		dacSignalUn.setVoltage(tableauValeurCanalUn[vitesseActuelle], true);
		dacSignalDeux.setVoltage(tableauValeurCanalDeux[vitesseActuelle], true);
	}

et tu verra que le problème est ici:
for ( int i = 0; i <= 2; i-- )

Tu as "bêtement" copié/collé la boucle de simpleClickMonterVitesse() en y mettant -- :wink:

Cordialement
jpbbricole

Tu balaies l'un des tableaux pour chercher dedans la valeur qui s'approche le plus de ta mesure et tu conserves l'index comme valeur pour initialiser vitesseActuelle

Merci beaucoup, je viens de comprendre que le moniteur série est indispensable pour voir réellement les valeurs passer ! Du coup, je suis bien repassé à for ( int i = 0; i <= 2; i++ ) et ça marche mieux :sweat_smile:

J'ai actuellement deux variables qui lisent la tension coté véhicule :

int valeurCanalUn qui me retourne une valeur de 0 à 1023
float tensionCanalUn qui me retourne la tension en volt

Ces deux variables ont une valeur qui sera différente de celle de mon tableau de donnée du DAC.
Comment procéder dans ce cas ? par un mappage du genre :

VitesseActuelleVehicule= map(valeurCanalUn, 0, 1023, 500, 3600);

Pour la comparaison dans le tableau :
if ( entreeVitesseActuelle == tableauValeurCanalUn[] ){} ??

La valeur trouvée dans le tableau est poussé sur vitesseActuelle.

C'est un peu flou pour la recherche en balayage du tableau, ça se déroule comment ?

Bonjour udina

Oh que oui!!!
C'est la première chose à mettre en route quand on développe un programme.

Bonne continuation.
jpbbricole

il y a d'autre méthode, mais pas aussi simple.

J'ai tenté de faire un bout de code pour la vérification de la tension du canal1 avant basculement des circuits véhicule / programme arduino et réduire les grosses différences de tension de mon encodeur, j'ai procédé comme suit :

Déclaration de variables :

int pinCanalUn = A3;
int valeurCanalUn = 0;
int valeurATester = 0;
int valeurTrouver = 0;

Déclaration du tableau de canal1 :

const int tableauValeurCanalUn[32] = {500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600};

La routine de contrôle :

valeurCanalUn = analogRead(pinCanalUn);
  valeurATester = map(valeurCanalUn, 0, 1023, 500, 3600);
  tensionCanalUn = valeurCanalUn * (5 / 1023.0);
  Serial.println(String(valeurCanalUn) + "\t" + String(tensionCanalUn) + "\t" + String(valeurATester));

    for (int i = 0; i <= 31; i++) {
        if (tableauValeurCanalUn[i] == valeurATester) {
            valeurTrouver = [i]; 
            break; 
        }
    }
}

Je map la valeur valeurCanalUn en une valeur se rapprochant des valeurs de mon tableau. Par contre, je n'arrive pas à avoir une valeur exact car le mappage n'est pas sur une valeur proportionnelle. Je ne vois pas comment faire pour que [i] soit trouvée dans un intervalle d'au moins 300. Comment puis-je faire ?

Une fois ma valeur [i] trouvé et poussée dans ma variable valeurTrouver, je n'ai normalement plus qu'à la pousser dans mes deux tableaux juste avant de basculer mes relais qui gèrent la transition :

dacSignalUn.setVoltage(tableauValeurCanalUn[valeurTrouver], true);
dacSignalDeux.setVoltage(tableauValeurCanalDeux[valeurTrouver], true);

Une idée pour m'aider ?
Merci par avance,
Ludo

Pourquoi 300 ton tableau va de 100 en 100?

Dans ce test, il faudrait chercher la première valeur qui est supérieure ou égale.


Maintenant, comme ton tableau va de 100 en 100 tu peux aussi calculer la position de l'index.

multipleDe100 = tensionCanalUn - tensionCanalUn % 100; // retourne une valeur multiple de 100
index = (multipleDe100-500)/100;

Bonjour,

J'ai testé des choses aujourd'hui mais sans grand fonctionnement, j'ai démarré par intégrer la sélection de l'index Canal1 dans ma fonction suivante ( qui prend place dans la fin du SETUP ) :

void arretDuVehiculeAuDemarrageDuProgramme() {

  valeurCanalUn = analogRead(pinCanalUn);
  valeurATester = map(valeurCanalUn, 0, 1023, 500, 3600);
//  tensionCanalUn = valeurCanalUn * (5 / 1023.0);
  
delay(500);

 for (int i = 0; i <= 31; i++) {
        if (tableauValeurCanalUn[i] >=  valeurATester) {
          valeurTrouver = i;
            break; 
        }
    }
    
    delay(500);
    
  Serial.println(String(valeurCanalUn) + "\t" + String(tensionCanalUn) + "\t" + String(valeurTrouver));  
  
  digitalWrite(relaisInverseur, LOW);

  analogWrite(valeurCanal_A, 205);
  analogWrite(valeurCanal_B, 50);
  delay(500);
  digitalWrite(relaisCanal_A_B_PedaleAccelerateur, HIGH);

  dacSignalUn.setVoltage(tableauValeurCanalUn[valeurTrouver], true);     
  dacSignalDeux.setVoltage(tableauValeurCanalDeux[valeurTrouver], true);   
  digitalWrite (relaisMonterDescente, HIGH);

  digitalWrite(relaisParking, HIGH);
  delay(2000);
  digitalWrite(relaisParking, LOW);

}

Voici le résultat du bébug :
Capture

Je récupère bien un index approchant de mes tension mais je pense que c'est trop approximatif par rapport à la tension réelle et du coup, l'équilibre ne fonctionne pas bien au basculement. Concrètement, le véhicule avant basculement affiche une vitesse cible qui bouge en fonction de l'encodeur et lors du basculement de circuit, cette vitesse change complètement ce qui pose problème.

Je n'arrive pas à compiler car multipleDe100 n'est pas de type correct. j'ai essayé de le déclarer en float mais ça ne marche pas car tensionCanalUn est float.