Medidor de Velocidade Papel Alumínio

De Garoa Hacker Clube
(Redirecionado de Medidor de Velocidade)
Ir para navegação Ir para pesquisar

Circuito

Muito simples, apenas um Arduino, dois sensores que são lâminas de papel aluminio e um display LCD. Funcionamento: Com o GND do Arduino ligado a um dos trilhos é colocado 2 lâminas de papel alumínio em cima do trilho mas sem encostar, quando o trem passa ele faz o papel aluminio encostar no trilho e o Arduino começa a contar o tempo, quando a roda encosta na outra folha o Arduino então usa a distância colocada no código ( DIST_MM ) para calcular a velocidade do trem, tanto em cm/s real quanto o que seria equivalente em km/h considerando a escala 1:87

Componentes

  • Arduino Uno (ou semelhante)
  • Papel Alumínio
  • Display LCD
  • Potenciômetro (controle do LCD)

https://www.tinkercad.com/things/eed0i7NN28G-fantastic-bombul/editel?sharecode=9VOF30qxlMP9vHSS02JtBoU2ATyaAA2d22DF8d53F3w

Implementação

https://t.me/garoaclube/50718/53895 (20/06/2024 idéia primordial)

https://t.me/garoaclube/50718/56158 (12/09/2024 com displayLCD 20x4)

Resultados

Utiliza esse sensor foi possível fazer diversas medições de velocidade e aferir conforme a tensão qual velocidade o trem anda. Um fato curioso é que a velocidade demora a estabilizar, por exemplo com o teste a 9V a velocidade foi crescendo a cada volta começando em 75,05Km/h até estabilizar em 78,25Km/h depois de algumas voltas. Depois de colher aproximadamente 10 medições de velocidade (10 voltas completas) foi possível fazer regressão obtendo a equação:

Velocidade = 11,8*Volts + -26,6 com R^2 de 0,999 (vermelho)

Velocidade = -29,2 + 12,5*Volts + -0,0496Volts^2 com R^2 de 0,999 (verde)

Um teste rápido foi feito com uma meta de velocidade de 50Km/h para isso utilizando a equação da regressão linear o valor da fonte deveria ser de 6,49V. O teste foi um sucesso, com velocidade bem próxima da esperada.

Regressão Medidor de velocidade.png


Os dados brutos podem ser consultados no link abaixo: https://docs.google.com/spreadsheets/d/1IByOs3CQukwv-ikAh96F56S8vzPb0XLuwKb1vcBK8-I/edit?usp=sharing

Um fato curioso foi de que a locomotiva de ré anda mais devagar do que indo de fente (considerando de frente como no vídeo) e também a sujeira nos trilhos e também na roda altera bastante a velocidade.

TODO

  • colocar um display para exibir a velocidade.
  • melhorar o código com uma função para fazer o Seria.print
  • exibir o tempo obtido?
  • deixar configurável a distância sem precisar subir de novo o programa no Arduino.

Código


#include <LiquidCrystal.h>

#define SENSOR_1    7  // Pino do sensor 1
#define SENSOR_2    8  // Pino do sensor 2
#define LED_STATUS   13  // Pino do LED de leitura

const float DIST_MM = 74; // Distância em mm

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned long startTime = 0; // Tempo em microssegundos
unsigned long elapsedTime = 0; // Tempo decorrido em microssegundos
float speed_mm_per_us = 0; // Velocidade em mm/µs
float speed_kmh = 0; // Velocidade em km/h

void setup() {
  lcd.begin(16, 2); // Inicializa o LCD com 16 colunas e 2 linhas
  pinMode(SENSOR_1, INPUT_PULLUP);
  pinMode(SENSOR_2, INPUT_PULLUP);
  pinMode(LED_STATUS, OUTPUT);
  
  lcd.print("hello world!");
  delay(500);
  lcd.clear();
  lcd.print("Vel(cm/s) Maquete");
  lcd.setCursor(0, 1);
  lcd.print("Vel(Km/h): Real");
  delay(2000);
  lcd.clear();
  lcd.print("Esperando");
}

void loop() {
  if (!digitalRead(SENSOR_1)) {
    startTime = micros();
    lcd.clear();
    lcd.print("Fazendo leitura");
    digitalWrite(LED_STATUS, HIGH);
    
    while (digitalRead(SENSOR_2)) {
      // Espera até o SENSOR_2 ser acionado
    }
    
    elapsedTime = micros() - startTime;
    calculateSpeed();
    displaySpeed();
    delay(5000);
    lcd.clear();
    lcd.print("Esperando");
    digitalWrite(LED_STATUS, LOW);
  }
  if (!digitalRead(SENSOR_2)) {
    startTime = micros();
    lcd.clear();
    lcd.print("Fazendo leitura");
    digitalWrite(LED_STATUS, HIGH);
    
    while (digitalRead(SENSOR_1)) {
      // Espera até o SENSOR_2 ser acionado
    }
    
    elapsedTime = micros() - startTime;
    calculateSpeed();
    displaySpeed();
    delay(5000);
    lcd.clear();
    lcd.print("Esperando");
    digitalWrite(LED_STATUS, LOW);
  }
}

void calculateSpeed() {
  // Calcula a velocidade em mm/µs e km/h
  speed_mm_per_us = DIST_MM / elapsedTime;
  speed_kmh = speed_mm_per_us * 3600 * 87; // 87 é o fator de escala
}

void displaySpeed() {
  lcd.clear();
  lcd.print("Vel(cm/s): ");
  lcd.print(speed_mm_per_us * 1e5); // Convertendo para cm/s
  lcd.setCursor(0, 1);
  lcd.print("Vel(Km/h): ");
  lcd.print(speed_kmh); // Velocidade em km/h
}