Todos los microprocesadores tienen unas entradas/salidas para la comunicación serie: son los puertos serie por hardware. Pero en podemos emular por software hasta 2 puertos serie: es el denominado SoftSerial en Betaflight. Este nuevo puerto puede servirnos si nos quedamos cortos con los primeros, o si, por ejemplo, necesitamos conectar un receptor con telemetría SmartPort.

Las controladoras de vuelo suelen tener varios UART para dicho propósito, ya que es muy habitual conectarles dispositivos de comunicación serie, como el RX de la radio o el GPS, por poner dos ejemplos muy conocidos.

Pero a veces el número de UART no es suficiente. O el puerto serie no puede leer una señal invertida (con voltajes cambiados para 0 y 1, como la comunicación Smartport de la telemetría de FrSky). En esos casos necesitamos emular un puerto serie por software. A eso se le llama  SoftSerial en Betaflight.

En este artículo vamos a crear un puerto serie adicional en una pequeña controladora de vuelo que nos servirá de ejemplo, la del Eachine Tyro79. Una vez creado le vamos a asignar la función de telemetría de las radios FrSky o SmartPort.

Crear un SoftSerial en la controladora de vuelo F4 de un Eachine Tyro79

Puertos serie controladora de vuelo

Puertos serie controladora de vuelo

El microprocesador de nuestra controladora de vuelo tiene una serie de salidas que pueden estar conectadas a un «pad» de la placa, para facilitar su localización y uso. No todas las salidas del micro están conectadas a un pad, y para utilizarlas implicaría soldar directamente en la patilla del micro, algo no aconsejable por lo reducidísimo del espacio. Además, si el fabricante no la ha sacado, quizá sea por algún motivo.

Estas salidas del microcontrolador nos sirven para conectar periféricos e interaccionar con ellos. Y ahí estarían las entradas/salidas de cada puerto UART de nuestra controladora de vuelo (RX1/TX1, RX2/TX2,…). Estos serían los puertos físicos (reales) de la comunicación serie.

El que estas salidas estén sacadas a un pad de la placa y no tengan nada soldado, no significan que no estén en uso, ya que pueden tener algo conectado por otro lado. Por ejemplo normalmente el UART1 está usado por el puerto USB de la placa. Enseguida veremos como saberlo.

Un determinado puerto serie de un chip puede estar usado por varios dispositivos en paralelo incluso sin tener nada soldado en su pad correspondiente. Consultar documentación de la FC.

Por otro lado, en determinadas ocasiones, un mismo puerto puede estar usado por varios dispositivos a la vez si su uso es compatible.

Listar las salidas del microprocesador y ver su conexión a dispositivos

Pasemos a la acción ya. Podemos ver un listado de puertos y a lo que están conectados en la consola CLI de nuestra controladora de vuelo:

Conexión puertos serie y resto de dispositivos en una controladora de vuelo

Conexión puertos serie y resto de dispositivos en una controladora de vuelo

La salida sigue el siguiente formato:

resource [Function] [Index] [Port]

En el listado podemos ver que esta controladora tiene salidas para  el motor 5 y 6, que nunca se utilizarán. Los pads deberían estar etiquetados en la placa con los textos B03 y B10, aunque para saberlo con exactitud hay que consultar la documentación técnica de la controladora.

Por otro lado vemos que hay dos UART, cada una con sus correspondientes salidas TX/RX. No vendrán etiquetadas por los textos A09, A02,A10 y A03 sino por los comúnmente aceptados RX1/TX1/RX2/TX2. Dos puertos serie son muy pocos y quedan completos con dos dispositivos muy comunes: el receptor de radio y el Smartaudio del VTX.

En la imagen superior tenemos el pinout de la controladora de vuelo de un Eachine Tyro79. Es una controladora al estilo Eachine: cero documentación. Nos vendrá bien de ejemplo para crear un puerto serie adicional.

Identificar los pads libres

En la imagen he marcado en amarillo los puertos para la UART1 y UART2, ocupados respectivamente por SmartAudio y receptor de radio. Hay 4 pads adicionales etiquetados como S5, S6, RSSI y CRT. Los dos últimos no sé identificarlos, pero S5 y S6 he logrado averiguar que se corresponden a las salidas de microprocesador B03 y B10, correspondientes a los motores 4 y 5. Dos candidatos ideales al Soft Serial una vez liberados.

Habilitar el SoftSerial en Betaflight

Habilitar SoftSerial y telemtría Smartport en Betaflight

Habilitar SoftSerial y telemtría Smartport en Betaflight

Habilito en configuración el SOFTSERIAL, también la opción TELEMETRY (SmartPort) que, en este caso, es precisamente los que voy a conectar al nuevo puerto serie. Que es lo mismo que:

feature SOFTSERIAL 
feature TELEMETRY 
save

Asignar el Soft Serial a una salida

resource MOTOR 5 none 
resource serial_tx 11 B03 
save

