quarta-feira, 13 de novembro de 2013

TUTORIAL - CONTA-GIROS ARDUINO

Sempre quis um conta-giros digital  no carro , com o arduino tive essa oportunidade de desenvolver um do meu gosto, com uma montagem e programação simples.
a ideia e receber as rotações do motor do carro e monstra-las em um display de lcd , para implementar o projeto , coloquei também uma leitura de tensão de bateria (resístores divisão de tensão)  e um sensor de temperatura (LM35 sensor analógico).

esquema:

funcionamento:

a entrada do optoacoplador(4n25) deve estar ligado no pino negativo da bobina do carro , usa-se o pino negativo da bobina pois é nesse pino que temos os pulsos para gerar as faícas para as velas, deve  observar se seu carro tem uma bobina para todas as velas ou se tem uma para cada duas velas e também a quantidades de pitões de seu carro pois isso vai ser utilizado no calculo de RPM no programa do arduino .Neste programa fiz amostras a cada 300 ms como mo meu carro era um Gol quadrado com motor AP
com uma bobina para todos os 4 pistões , então o sinal que é obtido no pino negativo da bobina é de 2 vezes a rotação do morto, assim se o motor estiver com 1000 RPM temos 4000 pulsos por minuto, para converter temos que fazer a seguinte conta:

Para leitura de temperatura e tensão temos que fazer os seguintes calculos:


temperatura = (valorLido * 0.00488); // 5V / 1023 = 0.00488 (precisão do A/D)
temperatura = temperatura * 100;
valorTensao = analogRead(pinoTensao);
tensao = valorTensao * 0.00488 ;
tensao = tensao * 4 ;

No LCD usei comunicação I2C com o ci PCF8574 , a biblioteca usada é LiquidCrystal_I2Ca  pode ser baixada aqui .

Seque o codigo :

#include <liquidcrystal_i2c .h="">

#include <wire .h="">
int pinoSensor = 0; //pino que está ligado o terminal central do LM35 (porta analogica 0)
int valorLido = 0; //valor lido na entrada analogica
float temperatura = 0;
int pinoTensao = 1;
int valorTensao = 0; //valor lido na entrada analogica
float tensao = 0;
byte detecta = 2;
int contador = 0;
LiquidCrystal_I2C lcd(0x38,16,2);
void setup()
{
lcd.init();
lcd.backlight();
lcd.print("CONTA GIROS DNL");
pinMode(detecta,INPUT);
digitalWrite(detecta,HIGH);
contador = 0;
attachInterrupt(0, DETECTA, FALLING);
noInterrupts();

delay (10000);

}

void loop()
{
unsigned long tempo = millis();
while(tempo +300 > millis())
{
interrupts();

}

contador = contador * 100 ;

valorLido = analogRead(pinoSensor);

temperatura = (valorLido * 0.00488); // 5V / 1023 = 0.00488 (precisão do A/D)
temperatura = temperatura * 100;
valorTensao = analogRead(pinoTensao);
tensao = valorTensao * 0.00488 ;
tensao = tensao * 4 ;

lcd.setCursor(0, 0);
lcd.print("V:");
lcd.print(tensao);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temperatura);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("RPM:");
lcd.print(contador);
lcd.print(" ");
contador = 0;
}
void DETECTA()
{
contador ++;
}