A ideia do projeto é montar uma injeção eletrônica suplementar para meu carro turbo.

O grande desafio de todo carro sobrealimentado é o acerto da queima de combustível. Usando Arduino e sensores de precisão, acredito que seja possível fazer algo bastante interessante (como hobby). Então, para esse projeto, pretendo desenvolver as seguintes funcionalidades:

Fase 1 – Injeção eletrônica básica e funcional:

Fase 1

Monitoramento da pressão da turbina

Há diversos sensores de pressão de qualidade e precisão. O mais fácil e prático de usar é o MPX4250, é um sensor da GM até 3 bar com saída 0-5v, perfeito para o Arduino. No entanto, esse sensor não é tão barato, custa ~30 dólares.

Primeiramente, optei em usar o sensor Motorola MPXM2202 GST1, por ser menor, muito barato e com muita precisão (comprei no ebay, aqui).

PS: Depois de um tempo (explico logo mais abaixo), resolvi não usar mais o sensor da motorola MPXM2202. De qualquer forma deixo como documentação aqui a instrução de como montar o circuito pra usa-lo.

As características do sensor são:

0 a 29 psi (até 2bar)

Saída linear com voltagem diferencial 0-40mV

0-40mV Compensação de temperatura automática (o sensor ajusta automaticamente a leitura independente da temperatura ambiente)

Alimentação 10v ~ 17v

O desafio desse sensor é a saída em voltagem diferencial. Então, não basta apenas plugar direto na porta analógica do Arduino. A porta analógica possui precisão de 0.4mv, então, teríamos apenas 10 valores possíveis em um range de 30 psi. Ou seja, precisão nenhuma.

Então, precisamos fazer um circuito que amplifique apenas a diferença dessas voltagens, ou seja, usar um Instrumentation Amplifier. Existem vários CIs específicos pra issso (AD620,INA128…), porém não encontrei nenhum desses na Sta Efigência.

De forma a substituir esse amplificador, é possível fazer um amplificador diferencial usando amplificadores operacionais. Esses sim, são baratos e muito fáceis de ser encontrados. Comprei o LM324 (que possui 4 amplificadores operacionais dentro do mesmo CI) e que não custa nem 3 reais (tem na Multicomponentes)

Abaixo está o esquemático para a montagem desse amplificador diferencial:

Setup:

O potenciômetro de 1k é o regulador de amplificação

O potenciômetro de 10k é o limitador de teto de voltagem (regule pra limitar a 5v, por exemplo)

Esse circuito deve ser alimentado com 12v

Não se esqueça de ligar o terra desse circuito com o GND do Arduino!

Por fim, basta ligar a saída do circuito em alguma porta analógica

Sensor de pressão da turbina (atual)

O uso do circuito e do sensor acima, além de um pouco complexo, é muito sensível a interferências e ruídos do resto do circuito. Como é necessário amplificar a diferença de mili volts, qualquer flutuação de voltagem do sistema acaba interferindo na medição. Ou seja, a cada vez que eu montava tudo no carro, os valores de pressão variavam um pouco em relação ao manômetro analógico do carro.

Por essa questão, resolvi usar o MPX4250, mesmo sendo mais caro, é perfeito para uso com arduino devido ao seu range de operação 0-5v!

Sendo assim, sua montagem é direta com o arduino. São 3 pinos, Vout, GND e Vcc.

Assim, o setup é óbvio, basta ligar o Vout no input analógico do Arduino e alimenta-lo com 5v.

G-Force

Talvez a parte mais legal desse projeto seja essa, exibir a força G exercida sobre o carro. Pra isso, usei o acelerometro MMA7260, configurado pra 4G. Veja o primeiro teste desse sensor: O sensor é facilmente encontrado por aí, comprei pelo eBay e paguei 10 dólares (link). Sua montagem não tem segredo nenhum: Vcc: 3.3v SLP (Sleep): 3.3v X, Y e Z: Qualquer porta analógica Há mais 2 pinos, G1 e G2, que servem para configurar a precisão do acelerometro. Para o meu caso, usei a configuração de 4G G1: 3.3v G2: GND

Monitorar a queima de combustível

