Velocímetro caminhonete F350 com sensor hall e servo motor no ponteiro

Boa noite galera, preciso de uma ajuda de vcs, tenho um amigo com uma caminhonete antiga e esta com cambio e diferencial modificado e ambos n tem onde ligar o cabo do velocimetro ou mesmo sensor.

A ideia a principio era colocar um sensor hall no cardã e um circuito com arduino nano e servo motor no painel, até a linguagem achei pronta de um video no youtubede uma pessoa que usou em uma bicilheta.

O problema é que n estou conseguindo fazer funcionar, montei o circuito e coloquei um imã em uma furadeira e a medida q vai aumentando a velocidade o servo começa a oscilar e aumentando mais a velocidade ele para de ler.

Acho q o sensor que n da conta de ler, usei dois sensores 3144 um analógico e outro digital. segue o link dos sensores no ML:

http://produto.mercadolivre.com.br/MLB-705790811-2x-sensor-magnetic...

http://produto.mercadolivre.com.br/MLB-854807306-shield-arduino-sen...

Segue tb o link do video do youtube, na descrição do vídeo está o site com a linguagem e a biblioteca, se vcs puderem me ajudar eu agradeço muito,

https://www.youtube.com/watch?v=1ycA7TFV4t4&t=7s

Há o odometro tb n está marcando, o circuito tenho certeza absoluta que liguei certo.

Obrigado novamente pessoal.

Exibições: 2114

Responder esta

Respostas a este tópico

Boa tarde JGP.

Estive revendo o sketch que encontrei no link do vídeo que você postou.

O autor usou o recurso do interrupt para saber que deve medir a velocidade e controlar o servo.

Eu não gosto de fazer cálculos ou qualquer outra coisa dentro da rotina de interrupção,

pois se demorar muito dentro dela, podem ocorrer outros interrupts que serão perdidos,

uma vez que estando dentro da rotina de interrupção qq outra interrupção é bloqueada.

Deve-se usar o minimo de instruções.

Acho que esta pode ser uma razão de você estar com problemas qdo a velocidade é bem alta.

Modifiquei o sketch fazendo o minimo uso da interrupção.

Teste o sketch que estou anexando,e depois dê um feedback do resultado.

Rui

Anexos

Boa noite Ranzinza.
Fiz a alteração e infelizmente ainda n atendeu, o servo sobe certinho ate 45, 50 km/h, a partir daí ele volta a oscilar e detalhe, o sensor 3144 funciona melhor q o shield magnético, ainda n conheço esse mundo de programação o minimo q deveria mas olhando o data shiet era para o sensor trabalhar bem em frequancia bem mais alta, será que é problema no sensor ou o processador do arduino nano não da conta de processar?
O duro que tem videos no youtube destes sensores com o arduino nano mostrando o RPM na casa de 1300RPM e certinho sem oscilar.

Há eu alterei a linguagem de 40 para 180km/h e o limite tb.

E ai, legal, achei seu poste! 

Deixa eu te perguntar:

1-mesmo com código original ele apresenta essa instabilidade, se não tenha uma velocidade intermediária tipo 90Km/h, pra ver o resultado.

2- qual o RPM máximo que ele está lendo?

E manda um vídeo pra gente ver como está a montagem e o comportamento dele, pra que fique mais fácil o entendimento.

Então no original até 40km/h o servo marca normal, se altero para 90km/h ele marca certo até a metade, depois começa a oscilar.
E o pior é q quando eu colocar o sensor no cardã cada volta vai representar 631mm, bem menos q os 2.050m q está escrito na linguagem.
vou gravar um vídeo, eu soldei os fios direto nos sensores e arduino, estava na protobord mas como está dando erro eu achei q podia ser mau contato.
como faço para postar o vídeo aqui.
Eu n manjo de linguagem C então vou baixar uma com contador de rotação assim mostro os dois e posto

Juliano boa noite, 

Se esta suspeitando que o sensor Hall não esta dando conta de perceber as variações do magneto, recomendo que faça um programa para ler o RPM . Talvez assim poderá ficar mais fácil de identificar a causa do problema. 

