Velocímetro para bicicleta

¿Quieres ponerle un velocímetro a tu bicicleta? Aquí te presento el diseño de uno que es capaz de medir velocidades de hasta 60 km/h en una bici rodada 26. Algunos de los materiales que necesitarás son: un PIC16F1938, un LCD para dos dígitos de 7 segmentos, un cristal de cuarzo de 32.768 kHz, 2 condensadores, 2 resistencias, un led infrarrojo y un fototransistor. Puedes ver el diagrama del circuito, que incluye más detalles de las piezas, en la figura 1.

Diagrama eléctrico de un velocímetro para bicicleta.
Figura 1. Diagrama eléctrico de un velocímetro para bicicleta. Puedes reemplazar el EDS812 (que yo usé para las pruebas) por el LCD-S2X1C50TR, el FE0203W-DU, el LCD-A2X1C50TR o algún otro. Aunque el reemplazo NO será directo, tampoco será muy difícil, bastará con identificar cuál terminal se conecta a cada segmento y cambiar la conexión.

Como la extensión del archivo permite ver, escribí VelBici.c en lenguaje C. El código es:

#include <xc.h>
// Inicia usando el oscilador interno a 500 kHz.
#pragma config FOSC=INTOSC
// Evita que el watchdog reinicie el uC.
#pragma config WDTE=OFF    
// Inicia hasta que el oscilador esté estable.
#pragma config PWRTE=ON
// No se permite la programación a bajo voltaje.
#pragma config LVP=OFF
// Se desactiva el reset.
#pragma config MCLRE=OFF

// Valores precalculados de las unidades.
__EEPROM_DATA(1, 2, 3, 4, 5, 6, 7, 7);
__EEPROM_DATA(8, 9, 0, 1, 2, 3, 4, 5);
__EEPROM_DATA(6, 7, 8, 9, 0, 1, 1, 2);
__EEPROM_DATA(3, 4, 5, 6, 7, 8, 9, 0);
__EEPROM_DATA(1, 2, 3, 4, 5, 5, 6, 7);
__EEPROM_DATA(8, 9, 0, 1, 2, 3, 4, 5);
__EEPROM_DATA(6, 7, 8, 9, 9, 0, 1, 2);
__EEPROM_DATA(3, 4, 5, 6, 7, 8, 9, 0);
// Valores precalculados de las decenas.
__EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0);
__EEPROM_DATA(0, 0, 1, 1, 1, 1, 1, 1);
__EEPROM_DATA(1, 1, 1, 1, 2, 2, 2, 2);
__EEPROM_DATA(2, 2, 2, 2, 2, 2, 2, 3);
__EEPROM_DATA(3, 3, 3, 3, 3, 3, 3, 3);
__EEPROM_DATA(3, 3, 4, 4, 4, 4, 4, 4);
__EEPROM_DATA(4, 4, 4, 4, 4, 5, 5, 5);
__EEPROM_DATA(5, 5, 5, 5, 5, 5, 5, 6);

