Lógica combinacional empleando Arduino y álgebra de Boole

En la siguiente tutorial se desea simular un sistema de representación binaria que prende 4 LED’s a partir de unas condiciones de entrada. Después de conocer el problema y los respectivos min-términos, se busca simplificar la función lógica haciendo uso del Álgebra de Boole y del Teorema de Morgan.

El problema que vamos a resolver consta un circuito digital que tiene como entrada 5 pulsadores (Switchs) P4, P3, P2, P1, P0; que generan señales lógicas y 4 señales de respuesta R3,R2,R1,R0; que indican las siguientes posibilidades:
  • Si el número binario de entrada P4 P3 P2 P1 P0 es mayor que 15 y es múltiplo de 3, debe activarse R3.
  • Si el número binario de entrada es menor o igual a 15 y es múltiplo de 3, debe activarse R2.
  • Si el número binario de entrada es un múltiplo de 5, debe activarse R1.
  • Si el número binario de entrada es un múltiplo de 7 debe activarse R0.
Nos podemos ayudar de a tabla de verdad para determinar los Min-términos de la función o del problema. Esto nos sirve para simplificar la función para prender cada LED representado por R3, R2, R1 y R0.

TABLA DE VERDAD


ENTRADAS
SALIDAS
#
P4
P3
P2
P1
P0
R3
R2
R1
R0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
2
0
0
0
1
0
0
0
0
0
3
0
0
0
1
1
0
1
0
0
4
0
0
1
0
0
0
0
0
0
5
0
0
1
0
1
0
0
1
0
6
0
0
1
1
0
0
1
0
0
7
0
0
1
1
1
0
0
0
1
8
0
1
0
0
0
0
0
0
0
9
0
1
0
0
1
0
1
0
0
10
0
1
0
1
0
0
0
1
0
11
0
1
0
1
1
0
0
0
0
12
0
1
1
0
0
0
1
0
0
13
0
1
1
0
1
0
0
0
0
14
0
1
1
1
0
0
0
0
1
15
0
1
1
1
1
0
1
1
0
16
1
0
0
0
0
0
0
0
0
17
1
0
0
0
1
0
0
0
0
18
1
0
0
1
0
1
0
0
0
19
1
0
0
1
1
0
0
0
0
20
1
0
1
0
0
0
0
1
0
21
1
0
1
0
1
1
0
0
1
22
1
0
1
1
0
0
0
0
0
23
1
0
1
1
1
0
0
0
0
24
1
1
0
0
0
1
0
0
0
25
1
1
0
0
1
0
0
1
0
26
1
1
0
1
0
0
0
0
0
27
1
1
0
1
1
1
0
0
0
28
1
1
1
0
0
0
0
0
1
39
1
1
1
0
1
0
0
0
0
30
1
1
1
1
0
1
0
1
0
31
1
1
1
1
1
0
0
0
0

Como se puede observar en las salidas, las casillas en '1' muestra con que combinación de de P4, P3, P2, P1 y P0 enciende el LED en esa salida.

Ahora vamos hacer uso del álgebra de Boole para simplificar las funciones. Después se muestra el circuito combinacional, solo con el fin de observar la simplificación final y cómo se puede montar con circuitos integrados.


Funciones

Para Activar R3

R3(P4,P3,P2,P1,P0) =  ∑m(18,21,24,27,30)

FR3(P4,P3,P2,P1,P0) = P4 P3 P2 P1 P0+P4 P3  P2 P1 P0 + P4 P3 P2 P1 P0 +...
...+P4 P3 P2 P1 P0+ P4 P3 P2 P1 P0

FR3(P4,P3,P2,P1,P0) =P4[P3 P2 P1 P0+  P3  P2 P1 P0 + P3 P2 P1 P0 +  P3 P2 P1 P0]

FR3(P4,P3,P2,P1,P0) = P4[P1 P0 ( P3 P2) + P3  P2 (P1 P0) +  P3  P2 P1 P0]

Circuito lógico para R3


Para activar R2

R2(P4,P3,P2,P1,P0) =  ∑m(3,6,9,12,15)

FR2(P4,P3,P2,P1,P0) = P4 P3 P2 P1 P0+P4 P3  P2 P1 P0 + P4 P3 P2 P1 P0 +...
...+P4 P3 P2 P1 P0+ P4 P3 P2 P1 P0

