La fonction map() ne semble plus fonctionner

Bonjour,

Je viens de réinstaller l'IDE 1.8.19 sur un xubuntu tout frais.
J'ai ajouté les cartes ESP32.
Tout se compile bien (galère habituelle avec python et pyserial, mais je sais faire).

Mon souci c'est qu'un code qui fonctionne parfaitement ne fait plus ce qu'il faisait auparavant.
J'ai un joystick analogique à 2 axes que j'utilise pour gérer un menu sur un boitier de 'télécommande'. Les potentiomètres me renvoient de valeurs de 0 à 4095 avec analogRead(), classique.
Auparavant je faisais

int potxval = map(analogRead(STICK_XAXIS_PIN), 0, 4095, -1, 1);
int potyval = map(analogRead(STICK_YAXIS_PIN), 0, 4095, -1, 1);

et je récupérais des valeurs -1, 0 et 1 selon la position.
Mais désormais je ne récupère plus que 0 et -1 (alors que analogRead renvoie des valeurs cohérentes, ça ne vient pas du matériel)

Bon, j'ai changé le code en faisant:

long analxval = analogRead(STICK_XAXIS_PIN);
long analyval = analogRead(STICK_YAXIS_PIN);
int potxval = (analxval < (4096/3)) ? -1 : (analxval > (8192/3)) ? 1 : 0;
int potyval = (analyval < (4096/3)) ? -1 : (analyval > (8192/3)) ? 1 : 0;

et ça fonctionne parfaitement, mais je me demandais si quelqu'un avait rencontré le problème ?

Bonne journée !

map est une fonction affine par morceau parce qu'elle fait les calculs en entier et map() ne retourne la valeur max que si l'entrée est la valeur max (pas d'intervalle pour cette valeur donc).

Donc pour que map retourne 1 il faut que analogRead() retourne 4095.

➜ si votre ADC ne fonctionne pas bien et retourne 4094 au plus haut vous n'aurez jamais 1

le plus simple est de passer un cran plus loin
int potxval = map(analogRead(STICK_XAXIS_PIN), 0, 4096, -1, 2);

comme vous n'aurez jamais 4096 vous n'aurez jamais 2 et vous aurez 3 vraies plages de valeur
-1 de 0 à 1365
0 de 1366 à 2730
1 de 2731 à 4095

cela dit comme map() fait des maths et vous n'avez que 3 valeurs en sortie donc ce sera plus rapide avec vos comparaisons avec des valeurs fixes

int analxval = analogRead(STICK_XAXIS_PIN);
int potxval = (analxval < 1366)  ? -1 : (analxval < 2731) ? 0 : 1;

En réalité, dans le code d'origine, c'était bien 4096 qui était indiqué (my bad j'ai copié un code que je venais de modifier pour des tests).
Mais cette valeur de 4096 pose les mêmes problèmes.
Bon, j'ai fait avec les comparaisons directes et ça règle le problème.

ça ne devrait pas, c'est exactement équivalent....

faites tourner ce code:

void setup() {
  Serial.begin(115200);
  int compteDesErreurs = 0;
  for (int i = 0; i < 4096; i++) {
    int resMap = map(i, 0, 4096, -1, 2);
    int resTest = (i < 1366)  ? -1 : (i < 2731) ? 0 : 1;
    if (resMap != resTest) {
      Serial.print("Erreur pour i = "); Serial.println(i);
      compteDesErreurs++;
    }
  }
  Serial.print("Nombre d'erreurs = "); Serial.println(compteDesErreurs);
}

void loop() {}

je suis sûr que ça va vous dire Nombre d'erreurs = 0

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.