INTERRUPTORES LOGICOS
Los interruptores lógicos no son interruptores reales como los que estamos acostumbrados a accionar en la emisora. Son interruptores virtuales. No los tocamos pero son capaces de activar/desactivar funciones exactamente igual que cualquier otro interruptor.
Para ello, los interruptores lógicos comparan y evaluan sus entradas (posición de sticks, datos de telemetría, variables globales, interruptores físicos, etc.) y si cumplen con la condición dada, se activan.
Para poder comparar y evaluar las entradas, OpenTx utiliza una serie de operadores matemáticos y lógicos que vamos a citar a continuación.
Operadores Matemáticos: |
a=x: cierto cuando la variable a es igual a la constante x |
a~x: cierto cuando la variable a es aproximadamente igual a la constante x |
a<x: cierto cuando la variable a es menor que la constante x |
a>x: cierto cuando la variable a es mayor que la constante x |
|a|<x: cierto cuando el valor absoluto (valor sin el signo) de la variable a es menor que la constante x |
|a|>x: cierto cuando el valor absoluto (valor sin el signo) de la variable a es menor que la constante x |
d>x : cierto cuando la variación de la variable d es mayor que la constante x |
|d|>x: cierto cuando la variación del valor absoluto de la variable d es mayor que la constante x |
a<b: cierto cuando la variable a es menor que la variable b |
Operadores Lógicos: |
AND: cierto si sus dos entradas son ciertas simultaneamente |
OR: cierto si una, otra o ambas entradas son ciertas |
XOR: cierto si una u otra de sus entradas es cierta, pero falso si las dos son ciertas simultáneamente. |
Operadores Compuestos |
Sticky: activado con V1 (interruptor físico/lógico o modo de vuelo), permanece cierto hasta que es desactivado por V2( interruptor físico/lógico modo de vuelo). Así la línea: |
L1 Sticky V1: SH? V2: SA? | activa L1 al mover SH hacia abajo, y permanece activo hasta que SA sea llevado arriba. |
Edge: cierto momentáneamente cuando V1 (interruptor físico/lógico o modo de vuelo) es activado más de cierto tiempo (V2a) pero menos de otro tiempo dado (V2b). Así las líneas: |
L1 Edge V1: SH? V2: 3.0 / 7.0 | activa un instante L1 al soltar SH si lo hemos tenido pulsado más de 3 segundos pero menos de 7. |
L2 Edge V1: SH? V2: 0.0 / instant | activa un instante L2 al pulsar SH. |
L3 Edge V1: SH? V2: 0.0 / infinite | activa un instante L2 al soltar SH. |
Temporizador: hace cierto / falso un interruptor según los interváluos definidos V1(tiempo activo) y V2 (tiempo desactivado). Se utiliza con el operador AND para que otro interruptor pueda activar /desactivar el temporizador. Así la línea: |
L1 Temporizador V1: 1.0 V2: 0.5 AND SA? | al subir SA se activa L1 durante 1 segundo, luego permanece desactivado durante medio segundo y así repetidamente. |
En cada una de las líneas de programación de los 32 interruptores lógicos que nos ofrece OpenTx Companion, dispondremos de un operador AND adicional, así como la duración y el retraso en la activación de los mismos.
Pero vale ya de teoría!!!! Vamos a poner ejemplos prácticos. Será imposible mostrar la utilización de todos ellos, pero vamos a ilustrar al menos unos pocos.
Empezamos por algo sencillo, y ya que en el tutorial anterior hablábamos de Fases de Vuelo…..
Queremos crear un modo de vuelo Acrobático en el modelo anterior. Para entrar en este modo es necesario que no estén extendidos los flaps y que activemos el interruptor SA?. Si recordáis, los flaps únicamente eran neutros en el modo Crucero, que se obtenía con SC?.
Bien, pues para entrar en el modo Acrobático necesitaremos evaluar la posición de dos interruptores físicos: SC y SA. Así, que necesitaremos un interruptor lógico, por ejemplo L3, que se active cuando SA? y simultáneamente SC?.
L3 cierto si SA? AND SC?
En OpenTx Companion, entramos en la página de interruptores Lógicos y en la tercera línea (interruptor lógico L3) seleccionamos función AND y entradas V1 SA? y V2 SC?.
Ahora ya solo queda asignar L3 como interruptor de activación del modo de Vuelo Acrobático. Para ello, vamos a la página de Fases de Vuelo, nombramos nuestro nuevo modo de vuelo como Acrobatico y seleccionamos L3 en el campo Switch.
Venga, un ejemplo algo más extravagante…..
Imagina que tenemos un drone de carreras y queremos que en carrera no baje de los 2 m, altura que consideramos de seguridad para evitar la colisión con el terreno.
El drone está dotado de telemetría y concretamente el altímetro transmite su valor a través de la variable Alt.
Disponemos de la función Mantener Altura (ya veremos que la podemos programar en un script LUA), que cuando es llamada mantiene la altura que el drone tenga en ese momento.
Finalmente, queremos asignar SA? para armar la altura de seguridad de 2 metros que habíamos citado anteriormente…… Super fácil
Tomamos como variable la Altitud (Alt) y le aplicamos el comparador menor que, siendo el límite dado 2 metros.
L1 activo si Alt < 2 /// L1 a<x Alt 2m
Además lo unimos por el operador AND con SA?.
L1 activo si simultáneamente Alt<2 y SA? /// L1 a<x Alt AND SA?
Para que L1 sea cierto, SA tiene que estar arriba (altura de seguridad armada) y además y simultáneamente, la altura debe ser menor de 2 metros.
Si SA no estuviera arriba, la altura de seguridad estaría desarmada y el drone puede subir, bajar, aterrizar con normalidad (L1 no sería cierto aunque estemos por debajo de los 2 metros). Si subimos SA, la altura de seguridad queda activada y L1 será cierto en el momento que el drone esté por debajo de los 2 metros.
L1 se activará justo cuando tengamos necesidad de aplicar la función Mantener Altura, así que no queda más que llamar a esta función siempre que L1 sea cierto.
Suponemos que hemos programado la función Mantener Altura con un script Lua y lo tenemos guardado como mantener.lua en la tarjeta de memoria. (El desarrollo de este script sobrepasa el nivel de estos tutoriales iniciales y no será desarrollado hasta alcanzar el nivel experto de los mismos).
Para llamar la función a través de L1 debemos ir a la página de Funciones Especiales y definir nuestra SF2 poniendo en el campo Cambiar el interruptor L1, que será el que la active; en el campo Acción pondremos Play Script (ejecutar un Script) y finalmente en Parámetros indicaremos mantener, el nombre del archivo que contiene nuestra función.
En el siguiente ejemplo vamos a ilustrar un hecho bastante corriente, y es que no es inusual tener que recurrir a interruptores lógicos intermedios como entrada de un interruptor lógico final.
Imagina que pretendemos realizar vuelos de 5 minutos para preservar las baterías, y queremos que la emisora nos avise transcurrido ese tiempo. El cronómetro debe activarse en cuanto demos motor, hacer una cuenta atrás de 5 minutos y detenerse al llegar a cero.
Antes de seguir, hay que comentar alguna particularidad del Timer en nuestra emisora.
- – A falta de instrucciones, la cuenta atrás, al llegar a cero ¡¡¡no se para!!!, sino que sigue con ¡¡¡tiempos negativos!!! y parpadeando en ¡¡¡vídeo inverso!!! Por tanto, habrá que decirle de alguna manera que se pare al llegar a cero.
- – Una vez completado un ciclo, es necesario resetear el Timer para que vuelva a funcionar correctamente. Por eso es muy habitual ver la función Reset unida a la utilización del Timer.
Dicho esto……nos ponemos manos a la obra.
En primer lugar vamos a establecer la condición de inicio para la cuenta atrás. Hemos dicho que al dar gas empezaremos a contar los cinco minutos….
El valor de Thr con el stick de motor completamente abajo es -100. En cuanto subamos ligeramente el stick para dar gas, ese valor irá aumentando (-99, …-70,…-30,…50,…100) hasta llegar a +100 con el stick completamente arriba.
Pues eso:
L1 activo si Thr > -100 /// L1 a>x Thr -100
Vamos a la página de Switches Lógicos. En la primera fila ponemos Función a>x, en V1 seleccionamos el stick de motor Thr y en V2 nuestro valor umbral -100.
L1 es un interruptor lógico intermedio que será cierto siempre que el stick de motor no esté completamente abajo. Pero no está diseñado para activar ninguna función, sino que es nuestra herramienta para saber cuando empezará la cuenta atrás.
La otra instancia que debemos ser capaces de reconocer es cuando el cronómetro llegue a cero. Timer igual a cero…..
L2 activo si Cróno = 00:00:00 /// L2 a=x Temporizador 1 00:00:00
En la página de Interruptores Lógicos. En la segunda fila, ponemos Función a=x, en V1 ponemos Temporizador 1 y V2 el valor cero del cróno, es decir, 00:00:00.
L2 es nuevamente un interruptor lógico intermedio. No está diseñado para activar ninguna función, sino que es nuestra herramienta para saber que la cuenta atrás ha llegado a cero. L2 será cierto cuando nuestro crono sea cero.
Ahora vamos a establecer otra condición para que active la cuenta atrás en cuanto utilicemos el motor y se pare cuando la cuenta atrás llegue a cero. Para ello utilizamos el operador compuesto Sticky. En la tercera fila, seleccionamos Función Sticky, en V1 ponemos L1 y en V2 tendremos L2.
L3 gracias al operador sticky se activará cuando L1 sea cierto, y permanecerá activo hasta que L2 sea cierto. Es decir, L3 se activara al dar motor (L1) y permanecerá activo hasta que la cuenta atrás llegue a cero (L2). Vaya, pero si eso es precisamente el cronómetro que estábamos buscando!!!!
En la página de ajustes nombramos el Temporizador 1 como Timer, damos el tiempo que dura 00:05:00 (5 minutos) y asignamos el interruptor L3 a nuestro temporizador.
Solo queda un pequeño detalle, poder resetear el temporizador, que lo haremos a través del interruptor SH.
En la página de Funciones especiales definimos SF1 con SH? en el campo cambiar, acción Resetear, parámetro Temporizador 1 y finalmente Activar ON.
Podríamos seguir poniendo ejemplos y no conseguiríamos abarcar todos los casos, ya que las posibilidades son infinitas, como son las posibilidades de esta emisora.
Espero haber ilustrado la forma de trabajo con estos interruptores para que vosotros mismos podáis ajustar la programación a vuestras necesidades.
¡¡¡Domina los interruptores lógicos de la Taranis y serás capaz de programar cualquier circunstancia que puedas imaginar!!! |
Un saludo, Tiziano.
P.D.: Recuerda que puedes hacer tus comentarios o preguntas en el hilo del foro http://www.miliamperios.com/foro/post1356615.html#p1356615