Ler a sonda-lambda é bastante simples, a própria sonda-lambda retorna uma voltagem entre 0v e +1v, sendo assim, basta ligar direto no Arduino. Dá pra pegar esse sinal direto da central do carro ou direto da sonda, basta medir com um multímetro pra saber qual é o fio exato.

Monitorar a temperatura

O mais simples e barato de todos. Tudo o que precisamos é de 1 (ou mais) sensores de temperatura LM35. O sensor de temperatura LM35DZ é fácil de ser encontrado (ex Dabi Eletrônica, Sta Ifigênia, custa 3 reais) e possui características impressionantes:

Range −55º a +150º C

Precisão de 0,5ºC

Trabalha de 4 até 30 volts

Tempo de resposta para variação ~0,5s

A montagem é muito simples: LM35DZ :

O código, mais fácil ainda:

float temperaturaEmCelsius = ( 5 * analogRead(TEMPERATURE_PIN) * 100.0 / 1024);

No meu caso, estou usando este sensor para monitorar a temperatura do ar na admissão. Fisicamente, coloquei ele dentro da tubulação da pressurização que vem da turbina.

Inicialmente estava usando esse sensor para medir a temperatura de trabalho da turbina. Para isso, basta montá-lo com contato na carcaça da turbina. As turbinas trabalham, geralmente, e em regime regular entre 110ºC e 160ºC. Medindo essa temperatura, dá pra evitar sobreaquecimento da turbina e/ou se o óleo está chegando legal no rotor. Turbinas com folga no eixo tendem a esquentar mais pois o rotor não trabalha muito linearmente.

Gerenciar um bico injetor de combustível suplementar

Um bico injetor automotivo não passa de uma simples solenóide. O problema é que, no caso de bicos de baixa impedância, eles consomem 4A! Ou seja, você vai precisar de um chaveador pra isso. Esse chaveador não pode ser um simples relé, pois precisa de velocidade. Um bico injetor deve “pulverizar” combustível e pra isso, devemos oscilar ele a uma taxa de 5ms aproximadamente. Além disso, um bico injetor se diferencia de uma solenóide comum pelo fato de que você não precisa manter a corrente 100% nele durante o período de abertura, ou seja, para abrir o bico, ele precisa de 4 A, porém para mante-lo aberto, ele precisa de 1 A. Pra isso, existe um circuito chamado de Peak n Hold. O uso do bico sem esse circuito faz com que o bico esquente muito e o risco de queima é alto. Pra montar esse circuito, resolvi pegar o mesmo esquema da MegaSquirt. Mais especificamente, montei um circuito muito bem feito e explicado e que achei no fórum do megasquirt brasil, feito pelo usuário piubrazil, (nesse link). Todos os créditos à ele.

O esquema todo do circuito pode ser baixado daqui: link

Todo os componentes podem ser encontrados com compra online pela Farnell (www.farnellnewark.com.br)

—

Como dito anteriormente, um bico injetor precisa pulverizar combustível e para isso, devemos fazer com que ele pulse em janelas de tempo, ou seja, em largura do pulso (pulse width). O cálculo da largura do pulso é simples, basta calcularmos janelas de abertura/fechamento dentro de uma janela de tempo.

Exemplo: com 3000 rpm um motor leva 0.040 segundos ou 40 ms para completar um ciclo de rotação. Precisamos injetar combustível dentro desse ciclo. Pra isso, devemos fazer um cálculo dentro dessa janela e que tenha uma margem para pulsar. Assim, temos uma janela máxima de 40ms para 3000 rpm.

Se deixarmos o bico aberto por 15ms dentro da janela de 40ms, teremos 37.5% de abertura.

Esse cálculo vale principalmente para cálculo de bicos injetores para cada cilindro. No projeto em questão, usei como parâmetro apenas a pressão da turbina.

Ou seja, dependendo da pressão da tubina, o bico injetor é acionado. Assim, usei abertura de 8ms em uma janela de 30ms para início de pressão (0,1 bar) e 15ms/20ms para pressão total da turbina. Assim, fiz um mapa de injeção para cada 0,1 bar.

