Medidor de Velocidade Papel Alumínio
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)
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.
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
}