Compte-tour Automobile

## Introduction

Le but de ce projet est de connaître la vitesse de rotation du moteur thermique d'un véhicule puis de l'afficher en temps réel. Nous allons ainsi construire un dispositif qui pourra se brancher sur n'importe quelle voiture (on l'espère !).

## Intégration sur la voiture

Notre boitier sera alimenté par la batterie de la voiture et présentera trois connexion :

* Batterie +

* Batterie - (masse du véhicule)

* Sortie + de l'alternateur

## Méthode et cahier des charges

Pour mesurer la vitesse du moteur, on profite du fait que l'alternateur du véhicule est relié au moteur via une courroie. La vitesse de l'alternateur nous donnera donc la vitesse moteur à une constante multiplicative près.

On peut déterminer la fréquence de rotation de l'alternateur à partir de son signal de sortie qui possède de légères fluctuations périodiques. Elles sont produites par la construction et le fonctionnement même de l'alternateur : il produit une tension triphasé puis la redresse via un pont de diodes double alternance. La forme du signal n'est pas totalement prévisible, elle dépendra du véhicule et de la condition de la batterie. Il existera donc des voitures ou notre dispositif ne fonctionnera pas. Nous proposons un circuit simple qui permet de se passer de la transformée de Fourier:

* La première tâche consiste à enlever la partie continue du signal, ceci est réalisé par un filtre passe haut >1hz. Les basses fréquences (la partie continue donc la moyenne) seront donc éliminées. Ensuite on protège le circuit des hautes fréquences (pollution électromagnétique) avec un filtre passe bas <10Khz. Il restera alors une tension crête à crête de moins de 4V sûr si le régulateur de l'alternateur n'est pas défectueux.

* Ensuite on transforme le signal en signal carré grâce au comparateur LM393 alimenté en 5V. Bien que la tension d'entrée pourra être négative et sortira de l'intervalle de la tension d'alimentation, cela est permis par sa documentation et le LM393 produira du 0V ce qui n'est pas le cas avec un amplificateur opérationnel tel le 741.

* Notre microcontrôleur ATmega328P récupérera alors en entrée le signal carré sur la ligne numérique 2 (numérotation arduino voir bas de page), une interruption logicielle incrémentera un compteur chaque fois qu'un passage bas haut se produira. Le timer 1 sera programmé afin d'évaluer la vitesse de rotation une fois par seconde. Il affichera le nombre de tours par minutes sur un écran LCD.

* Un potentiomètre 3K Ohms servira à régler la constante multiplicative entre 0 et 1 à appliquer à la vitesse alternateur afin de trouver la vitesse moteur. Pour déterminer la constante de façon simple, il faut réaliser le réglage à une vitesse connue et connaissant les rapports de sa boite de vitesse/différentiel et diamètre des roues de propulsion, on peut calculer théoriquement la valeur du régime moteur que devrait normalement afficher le détecteur et donc ajuster le potentiomètre jusqu'à ce qu'on trouve la valeur calculée. Ce potentiomètre sera régler sur l'entrée analogique 0 du microcontrôleur. Par example, j'ai calculé qu'à 70 km/h avec ma dernière vitesse dans ma fiat panda, je suis à 3000 tours/min, il me suffira donc de rouler à 70 puis de régler le potentiomètre de sorte que le lcd affiche 3000.

* Un autre potentiomètre 10K Ohms servira à régler le contraste de l'afficheur.

* Un interrupteur servira à mettre sous tension le boitier.
* Un autre interrupteur servira à isoler le signal du boitier pour éviter des courants de fuites lorsque la voiture est à l'arrêt.

## Alimentation des composants

Un convertisseur 12V+ vers 5V comme le LM7805 nous permettra d'alimenter :

* L'amplificateur opérationnel

* Le microcontrôleur ATmega328P

* L'afficheur lcd

## Filtre passe bande

Il est composé d'un simple filtre RC passe haut puis d'un simple filtre RC passe bas. La fréquence de coupure de chacun des filtres est donnée par la formule :

# f

1

2
π
R
C

{\displaystyle f = \frac{1}{2 \pi R C}}

Après calculs pour des résistances de 10k ohms (voir schéma bas de page), on trouve Cph = 15.8 uF et Cpb = 1.53 nF

## Programme Arduino

Ci-dessous le programme Arduino complet  :