A injeção eletrônica original de um carro possui um mapa de injeção similar a esse, só que mapeado em relação ao RPM do motor e outros mapas modificadores com valores em forma de fator de multiplicação. Quando alguém vai alterar o chip de injeção de um carro, basicamente é feito um novo mapa desses, com valores mais agressivos.

Por enquanto, o circuito completo é esse:

Fase 2

Durante o desenvolvimento resolvi abandonar o display LCD e partir pra uma alternativa mais interessante: usar um Celular Android como interface de controle da injeção eletrônica. Para isso, precisava de um meio para conexão entre Arduino e Android, optei pelo bluetooth quase que por razões óbvias.

Integração Arduino – Bluetooth

Para trocar informações com o Arduino e fazer com que seja possível controlar a injeção através do celular, encontrei esse módulo bluetooth serial. De uma forma bem simples, ele é simplesmente uma porta serial comum. Esse módulo, funciona tanto como slave ou master. Especificações:

Bluetooth Specification v2.0+EDR

Frequência 2.4GHz ISM band

Input: 3.3V-6V

Pinos RX e TX

16mm x 40mm

Montagem:

Extremamente simples, basta alimentar o módulo com +5v, conectar o RX do módulo com o TX da porta serial do Arduino e o TX do módulo com a RX do Arduino (basta inverter o RX/TX).

Um detalhe importante aqui, o Arduino Uno/Duelaminove possui apenas uma porta serial, que é a mesma do USB. Portanto, isso dará um grande trabalho durante o desenvolvimento/testes do projeto, pois teria que fazer um switch para revezar o uso da porta. No meu caso, usei um Arduino Mega, que tem 4 portas seriais. Caso for fazer algum projeto com bluetooth, opte pelo Arduino Mega sem dúvidas.Código do Arduino:

