Lógica y sentido común son usados a diario, ya sea por sistemas electrónicos o personas. en este articulo veremos la lógica and, lógica or, lógica xor, lógica secuencial y cómo podemos ejecutar estas instrucciones en la placa Arduino uno, mismo no siendo programador, es bueno conocer los elementos que influencian la lógica binaria, pues tiene mucho a ver con las decisiones que tomamos en nuestro diario vivir. Casi todo equipo electrónico usa lógica digital para su funcionamiento y operación. de ahí la importancia de conocer este tema.
La electrónica moderna y sus resultados como: celulares, computadores, televisores, equipos industriales, médicos, etc., no serían posibles sin el uso de los circuitos lógicos digitales y lógica aplicada en ellos. La lógica y el sentido común tienen mucho a ver, pues se trata de que las cosas o circuitos funcionen o se llegue a un resultado aceptable.
Las principales instrucciones lógicas son:
OR
AND
XOR
NOT
En la Figura 1 podemos ver la placa de Arduino Uno y en la Figura 2 el software para el desarrollo de proyectos, el cual puede ser bajado de la página web de Arduino. En la Figura 3 mostramos la similitud o igualdad que hay entre la tarjeta de Arduino Uno y la mente humana, pues los 2 permiten hacer operaciones lógicas.
Las operaciones lógicas que hace el cerebro pueden ser consientes o subconsciente. Cuando consientes, nosotros nos damos cuenta de la operación, acción o decisión que estamos haciendo. Cuando subconsciente, nosotros no nos damos cuenta de ello, pero mismo así lo ejecutamos. La lógica y el sentido común o modo de pensar de cada persona, tienen mucha similitud. Por eso el parecido entre una tarjeta como Arduino y la mente o celebro humano, pues las 2 pueden realizar procesos lógicos. En electrónica se realizan muchas operaciones lógicas, a tal punto que todos los sistemas electrónicos modernos la utilizan. En este artículo estudiaremos estas operaciones o instrucciones.
Las operaciones OR, AND, XOR y NOT, son del tipo bit a bit o bit-wise. Esto quiere decir que estas operaciones lógicas se ejecutan sobre los bits individuales de los operandos.
LA INSTRUCCIÓN LOGICA OR (||)
La instrucción lógica OR, sigue el principio de funcionamiento del circuito mostrado en la Figura 4.
Podemos notar que cerrando el circuito con cualquiera de los 2 interruptores, la lámpara va a encender. Mismo si los dos interruptores están cerrados, la lámpara encenderá. Eso es la lógica OR. La única manera de que la lámpara no prenda, es que los 2 interruptores estén abiertos. Así, se han creado tablas de verdad para cada instrucción lógica. En la Figura 5 podemos observar la tabla de verdad para la instrucción lógica OR.
Esta tabla simplifica lo dicho anteriormente acerca de la lógica OR. La Figura 6 muestra el diagrama esquemático usado para la lógica OR.
De la vida práctica podemos citar un ejemplo donde usamos la lógica OR. Por ejemplo, cuando queremos ir del trabajo a nuestra casa. Tenemos varias alternativas, como:
Se puede ir caminando.
Se puede ir de bicicleta.
Se puede ir de motocicleta.
Se puede ir en bus u ómnibus.
Se puede ir de metro.
Se puede ir de taxi.
Se puede ir un carro.
Cualquiera de las alternativas anteriores nos llevara a casa y así lograr el objetivo de llegar a ella. Por cada posibilidad se puede hacer una entrada en una lógica OR. La Figura 7 muestra una lógica OR de 7 entradas.
Se pueden crear compuertas lógicas OR de la cantidad de entradas que se necesiten. El celebro usa este tipo de lógica prácticamente a diario y aunque no nos demos cuenta o no seamos conscientes de ello, el cerebro la usa. Trate de analizar los actos que hacemos o decisiones que tomamos y podemos observar que siempre usamos este tipo de lógica.
El símbolo usado en lenguaje C/C++ para la lógica OR, es la barra vertical (||). En la tarjeta Arduino Uno, normalmente se trabaja a nivel de byte, es decir 8 bits. La Figura 8 muestra un byte.
Observemos que hay 8 bits. Cuando ejecutamos una instrucción OR a nivel byte, todos los 8 bits dan el resultado al mismo tiempo, pero se mantiene la individualidad de cada bit; es decir, el bit 0 de un byte con el bit 0 del otro byte, el bit 1 de un byte con el bit 1 del otro byte, el bit 2 de un byte con el bit 2 del otro byte y así sucesivamente. En la Figura 9 podemos observar el resultado de la lógica OR a nivel de byte.
El programa de la Figura 9, sería el siguiente:
byte operando1 = B01011000; byte operando2 = B11011011; byte resultado = 0; void setup() { } void loop() { resultado = operando1 || operando2; }
Después de ejecutar el programa resultado aparecerá con el valor binario B11011011. Pruebe con diferentes valores y observe los resultados.
La Figura 10 muestra otro ejemplo de lógica OR, pero en este caso los valores son enteros (unsigned int).
En Arduino Uno los tipos de datos int son formados por 2 bytes. El programa seria el siguiente:
unsigned int operando1 = B0000000001011100; unsigned int operando2 = B0000000001100101; unsigned int = 0; void setup() { } void loop() { resultado = operando1 || operando2; }
Después de ejecutar el programa resultado aparecerá con el valor binario B0000000001111101. Pruebe con diferentes valores y observe los resultados.
La lógica OR la podemos usar en una alarma para casa. Podemos conectar puertas y ventanas a las entradas lógicas de la placa de un microcontrolador y testar si alguna de ellas fue activada. Vea la Figura 11.
LA INSTRUCCIÓN LOGICA AND (&&).
La Figura 12 muestra el circuito eléctrico que representa la instrucción lógica AND. Observemos que solamente cuando los 2 interruptores están cerrados, la lámpara encenderá.
Casos contrarios la lámpara no encenderá. Es como si dijéramos: “La lámpara prende, solo si el interruptor A y el interruptor B, están cerrados”. La Figura 13 muestra la tabla de verdad para la lógica AND.
La Figura 14 muestra el símbolo de lógica AND y la Figura 15 muestra algunos ejemplos de esta lógica.
En la vida diaria, también usamos mucho esta lógica AND. Por ejemplo, cuando vamos a sacar dinero de un cajero automático, es necesario tener el cartón o tarjeta que permita hacer el débito de la cuenta y también tener la clave. Si falta alguno de estos dos ítems, no podemos sacar el dinero.
Otro ejemplo, donde es necesario tener varios ítems para llegar a nuestro objetivo puede ser cuando queremos preparar por ejemplo una torta o ponqué. Se necesita tener todos los ingredientes, un recipiente donde colocar ellos y un horno. La Figura 16 muestra este ejemplo.
En electrónica esta lógica es muy usada. Por ejemplo en la alarma de una casa, cuando queremos deshabilitar la alarma. Vea la Figura 17.
Mismo que se disparen los sensores, la alarma no sonora porque uno de los pines de entrada de la lógica AND está a nivel bajo (0 voltios)
El símbolo usado en lenguaje C/C++ para la lógica AND, es el símbolo &. Veamos el siguiente programa:
byte operando1 = B01011000; byte operando2 = B11011011; byte resultado = 0; void setup() { } void loop() { resultado = operando1 & operando2; }
Despues de ejecutar el programa, la variable resultado estará con el valor B01011000. Observe la Figura 18.
El siguiente programa usa enteros sin signo para ejecutar la instrucción AND:
unsigned int operando1 = B0000000001011100; unsigned int operando2 = B0000000001100101; unsigned int = 0; void setup() { } void loop() { resultado = operando1 & operando2; }
Después de ejecutar el programa resultado aparecerá con el valor binario B0000000001000100 . Observe la Figura 19. Pruebe con diferentes valores y observe los resultados.
LA INSTRUCCIÓN LOGICA XOR (^).
La lógica XOR es también conocida como OR ESCLUSIVA, es decir que solamente cuando una de las entradas está a nivel alto (5 Voltios), la salida también estará a nivel alto. Vea la tabla de verdad en la Figura 20.
Si las 2 entradas están a nivel alto, la salida estará a nivel bajo. También, si las 2 entradas están a nivel bajo, la salida estará a nivel bajo. El diagrama esquemático para la lógica XOR se puede observar en la Figura 21.
El símbolo usado para representar la instrucción XOR es el símbolo de intercalación (^).
Un ejemplo de XOR se puede dar cuando una persona quiere casarse o formar familia, pero se tienen 2 enamoradas. Siendo así, se puede casar, si escoge una de las enamoradas, pero no se puede casar, con las 2 enamoradas. Así, en muchas cosas o actitudes humanas es posible ver el uso de lógica XOR.
En la Figura 22 podemos ver un ejemplo de XOR a nivel de byte.
Veamos el siguiente programa:
byte operando1 = B01011000; byte operando2 = B11011011; byte resultado = 0; void setup() { } void loop() { resultado = operando1 ^ operando2; }
Después de ejecutar el programa, la variable resultado estará con el valorB10000011 .
El siguiente programa usa enteros sin signo para ejecutar la instrucción XOR:
unsigned int operando1 = B0000 0000 0101 1100; unsigned int operando2 = B0000 0000 0110 0101; unsigned int = 0; void setup() { } void loop() { resultado = operando1 ^ operando2; }
Después de ejecutar el programa resultado aparecerá con el valor binario B0000000000111001 . Observe la Figura 23. Pruebe con diferentes valores y observe los resultados.
LA INSTRUCCIÓN LOGICA NOT (~).
La instrucción lógico NOT invierte los bits de un byte, es decir si el bit tiene un nivel bajo (0 voltios) es pasado para nivel alto (1 voltio) y si el bit tiene un nivel alto, el bit es cambiado para nivel bajo. La Figura 24 muestra el diagrama esquemático para la lógica NOT.
La Figura 25 muestra la tabla de verdad para la lógica NOT. Esta operación es de tipo unitaria, es decir que se aplica sobre una variable.
El símbolo usado en lenguaje C/C++ para la lógica NOT, es el símbolo ~.Veamos el siguiente programa:
byte operando1 = B01011000; byte resultado = 0; void setup() { } void loop() { resultado = ~operando1; }
Después de ejecutar el programa, la variable resultado estará con el valor B10100111. Observe la Figura 26.
El siguiente programa usa enteros sin signo para ejecutar la instrucción NOT:
unsigned int operando1 = B00000000 01011100; unsigned int = 0; void setup() { } void loop() { resultado = ~operando1; }
Después de ejecutar el programa resultado aparecerá con el valor binario B1111111110100011. Observe la Figura 27. Pruebe con diferentes valores y observe los resultados.
LOGICA COMBINACIONAL.
La lógica combinacional nace cuando combinamos las lógicas vistas anteriormente, es decir las salidas son el resultado de las lógicas expuestas en un circuito. La palabra combinacional ya dice que se trata de combinar, mezclar o juntar varias de las lógicas OR, AND, XOR, NOT, para llegar algún resultado.
En el siguiente ejemplo se combina lógica AND y OR.
Observe la Figura 28 y veamos el siguiente programa:
byte operando1 = B0101 1000; byte operando2 = B1101 1011; byte operando3 = B0011 0011; byte resultado = 0; void setup() { } void loop() { resultado = operando1 & operando2; resultado = resultado || operando3; }
Después de ejecutar el programa, la variable resultado estará con el valor B01111011 .
El siguiente programa usa enteros sin signo para ejecutar la instrucción de lógica combinacional:
unsigned int operando1 = B0000 0000 0101 1100; unsigned int operando2 = B0000 0000 0110 0101; unsigned int operando3 = B1111 0000 1100 1100; unsigned int = 0; void setup() { } void loop() { resultado = operando1 & operando2; resultado = resultado || operando3; }
Después de ejecutar el programa resultado aparecerá con el valor binario B1111000011001100 . Pruebe con diferentes valores y observe los resultados.
Vamos a hacer otro ejemplo de lógica combinacional. En este ejemplo se combinan lógica OR, AND y NOT.
Observe la Figura 29 y veamos el siguiente programa:
byte operando1 = B0101 1000; byte operando2 = B1101 1011; byte operando3 = B0011 0011; byte operando4 = B1111 0000; byte resultado = 0; void setup() { } void loop() { resultado = operando1 || operando2; resultado = resultado && operando3; resultado = resultado || operando4; resultado = ~resultado; }
Después de ejecutar el programa, la variable resultado estará con el valor B00001100.
El siguiente programa usa enteros sin signo para ejecutar la instrucción de lógica combinacional:
unsigned int operando1 = B0000 0000 1011 1000; unsigned int operando2 = B0000 0000 0110 0101; unsigned int operando3 = B1111 0000 1100 1100; unsigned int operando4 = B1010 1010 1010 1010; unsigned int = 0; void setup() { } void loop() { resultado = operando1 || operando2; resultado = resultado && operando3; resultado = resultado || operando4; resultado = ~resultado; }
Después de ejecutar el programa resultado aparecerá con el valor binario B0101010100010001. Pruebe con diferentes valores y observe los resultados.
OPERACIONES BOOLEANAS.
Las operaciones booleanas se pueden usar para verificar si 2 o más expresiones son verdaderas o falsas y normalmente se usan en instrucciones condicionales como if o while . Debemos tener cuidado de no confundir las instrucciones a nivel de byte o enteros (int), con la operaciones booleanas. Las instrucciones booleanas usan dos caracteres así:
AND &&
OR ||
OPERACIÓN BOOLEANA AND (&&).
La operación booleana AND es verdadera (true), solamente si sus 2 expresiones son verdaderas. Normalmente, la operación booleana AND es usada dentro de una instrucción condicional if(). Veamos el siguiente ejemplo:
if (digitalRead(2) == HIGH && digitalRead(3) == HIGH) // verifica si ambas entradas son altas.
{
// Instrucciones.
}
En el anterior código se están verificando si la entrada digital 2 y la entrada digital 3, están a nivel lógico alto. Si las 2 entradas están altas, entonces se ejecutaran las instrucciones que hay entre los corchetes ({ }). Caso contrario, el programa saltara y las instrucciones no se ejecutaran.
OPERACIÓN BOOLEANA OR (||).
La operación booleana OR seráverdadera, si cualquiera de las 2 expresiones son verdaderas. Veamos el siguiente ejemplo:
If (x > 0 || y > 0) // si, cualquiera, x o y es más grande que cero (0).
{
// instrucciones.
}
En la anterior línea de código, estamos testando si cualquier variable de x o y, es mayor que cero (0). Si cualquiera de las variables x o y, es mayor que cero, entonces se ejecutaran caso contrario, estas instrucciones no se ejecutan.
CONCLUCION
Como podemos concluir, la lógica es muy simple pues sigue el sentido común. La lógica OR dice que se llega al objetivo por cualquiera de sus entradas y la lógica AND dice que se llega al objetivo, si se cumplen todos los requisitos. La lógica XOR dice que solamente una entrada puede estar activada para que se cumpla o llegue al objetivo. La práctica es madre del conocimiento, por eso puede testar y observar los resultados. También se puede usar esta lógica para testar o evaluar expresiones aritméticas, a través de la operación booleana OR (||) y la operación booleana ADD (&&).