Seus testes são na furadeira. Sugiro que use um sensor ótico (para efeito de teste) para conferir o RPM da furadeira. 

Nesse meu teste, usei as medições do meu osciloscópio :

http://labdegaragem.com/forum/topics/tutorial-arduino-esc-motor-sem...

http://labdegaragem.com/forum/topics/tutorial-arduino-esc-motor-sem...

Analisando as especificações (datasheet) do sensor HALL 3144 :

https://www.elecrow.com/download/A3141-2-3-4-Datasheet.pdf

Você esta alimentando-o com 5V, naõ é ? 

O tempo máximo de Rise Time é 2 uS e o tempo maximo de Fall time também é 2 uS. 

Deduz-se que pode-se medir frequências nessa faixa :

 se T = 4 us, então F = 1 /T = 250 Khz

Boa noite pessoal, desculta a demora para resposta, ainda n desisti é que está meio corrido.

eu peguei um link que vc José Gustavo colou em outro tópico para RPM com sensor Hall, esse a baixo:

http://facacomarduino.info/img/proj46_orig.jpg

e testei os sensores.

o sensor 3144 sozinho lê bem a rotação da furadeira até 1350rpm e depois estaciona, acredito q deva ser a rotação maxima dela apesar de dizer q vai até 2600.

O shield hall 3144 n vai, tentei regular e n consigo passar de 100rpm. Acho q joguei dinheiro fora nesse.

Bom se o sensor 3144 leu bem nessa programação então, ou a outra linguagem está errada ou o processador do arduino nano é meio fraco pra ler o sensor e ainda refletir no odometro e no servo. Eu acredito q n esta errado.

O que vcs acham?

Como eu ainda n sei C, será q vcs poderiam me ajudar a incluir nessa linguagem do link a cima o servo da outra linguagem e o odometro?

Bom dia , 

Se você não tem osciloscópio para monitorar esses sensores, recomendo que use um analisador lógico. 

Tem um que custa R$ 50,00 no Mercado Livre. 

Analisador Lógico 24 Mhz 8 Ch Usb Saleae

Se quiser, tem um analisador lógico com Arduino:

Boa noite pessoal, chegou hj o arduino Mega e infelizmente n deu resultado, quando baixo um sketch com a função de mostrar apenas a rotação no monitor, n importa qual modelo de sketch é, sempre atinge uma rotação próximo dos 2500 rpm, mesmo que n mostre valores corretos pelo menos ocorre uma aceleração gradual junto da furadeira. Já quando carrego o sketch com a função de representar a velocidade no servo e a distancia no odometro o servo da erro (fica oscilando e n marca mais nada) em torno de 350rpm.

Obrigado por me darem dicas, até o Rui deu uma alterada no sketch que apresentei, mas se alguém puder escrever uma linguagem nova eu agradeço muito. Tentei achar algo na internet que falasse tudo sobre servos e linguagem C mas só achei coisas básicas como movimenta-lo com potênciometro ou avança, aguarda e volta e etc.

Ou até me ajudar a separar a função odometro do velocímetro, assim eu usaria dois arduinos mesmo. Assim acredito q ficaria leve para o microcontrolador.

Obrigado pela atenção 

Segue a baixo a linguagem utilizada.

