O Hand Spinner basicamente, é um rolamento que está ligado a outros por uma estrutura só pra dar peso e ele fica girando.
É um brinquedo que ajuda a lidar com problemas de concentração e com o estresse e ele já existe tem cerca de 20 anos.
As pessoas acham relaxante olhar seu movimento giratório. Crianças e
adolescentes usam o aparelhinho para praticar “manobras” enquanto ele
está girando.
Deixa de bla-bla-bla e vamos ao experimento.
Primeiro como funciona o encoders? precisamos saber disso para idealizar um protótipo do medidor de velocidade.
O módulo possui 4 pinos, sendo dois de alimentação (3 à 5V e GND), uma saída digital (DO) e uma analógica (A0).
De um lado tem um led emissor e do outro receptor que tem a função de ficar captando o infravermelho e toda vez que é interrompido o feixe por algum objeto ou por uma roda encorder, aquela furadinha, ele cria uma marcação através da oscilação da voltagem.
Então temos que colocar alguma coisa no spinner, tipo um pedaço de plastico duro aquele de encadernação por exemplo, para passar no meio do sensor.
Só que nós resolvemos medir a velocidade desse brinquedo e você pode conferir no vídeo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/// Variables ////////////////////////////////////////////////////////////////////////////////////////////////////////////// int encoder_pin = 2; //Pin 2, donde se conecta el encoder unsigned int rpm = 0; // Revoluciones por minuto calculadas. float velocity = 0; //Velocidad en [Km/h] volatile byte pulses = 0; // Número de pulsos leidos por el Arduino en un segundo unsigned long timeold = 0; // Tiempo unsigned int pulsesperturn = 20; // Número de muescas que tiene el disco del encoder. const int wheel_diameter = 64; // Diámetro de la rueda pequeña[mm] static volatile unsigned long debounce = 0; // Tiempo del rebote. //// Configuración del Arduino ///////////////////////////////////////////////////////// void setup(){ Serial.begin(9600); // Configuración del puerto serie pinMode(encoder_pin, INPUT); // Configuración del pin nº2 attachInterrupt(0, counter, RISING); // Configuración de la interrupción 0, donde esta conectado. pulses = 0; rpm = 0; timeold = 0; Serial.print("Seconds "); Serial.print("RPM "); Serial.print("Pulses "); Serial.println("Velocity[Km/h]");} //// Programa principal /////////////////////////////////////////////////////////////////////// void loop(){ if (millis() - timeold >= 1000){ // Se actualiza cada segundo noInterrupts(); //Don't process interrupts during calculations // Desconectamos la interrupción para que no actué en esta parte del programa. rpm = (60 * 1000 / pulsesperturn )/ (millis() - timeold)* pulses; // Calculamos las revoluciones por minuto velocity = rpm * 3.1416 * wheel_diameter * 60 / 1000000; // Cálculo de la velocidad en [Km/h] timeold = millis(); // Almacenamos el tiempo actual. Serial.print(millis()/1000); Serial.print(" ");// Se envia al puerto serie el valor de tiempo, de las rpm y los pulsos. Serial.print(rpm,DEC); Serial.print(" "); Serial.print(pulses,DEC); Serial.print(" "); Serial.println(velocity,2); pulses = 0; // Inicializamos los pulsos. interrupts(); // Restart the interrupt processing // Reiniciamos la interrupción } } ////Fin de programa principal ////////////////////////////////////////////////////////////////////////////////// ///////////////////////////Función que cuenta los pulsos buenos /////////////////////////////////////////// void counter(){ if( digitalRead (encoder_pin) && (micros()-debounce > 500) && digitalRead (encoder_pin) ) { // Vuelve a comprobar que el encoder envia una señal buena y luego comprueba que el tiempo es superior a 1000 microsegundos y vuelve a comprobar que la señal es correcta. debounce = micros(); // Almacena el tiempo para comprobar que no contamos el rebote que hay en la señal. pulses++;} // Suma el pulso bueno que entra. else ; } |