```
/*THIS PROGRAM WILL DISPLAY TO AN LCD THE NUMBER OF HIGH PULSE FROM PIN2 PER SECOND EVERY SECONDS UP TO A CONSTRUCTO'S MULTIPLIER.

  THE MULTIPLIER IS SET FROM ANALOG 0 VIA A POTENTIOMETER*/

//MIVILLE ANDRE AVRIL 2017

// include the library code:

#include <LiquidCrystal.h>

#define MEAN_NB 5//give an average value of rpm over 5 samples

// initialize the library for the lcd with the numbers of the interface pins

/*LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,

    uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3

    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);*/

LiquidCrystal lcd(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);//warning, the pins

//numbers are according the arduino specification of uno card which
//are different from the at328p specification

//pin 2 will recieve the square signal

const byte interruptPin = 2;

volatile int occurence;

volatile int flag;

float Cmultiplier = 1.0;

void setup() {

  pinMode(interruptPin, INPUT);

  //whenever the signal shifts from low to high, it will trigger off a software interrupt

  attachInterrupt(digitalPinToInterrupt(interruptPin), Icounter, RISING);

  // set up the LCD's number of columns and rows:

  lcd.begin(16, 2);

  // initialize Timer1 to bring about interrupts every second

  noInterrupts(); // disable all interrupts

  TCCR1A = 0;

  TCCR1B = 0;

  TCNT1 = 3036; // preload timer 65536-16MHz/256/1Hz

  TCCR1B |= (1 << CS12); // 256 prescaler

  TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt

  interrupts(); // enable all interrupts

}

ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt

{

  flag=1;

}

int A0vold;//previous value of A0

int occurences[MEAN_NB]={0};

int Counter=0;

void loop() {

  if(flag)

  {flag=0;

  TCNT1 = 3036; // preload timer

  occurence *= 60; //convert it to rpm

  occurence *= Cmultiplier;

  occurences[Counter]=occurence;

  Counter++;

  if(Counter==MEAN_NB)Counter=0;

;{

    float Occurence=0;

    int j;

    for(j=0;j<MEAN_NB;j++)

    Occurence+=occurences[j];

    Occurence=Occurence/(MEAN_NB+0.0);

    lcd.clear();

  lcd.print(Occurence);

    }

  occurence = 0;

  }

  int A0v = analogRead(A0); //10bit ADC from 0 to 1023

  if (A0v - A0vold > 10 || A0v - A0vold < -10) //potentiometer has changed >+-0.05V on the ADC

  {

    A0vold = A0v;

    Cmultiplier = A0v / (1023 + 0.0);

    //print out the multiplier

    lcd.clear();

    lcd.print("MUL");

    lcd.print(Cmultiplier);

  }

  delay(100);

}

void Icounter() //SOFTWARE INTERRUPT WHEN PIN 2 SHIFTS FROM LOW TO HIGH

{

  occurence++;

}

```

## Schéma du circuit

Les branchements des inputs/outputs du microcontrôleur ont été choisis intelligemment de sorte d'avoir une certaine compatibilité avec d'autres fonctions pour la carte arduino uno (voir bas de page).

## Résultats & Précision

Afin d'améliorer la constance de la mesure nous avons décidé de faire une moyenne logicielle sur 5 secondes.

Pour avoir un nombre de tours précis il est nécessaire de mettre un condensateur entre le 5V et la sortie du LM393. Ce condensateur empêche la sortie de varier trop souvent (dû à la pollution électromagnétique par exemple). On trouve ainsi RC > 1/10K avec R =3K, d’où C=33nF

## Difficultés du projet

* Les numéros de pins marqués sur la arduino uno ne sont pas les même que dans la documentation du microcontrôleur.

* En partie programmation, si on utilise la communication serial pour le débogage, alors on ne peut plus utiliser les pins 0 & 1 pour l'afficheur lcd par exemple, cela nous a fait perdre beaucoup de temps.
* Erreur humaines dans les branchements des fils de connexions résultant en la destruction d'un lcd.
* Traitement du signal par le 741 hors tensions recommandées avec une méconnaissance total de son comportement.
* Incapacités à avoir une idée claire sur la forme du signal de sortie d'alternateur qui dépend de beaucoup de paramètres.
* Perte de temps à vouloir générer un signal similaire avec un vrai alternateur démonté (perte de temps démontage et essais d'utilisations infructueux).
* Pin Aref qui est à 5V et pas à la masse.
* Pins du lcd peu clairs : VSS = masse, VDD = +5V et surtout le gros piège K = masse et A = +5V !
* Confusions lors de la fabrication du filtre passe bande
* Le fonctionnement du comparateur qui connecte ou non la masse, différent du 741.
* Difficulté dans le choix du condensateur à la sortie du comparateur afin d'éviter les hautes fréquences, équation transistor, résolu en faisant un travail d'épicier en disant que RC correspond à un temps...
* On a découvert que les condensateurs pouvaient être polarisés selon les technologies
* Erreur humaines dans les branchements des fils de connexions résultant en la destruction d'un microcontrôleur et court circuits.
* Il nous aurait fallu faire une carte pcb pour terminer notre projet