void main(void)
{
 unsigned char vel=0, unidades=0, decenas=0;
 
 // Habilita el oscilador del temporizador 1 y lo usa como base de tiempo.
 T1CONbits.T1OSCEN=1;
 T1CONbits.TMR1CS0=1; // FOSC=32768 Hz.
 // Activa el temporizador 1.
 T1CONbits.TMR1ON=1;
 // El núcleo también usará el oscilador del temporizador 1.
 OSCCONbits.SCS0=1;
 // Terminal 4 del puerto A para uso digital.
 ANSELAbits.ANSA4=0;
 // Limpia el temporizador 0.
 INTCONbits.TMR0IF=0;
 TMR0=0;
 
 // Asignación de terminales compartidas al manejador
 // de dispositivos de cristal líquido.
 LCDSE0=0xEF;
 LCDSE1=0xF7;
 // Todos los segmentos apagados.
 LCDDATA0=0;
 LCDDATA1=0;
 // Modo estático, factor de escala para f de 1:5.
 LCDPS=0x04;
 // Usar la tensión de referencia interna.
 LCDREF=0x80;
 // Máximo contraste.
 LCDCST=0;
 // Modos A y B a corriente mínima.
 LCDRL=0x50;
 // Activa el módulo para trabajar en modo estático
 // y usar el oscilador interno de 31 kHz.
 LCDCON=0x88;
 while(1)
 {
  // La condición es verdadera cada segundo.
  if (PIR1bits.TMR1IF==1)
  {
   // Prepara al temporizador 1 para medir otro intervalo de 1 s.   
   TMR1H=0x80;
   PIR1bits.TMR1IF=0;
   // Lee el número de pulsos que contó el temporizador 0.
   vel=TMR0;
   TMR0=0;
   INTCONbits.TMR0IF=0;
   if (vel==0) // Cuando NO se cuentan pulsos, se asigna 0 km/h.
   {
    unidades=0;
    decenas=0;
   }
   else
   {
    // Cuando el número de pulsos está dentro de lo esperado, se lee la tabla.   
    if (vel<65)
    {
     vel--;
     unidades=EEPROM_READ(vel);
     decenas=EEPROM_READ(vel+64);
    }
    // De lo contrario, se indica error obligando a que las sentencias 
    // siguientes entren el el caso por default.
    else
    {
     unidades=10;
     decenas=10;
    }
   }
   // Ordena que se desplieguen los valores de velocidad obtenidos.
   LCDDATA0=0;
   LCDDATA1=0;
   switch (unidades)
   {
    case 0: LCDDATA0=0b11100000;
            LCDDATA1=0b10110000;
            break;
    case 1: LCDDATA0=0b10000000;
            LCDDATA1=0b10000000;
            break;
    case 2: LCDDATA0=0b11100000;
            LCDDATA1=0b01010000;
            break;
    case 3: LCDDATA0=0b11000000;
            LCDDATA1=0b11010000;
            break;
    case 4: LCDDATA0=0b10000000;
            LCDDATA1=0b11100000;
            break;
    case 5: LCDDATA0=0b01000000;
            LCDDATA1=0b11110000;
            break;
    case 6: LCDDATA0=0b01100000;
            LCDDATA1=0b11111000;
            break;
    case 7: LCDDATA0=0b10000000;
            LCDDATA1=0b10010000;
            break;
    case 8: LCDDATA0=0b11100000;
            LCDDATA1=0b11110000;
            break;
    case 9: LCDDATA0=0b11000000;
            LCDDATA1=0b11110000;
            break;
    default:LCDDATA0=0b01100000;
            LCDDATA1=0b01110000;
   }
   switch (decenas)
   {
    case 0: LCDDATA0=LCDDATA0|0b00001111;
            LCDDATA1=LCDDATA1|0b00000011;
            break;
    case 1: LCDDATA0=LCDDATA0|0b00000101;
            break;
    case 2: LCDDATA0=LCDDATA0|0b00001011;
            LCDDATA1=LCDDATA1|0b00000101;
            break;
    case 3: LCDDATA0=LCDDATA0|0b00000111;
            LCDDATA1=LCDDATA1|0b00000101;
            break;
    case 4: LCDDATA0=LCDDATA0|0b00000101;
            LCDDATA1=LCDDATA1|0b00000110;
            break;
    case 5: LCDDATA0=LCDDATA0|0b00000110;
            LCDDATA1=LCDDATA1|0b00000111;
            break;
    case 6: LCDDATA0=LCDDATA0|0b00001110;
            LCDDATA1=LCDDATA1|0b00000111;
            break;
    case 7: LCDDATA0=LCDDATA0|0b00000101;
            LCDDATA1=LCDDATA1|0b00000001;
            break;
    case 8: LCDDATA0=LCDDATA0|0b00001111;
            LCDDATA1=LCDDATA1|0b00000111;
            break;
    case 9: LCDDATA0=LCDDATA0|0b00000111;
            LCDDATA1=LCDDATA1|0b00000111;
            break;
    default:LCDDATA0=LCDDATA0|0b00001010;
            LCDDATA1=LCDDATA1|0b00000111;
   }
  }
 }
}

Modificaciones que tendrás que hacerle a tu bicicleta:

  • Colocar dos soportes, uno en el manubrio para el cuerpo del velocímetro; otro en la tijera para el sensor (led infrarrojo, fototransistor y un par de resistencias).
  • Será necesario que le pintes 8 franjas negras o blancas al rin delantero. Ya que la idea es formar una secuencia de ceros y unos, si el rin es obscuro colocarás marcas blancas, y si es cromado colocarás marcas negras. Si primero quieres hacer algo que altere menos tu bici, puedes colocar cinta de aislar o making tape.
  • Ten cuidado de NO colocar las marcas en la región que se usa para frenar.
  • Procura hacer regiones negras y blancas del mismo tamaño y que ocupen el perímetro completo, figura 2.
