Mudanças entre as edições de "Medidor de Velocidade"

De Garoa Hacker Clube
Ir para navegação Ir para pesquisar
 
(12 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
 
== Circuito ==
 
== Circuito ==
Bem simples, apenas um Arduino com o GND ligado a um dos trilhos e deois sensores que são lâminas de papel aluminio por cima deste trilho, quando o trem passa ele fecha contato e detecta que o momento, quando passa pelo segundo o Arduino calcula a velocidade e manda via serial.
+
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
   
== TODO ==
+
=== Componentes ===
  +
* Arduino Uno (ou semelhante)
* colocar um display para exibir a velocidade
 
  +
* Papel Alumínio
* melhorar o código com uma função para fazer o Seria.print
 
  +
* Display LCD
  +
* Potenciômetro (controle do LCD)
   
  +
https://www.tinkercad.com/things/eed0i7NN28G-fantastic-bombul/editel?sharecode=9VOF30qxlMP9vHSS02JtBoU2ATyaAA2d22DF8d53F3w
== Código==
 
  +
==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)
<pre>
 
unsigned long Time = 0;
 
unsigned long delta_time = 0;
 
   
  +
== Resultados ==
#define sensor_1 22 // Pino do sensor
 
  +
Utiliza esse sensor foi possível fazer diversas medições de velocidade e aferir conforme a tensão qual velocidade o trem anda.
#define sensor_2 53 // Pino do sensor
 
  +
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.
#define Esperando 13 // Pino do LED de leitura
 
  +
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)
float dist = 74; // Distância entre os sensores em mm
 
/*
 
   
  +
Velocidade = -29,2 + 12,5*Volts + -0,0496Volts^2 com R^2 de 0,999 (verde)
Escala H0 1:87
 
   
  +
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.
Velocidade = Espaço / Tempo
 
  +
O teste foi um sucesso, com velocidade bem próxima da esperada.
v = dist [mm] / Time [micro_sec]
 
v = dist/Time*3600 [km/h]
 
v = dist/Time*3600*87[km/h em escala real]
 
   
  +
[[Arquivo:Regressão_Medidor_de_velocidade.png|1000px]]
   
   
  +
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 ==
  +
* <s>colocar um display para exibir a velocidade. </s>
  +
* <s>melhorar o código com uma função para fazer o Seria.print </s>
  +
* exibir o tempo obtido?
  +
* deixar configurável a distância sem precisar subir de novo o programa no Arduino.
  +
  +
== Código==
  +
<pre>
  +
  +
#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() {
 
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(SENSOR_1, INPUT_PULLUP);
pinMode(Esperando, OUTPUT);
+
pinMode(SENSOR_2, INPUT_PULLUP);
  +
pinMode(LED_STATUS, OUTPUT);
Serial.begin(9600);
 
  +
digitalWrite(Esperando,LOW);
 
  +
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() {
 
void loop() {
if (!digitalRead(sensor_1)) {
+
if (!digitalRead(SENSOR_1)) {
Time = micros();
+
startTime = micros();
  +
lcd.clear();
while (digitalRead(sensor_2)) {
 
  +
lcd.print("Fazendo leitura");
digitalWrite(Esperando,HIGH);
 
  +
digitalWrite(LED_STATUS, HIGH);
  +
  +
while (digitalRead(SENSOR_2)) {
  +
// Espera até o SENSOR_2 ser acionado
 
}
 
}
  +
digitalWrite(Esperando,LOW);
 
delta_time = micros() - Time;
+
elapsedTime = micros() - startTime;
Serial.println(delta_time);
+
calculateSpeed();
  +
displaySpeed();
Serial.println(115*313.2/delta_time/1000);
 
Serial.println();
 
 
delay(5000);
 
delay(5000);
  +
lcd.clear();
  +
lcd.print("Esperando");
  +
digitalWrite(LED_STATUS, LOW);
 
}
 
}
if (!digitalRead(sensor_2)) {
+
if (!digitalRead(SENSOR_2)) {
Time = micros();
+
startTime = micros();
  +
lcd.clear();
while (digitalRead(sensor_1)) {
 
  +
lcd.print("Fazendo leitura");
digitalWrite(Esperando,HIGH);
 
  +
digitalWrite(LED_STATUS, HIGH);
  +
  +
while (digitalRead(SENSOR_1)) {
  +
// Espera até o SENSOR_2 ser acionado
 
}
 
}
  +
digitalWrite(Esperando,LOW);
 
delta_time = micros() - Time;
+
elapsedTime = micros() - startTime;
Serial.print("Time: ");
+
calculateSpeed();
Serial.println(Time);
+
displaySpeed();
Serial.print("Delta: ");
 
Serial.println(delta_time);
 
Serial.print("Velocidade: ");
 
Serial.print(dist/delta_time);
 
Serial.println("mm/us");
 
Serial.print("Velocidade: ");
 
Serial.print(dist*3600*87/delta_time);
 
Serial.println("Km/h");
 
Serial.println();
 
 
delay(5000);
 
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
  +
}
  +
 
</pre>
 
</pre>
  +
  +
  +
[[Categoria:Projetos]][[Category:Ferromodelismo]][[Category:EFG]]

Edição atual tal como às 19h00min de 14 de setembro de 2024

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
}