Remplacer un "bouton rotatif infini mecanique" par un Arduino

Bonjour à tous ,
J'ai découverte il y a 3 jours l'existence de cette petite bête qu'est l'arduino :frowning:
Et c'est une bonne chose pour mon projet que j'ai en tête car des semaines que je me turlupine les neurones pour trouver une solution et voila qu'un ange apparait : ARDUINO.

Voila , je souhaite remplacer un "bouton rotatif infini mécanique" qui permet d'incrémenter ou de décrémenter selon son sens de rotation (normal quoi !)

en cherchant sur le net , j'ai trouvé le rendu visuel du fonctionnement de ce bouton rotatif pour mon installation .
il génère au repos sur une broche un 0v et la seconde un 5v, puis en tournant dans un sens ou l'autre il génère un signal carré déphasé , cela permet de dire à l'électronique derrière dans quel sens il tourne .
voila en gros à quoi cela ressemble : (ça reste un ex trouvé sur le net)

dans un sens en utilisant le front montant , on a un A & B qui se retrouve un 1 et dans l'autre sens B serait à 1 et A à 0 (pour notre exemple)

comme j'ai pas d'oscillo (j'ai commandé un petit mono canal) je peux pas voir le vrai rendu .

mais on sait que :

Si A = 0 & B = 1 ==> cela veut dire on tourne pas au bouton (repos)

je suppose donc :
Si A = 1 & B = 1 alors on doit être dans un sens
et si A = 0 & B = 0 alors on doit tourner dans un sens .

on aurait donc une porte logique au cul du bouton & ( à confirmer )

mon projet avec l'arduino est de passer ce bouton Rot en 2 boutons simple

quand je ferais sur le bouton (-) un appuie cela , via l'arduino, devra décrémenter , si je fais (+) cela incrémentera , si je reste appuyé X secondes sur un des 2 on génère X incrémentation/décrémentation. il faudra ajouter une protection pour si on appuie sur les 2 en même temps qu'il se passe rien :slight_smile: sinon problème .

en espérant avoir expliqué au mieux mon projet :slight_smile:

Amicalement Pascal

la prochaine étape est de découvrir comment bien poster sur le forum :slight_smile:

➜ lire et appliquer les recommandations listées dans "Les bonnes pratiques du Forum Francophone” à commencer par poster au bon endroit

comme ce n'est pas un tuto que vous postez, j'ai déplacé votre vers le forum francophone général

Oups milles excuses .
je n'ai pas fait attention je pensais etre revenu sur le forum principal et non dans les tuto

Non, c'est purement mécanique.

Pour simuler un encodeur rotatif il suffirait de recréer les deux signaux avec une fréquence donnée.

Mais au final, quelle est votre question ?

Si vous avez l'algorithme,il suffit de le coder.

je voudrais remplacer le bouton rotatif par 2 bouton poussoir .
un <= pour décrémenter un => pour incrémenter

je voudrais reproduire cela

bonsoir
il "suffit" de recopier le code apparaissant dans la vidéo

je vais tester le cablage et voir via tinkercad.com pour tester l'ensemble avec un oscillo

bonjour à tous ,
je viens de trouver le câblage (je pense) et reproduit le système sur le site tinkercad

ON TOUCHE PAS LES BOUTONS

2 signaux identique

(par défaut sur mon boitier j'ai 0 & 5V qui sortent des 2 broches et non un signal carré ) normalement cela doit pas gêner ?

BOUTON (+)

BOUTON (-)

JE vais tester de simuler 2 boutons rotatifs a présent sur le même boitier :slight_smile:

(désolé de poster plusieurs fois a la suite mais le système m'interdit de mettre plus d'une image par post )

Retour de test avec 4 boutons

voici le code

//BLOC2 
const int DISCMOINS_1 = 2 ;
const int DISCPLUS_1 = 3 ;
const int COMMANDEA_1 = 4 ;
const int COMMANDEB_1 = 5 ;
// BLOC1
const int DISCMOINS_2 = 6 ;
const int DISCPLUS_2 = 7 ;
const int COMMANDEA_2 = 8 ;
const int COMMANDEB_2 = 9 ;

void setup() 
{
  // BLOC 2
  pinMode(DISCMOINS_1, INPUT_PULLUP);   
  pinMode(DISCPLUS_1, INPUT_PULLUP);   
  pinMode(COMMANDEA_1, OUTPUT);   
  pinMode(COMMANDEB_1, OUTPUT);  
  // BLOC 1
  pinMode(DISCMOINS_2, INPUT_PULLUP);   
  pinMode(DISCPLUS_2, INPUT_PULLUP);   
  pinMode(COMMANDEA_2, OUTPUT);   
  pinMode(COMMANDEB_2, OUTPUT);

}

void loop() {
  // BLOC 2
  {
    if ( digitalRead(DISCMOINS_1) == LOW )
    digitalWrite(COMMANDEA_1, LOW);
    delay(20);
    digitalWrite(COMMANDEB_1, LOW);
    delay(20);
    digitalWrite(COMMANDEA_1, HIGH);
    delay(20);
    digitalWrite(COMMANDEB_1, HIGH);
    delay(80);
  }

  {
    
    if ( digitalRead(DISCPLUS_1) == LOW )
    digitalWrite(COMMANDEB_1, LOW);
    delay(20);
    digitalWrite(COMMANDEA_1, LOW);
    delay(20);
    digitalWrite(COMMANDEB_1, HIGH);
    delay(20);
    digitalWrite(COMMANDEA_1, HIGH);
    delay(80);
  }  
    // BLOC 1
  {
    if ( digitalRead(DISCMOINS_2) == LOW )
    digitalWrite(COMMANDEA_2, LOW);
    delay(20);
    digitalWrite(COMMANDEB_2, LOW);
    delay(20);
    digitalWrite(COMMANDEA_2, HIGH);
    delay(20);
    digitalWrite(COMMANDEB_2, HIGH);
    delay(80);
  }
  
  {
    
    if ( digitalRead(DISCPLUS_2) == LOW )
    digitalWrite(COMMANDEB_2, LOW);
    delay(20);
    digitalWrite(COMMANDEA_2, LOW);
    delay(20);
    digitalWrite(COMMANDEB_2, HIGH);
    delay(20);
    digitalWrite(COMMANDEA_2, HIGH);
    delay(80);
  } 
    
    
}

malheureusement cela ne va pas et ca modif meme le premier signal j'ai toujours le meme signal sur les 4 oscillo

une idée ?

Bonjour,

Tes accolades sont mal placées.
Je suppose que ce que tu as voulu faire c'est ça:

//BLOC2
const int DISCMOINS_1 = 2 ;
const int DISCPLUS_1 = 3 ;
const int COMMANDEA_1 = 4 ;
const int COMMANDEB_1 = 5 ;
// BLOC1
const int DISCMOINS_2 = 6 ;
const int DISCPLUS_2 = 7 ;
const int COMMANDEA_2 = 8 ;
const int COMMANDEB_2 = 9 ;

void setup()
{
  // BLOC 2
  pinMode(DISCMOINS_1, INPUT_PULLUP);
  pinMode(DISCPLUS_1, INPUT_PULLUP);
  pinMode(COMMANDEA_1, OUTPUT);
  pinMode(COMMANDEB_1, OUTPUT);
  // BLOC 1
  pinMode(DISCMOINS_2, INPUT_PULLUP);
  pinMode(DISCPLUS_2, INPUT_PULLUP);
  pinMode(COMMANDEA_2, OUTPUT);
  pinMode(COMMANDEB_2, OUTPUT);

}

void loop() {
  // BLOC 2
  if ( digitalRead(DISCMOINS_1) == LOW )
  {
    digitalWrite(COMMANDEA_1, LOW);
    delay(20);
    digitalWrite(COMMANDEB_1, LOW);
    delay(20);
    digitalWrite(COMMANDEA_1, HIGH);
    delay(20);
    digitalWrite(COMMANDEB_1, HIGH);
    delay(80);
  }

  if ( digitalRead(DISCPLUS_1) == LOW )
  {
    digitalWrite(COMMANDEB_1, LOW);
    delay(20);
    digitalWrite(COMMANDEA_1, LOW);
    delay(20);
    digitalWrite(COMMANDEB_1, HIGH);
    delay(20);
    digitalWrite(COMMANDEA_1, HIGH);
    delay(80);
  }
  
  // BLOC 1
  if ( digitalRead(DISCMOINS_2) == LOW )
  {
    digitalWrite(COMMANDEA_2, LOW);
    delay(20);
    digitalWrite(COMMANDEB_2, LOW);
    delay(20);
    digitalWrite(COMMANDEA_2, HIGH);
    delay(20);
    digitalWrite(COMMANDEB_2, HIGH);
    delay(80);
  }

  if ( digitalRead(DISCPLUS_2) == LOW )
  {
    digitalWrite(COMMANDEB_2, LOW);
    delay(20);
    digitalWrite(COMMANDEA_2, LOW);
    delay(20);
    digitalWrite(COMMANDEB_2, HIGH);
    delay(20);
    digitalWrite(COMMANDEA_2, HIGH);
    delay(80);
  }
}

Bonjour @kamill
je suis parti de ce code qui fonctionne tres bien

j'ai simplement voulu le doubler l

Je doute fortement (litote :slightly_smiling_face:) qu'il fonctionne très bien.
A mon avis il y a le même problème de fonctionnement dans ce code.
On le voit sur tes oscillogrammes

  • il y a un signal lorsque aucun bouton n'est enfoncé alors qu'il ne devrait pas y avoir de signal
  • les signaux ne sont pas carrés

Dans la simulation on ne peut pas voir la phase des deux signaux (donc impossible de voir si le fonctionnement est correct), mais je doute qu'elle soit correcte.

merci de ne pas poster d'images d'un code

  • c'est difficile à lire. on ne peut pas voir tout le code s'il est long
  • c'est inutilisable (on ne peut pas copier coller pour tester)
  • ça prend de la bande passante internet pour rien (et ça pollue plus la planète)
  • ça prend de la place disque pour rien (et ça pollue plus la planète)

postez simplement le texte du code entre balises de code... (après indentation)

EDIT: pas votre faute pour ce coup là :slight_smile:

Bonjour
C'est moi qui suis à l'origine de cette mauvaise hard copy ! :innocent:
j'ai hésité hier , mais le "youtubeur" d'origine n'ayant même pas pris la peine
de faire un lien vers son code , et compte tenu du faible nombre de lignes, j'ai pensé que cela pouvait quand même être utile.

oops ! :slight_smile:
j'avais pas vu que c'était la même qu'en #7

je comprends mieux

@kamill

malheureusement l'oscillo du site ne peut prendre en compte qu'un signal

sur mon boitier en repas j'ai 5v sur la broche A et 0v sur la B en permence
si ici on a les 2 même signaux en // normalement il doit rien se passer car en phase (toujours en théorie )

voici le code d'origine (celui de la photo)

const int DISCMOINS = 2 ;
const int DISCPLUS = 3 ;
const int COMMANDEA = 4 ;
const int COMMANDEB = 5 ;


void setup() 
{

  pinMode(DISCMOINS, INPUT_PULLUP);   
  pinMode(DISCPLUS, INPUT_PULLUP);   
  pinMode(COMMANDEA, OUTPUT);   
  pinMode(COMMANDEB, OUTPUT);  

}

void loop() {

  {
    if ( digitalRead(DISCMOINS) == LOW )
    digitalWrite(COMMANDEA, LOW);
    delay(20);
    digitalWrite(COMMANDEB, LOW);
    delay(20);
    digitalWrite(COMMANDEA, HIGH);
    delay(20);
    digitalWrite(COMMANDEB, HIGH);
    delay(80);
  }

  {
    
    if ( digitalRead(DISCPLUS) == LOW )
    digitalWrite(COMMANDEB, LOW);
    delay(20);
    digitalWrite(COMMANDEA, LOW);
    delay(20);
    digitalWrite(COMMANDEB, HIGH);
    delay(20);
    digitalWrite(COMMANDEA, HIGH);
    delay(80);
  }  
      
}

cela donne ça en repos

Si le code posté était indenté correctement cela donnerait ceci :

const int DISCMOINS = 2 ;
const int DISCPLUS = 3 ;
const int COMMANDEA = 4 ;
const int COMMANDEB = 5 ;


void setup()
{
  pinMode(DISCMOINS, INPUT_PULLUP);
  pinMode(DISCPLUS, INPUT_PULLUP);
  pinMode(COMMANDEA, OUTPUT);
  pinMode(COMMANDEB, OUTPUT);
}

void loop() {
  {
    if ( digitalRead(DISCMOINS) == LOW )
      digitalWrite(COMMANDEA, LOW);
    delay(20);
    digitalWrite(COMMANDEB, LOW);
    delay(20);
    digitalWrite(COMMANDEA, HIGH);
    delay(20);
    digitalWrite(COMMANDEB, HIGH);
    delay(80);
  }
  {
    if ( digitalRead(DISCPLUS) == LOW )
      digitalWrite(COMMANDEB, LOW);
    delay(20);
    digitalWrite(COMMANDEA, LOW);
    delay(20);
    digitalWrite(COMMANDEB, HIGH);
    delay(20);
    digitalWrite(COMMANDEA, HIGH);
    delay(80);
  }
}

On voit bien que seule la ligne après chaque condition if() est conditionnée, le reste s'exécute inconditionnellement.
Se méfier des codes trouvés sur le WEB. Ce n'est pas parce que c'est publié que le fonctionnement est garanti.