Distribución de franjas obscuras y claras que leerá el sensor del velocímetro.
Figura 2. Distribución de franjas obscuras y claras que leerá el sensor del velocímetro. En este caso sólo coloqué provisionalmente cinta de aislar para indicar la posición y proporción de las marcas. Observa que dejé libre la sección del rin donde ejercen presión los frenos. Observa también que podrías colocar 8 reflectores en los rayos (en la foto sólo hay uno).

Las ligas siguientes te llevarán a las especificaciones de los componentes principales:

¿Cómo funciona?

Evidentemente existe una relación entre la velocidad a la que giran las ruedas y la velocidad a la que se desplaza la bicicleta. Medir la velocidad de giro de las ruedas es, simplemente, contar cuantas vueltas dan durante algún tiempo; podríamos obtener dicha velocidad en revoluciones por minuto o vueltas por segundo. Ya que se suele expresar la velocidad de los vehículos en km/h tendremos que aplicar algunos factores de conversión.

Por otro lado, para una bici que usa llantas de 26 pulgadas de diámetro, un giro completo implica avanzar aproximadamente 2.07 m. Para no tener que esperar a que la rueda de una vuelta completa para obtener una lectura en el sensor, colocaremos 8 marcas, así bastará que la bici avance unos 0.26 m para que el sensor indique movimiento.

Para poder actualizar la velocidad cada segundo los factores de conversión son:

vel\left ( km / h \right ) = vel\left ( pulsos/s \right )\cdot\frac{1 vuelta}{8 pulsos}\cdot\frac{\pi\cdot26

Así las tareas del PIC son:

  • Contar pulsos de un oscilador de 32768 Hz para determinar que ha transcurrido un segundo. Tarea que asigné al temporizador 1.
  • Contar, cada segundo, los pulsos que produce el fototransistor cuando pasan frente a él las franjas claras y obscuras que hicimos en el rin. Tarea asignada al temporizador 0.
  • Usar la cuenta del temporizador, que es la velocidad en pulsos por segundo cuando hay ocho marcas en la rueda, como el índice de una tabla que almacena las velocidades en km/h.
  • Enviar las constantes apropiadas al manejador LCD para que el EDS812 despliegue la velocidad de la bici.

¿Cómo ajustar el par emisor detector?

La tarea del sensor es detectar que la rueda delantera gira; entregará 8 pulsos por vuelta. El led infrarrojo emitirá una luz que será reflejada en el rin, y captada por el fototransistor. Se recibirá más luz cuando frente al par emisor-detector esté una franja clara, y menos cuando esté presente una franja obscura. Así se formará un tren de unos y ceros con una frecuencia proporcional a la velocidad de la bici.

Los valores de R1 y R2 dependerán del acomodo que logres entre el led, el rin y el fototransistor; así como de la cantidad de luz que reflejen las franjas. Puedes iniciar con R1 de 470 Ω y para R2 un potenciómetro o resistencia variable de 10 kΩ; después considera que:

  • A menor valor de R1 el led emitirá más luz, el circuito consumirá más energía y las baterías durarán menos.
  • La corriente constante máxima que soporta el IR333C es de 100 mA. Cuando el led está encendido, se observará una diferencia de potencial entre sus terminales de aproximadamente 1.2 V.
  • La corriente que pasa a través del fototransistor es proporcional a la luz que recibe. Así cuando el sensor esté frente a una franja blanca deberás obtener en la terminal T0CKI un voltaje cercano a VDD. Mientras que cuando esté frente a una franja negra, deberás obtener un voltaje cercano a GND.
  • Para una determinada corriente circulando por el fototransistor, obtendrás una tensión mayor en T0CKI mientras mayor sea el valor de R2 (ley de Ohm).

Si requieres información más detallada para determinar el valor de R1 y R2, o para reemplazar el led o el fototransistor, puedes consultar Microcontroladores PIC16, fundamentos y aplicaciones, página 139.

Alternativas para reemplazar componentes:

Sensor: El sensor que usé es un fototransistor, pero su uso implica usar también un led. Dicho led, es el elemento que consume más energía del diseño, por lo que tal vez quieras reemplazarlo. Considera el uso de imanes permanentes como marcas y un sensor de efecto Hall como detector.

Baterías: El equipo está pensado para 4 pilas recargables de 1.2 V. Considera que las de tamaño AA durarán más que las AAA.

Ojalá que te animes a implementar el diseño y a contarnos cómo te fue.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *