Menú Cerrar

TBO. Transporte en Bicicleta Observable.

Con el patrocinio de PCBWay – PCB Prototype the Easy Way

🇬🇧 Read this post is in english at hackaday.

El TBO es el gadget que te permite ser más visible durante tus desplazamientos en bicicleta o scooter. Incrementa tu seguridad con luz de freno e intermitentes y se ve muy bien. Muchas veces me han preguntado por él mientras estaba parado en un semáforo:
– ¿Se activa al frenar?
– ¿Dónde lo has comprado?

¿Cómo funciona?

Tienes un Manual de Instrucciones completo.

Iluminación Normal, Frenado e Intermitentes

En la mochila, fijamos el TBO. Si es una mochila con sistema MOLLE, se puede fijar con 4 accesorios:

Fijación con sistema Molle

Si no, se puede usar la cinta incluida pasándola por los 4 anclajes.

Intermitentes

Mando en su posición de uso
Soporte para el mando

En el manillar está el mando cómodamente accesible mientras conducimos. Los 2 botones de la derecha A y B activan el intermitente de la derecha. C y D el izquierdo.

La intermitencia se mantendrá durante 3 segundos desde que soltemos el botón. 3 ciclos de 0,5 s, encendido, 0,5 s apagado. Si mantenemos un botón pulsado, la intermitencia se mantendra indefinidamente. Si mientras está parpadeando en un lado, pulsamos el otro lado, el cambio es instantáneo.

Luz de freno

Mediante un acelerómetro, detecta cuando frenamos y cambia la luz de señalización, normalmente azul, a rojo durante 0,4 s

Hardware

Adafruit Circuit Playground Express

Circuit PlayGround Express. Foto de adafruit.com

Todo gira alrededor de la adafruit Circuit Playground Express (CPX en adelante). Está basada en una microcontroladora ATSAMD21 ARM Cortex M0, de 3.3V y 48MHz e incorpora 10 Neopixeles y estos sensores:

Sensores. Imagen de adafruit.com
  • Acelerómetro de 3 ejes LIS3DH con detección de caída libre y toque. En el TBO lo usamos para detectar el frenado.
  • Termistor para medir la temperatura.
  • Fototransistor para medir la luz.
  • Micrófono MEMS
  • Mini altavoz de 7,5 mm con amplificador de clase D.

También dispone de 2 pulsadores, 1 botón de reset y un interruptor de 2 posiciones.

Alimentación

Alimentación mediante Power Bank

La CPX se alimenta a través de un Cable USB micro que debe conectarse a un Power bank en el interior de la mochila. El interruptor de encendido/apagado interrumpe el cable de 5V. Puedes conectar el cable a un ordenador y reprogramar el TBO. ¡Sólo recuerda encender el interruptor!

Interruptor

PCB

Con el patrocinio de PCBWay – PCB Prototype the Easy Way

Puedes descargar los archivos del diseño en Formato KICAD. (Dale a guardar como…)

PCB Frontal
PCB trasera

Los tornillos de fijación de la CPX sirven de conexión con la PCB que está al otro lado.

CPX en su alojamiento
Esquema

Sirve de soporte de los conectores e interface con la CPX. Además contiene:

  • Resistencia de entrada de datos a los neopixeles.
  • Condensador buffer para los bruscos cambios de la corriente absorbida por la tira de neopixeles.
  • 2 cambiadores de nivel de tensión 74AHCT125. Uno es alimentado a 5V, recibe la señal de la CPX y la transmite a los neopixeles. El otro es alimentado a 3V3 por la CPX, recibe las 4 señales del receptor de radio a 5V y las transmite a la CPX, a sus 3V3. No, no se perfora porque las señales sean mayores que la alimentación. ¡Es el quid de este chip!
  • led azul que muestra el valor del pin VT del receptor de radio. Se encenderá si se recibe pulsación de cualquiera de los botones.
PCB

Receptor de Radio

Receptor 315MHz IC PT2272M4
Receptor 315MHz IC PT2272M4
Emisor
Emisor

Es un receptor de radio de 315 MHz. Funciona a 5V. Es del tipo momentáneo con un pin para cada uno de los botones. Está basado en el PT2272.

Neopixeles

Neopixeles

4 tiras de 17 neopixeles (leds direccionables basados en el WS2812) como lados de un cuadrado que formará las flechas de los intermitentes.