FR2(P4,P3,P2,P1,P0) =P4[P3 P2 P1 P0 + P3  P2 P1 P0 + P3 P2 P1 P0 +P3 P2 P1 P0+...
...+P3 P2 P1 P0]

FR2(P4,P3,P2,P1,P0) = P4[ P3P0 (P2 P1) + P2 P0 (P3 P1) +P3 P2 P1 P0 ]

Circuito lógico para R2


Para activar R1

R1(P4,P3,P2,P1,P0) =  ∑m(5,10,15,20,25,30)

FR1(P4,P3,P2,P1,P0) = P4 P3 P2 P1 P0+P4 P3 P2 P1 P0 + P4 P3 P2 P1 P0 +...
...+P4 P3 P2  P1 P0+ P4 P3 P2 P1 P0 + P4 P3 P2 P1 P0

FR1(P4,P3,P2,P1,P0) = P3 P2 P1 (P4P0) + P3 P2 P1 (P4P0) +...
...+P3 P2  ( P4 P1 P0+P4 P1 P0)

FR1(P4,P3,P2,P1,P0) = P2(P4P0)(P3 P1) +P3 P2  ( P4 P1 P0+P4 P1 P0)

Circuito lógico para R1

Para activar R0

R1(P4,P3,P2,P1,P0) =  ∑m(7,14,21,28)

FR0(P4,P3,P2,P1,P0) = P4 P3 P2 P1 P0+P4 P3 P2 P1 P0 + P4 P3 P2 P1 P0 +...
...+P4 P3 P2  P1 P0

FR0(P4,P3,P2,P1,P0) = P4 P2 P1 (P3P0) +P4 P2 P1  (P3P0)

FR0(P4,P3,P2,P1,P0) = P2 (P3P0)(P4P1)

Circuito lógico para R0
Conociendo las funciones, solo nos queda implementar el código en Arduino. Para lo cual vamos hacer uso de la sintaxis if - else. 

Te puede interesar (Compuertas lógicas en Arduino)

Montaje



Código

int P4 = 2, P3 = 3, P2 = 4, P1 = 5, P0 = 6;
int R3 = 10, R2 = 11, R1 = 12, R0 = 13;

void setup() {
  // put your setup code here, to run once:

  /*Entradas*/
  pinMode(P4,INPUT_PULLUP);
  pinMode(P3,INPUT_PULLUP);
  pinMode(P2,INPUT_PULLUP);
  pinMode(P1,INPUT_PULLUP);
  pinMode(P0,INPUT_PULLUP);

  /*Salidas*/
  pinMode(R3,OUTPUT);
  pinMode(R2,OUTPUT);
  pinMode(R1,OUTPUT);
  pinMode(R0,OUTPUT);

  /*Para iniciar led's apagados*/
  digitalWrite(R3, HIGH);
  digitalWrite(R2, HIGH);
  digitalWrite(R1, HIGH);
  digitalWrite(R0, HIGH);
}

void loop() {
  /*
   *Entradas negadas para cambiar configuración del pullup
   *cuando se lee estado de la entrada
   */
  bool a = !digitalRead(P4);
  bool b = !digitalRead(P3);
  bool c = !digitalRead(P2);
  bool d = !digitalRead(P1);
  bool e = !digitalRead(P0);
  
  /*Salida R3*/
  if( a && ( (d&&!e&&!(b^c)) ||  (b&&!c&&!(d^e)) || (!b&&c&&!d&&e) ) ){
      digitalWrite(R3,LOW);
  }else{
      digitalWrite(R3, HIGH);  
  }

  /*Salida R2*/
  if(!a&&( (b&&e&&!(c^d)) || (c&&!e&&(b^d)) || (!b&&!c&&d&&e) )){
      digitalWrite(R2,LOW);
  }else{
      digitalWrite(R2, HIGH);  
  }

  /*Salida R1*/
  if( c&&((a^e)&&(!(b^d))) || b&&!c&& ((!a&&d&&!e)||a&&!d&&e) ){
      digitalWrite(R1,LOW);
  }else{
     digitalWrite(R1,HIGH);   
  }

  /*Salida R0*/
  if( c && (b^e) && (a^d) ){
      digitalWrite(R0,LOW);
  }else{
      digitalWrite(R0, HIGH);
  }
}


DESCARGAR

Comentarios

Publicar un comentario

Entradas más populares de este blog

Compuertas lógicas en Arduino

Manejo display 7 segmentos empleando Arduino