Go Down

Topic: Velocimetro só chega a 96Km/h ... ajuda (Read 13716 times) previous topic - next topic

bubulindo

This... is a hobby.

paulinhoinformatica

olá,sou novo aki no Fórum, Gostaria de uma ajuda, achei interessante o codigo do velocimetro, usei ele mas não consegui a leitura do sensor hall, como faço para definir a porta do sinal do sensor, muito obrigado.

luisilva

#17
Feb 22, 2015, 05:18 pm Last Edit: Feb 22, 2015, 05:21 pm by luisilva
O sensor é lido por interrupção, por isso deve ser ligado ao pino 0:
Code: [Select]
attachInterrupt(0, speedCalc, RISING);

patinhofeio

#18
Feb 23, 2015, 12:50 am Last Edit: Feb 23, 2015, 12:52 am by patinhofeio
O sensor é lido por interrupção, por isso deve ser ligado ao pino 0:
Code: [Select]
attachInterrupt(0, speedCalc, RISING);
Boas.
Permita discordar.
O sensor deve ser ligado no pino 2(em Arduino Uno): (#define PMS_PIN 2)

O código que fez quote (attachInterrupt(0, speedCalc, RISING);) refere a interrupção 0, a função a chamar, e em que tipo de actividade no pino, que é referente ao pino 2.
Podem ver AQUI o código das interrupções e a forma de as usar..

hugo007

Quote
Permita discordar.
O sensor deve ser ligado no pino 2(em Arduino Uno):
Está correcto
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

raidpro

#20
Jul 09, 2015, 12:57 am Last Edit: Jul 09, 2015, 01:15 am by raidpro
Ola!! Estou fazendo um velocímetro pra bike também, testei esse código mas logo após o boot do arduino  ele mostra 0 KM/H por 1 segundo, depois começa a mostrar valores que ficam mudando. Mesmo "jampeando" manualmente o pino 2 (attachinterrupt 0) para o +5 para simular o sensor o valor não muda.
Percebi que se não conecto nenhum fio ao pino 2 o LCD mostra 0 KM/H, mas so de chegar a mão perto do circuito ou colocar um fio no pin 2 os valores de km/h começam a ficar meio doidos, variando em torno de 30km/h. Parece ser algum tipo de interferência ou ruído.

 Alguma ideia do por que?

Valeu!!

[]'s


raidpro

Beleza, ja resolvi. O que tava faltando era um resistor pull down para o pino 2.

Muito bacana, obrigado pelo sketch.

Abs

bubulindo

E por acaso tens o código aqui para podermos ver?
This... is a hobby.

luisilva

Ajudava bastante uma boa apresentação do código. Já agora ma leitura nas regras do fórum também era útil.
Quando olho para o seu código fico sem vontade de perceber o que está isso a fazer, por isso vou deixar esse trabalho para outro membro.

Boa sorte!

paulinhoinformatica

Tudo Removido, Valeu pela ajuda, grande abraço a todos...

cabana

#25
Nov 19, 2017, 02:53 pm Last Edit: Nov 19, 2017, 03:17 pm by cabana
Boa tarde

gostaria de poder usar este código em um projeto que estou fazendo caso afirmativo poderia me ajudar a adaptar ele para utilizar usando um sensor de rotação onde este sensor ler quantos pulsos tem ma engrenagem da transmissão imaginando que teria 200 pulsos para completar uma circunferência completa ou seja 100 cm e transformando em km/h.

desde já agradeço.



bubulindo

E que pretendes que os outros utilizadores do fórum façam?

This... is a hobby.

maisdoiscorregos

#27
Jul 15, 2019, 06:09 pm Last Edit: Jul 15, 2019, 06:13 pm by maisdoiscorregos
sera que se usar micros() resolve ??? nâo entendi direito


Vamos lá, seu problema está na matemática da coisa. A função millis() retorna um long, que é um valor inteiro. Fazendo as contas, você vai ver que, quando a velocidade é 96 km/h, é porque se passaram 6 milissegundos entre as duas leituras (3600 * 0.16 / 6 = 96). A próxima velocidade seria quando a diferença entre as duas leituras fosse de 5 milissegundos, que daria 3600 * 0.16 / 5 = 115.2. Como a diferença nunca vai dar 5.5, por exemplo, você não vai conseguir ler as velocidades intermediárias.

A função micros() pode resolver, mas você teria 2 questões:
  • a cada 70 minutos o micros() é zerado. Isso não traria muito impacto, somente a cada 70 minutos um valor estranho iria aparecer, mas logo seria substituído;
  • o display iria mostrar valores mudando muito rapidamente, e pode ficar pouco legível, pois a cada pequena variação de velocidade, a velocidade mostrada seria diferente.



Pense no velocímetro digital de um carro. Ele se atualiza em uma frequência constante (1 vez por segundo, por exemplo), ao invés de ficar se atualizando a cada pequena variação de velocidade. O que ele faz é pegar uma velocidade média naquele intervalo de 1 segundo, e acho que assim o velocímetro fica mais legível. Vou modificar o seu código para você ver como seria esse velocímetro com valor "médio":

Code: [Select]

#include <LiquidCrystal.h>

// Atualiza a cada 1000 milissegundos. Modificar para o tempo que te agradar melhor
#define REFRESH_TIME 1000

LiquidCrystal lcd(8,9,4,5,6,7);
long lastRefresh;   // Para trabalhar com o millis(), use long, e não float.
float circMetric=0.16;
float speedk;
long loopCount;   // Contador de giros

void setup()
{
  attachInterrupt(0, speedCalc, RISING);

  lcd.begin(16,2);  
  lcd.clear();
  loopCount = 0;
  lastRefresh = millis();
  speedk = 0.0
}
void speedCalc()
{
  loopCount++;
}
void loop()
{
  
  if (millis() - lastRefresh >= REFRESH_TIME)
  {
    speedk = (3600*circMetric*loopCount)/(millis() - lastRefresh);
    loopCount = 0;
    lastRefresh = millis();
  }

  lcd.setCursor(5,0);
  lcd.print(int(speedk));
  lcd.print("  km/h ");
}


Testa esse código e o seu substituindo o millis() pelo micros(), e fazendo o ajuste no cálculo (speedk=(3600000*circMetric)/elapsed) e vê qual resultado te agrada mais. Depois posta se funcionou  ;).
Olá amigo, estou tentando modificar um código de exemplo do RealDash através de envio de dados por um protocolo que eles chamam de RealDash CAN, que é um painel de instrumentos de uso automotivo para android e outros SO, tentei usar esse seu código, mas não aparece nada no painel, só consegui colocando esse que está abaixo, ele é muito instável, muda o valor de velocidade muito rapidamente e sem muita precisão, se mudar o tempo de Delay de 200ms logo após a linha do comando {  sei();}
 ele muda a contagem, tipo se deixar 100ms ele apresenta 20km/h, se aumento pra 200ms ele mostra 40km/h, mas não posso aumentar muito esse tempo pois ele atrasa o envio de todos os dados, tipo a luz do pisca-seta, fica fora de sincronia com o real por causa do delay, ou se ascendo o farol alto, ele demora pra indicar no painel. Estou começando a assistir uma aulas em vídeo gratuitas do Centro Paula Souza sobre arduino, sou muito iniciante em programação, sou técnico em eletrônica, então meu forte não é programar arduino, fiz a shield para conectar no arduino e conectar no chicote original do meu carro, mas o programa está osso, rs. Se puder me dar uma luz no que eu estou errando e se tem uma estratégia melhor para esse velocimetro. Obrigado.