void setup(){ Serial.begin(9600); // USB computador Serial1.begin(9600); // Bluetooth } void loop(){ // Chegou informação na Serial1 (do bluetooth)? if(Serial1.available() > 0){ // Se chegou, vamos ler ela int input = Serial1.read(); // Imprimindo a informação na Serial USB do computador Serial.println("Chegou pelo bluetooth:"); Serial.println(input); } }

Exibir o RPM no celular

Todos os carros que possuem injeção eletrônica tem um sensor para medir a rotação do motor. E geralmente, é um sensor que retorna a frequência que o motor está girando. No meu caso, um gol monoponto injeção EEC IV (da ford, a mesma injeção do logus, mustang, etc), o pino 56 da centralina fica oscilando em +12v e 0v. Dessa forma, basta medir a frequêncianesse pino. Com um osciloscópio ou um multímetro que mede frequencia, basta medir para observar que na marcha lenta o sinal fica em ~30hz. Cada 100 rpm equivale a 3hz.Para ler essa informação, usei um simples regulador de tensão LM7905, que faz com que o sinal fique entre 0 ou +5v, o que é ideal para o arduino. Na parte de software, para medir a frequencia pelo arduino, usei uma interrupção e um contador. Me baseei nessa biblioteca: http://www.avdweb.nl/arduino/hardware-interfacing/frequency-period-counter.html. Essa biblioteca já retorna a frequência em Hertz, assim, basta apenas fazer um “de-para” a rotação do motor. LM7805

Software de controle da injeção eletrônica

O software de controle da injeção ficou separado em 2 partes, a primeira, leitura e atuação de sensores ficou no Arduino; a segunda, exibição das informações e interação, no Android.

Assim, no celular fica a parte de exibição dos sensores (força G, pressão turbo, sonda lambda e temperatura do ar na admissão) além da parte de interação, que é a montagem do mapa de injeção baseado no valor da sonda lambda. No microcontrolador Arduino, fica todo o software de leitura de sensores, tratamento dos valores de leitura e atuação (cálculo do tempo de abertura dos bicos).

O principal código para controle da injeção fica no Arduino e é responsável por calcular o percentual de abertura dos bicos dado uma janela de tempo. Lembrando que o bico injetor deve pulverizar combustível, não basta apenas deixarmos ele aberto metade do tempo e a outra metade fechado para conseguir 50%, isso fará com que ele derrame combustível, ao invés de pulverizar. Assim o código deve fazer um cálculo de fragmentação da janela de tempo com mínimo de 2ms de abertura e máximo de 7ms (esses 2 valores são empíricos, descobertos em testes e conversas com mecanicos, deve variar de acordo com o modelo do bico injetor). Abaixo o código que faz isso:

void fuelInject(int percent){ int MAX_CYCLE = 7; int MIN_CYCLE_WIDTH = 2; // quanto menor, mais ele vai abrir e fechar float prop = ( (float) window * ( (float) percent/100)); float mod = 0; float div = 0; int i = MAX_CYCLE; for(; i >= 1 ; i--){ mod = (int) prop % i; div = prop / i; if(mod == 0 && div >= MIN_CYCLE_WIDTH){ break; } } if(i==0) i++; // se tiver apenas 1 ciclo, encaixar ele no meio da janela float gap = 0; if(i==1) gap = (window - prop) / (i+1); else gap = (window - prop) / (i); float qtdGaps = (window - prop) / gap; char foo1[100]; sprintf(foo1,"Janela: %i ms com %i percent, Tempo de injecao %i ms ",window,percent, round(prop)); Serial.println(foo1); char foo2[100]; sprintf(foo2,"%i ciclo(s) de %i ms com intervalos de %i",i, (int) div, (int) gap); Serial.println(foo2); for(int j=0; j < qtdGaps+i ; j++){ if(j % 2 == 0){ // sleep.. delay(gap); }else{ // injetando.. digitalWrite(injectorPin,HIGH); delay(div); digitalWrite(injectorPin,LOW); } } }

N parte do Android, o código é em Java (Android) e não ficou tão simples. A parte de conexão com bluetooth ficou um pouco pesada, pois foi necessário fazer uma espécie de protocolo de comunicação, uma vez que os dados são trafegados de forma serial. A transmissão deve ser feita de byte em byte, por isso precisei fazer esse protocolo, para determinar início e fim da transmissão, que tipo de informação está trafegando e a informação em si. Assim sendo, na parte do Arduino, os sensores são lidos e enviados para o bluetooth da seguinte forma:

byte sondaLambda = analogRead(sondaLambdaPin); Serial1.write("<s"); Serial1.write(sondaLambda); Serial1.write(">");

Ou seja, é enviado “<s330>” pelo Bluetooth, sendo os caracteres de maior e menor (<>) início e fim da informação, “s” o indicador do tipo de dado enviado (no caso s = sondaLambda) e por fim o valor do sensor. No Android, irá chegar tudo quebrado, assim, é necessário fazer um buffer (pilha) e assim que fechar uma informação, devemos processar a pilha e interpretar os dados. Tudo isso está no código fonte: https://github.com/emersonmoretto/A2Turbo

Alterar o mapa de injeção em runtime pelo celular

Com o hardware de injeção peak n hold montado e a leitura da sonda lambda ok, o trabalho de fazer um mapa de injeção em runtime agora é simples. No android fiz uma tela para fazer uma curva da relação entre o valor da sonda lambda pelo percentual de injeção do bico (0-80%). Dessa forma, para cada valor da sonda lambda (0 (pobre) a 12 (rico)) há um percentual de injeção dos bicos. Na tela, adicionei um botão para salvar e enviar essa curva, assim, essa curva é enviada via bluetooh pro arduino, que a recebe e monta o mapa da seguinte forma:

/** * Recebendo novo Mapa via BT */ if(Serial1.available() > 0){ Serial.println("Chegando do BT: "); char c = Serial1.read(); if(c == 'm'){ // o mapa vem assim: m80,70,70,60,50,40,30,20,0,0,0 int buff[] = {0,0,0}; // acumulador int j=0,k=0; while(Serial1.available() > 0){ int c = Serial1.read(); if(c == ','){ // ler e converter os valores, [0]*10+[1] int item = (buff[0] - 48) * 10; mapa[k] = item; k++; Serial.println(item); j=0; }else{ buff[j] = c; j++; } } } } //usando o mapa fuelInject(mapa[lambda])

Screenshots

Tela principal

Mapa de injeção

Tela de conexão com devices Bluetooth

—- Conforme o desenvolvimento do projeto, irei atualizando este post.