Afficheur de rapport engagé pour moto.

Bonjour à tous,

Mon projet est de fabriquer un afficheur de rapport engagé pour moto. L'afficheur (7 segments) doit pouvoir afficher 0 pour la neutre, 1,2,3,4,5,6, pour les vitesses (ou rapports engagés).
Pour cela, je dois utiliser plusieurs capteurs, dont un qui est déjà sur la moto, c'est celui de la neutre. En effet, quand je suis en neutre, un voyant vert sur le tableau de bord s'allume. La condition donc pour afficher 0 (pour la neutre) sera quand ce capteur est à l'état haut (12 volts) plus d'une seconde. Jusque là pas de problème.

Pour afficher 1,2,3,4,5,6 (il y a 6 vitesses sur la moto), j'ai installé 2 microrupteurs sur le selecteur de vitesse. Avant tout, il faut comprendre comment fonctionne le passage des vitesses sur une moto: Initialement la moto est en neutre. Pour passer la 1ère vitesse, il suffit d'appuyer vers le bas sur le selecteur (ou pédale). Pour repasser la neutre, il suffit alors de lever le selecteur, mais pas à fond, sinon la 2ème vitesse est passée (le selecteur peut soit monter, soit descendre, mais il revient toujours en position initiale). Pour passer la 3ème, il suffit de le lever encore une fois. Et ainsi de suite pour la 4ème, la 5ème et la 6ème. En 6ème si le selecteur est encore levé, il ne se passe rien. A l'inverse, pour rétrograder, il suffit d'apuyer sur le sélecteur, autant de fois qu'il faut pour rétrograder toutes les vitesses. Comme je vous ai dit que la neutre se situe entre la 1ère et la 2ème, si le 2ème rapport en engagé, en appuyant pas à fond mais légèrement, la neutre est engagée. Mais on ne le fait jamais, on passe toujours par la 1ère pour passer ensuite la neutre. En fait il y a un "cran" intermédiaire entre la 1ère et la 2ème.

Comme ma moto est du type sportive, les commandes sont reculées, c'est à dire que le sélecteur n'est pas directement monté sur l'arbre de la boite à vitesse, mais il est monté sur un axe, puis relié par une tige à un autre "petit sélecteur" sur l'abre de la boite. (Voir le schéma).

Remarque: Il faut savoir qu'on ne peut pas sauter une vitesse, elle se passe une par une et dans l'ordre sauf dans le cas de la 2ème où l'on peut directement passer à la neutre sans passer par la 1ère.

J'ai besoin d'aide niveau programmation.
J'ai réalisé un rapide logigramme, qu' en pensez vous (voir schéma 2).
Merci pour votre aide.

A+, V.