Code: [Select]

/**
 * ============================================================================
 *  Name        : RealDash_CAN.ino
 *  Part of     : RealDash
 *  Author      : Jani Immonen
 *  Created     : 15.10.2017
 *
 * Arduino example sketch of how to use RealDash CAN protocol.
 *
 * This example code is free for any use.
 *
 * www.realdash.net
 * ============================================================================
**/
unsigned int digitalPins = 0;
int analogPins[7] = {0};
unsigned int tanque = 0;
unsigned int tanque_mapeado = 0;
long rpmcount;
long velocidade;

void setup()
{
  attachInterrupt(digitalPinToInterrupt(20), rpm_fun, CHANGE);
  Serial1.begin(115200);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  delay (200);
}

void loop()
{
  rpm();
  rpm_fun();
  ReadDigitalStatuses();
  ReadAnalogStatuses();
  SendCANFramesToSerial();
}


void rpm()
{
  long count;
  cli();
  count = rpmcount;
  sei();
  delay (200);
  velocidade = int(rpmcount);
  rpmcount = 0;
}


void rpm_fun()
{
   rpmcount++;
}


void ReadDigitalStatuses()
{
  // read status of digital pins (1-13)
  digitalPins = 0;

  int bitposition = 0;
  for (int i=1; i<14; i++)
  {
    if (digitalRead(i) == LOW) digitalPins |= (1 << bitposition);
    bitposition++;
  }
}

void ReadAnalogStatuses()
{
  // read analog pins (0-7)
  tanque = analogRead (0);
  tanque_mapeado = map(tanque,14,96,1023,0);
  for (int i=0; i<7; i++)
  {
    analogPins[i] = analogRead(i);
  }
}

void SendCANFramesToSerial()
{
  byte buf[8];
  
  // build 2nd CAN frame, Arduino digital pins and 2 analog values
  memcpy(buf, &digitalPins, 2);
  memcpy(buf + 2, &tanque_mapeado, 2);
  memcpy(buf + 4, &velocidade, 2);
  memcpy(buf + 6, &analogPins[2], 2);

  // write 2nd CAN frame to serial
  SendCANFrameToSerial(3201, buf);

  // build 3rd CAN frame, rest of Arduino analog values
  memcpy(buf, &analogPins[3], 2);
  memcpy(buf + 2, &analogPins[4], 2);
  memcpy(buf + 4, &analogPins[5], 2);
  memcpy(buf + 6, &analogPins[6], 2);

  // write 3rd CAN frame to serial
  SendCANFrameToSerial(3202, buf);
}

void SendCANFrameToSerial(unsigned long canFrameId, const byte* frameData)
{
  // the 4 byte identifier at the beginning of each CAN frame
  // this is required for RealDash to 'catch-up' on ongoing stream of CAN frames
  const unsigned long serialBlockTag = 0x11223344;
  Serial1.write((const byte*)&serialBlockTag, 4);

  // the CAN frame id number
  Serial1.write((const byte*)&canFrameId, 4);

  // CAN frame payload
  Serial1.write(frameData, 8);
}

Go Up