Mudanças entre as edições de "Medidor de Velocidade Papel Alumínio"
(→Código) |
m (Gabriel Almeida moveu Medidor de Velocidade para Medidor de Velocidade Papel Alumínio: Deixar o nome mais específico) |
||
(17 revisões intermediárias por 2 usuários não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
== Circuito == |
== 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) |
||
− | * 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== |
||
− | <code> |
||
+ | https://t.me/garoaclube/50718/53895 (20/06/2024 idéia primordial) |
||
+ | https://t.me/garoaclube/50718/56158 (12/09/2024 com displayLCD 20x4) |
||
− | 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( |
+ | pinMode(SENSOR_1, INPUT_PULLUP); |
− | pinMode( |
+ | 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( |
+ | if (!digitalRead(SENSOR_1)) { |
− | + | 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); |
||
− | + | elapsedTime = micros() - startTime; |
|
− | + | 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( |
+ | if (!digitalRead(SENSOR_2)) { |
− | + | 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); |
||
− | + | elapsedTime = micros() - startTime; |
|
− | + | calculateSpeed(); |
|
− | + | 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> |
||
+ | [[Categoria:Projetos]][[Category:Ferromodelismo]][[Category:EFG]] |
||
− | </code> |
||
+ | [[Category:Medidores de velocidade H0]] |
Edição atual tal como às 12h11min de 2 de outubro 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)
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 }