Arduino + Tacômetro

Olá.

Venho perguntar se alguem sabe como ligar e enviar sinais de um Arduino para um tacômetro:

Em tempos fiz um circuito com um PIC18F2550 e funciona bem. Ele apenas tem estes fios:

Vermelho: Para ligar aos 12v (+)
Preto: Para ligar ao Ground (-)
Verde: Para receber o sinal do circuito/aplicação/arduino
Branco: Para ligar aos 12v (associado a um Led extra de 'shift indicator')

A minha questão é apenas saber se podemos ligar o fio verde directamente num pino do arduino e que tipo de sinais podemos enviar.. PWM?

Se alguém souber.. Obrigado!!

O PIC que falas é semelhante a um arduino... que componentes meteste nesse circuito?

12V queima ambos os chips (AVR e PIC).

O programa que usaste no PIC também serve (conceptualmente) no Arduino. É só adaptar as funções... até deve ser mais simples no Arduino.

Duvido que funcione com PWM... pelo que li, esses dispositivos têm ligado a eles um sensor de rotações do eixo e isso é um sinal modulado em frequência e não em duty cycle como o PWM.

Tens o esquema do circuito que montaste com a PIC?

Sim, meti na minha página o esquema que usei: https://sites.google.com/site/grcbyte/electronica/tachometer-cpu

O problema é que agora não tenho a aplicação nem o ficheiro Hex, porque o site de onde os tirei está indisponível (já mandei um mail ao autor para ver se me envia mas não sei se responde).

Lembrei-me por isso se utilizar um arduino que penso que seja mais fácil, o tacômetro funciona com 12V, por isso tem mesmo de ser ligado aos 12V. O fio verde é apenas para receber uns impulsos mas nessa parte é que tenho as minhas dúvidas..

Em tempos fiz um circuito com um PIC18F2550 e funciona bem

Venho perguntar se alguem sabe como ligar e enviar sinais de um Arduino para um tacômetro:

Em que ficamos, apenas soldaste as coisas na placa com o PIC ja programado ou tu é que escreveste o codigo?
Se tiveres o codigo podes adapta-lo como o Bubulindo sugere para o arduino.
Se nao tens o codigo fonte entao tens de tentar "escutar" o passa nesse fio de sinal, se é PWM, frequencia, nivel de sinal ...
Um osciloscopio pode te dar essa resposta se nao tiveres a documentaçao tecnica dele.

Numa breve busca parece que um tacometro analogico conta os impulsos nesse cabo verde.
Aqui esta um esquema usando o famoso 555 em que na entrada de trigger o fio verde é ligado para assim contar as rotaçoes.

:slight_smile: Eu não fiz o código, apenas programei o PIC e soldei as coisas sim. A aplicação e o HEX tirei de um site há uns anos.

Eu experimentaria o circuito que o Hugo meteu aqui.

Acho muito estranho essa ligação directa com os 5V de alimentação da PIC a um dispositivo alimentado a 12V... no entanto, os 12V podem ser apenas por facilidade (as baterias dos carros são de 12V) e para fornecer potência para mexer o ponteiro (que não será por aí fora...).

Se funcionou assim, eu diria que funciona com o Arduino...

Experimenta algo assim para o código:

void setup() {

pinMode(PINO_SAIDA, OUTPUT);
digitalWrite(PINO_SAIDA, LOW);
}

unsigned int freq = 1; 
unsigned int counts = 0;

void loop() {

digitalWrite(PINO_SAIDA, HIGH);
delay(freq);
digitalWrite(PINO_SAIDA, LOW);
delay(freq); 

if (++ counts >= 65000) {
    i++; 
    counts = 0; 
    }
}

Isto vai criar uma onda com uma frequência variável e dará para teres uma ideia das frequências a que o velocímetro responde.
A variável counts está lá para te dar algum tempo entre cada frequência... se bem que talvez seja necessário aumentar isso para ver o que se está a passar.

Tens um osciloscópio aí à beira?

O tacômetro só liga ao Arduino através do fio de 'pulse', independentemente de estar ligado aos 12V acho que não interfere com o Arduino, pois deve ser a mesma coisa do que com o PIC.
Vou testar ligá-lo com o fio verde num pino do Arduino e usar o código referido (que agradeço desde já) para gerar a onda com frequência, penso que quanto mais impulsos forem enviados mais a agulha sobe, se calhar meto um potenciometro para ver o valor máximo ou assim.

osciloscópio não tenho não..

Obrigado!

if (++ counts >= 65000) {
    i++; 
    counts = 0; 
    }

Podes explicar melhor o que este if pretende fazer nao estou a entende-lo no que pode afectar a onda final :fearful:
a var i nao foi declarada por isso deve dar erro na compilaçao, mas supondo que a avaliaçao do if ocorre passados 65000 ciclos incrementada por ++ counts o que irá executar??