Primero liberamos la salida asignada al quinto motor. Luego asignamos el SoftSerial 1 a la salida que ocupaba el motor 5. Serial_tx 11 y 12 se corresponden al SoftSerial 1 y 2 respectivamente. Grabamos y se reinicia la controladora.

Configurar el SoftSerial creado: telemetría SmartPort

Ahora tenemos ya nuestro SoftSerial asignado, podemos comprobarlo en la consola:

Asignación de SoftSerial en Betaflight

Asignación de SoftSerial en Betaflight

Y podemos verlo en la pestaña de puertos, donde le asignaremos la función que deseemos, en este caso la de SmartPort, la de telemetría de las radios FrSky.

Puertos serie y el softserial creado con Smartport

Puertos serie y el softserial creado con Smartport

El protocolo SmartPort tiene un inconveniente y es que viaja con la señal invertida, esto es, 0 es voltaje alto y 1 es voltaje bajo, al contrario del mundo. Cosas de FrSky. Los receptores de FrSky suelen ser conocedores de este hecho y suelen poner un pad en sus placas para sacar la señal SmartPort sin invertir, pero por defecto el conector principal la suele sacar invertida o el pad es de difícil acceso (si es que existe).

Con el SoftSerial no hay ese problema en Betaflight, porque al no ser un dispositivo real, una UART física, podemos configurarlo al revés del mundo y conectarle una señal SmartPort original sin problema.

Para ello tenemos que escribir en la consola CLI:

set tlm_halfduplex = on
set tlm_inverted = off
save

Estamos diciendo a Betaflight que la telemetría será half duplex, es decir, que la información va por el mismo cable en los dos sentidos (1-wire communication). SmartPort es half duplex.

Por otro le estamos diciendo con tlm_inverted=off que, oh my God!, la telemetría que esperamos en el puerto configurado no estará invertida con respecto al protocolo de telemetría que vamos a recibir que, como es SmartPort y es por defecto invertido, que no lo vuelva a invertir porque ya sabe que está invertido. En resumen, poner lo que he puesto en la caja de código.

Tras configurar Softserial hay que reiniciar la controladora de vuelo con un corte de corriente. Es decir, hay que desenchufar y volver a enchufar o no funcionará.

El carajal montado con la señal invertida es tal, que en todas las páginas y copias de páginas y copias de copias de páginas que hablan de SoftSerial en Betaflight y SmartPort, dicen que si no funciona «tlm_inverted = off«, que se ponga «tlm_inverted = on» y punto. Es lo que tiene el copy+paste. No es eso.

Yo os pongo el literal de los chicos de Betaflight, que si ya FrSky había metido la pata con su señal invertida, los términos elegidos por BF son de lo más desafortunados:

With the change of the configuration parameter tlm_inversion to the parameter tlm_inverted, the scope and function of the parameter have changed:

  • tlm_inverted applies to all telemetry protocols;
  • tlm_inverted = on means that telemetry is expected to be inverted compared to what it is for the selected protocol (i.e. when using SmartPort, tlm_inverted = off means that the flight controller expects the telemetry signal to be inverted serial, since this is the default for SmartPort).

This means that for all protocols, if unmodified hardware is used tlm_inverted = off is most likely the correct setting.

(Also, note that this only works for F3 / F7 based boards, or for F4 boards on ports with switchable external inverters.)

Softserial en el pin de los leds: Mamba F405 mini

Una de las salidas candidatas a usar el Softserial es el pad para conectar los leds. Cuando volamos en FPV, los leds no resultan interesantes, por lo que podemos aprovechar esta preciosa salida para crear sobre ella nuestro dispositivo de serie por software.

Como ejemplo lo haremos sobre una controladora Mamba F405 mini. Veamos donde tiene el pad de leds:

Pad para la tira led Mamba F405 mini

Pad para la tira led Mamba F405 mini

En la consola tecleamos el comando «resouces» para localizar el nombre de la salida:

Resources en Mamba F405. Localización de la salida led

Resources en Mamba F405. Localización de la salida led

Una vez localizada la salida de los leds (no confundir con las tomas GND y 5V para alimentarlos) procedemos como anteriormente, reasignando el softserial a esa salida y configurando la telemetría para conectarle una señal SmartPort:

resource LED_STRIP 1 none
resource serial_tx 11 A00

set tlm_halfduplex = on
set tlm_inverted = off

Limitaciones del Softserial

Pero todo tiene sus limitaciones. Soft Serial es un puerto serie emulado por software, lo que implica que consume CPU:

  1. No es posible usarlo en procesadores de la serie F1 y no es recomendable en F3.
  2. Hay que vigilar que el consumo de CPU no sea excesivo. Lo podemos ver en Betaflight Configurator, en la barra inferior de estado.
  3. Hay ciertos dispositivos con una alta frecuencia de intercambio de información que no podrán nunca estar conectados a un puerto serie emulado por software. Por ejemplo el OSD y el receptor de la radio.
  4. Sólo hay hasta la fecha posibilidad de emular dos puertos.