#include <EEPROM.h> // biblioteca para trabalhar com uma memória interna de Arduino
#include <Servo.h> // biblioteca para servo
Servo servo; // declarar chamado servo servo
unsigned int min_speed = 0; // velocidade mínima de exibição, km / h
unsigned int max_speed = 40; // máxima exibida velocidade, km / h
// ----------- ----------- exibição
#include <TM74HC595Display.h>
int SCLK = 7;
int RCLK = 6;
int DIO = 5;
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];
unsigned long lastturn, time_press; // tempo de armazenamento variáveis
float SPEED; // variável armazenamento velocidade como um decimal
float DIST; // variável armazenar a distância em forma decimal
float w_length = 0.650; // o comprimento da circunferência da roda em metros
boolean flag; // verificar se há armazenamento (que exibe a velocidade ou a distância)
boolean state, button; // flags para pressionar manipulador
bool Flag1 = 0; // Flag para indicar que ocorreu interrupt
//--------------------------
void setup()
{
servo.write(0);
Serial.begin(9600); // abrir a porta
attachInterrupt(0, sens, RISING); // conectar uma interrupção no pino 2 com o aumento de sinal
pinMode(3, OUTPUT); // 3 pino como uma saída
digitalWrite(3, HIGH); // submeter a 5 volts no pino 3
pinMode(8, INPUT); // aqui botão Conectar
servo.attach(4); // porta servo-4
// para exibir os números ----------
LED_0F[0] = 0xC0; //0
LED_0F[1] = 0xF9; //1
LED_0F[2] = 0xA4; //2
LED_0F[3] = 0xB0; //3
LED_0F[4] = 0x99; //4
LED_0F[5] = 0x92; //5
LED_0F[6] = 0x82; //6
LED_0F[7] = 0xF8; //7
LED_0F[8] = 0x80; //8
LED_0F[9] = 0x90; //9
DIST = (float)EEPROM.read(0) / 10.0; // lembre-se a distância percorrida durante a inicialização do sistema (divisão por 10 é necessário para armazenar os décimos de distância lobos cm. Escrever)
}
//--------------------------
void Calcula() // Rotina de calculo
{
if (millis() - lastturn > 80) // proteção contra medição acidental (com base no fato de que a moto não vai mais rápido do que 120 mph)
{
SPEED = w_length / ((float)(millis() - lastturn) / 1000) * 3.6; // calcular a velocidade, km / h
lastturn = millis(); // se lembrar da última vez
DIST = DIST + w_length / 1000; // adicionar o comprimento para a distância a roda durante cada revolução do mesmo,
}
}
//--------------------------
void sens()
{
/*
if (millis() - lastturn > 80) // proteção contra medição acidental (com base no fato de que a moto não vai mais rápido do que 120 mph)
{
SPEED = w_length / ((float)(millis() - lastturn) / 1000) * 3.6; // calcular a velocidade, km / h
lastturn = millis(); // se lembrar da última vez
DIST = DIST + w_length / 1000; // adicionar o comprimento para a distância a roda durante cada revolução do mesmo,
}
*/
Flag1 = 1; // Informa que ocorreu interrupt
}
//--------------------------
void loop()
{
if (Flag1 == 1) // Se ocorreu interrupt
{
Calcula(); // Chama rotina de calculo
Flag1 = 0; // Desliga informação de interrupt
}
int pos = map(SPEED, min_speed, max_speed, 180, 0); // mover valor do mínimo para o ângulo de rotação máxima no servo (0 180)
servo.write(pos); // transformar Servais
disp.digit4(DIST, 50); // output a distância para o ecrã
if ((millis() - lastturn) > 2000) // Se nenhum sinal for maior do que 2 segundos
{
SPEED = 0; //считаем что SPEED 0
EEPROM.write(0, (float)DIST * 10.0); // gravação DIST memória interna. Eu fiz isso de forma inteligente, porque a memória interna não é como reescrita frequente. Além disso, * 10, para salvar um décimo de
}
if (digitalRead(8) == 1) // Se o botão for pressionado
{
DIST = 0; // redefinir a distância
}
}

Bom dia JGP.

Recomendo vc remover o código que colou na área de texto do tópico.

Remova o que vc colou e anexe um arquivo contendo o codigo.

Use este recurso aqui ;para isto:

RV

Boa noite Rui, desculpa a cabacisse, achei q ficaria melhor pra quem n gosta de ficar baixando arquivos, em fim, esse código é o que o Sr reescreveu pra mim, tentei separar os códigos que executam o odometro e velocimetro mas n sei quando uma função é necessario para um e para outro.

Se puderem me ajudar separando as funções eu agradeço.

Acho que ficaria mais leve dois arduinos, um para velocimetro e outro para odometro.

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço