Salut à tous,
Comme proposé dans mon post sur mon brélon, voici un mini tuto pour réaliser votre indicateur de rapport engagé.
La logique derrière est suffisamment simple pour être à la portée de tout le monde avec quelques explications mais suffisamment complexe dans le sens ou vous serez obligés de vous poser un moment pour coder votre propre afficheur.
L'idée est d'utiliser un arduino nano pour lire la tension renvoyée par la boite et afficher le rapport correspondant sur un afficheur 7 segments.
Pour cela il vous faudra : - un arduino nano (sans blague), environ 3€ sur aliexpress
- un afficheur 7 segments, perso j'ai utilisé un 0.56 pouce bleu, à vous de voir, environ 3€ les 5. Privilégiez à
"cathode commune" ça évite de raisonner en logique inversée.
- du cable fin et souple (pour ne pas prendre trop de place ni tirer sur les soudures)
- de la gaine thermo
- du cable noir rouge et d'une autre couleur (pour + et 6 - de la moto et tension renvoyée par la boite)
- une resistance de 300-400 ohm
- deux autres résistances pour faire un pont diviseur si besoin (voir à la fin)
Juste avec ça vous avez de quoi faire le système à vous de voir pour le boitier si vous le déportez ou intégrez dans votre compteur, perso j'ai fait une boite avec mon imprimante 3D.
Il y a 5 grandes étapes :
1/ Partie hardwareCette partie correspond à la soudure de votre arduino. Commencez par souder un fil fin sur chaque segment de l'afficheur (
un fil par lettre sur le schéma ci dessous) :
Soudez sur l'une des broches "cc" (pour "common cathode") la résistance 400ohm, coupez l'autre broche elle ne sert à rien elles sont reliées.
N'oubliez pas de tout protéger avec de la gaine thermo pour éviter les courts circuits.
Ensuite reliez chaque fil fin (et donc chaque segment de l'afficheur) sur une broche "D2" à "D13" de l'arduino, et la résitance de 400ohm (donc la broche "cc") sur un des deux "GND" :
Peu importe l'ordre ou le numéro de broche, vous les modifierez dans le code l'arduino par contre essayez de faire des fils le plus court possible pour ne pas avoir un final trop volumineux.
Enfin soudez les cables rouges et noirs sur "Vin" et "GND" et le fil de l'autre couleur sur "A0"
Pour le moment ne soudez rien sur la motoVoici quelques photos de mon montage pour illustrer le tout (ne tenez pas compte de l'aspect esthétique
) :
2/ Partie software et mise en placeTéléchargez et installez le logiciel arduino (il est gratuit) puis connectez ce dernier sur le PC via usb.
Grace aux schéma ci-dessus et à vos soudures, repérez à quelle sortie "Dx" correspond chaque segment de l'afficheur.
Pour ma part j'ai fait un schéma manouel du 7 segment qui ressemble à ça :
Ensuite dans un microcontroleur, les entrées/sorties sont regroupées sous ce qu'on appelle des PORTS (il y a des bit, des ports, des PD, même des Q-bit ... bref un peu salace je l'avoue).
8 bits forment un octet (chaque bit prend comme valeur 0 ou 1).
Il sont souvent nommés A,B,C,D etc et regroupent n-entrées/sorties (pour info les PORTS sont en fait des registres de taille 8,16,32,64 bits ils régissent tout votre systeme, c'est ça qu'on voit avec les ordi 32 ou 64bits), ici l'arduino est un microcontroleur 8bits donc chaque PORT regroupe 8 entrees/sortie. Avec le schéma ci-dessous vous pouvez voir a quel PORT correspondent vos entrées/sorties reliées au 7 segment :
Les couleurs qui nous intéressent sont les cases jaunes pale et les grises clair "PORTS PIN" et "DIGITAL PIN".
Par exemple la broche "D2" correspond au PORT D, bit numéro 2 "PD2"............. la broche "D8" correspond au PORT B, bit numéro zéro "PB0" ......etc etc.
L'avantage de cette pratique est que on peut activer plusieurs sorties avec une seule ligne de code, donc si PD2 = 1 alors la sortie D2 sera activée, idem pour PB0 idem pour tous les autres port.
Je vous invite donc à modifier votre schéma précédent de la façon suivante ça va simplifier la suite :
Les bits sont numérotés de 7 à 0 (dans l'ordre décroissant), par exemple si j'écris "PORTD = 0000 0000" toutes les sorties D2 à D7 seront "éteintes" si j'écris "PORTD = 0100 0000" seule D6 sera "allumée", si j'écris "PORTD = 1111 1111" toutes les sorties seront activées.
3/ Ecriture des chiffres sur le 7 segmentsVous devez maintenant "ecrire" les chiffres sur le 7 segments. Par exemple, DANS MON CAS, pour ecrire le chiffre "2" il faut que "j'allume" les segments PD2, PB0, PD7, PD5, PD4.
Encore pour simplifier la suite, faites un tableau comme celui ci :
J'ai mis des 0 dans tous les bits inutilisés (par exemple, je n'utilise pas PB2 à PB7).
Ensuite j'ai rempli la ligne correspondant au rapport "2" avec des "1" dans les segments à allumer et des "0" ailleurs :
Vous voyez les chiffres binaires a entrer sur les PORT B et D pour afficher le chiffre "2" sur le 7 segments : si j'écris "PORTB = 00000001" et "PORTD = 10110100" j'aurai les bonnes sorties activées pour afficher "2".
Vous devez faire de même pour tous vos rapports, le "N" et autres symboles que vous voulez afficher.
4/ Niveaux de tensionVous devez maintenant trouver les niveaux de tension correspondants à chacun des rapports engagés. Mesurez les au voltmètre en mettant la moto sur bequille d'atelier et en donnant des coups de gaz.
Les valeurs devraient varier, noter la plus basse pour chaque rapport. Cela permettra de faire des plages (par exemple si la tension > 1v alors on affiche 1, si >2v on affiche 2 etc) et ça évite d'avoir un affichage qui varie sans cesse.
ATTENTION : assurez vous bien que les niveaux de tension soient compris entre 0 et 5v, si la boite vous sort des tensions supérieures vous devrez mettre un pont diviseur sur l'entrée de mesure sous peine de cramer l'arduino (si c'est le cas contactez moi ou tapez "pont diviseur" sur google c'est tout bête
)
5/ Code arduinoJ'ai codé l'arduino avec le code suivant (si vous avez une solution pour améliorer l'affichage je suis preneur ...) :
//copiez a partir d'ici
int adcRead1 = 0;
int adcRead2 = 0;
int adcRead3 = 0;
int adcRead4 = 0;
int adcRead5 = 0;
int adcRead6 = 0;
int adcRead7 = 0;
int adcRead8 = 0;
float mesure = 0;
float temp = 0;
void setup(){ //configuration des pins en "sorties" et de la mesure en "entree"
DDRD=0b11111111;
DDRB=0b11111111;
pinMode(A0, INPUT); // modifier le "A0" en pin de votre choix
Serial.begin(9600);
}
void loop() {
delay(70);
adcRead1 = analogRead(A0); //lire la tension sur la broche A0, // modifier le "A0" en pin de votre choix
delay(10);
temp = (float)(adcRead1+adcRead2+adcRead3+adcRead4+adcRead5+adcRead6+adcRead7+adcRead8)/8; //utilise pour faire une moyenne glissante sur 8 mesures (permet de limiter les variations intempestives)
mesure = 5*temp/1023;
http://0.9461* adcRead8=adcRead7;
adcRead7=adcRead6;
adcRead6=adcRead5;
adcRead5=adcRead4;
adcRead4=adcRead3;
adcRead3=adcRead2;
adcRead2=adcRead1;
Serial.println(mesure); // afficher sur le pC la valeur mesuree
PORTD=0b00100000; // si aucune tension recueillie, on affiche le "point"
PORTB=0;
if(mesure>1.3){ // modifier les valeurs numeriques en accord avec celles mesurees sur votre moto IMPORTANT DE LAISSER DANS L ORDRE CROISSANT
UN();
}
if(mesure>1.75){
DEUX();
}
if(mesure>2.4){
TROIS();
}
if(mesure>3){
QUATRE();
}
if(mesure>3.9){
CINQ();
}
if(mesure>4.3){
SIX();
}
if(mesure>4.7){
N();
}
}
void N(){
PORTB = 0b00000000; ///modifier ici les valeurs des ports B et D en accord avec votre tableau precedemment cree cf post sur motopiste
PORTD = 0b01010100; // IL EST IMPORTANT DE LAISSER LES "0b" et les ";" (0b indique que c'est du binaire et le ; est pour signaler la fin de la ligne)
}
void UN(){
PORTB = 0b00000010;
PORTD = 0b00010000;
}
void DEUX(){
PORTB = 0b00000011;
PORTD = 0b01001100;
}
void TROIS(){
PORTB = 0b00000011;
PORTD = 0b01011000;
}
void QUATRE(){
PORTB = 0b00000010;
PORTD = 0b11010000;
}
void CINQ(){
PORTB = 0b00000001;
PORTD = 0b11011000;
}
void SIX(){
PORTB = 0b00000001;
PORTD = 0b11011100;
}
//copiez jusque là
Tout ce qui est après des "//" est en commentaire et ne sera pas pris en compte lors de la compilation. Je vous invite a copier coller le code dans l'appli arduino, il sera affiché avec des couleurs et sera plus facile à lire.
Modifiez tous les champs "PORTB" et "PORTD" en fonction de votre tableau papier précédent puis cliquez sur "Croquis => Verifier/compiler".
Si tout se passe bien il n'y a pas de message d'erreur et vous ferez alors "Fichier => Téléverser". Cette action va programmer votre arduino.
Vous avez plus qu'à connecter votre arduino sur la moto (broches + , - , et tension de boite) et voilàààààà !!!!
ATTENTION : Sur certaines cartes arduino chinoises (comme celle que j'ai utilisée), il n'y a pas de sécurité sur l'alimentation. Je m'explique, l'usb de votre PC sort du 5v et alimente votre carte arduino, si vous alimentez en même temps la carte avec le +12v de la moto vous ramenez le 12v sur le 5V du PC sans limitation de courant ==> il y a un risque de destruction soit de la carte arduino soit de votre carte usb !!! donc si vous connectez le port usb avec une chinoiserie, assurez-vous d'avoir débranchez le +12V !!! Il me semble que les cartes arduino officielles ont cette sécurité, mais à vérifier.
PS : si l'affichage vous paraît "lent", réduisez la valeur du "delay(70)". Si vous mettez un truc trop faible les vitesses risquent de sauter, si vous mettez un truc trop haut le changement d'affichage sera moins "instantané" mais plus stable.