Simulation d'un encoder

Salut à tous,

Je recherche une méthode de programmation afin de pouvoir montée et descendre une vitesse d'avancement d'un véhicule qui est géré par encoder.
Dans le fonctionnement, plus je tourne l'encoder dans un sens, plus j'augmente ma vitesse et pareil dans le sens inverse, plus je tourne en anti-horaire, plus je descends la vitesse.

J'ai repéré la routine de l'encodeur d'origine :

  • Montée de la vitesse :

signal 1 0V
signal 2 0V
|
signal 1 5V
signal 2 0V
|
signal 1 5V
signal 2 5V
|
signal 1 0V
signal 2 5V

  • Descente de la vitesse :

signal 1 0V
signal 2 0V
|
signal 1 0V
signal 2 5V
|
signal 1 5V
signal 2 5V
|
signal 1 5V
signal 2 0V

L'idée est de créer deux fonctions, une de descente et une de montée qui seront intégrées dans un if(switch_monte, HIGH) { fonction-monte }

Pouvez vous m'aider à fabriquer ce bout de code ?

Merci,
Ludo

utilisez une bibliothèque pour gérer l'encodeur ➜ encoder library

@J-M-L
Ce n'est pas pour gérer l'encodeur. C'est pour simuler celui-ci

@udina
Il suffit juste de générer la suite d'états que tu décris je ne vois pas ce qui te bloque?

ah j'avais pas compris !

Je tente de mon coté et si je suis embêté, je vous tiens au courant. Merci

La séquence est facile à reproduire.
A noter

  • si tu regardes bien, tu remarqueras qu'à chaque pas il n'y a qu'une seule sortie qui change.
  • la séquence complète fait 4 pas. il faut regarder comment fonctionne le système sur lequel tu veux remplacer l'encodeur pour voir si la vitesse change au bout des 4 pas ou seulement tout les 2 pas.

Voici ce que j'ai fais, pas encore testé.

[code]
const int Pin_Signal_un = 2;
int Etat_Signal_un = LOW;

const int Pin_Signal_deux = 3;
 int Etat_Signal_deux = LOW;
 
const int inter_monter = 4;
const int inter_descente = 5;

void setup() {

  pinMode(Pin_Signal_un, OUTPUT);
  pinMode(Pin_Signal_deux, OUTPUT);
 

  pinMode(inter_monter, INPUT);
  pinMode(inter_descente, INPUT);

}

void loop() {

  if (inter_monter, HIGH) {
    Monter_vitesse();
  }

  if (inter_descente, HIGH) {
    Descente_vitesse();
  }


}

void Monter_vitesse() {

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(500);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(500);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(500);

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(500);

}

void Descente_vitesse() {

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(500);

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(500);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(500);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(500);

}

[/code]

Bonjour à tous,

Test ce matin de mon sketch sur le véhicule.

[code]
const int led = 13;
int Etat_led;

const int Pin_Signal_un = 2;
int Etat_Signal_un = LOW;

const int Pin_Signal_deux = 3;
int Etat_Signal_deux = LOW;

const int inter_monter = A0;
int Etat_inter_monter;

const int inter_descente = A1;
int Etat_inter_descente;

void setup() {

  pinMode(led, OUTPUT);

  pinMode(Pin_Signal_un, OUTPUT);
  pinMode(Pin_Signal_deux, OUTPUT);


  pinMode(inter_monter, INPUT);
  Etat_inter_monter = 0;

  pinMode(inter_descente, INPUT);
  Etat_inter_descente = 0;
}

void loop() {

  Etat_inter_monter = analogRead(inter_monter);
  Etat_inter_descente = analogRead(inter_descente);

  if (Etat_inter_monter < 200) {
    Monter_vitesse();
    /* digitalWrite(led, HIGH);
      delay(1000);
      }
      else {
      digitalWrite(led, LOW);
      delay(1000); */
  }

  if (Etat_inter_descente < 200) {
    Descente_vitesse();
    /*  digitalWrite(led, HIGH);
      delay(1000);
      }
      else {
      digitalWrite(led, LOW);
      delay(1000); */
  }
}