He aplicado gel de acabado de uñas para protegerlos de la humedad y la corrosión.

Piezas impresas en 3D

PIezas impresas en 3D

Todo está alojado en piezas fabricadas en 3D fijadas con tornillos. La CPX se protege de la lluvia con una tapa de metacrilato y juntas de goma.

FF Imagenes freecad

Aquí tienes los diseños en formatos freeCAD y .stl

Software

circuitPython

Desarrollado en Circuitpython, la implementación de micropython de adafruit. Conectando el TBO a un ordenador, aparece como una unidad extraíble. En ella se encuentra una carpeta ‘lib’ con las librerías necesarias. Y un archivo ‘code.py’ (Dale a guardar como…) que contiene el programa. Para editarlo puede usarse el software ‘mu’.

Máquina de estados

La arquitectura del software es una máquina de estados definidos por la variable mST con el esquema:

while RUN:
    while mST == 0:
  • 0: Es el estado por defecto. Neopixeles azules. Esperamos una pulsación de botón o la señal de luz de freno.
  • 10: Es la inicialización del Intermitente a la derecha. Cogemos tiempo de inicio y ponemos la cuenta de parpadeos a 1. Pasa a 11.
  • 11: Es el Intermitente a la derecha.
  • 20 y 21: Inicialización e Intermitente a la izquierda.
  • 3: La luz de freno se ha activado. Esperamos que pase el tiempo de encendido y apagamos.

Intermitentes

Los intermitentes están temporizados con una duración total de ‘time_minimum = 3 s’. El número de intermitencias por segundo se define en ‘bps = 2’ (beats per second)

    while mST == 10:
        begin_time = time.monotonic()
        end_time = begin_time + time_minimum
        blink_number0 = 1
        mST = 11
    while mST == 11:
        now = time.monotonic()
        time_elapsed = now - begin_time
        time_remaining = end_time - now
        blink_number = int(time_elapsed / beat_time) % 2
        if blink_number != blink_number0:
            blink_number0 = blink_number
            if blink_number:
                apaga()
            else:
                dch()
                cp.play_tone(tone_int_freq, tone_int_dur)
        if boton_pulsado():
            if boton_B.value or boton_D.value:
                mST = 20
            if boton_A.value or boton_C.value:
                end_time = now + time_minimum
        if time_remaining < 0:
            apaga()
            mST = 0
        time.sleep(0.1)

Del acelerómetro a la luz de freno

Podemos acceder a los datos del acelerómetro de 3 ejes con sólo:

x, y, z = cp.acceleration
    acceleration = z

Aunque la CPX no estará en posición perfectamente vertical (lo llevamos en la espalda), el eje Z es el que mayor componente de frenado representará. Por eso sólo usaremos ese eje.

Para convertir los ruidosos datos brutos del acelerómetro en una señal para activar la luz de freno, vamos a seguir el planteamiento que Eva Herrada comparte en su tutorial: «Circuit Playground Bluefruit Automatic Bike Brake Light«.

En lugar de usar una listas para calcular las medias móviles, utilizaremos 2 filtros kalman. Uno más rápido que el otro:

k_alman_fast = 0.3
k_alman_slow = 0.1
[...]
acc_fast = k_alman_fast * acceleration + (1 - k_alman_fast) * acc_fast
acc_slow= k_alman_slow * acceleration + (1 - k_alman_slow) * acc_slow
shakiness =  acc_slow – acc_fast

Además de que shakiness sea mayor que 0.8, requeriremos que esto se haya producido 3 veces consecutivas y que la señal “shake” del acelerómetro no esté activada:

        if shakiness  > 0.8:
            if consecutive_triggers > 3:
                if not cp.shake(shake_threshold=10):
                    start_brake = time.monotonic()
                    mST = 3
                    rojo()
                    cp.start_tone(800)
            consecutive_triggers += 1

He probado con distintos valores de shakiness:

  • Con shakiness > 2, había que frenar muy fuerte para que se activara la luz.
  • Con shakiness > 0.5, la luz de freno se activaba al pasar baches de la calzada. Se activaba demasiado pronto.
  • El valor de corte 0.8 funciona bastante bien con las constantes del filtro kalman a 0.3 y 0.1.

Artículos relacionados

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de privacidad, pinche el enlace para mayor información. ACEPTAR

Aviso de cookies