Ah vrai dire niveau programmation ça sera beaucoup plus simple (j'écris pas tout hein c'est pour donner l'idée)

interruption microrupteur bas(){
if(Compteur>=2 && Neutre==0) Compteur--;
else Neutre=0;
}

interruption neutre(){
Neutre=1;
}

interruption microrupteur haut(){
if(Compteur<=2 && Neutre==0) Compteur++;
else Neutre=0;
}

void loop(){
Afficher7sgements(Compteur);
}

Salut B@tto,

Merci pour ta réponse. Je ne maitrise pas encore très bien la programmation, mais si j'ai bien compris, cela donne:

-Si le capteur 2 est mis à l'état haut et si le compteur est supérieur ou égal à 2 et que le capteur de neutre est à l'état bas, le compteur décompte de 1.

-Si le capteur 1 est mis à l'état haut et si le compteur est compris entre 1 et 5 et que le capteur de neutre est à l'état bas, le compteur ajoute 1.

-Si le capteur de neutre est à l'état haut, le compteur est à 0.

Est ce bien cela ?

merci pour l'aide

Tout juste sauf pour la dernière affirmation : le neutre ne mets pas le compteur à zero, il est géré à par (d'où la nécessité d'employer une seconde variable, baptisée simplement "neutre" dans mon code). Il faudra juste le gérer dans l'afficheur, c'est vrai que dans mon code il aurait plutôt fallut faire :

void loop(){
if (Neutre==1) Afficher7sgements(Neutre);
else Afficher7sgements(Compteur);
}

OK, merci pour l'info.
Dès que j'ai un peu de temps, je fais le programme et je le poste.

A+, V.

Bonjour,

Le programme est fait. Mais j'ai un problème. Tant que je n'active pas le capteur de neutre entre la 1ère et la 2ème, l'afficheur indique le bon rapport. Mais si je suis en 1ère et que ensuite j'active la neutre pour passer en 2ème, le compteur est remis à 0 et donc je suis en 1ère au lieu d'être en 2ème. En plus, il y a des rebonds à chaque impulsions. Voici le programme :

const int DIGIT_e=2;
const int DIGIT_d=3; 
const int DIGIT_c=4; 
const int DIGIT_g=5; 
const int DIGIT_f=6; 
const int DIGIT_a=7; 
const int DIGIT_b=8;  
volatile long neutre=0;
volatile long compteur=0;

void setup(){
int valDIGIT_e = 0; 
int valDIGIT_d = 0;
int valDIGIT_c = 0;
int valDIGIT_g = 0;
int valDIGIT_f = 0;
int valDIGIT_a = 0;
int valDIGIT_b = 0; 

pinMode(DIGIT_e, OUTPUT);
pinMode(DIGIT_d, OUTPUT); 
pinMode(DIGIT_c, OUTPUT); 
pinMode(DIGIT_g, OUTPUT); 
pinMode(DIGIT_f, OUTPUT); 
pinMode(DIGIT_a, OUTPUT);  
pinMode(DIGIT_b, OUTPUT);

attachInterrupt(2,gestionINT0,RISING); 
attachInterrupt(3,gestionINT1,RISING);  
attachInterrupt(4,gestionINT2,RISING);
}

void gestionINT2(){ //capteur neutre
  neutre=1;}
  
void gestionINT1(){ //capteur 1
  if(compteur<=5 && neutre==0) {compteur++;}
  else {neutre=0;};}  
  
void gestionINT0(){ //capteur 2
  if(compteur>=2 && neutre==0) {compteur--;} 
  else {neutre=0;};}
  
void loop(){
if (compteur==1){digitalWrite (DIGIT_e,LOW);digitalWrite (DIGIT_a,LOW);digitalWrite (DIGIT_f,LOW);digitalWrite (DIGIT_g,LOW);digitalWrite (DIGIT_d,LOW);digitalWrite (DIGIT_b,HIGH);digitalWrite (DIGIT_c,HIGH);};  
if (compteur==2){digitalWrite (DIGIT_e,HIGH);digitalWrite (DIGIT_a,HIGH);digitalWrite (DIGIT_f,LOW);digitalWrite (DIGIT_g,HIGH);digitalWrite (DIGIT_d,HIGH);digitalWrite (DIGIT_b,HIGH);digitalWrite (DIGIT_c,LOW);};
if (compteur==3){digitalWrite (DIGIT_e,LOW);digitalWrite (DIGIT_a,HIGH);digitalWrite (DIGIT_f,LOW);digitalWrite (DIGIT_g,HIGH);digitalWrite (DIGIT_d,HIGH);digitalWrite (DIGIT_b,HIGH);digitalWrite (DIGIT_c,HIGH);};
if (compteur==4){digitalWrite (DIGIT_e,LOW);digitalWrite (DIGIT_a,LOW);digitalWrite (DIGIT_f,HIGH);digitalWrite (DIGIT_g,HIGH);digitalWrite (DIGIT_d,LOW);digitalWrite (DIGIT_b,HIGH);digitalWrite (DIGIT_c,HIGH);};
if (compteur==5){digitalWrite (DIGIT_e,LOW);digitalWrite (DIGIT_a,HIGH);digitalWrite (DIGIT_f,HIGH);digitalWrite (DIGIT_g,HIGH);digitalWrite (DIGIT_d,HIGH);digitalWrite (DIGIT_b,LOW);digitalWrite (DIGIT_c,HIGH);};
if (compteur==6){digitalWrite (DIGIT_e,HIGH);digitalWrite (DIGIT_a,HIGH);digitalWrite (DIGIT_f,HIGH);digitalWrite (DIGIT_g,HIGH);digitalWrite (DIGIT_d,HIGH);digitalWrite (DIGIT_b,LOW);digitalWrite (DIGIT_c,HIGH);};
if (neutre==1){digitalWrite(DIGIT_e,HIGH);digitalWrite(DIGIT_d,HIGH);digitalWrite(DIGIT_c,HIGH);digitalWrite(DIGIT_g,LOW);digitalWrite(DIGIT_f,HIGH);digitalWrite(DIGIT_a,HIGH);digitalWrite(DIGIT_b,HIGH);};
}

Avez vous des solutions ?, Merci d'avance

Alors oui je m'étais planté je pense, il ne faut pas vérifier la valeur de neutre quand tu passes un rapport et la mettre à 0 :

void gestionINT2(){ //capteur neutre
  neutre=1;}
  
void gestionINT1(){ //capteur 1
  if(compteur<=5) {
compteur++;
neutre=0;}
}  
  
void gestionINT0(){ //capteur 2
  if(compteur>=2)  {
compteur--; 
 neutre=0;
}
}

Sinon pour les rebonds c'est un sujet assez récurrent il y a pas mal de topics la dessus, souvent un ptit condo fait l'affaire :wink:

Merci, ça fonctionne à merveille !

J'avais déjà pensé à ne pas vérifier la valeur de la neutre, mais ça ne marchait pas. J'avais surement oublier de supprimer quelquechose.
J'ai un dernier problème, c'est un détail.
Quand le programme s'initialise, rien ne s'affiche. C'est normal, car volatile long neutre=0; et pas 1.
Je remplace donc le 0 par un 1. Lors de l'initialisation, l'afficheur affiche 0. C'est parfait, puisque la moto est en neutre au départ. Par contre dès que je passe en 1ère, donc le capteur 2 est à l'état haut, rien ne se passe. Il faut que j'appuie sur le capteur 1, puis que je remette en neutre pour pouvoir incrémenter le compteur avec le capteur 2 et que le programme se déroule comme prévu.
Je ne sais pas si je me suis bien fait comprendre, n' hésitez pas à me poser des questions.
Comment puis-je remédier à cela ?

Merci d'avance.
V.