void Monter_vitesse() {

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(1000);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(1000);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(1000);

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(1000);

}

void Descente_vitesse() {

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(1000);

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(1000);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(1000);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(1000);

}
[/code]

Dans les deux condition du Loop, lorsque j'active la led 13 dans le programme sans la fonction Descente_vitesse(); - Monter_vitesse(); j'ai bien un clignotement toute les une seconde de la led à l'appui de mes contacteurs poussoir.

Lorsque je rajoute mes deux fonctions dans les conditions, il ne se passe rien sur l'affichage de vitesse de mon véhicule.

Lorsque je supprime la partie led, ça ne marche pas non plus.

Comment faire évoluer mes fonctions Monter_vitesse(); et Descente_vitesse(); pour simuler cette encodeur et qu'elles deviennent fonctionnelles ?

vous avez des pullup externes? pourquoi utiliser analogRead?

Oui, j'ai des Pullup de 10Kohm sur mes deux poussoirs, je n'ai pas réussi à faire marcher mes poussoirs avec DigitalRead hier, je n'ai réussi qu'avec les ports analogiques.
Je n'ai pas de Pullup par contre sur mes sorties 2 et 3 de carte.

vous pouvez poster un dessin (fait à la règle et crayon ça suffit) de votre circuit ?

Et pour simplifier votre gestion des boutons, éventuellement utilisez la librairie Button dans easyRun de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

Voici mon plan de montage :

La borne 2 et 3 connectées à l'encodeur coté véhicule en S1 et S2 est relié directement au faisceau électrique du véhicule.
Le plus 5V et masse du faisceau d'encodeur véhicule ne sont pas connectées au circuit arduino car ces deux derniers sont générés par le véhicule.

Bonjour.
La masse du vehicule doit être connectée a la masse de l’arduino. On dit aussi GND :wink:

S1 et S2 sont les sorties de l'encodeur (OUTPUT)

si S2 en interne à l'encodeur du véhicule est à LOW et que vous mettez HIGH sur la pin D3 qui est aussi en OUTPUT vous avez créé un court circuit...

idem dans le sens inverse, si S2 est HIGH et que D3 est LOW, vous avez un court circuit et risquez de griller votre pin / arduino

L'encodeur véhicule est débranché lorsque la carte arduino est en fonctionnement, les deux ne seront jamais connectés simultanément sur le circuit.

Je vais relier le GND du véhicule à celui du circuit arduino et je vous redit.

Ça ne fonctionne pas.

digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(1000);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, LOW);

  delay(1000);

  digitalWrite(Etat_Signal_un, HIGH);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(1000);

  digitalWrite(Etat_Signal_un, LOW);
  digitalWrite(Etat_Signal_deux, HIGH);

  delay(1000);

Ne faudrait il pas que les deux signaux soient sur la même ligne de code afin d'avoir un état simultané et pas à la suite l'un de l'autre niveau horodatage ?

vous êtes à quelques microsecondes d'écart en écrivant

digitalWrite(Etat_Signal_un, LOW);
digitalWrite(Etat_Signal_deux, LOW);

un encodeur mécanique n'est pas parfait non plus, donc ça ne devrait pas jouer

si vraiment vous voulez de la simultanéité il faudra passer par les registres des PORTs

Qu'est ce qui cloche dans cette suite d'état pour quelle me face varier ma vitesse ?
Faudrait il des pullup pour forcer l'état vers le haut des ports ?

avez vous connecté les GND ?

êtes vous sûr des timing, faut-il des fronts et plateaux plus courts ?

Oui, c'est connecté à un GND de la carte UNO.

êtes vous sûr des timing, faut-il des fronts et plateaux plus courts ?

Qu'entendez vous la ?