almamater:
O tacômetro só liga ao Arduino através do fio de 'pulse', independentemente de estar ligado aos 12V acho que não interfere com o Arduino, pois deve ser a mesma coisa do que com o PIC.
Vou testar ligá-lo com o fio verde num pino do Arduino e usar o código referido (que agradeço desde já) para gerar a onda com frequência, penso que quanto mais impulsos forem enviados mais a agulha sobe, se calhar meto um potenciometro para ver o valor máximo ou assim.

O GND tem de ligar a algum lado para dar uma referência ao pulse, não?

HugoPT:

if (++ counts >= 65000) {

i++;
    counts = 0;
    }



Podes explicar melhor o que este if pretende fazer nao estou a entende-lo no que pode afectar a onda final :fearful:
a var i nao foi declarada por isso deve dar erro na compilaçao, mas supondo que a avaliaçao do if ocorre passados 65000 ciclos incrementada por ++ counts o que irá executar??

O i é para substituir por freq. LOL

Basicamente esse pedaço de código serve garantir que a mesma onda corre durante 65000 vezes, depois incrementa freq, a frequência da onda diminui e volta a correr 65000 vezes até incrementar de novo. Isto dará para ter uma ideia da frequência de pulsos que o velocimetro usa.

Se não houvesse esse pedaço de código e apenas incrementasse a variável freq, cada frequência só era visível por um ciclo... isso ia ser um pouco difícil de visualizar, acho. LOL

agora sim faz sentido a tua explicaçao. :grin:

bubulindo:
O GND tem de ligar a algum lado para dar uma referência ao pulse, não?

Ah sim.. tenho que ligar o Grnd do Arduino ao Grnd da fonte do Tacômetro..

Já agora, só por curiosidade, porque é que vais ligar isso a um Arduino e não a um sensor de rotações?

É para fazer uma brincadeira? :slight_smile:

sim é para brincadeira :slight_smile:

Inicialmente foi para mostrar a utilização do CPU e seria para implementar numa caixa de PC (gosto de modding) mas de facto nunca o usei e lembrei-me ontem de o tirar da caixa e como agora tenho o Arduino pensei em usá-lo mas sem nenhum projecto para já em mente :slight_smile:

O efeito deve ser interessante.Ja agora como estas a pensar ler a utilizaçao do CPU e depois envia-la atraves do arduino?

Bem, se utilizar o circuito que já tenho com PIC já consigo usar a aplicação que falei acima, o autor da mesma já me enviou por mail :slight_smile: assim como o código fonte e o hex.

No caso de utilizar o Arduino poderia usar o VB ou adaptar o código já feito para o PIC.. mas para já quero apenas testar o funcionamento dele enviando uns impulsos a ver se funciona desta forma :slight_smile:

Coloca entao o codigo fonte do autor para ver como ele faz mexer o Tacometro.

Está em anexo um .rar com os 3 ficheiros (Source, binaries e o firmware para o PIC).

Tachometer.rar (219 KB)

Infelismente do que vi dentro do rar nao tem da o codigo fonte do PIC apenas o HEX ja gerado e o projecto da aplicaçao do autor, por isso o misterio permanece :~

Já estive a testar.. com o código referido não consigo grande coisa, a agulha inicialmente ficava sempre nas 7 (x1000) RPM, depois resolvi adicionar um debug e meti Serial.Begin(9600); no setup do código e a agulha passou para os 3 (x1000) RPM.. alterando o número no ciclo (de 65000 para outro qualquer) não influência, pelo menos com os valores que meti (10000, 40000,110000, etc..).

Encontrei no entanto um tópico a falar também disto, o user utilizou este código:

void setup()  { 
pinMode(9, OUTPUT);
} 

void loop()  { 
    tone(9, 33.3333333333333);
    delay(2500);
    tone(9, 66.66666666666667);
    delay(2500);
    tone(9, 100);
    delay(2500);
    tone(9, 133.3333333333333);
    delay(2500);
    tone(9, 166.6666666666667);
    delay(2500);
    tone(9, 200);
    delay(2500);
    tone(9, 233.3333333333333);
    delay(2500);
    tone(9, 266.6666666666667);
    delay(2500);
    noTone(9);
    delay(2500);
}

e por acaso funciona +/-, fazendo o cálculo referido nesse tópico: "Use the calculations he provided, or to put is another way, frequency = RPM * cylinders/120." a agulha mantêm-se fiel até às 6 mil RPM depois é que começa a ficar mais atrás do objectivo.. não testei ajustar os valores das frequências mas se calhar é a solução.

Vídeo: