Instituto Politécnico Nacional.
Escuela Superior de Ingeniería
Mecánica y Eléctrica Zacatenco.
Unidad Profesional “Adolfo López Mateos”
Carrera: Ingeniería en comunicaciones y electrónica.
Materia: Circuitos digitales.
Práctica 1. Compuertas Básicas y Arduinos
Prof. Luis Manuel Diaz García.
Alumno: Pineda Montaño Salvador.
Numero de boleta: 2023302038
Grupo: 5CV1.
Estado de México, México.
RESUMEN.
En esta práctica, se llevaron a cabo varias actividades relacionadas con circuitos digitales,
programación en Arduino y simulaciones. A continuación, se presenta un resumen de cada
una de las etapas de la práctica:
• Conversión de Binario a Decimal:
Se comenzó por aprender y practicar la conversión de números binarios a decimales. Los
estudiantes realizaron ejercicios para convertir números binarios simples en sus equivalentes
decimales, lo que es fundamental para comprender cómo funcionan los sistemas digitales.
• Prueba del Funcionamiento de las Compuertas NAND y NOR:
Se introdujeron las compuertas lógicas NAND y NOR, y se procedió a probar su
funcionamiento. Los estudiantes construyeron circuitos utilizando estas compuertas y
verificaron que sus salidas se comportaran de acuerdo con las tablas de verdad
correspondientes.
• Tabla de Verdad y Simulación en Tinkercad:
Se diseñaron tablas de verdad para los circuitos que involucraban compuertas AND y OR.
Luego, se llevaron a cabo simulaciones utilizando una herramienta como Tinkercad para
confirmar que las salidas del circuito coincidieran con las expectativas según las tablas de
verdad.
• Programación en C++ (Arduino) para Controlar un LED:
Los estudiantes programaron un microcontrolador Arduino utilizando C++ para controlar un
LED. Crearon programas que hicieron parpadear el LED a tres frecuencias diferentes: 1 Hz,
5 Hz y 10 Hz. Esto implicó el uso de temporizadores y bucles para controlar el tiempo de
encendido y apagado del LED.
• Emulación de un Semáforo:
Finalmente, se diseñó y simuló un programa que emulaba el funcionamiento de un semáforo.
Esto implicó el uso de varios LEDs para representar las luces roja, amarilla y verde de un
semáforo. Los estudiantes programaron el microcontrolador para que las luces se encendieran
y apagaran en secuencia, simulando así el ciclo de un semáforo.
En resumen, esta práctica abarcó conceptos clave de electrónica digital, compuertas lógicas,
programación en Arduino y simulación de circuitos. Proporcionó a los estudiantes una
comprensión sólida de estos temas y les permitió aplicar sus conocimientos en proyectos
prácticos como el control de un LED y la emulación de un semáforo.
OBJETIVO.
El objetivo principal de esta práctica es afianzar de mejor manera los conocimientos
adquiridos en clase, de igual forma, desarrollar mejor nuestra habilidad armando circuitos y
en la creación de programas en C++.
DESARROLLO.
1.1. Conversión de decimal, binario, hex y BCD.
a) 141710 dec bin = 100010100110001110
b) 11010001 bin dec = 209
c) 2497 dec hex = 9C1
d) 511 dec (BCD) = 0101 0001 0001
e) B34 hex bin = 2868
1.2. Prueba de funcionamiento de compuertas NAND y NOR.
Mediante el cambio y accionamiento de los switches dentro de la simulación podemos
corroborar el funcionamiento de las compuestas AND así como de los interruptores
conectados en push down:
Obteniendo que al estar ambos abiertos se enciende el led, sin embargo, cuando uno cambia
de posición el led se apaga.
1.3. Tabla de verdad y simulación de comportamiento de un circuito.
Comenzamos planteando el circuito con sus 3 entradas y su salida, obteniendo lo siguiente:
La expresión obtenida del circuito es:
(ĀB+BC) = X
Y mostrándola en la tabla de verdad obtenemos:
a b c X = (ĀB+BC)
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Posteriormente armamos el circuito en TINKERCAD para simular su funcionamiento:
Bajamos y subimos los switches para generar las combinaciones y obtenemos la siguiente
tabla de verdad:
a b c X = (ĀB+BC)
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 1
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 1
1.4. Programa para parpadear un LED a diferentes frecuencias.
Iniciamos con el desarrollo del programa, con la declaración de una variable en la cual
almacenaremos el valor de la frecuencia y 4 pines, tres de entrada y uno de salida para los
botones y el led:
Como paso siguiente declaramos el uso que le daremos a los pines en el setup con el siguiente
código:
Posteriormente realizamos la función mediante la cual el led va a parpadear, en la cual
usaremos la variable declarada en la primera parte del código, esta misma será modificada
más adelante en el loop, además de la conversión de la frecuencia en periodo y su conversión
a milisegundos. Es importante agregar un condicional que evite el uso de una frecuencia 0,
debido a la contradicción matemática que se obtiene:
Y finalmente, en el cuerpo principal del programa(loop), usaremos condicionales para
determinar el valor de la variable frecuencia, y el caso en el que ningún botón es presionado
la variable mantenga su valor 0 para no generar problemas con la función anteriormente
planteada, y finalmente solo se llama a la función “turnOnLed” la cual es la encargada del
parpadeo del led:
El diagrama de conexión utilizado es el siguiente:
1.5. Desarrollo y simulación de programa de un semáforo.
Lo primero es plantear la ubicación del semáforo, la manera más sencilla es basarnos en
alguna avenida o lugar ya existente.
Posteriormente debemos de tomar en cuenta el tiempo estándar para el avance del tráfico.
Y ya como paso final, considerar el número y ubicación de los sensores que usaremos para
contabilizar el tráfico, en este caso usaremos fotorresistores, sin embargo, hay un sin fin mas
que pueden ser útiles para este fin
Ahora, procederemos con el código, iniciando por declarar los pines donde conectaremos
los fotorresistores, estos deben de estar dentro de los pines analógicos, debido que medirán
valores relacionados al voltaje.
De igual forma declararemos variables asociadas a guardar los valores que representaran la
cantidad de tráfico que registre el sensor.
Después, debemos configurar nuestros pines como entrada y salida según sea conveniente
tomando en cuenta el Arduino que tengamos, para este caso, las salidas serán del 4 al 9 y el
13.
Ya entrando de lleno al desarrollo del código, iniciaremos con la función analogRead, la
cual lee valores analógicos, y le asignaremos el valor del respectivo sensor a su respectiva
variable creada al principio del programa.
Tomando en cuenta que los leds se enumeraron tomando el numero uno el ubicado
apuntando a bordo de Xochiaca, y los leds número 2 en la avenida Villada, generamos el
caso general, aplicándose para condiciones de tráfico iguales.
Generando un pequeño parpadeo para que notifique que se acerca el cambio de color del
semáforo, iniciamos con un tiempo igual de 20 para ambos semáforos, recordando que esto
solo es cuando existan condiciones de tráfico iguales para ambos sentidos.
Posteriormente, usando los valores obtenidos de los sensores, generaremos condicionales
para que dependiendo del valor del tráfico sea mayor o menor el tiempo que permanezca
uno o el otro encendido, aumentando los segundos que el usuario crea conveniente, en este
caso, solo serán 5 para fines demostrativos.
Y finalizamos generando la función inicial, la cual mostrara de nuevo los valores, para
revisar nuevamente el tráfico, sin embargo, esta función solo es con fines visuales, ya que
una vez que el Código se repita volverá al inicio para ejecutar la misma función planteada al
principio del programa
El diagrama de conexión usado fue el siguiente:
CONCLUSION.
Esta práctica proporcionó a los participantes una valiosa experiencia en varios aspectos
fundamentales de la electrónica digital y la programación de microcontroladores. A lo largo
de las diferentes etapas de la práctica, se adquirieron y aplicaron conocimientos clave, y se
lograron los siguientes puntos destacados:
Conversión de Binario a Decimal: Se comprendió y practicó la conversión de números
binarios a decimales, lo que es esencial para trabajar con sistemas digitales.
Compuertas Lógicas NAND y NOR: Se demostró y verificó el funcionamiento de las
compuertas NAND y NOR mediante la construcción de circuitos y la observación de sus
salidas de acuerdo con las tablas de verdad.
Simulación en Tinkercad: Se utilizó una herramienta de simulación como Tinkercad para
validar el comportamiento de circuitos digitales, lo que permite probar conceptos de manera
virtual antes de implementarlos físicamente.
Programación en Arduino: Se adquirieron habilidades de programación en C++ para
Arduino, lo que permitió controlar un LED y lograr efectos de parpadeo a diferentes
frecuencias, lo que es fundamental en la creación de proyectos electrónicos.
Emulación de un Semáforo: Se diseñó y simuló un programa que emuló el funcionamiento
de un semáforo utilizando LEDs, lo que proporcionó una aplicación práctica y divertida de
los conceptos aprendidos.
En resumen, esta práctica integró teoría y aplicación práctica en un conjunto de actividades
que abordaron conceptos desde lo más básico, como la conversión de binario a decimal, hasta
proyectos más complejos como la emulación de un semáforo. Los participantes ganaron una
comprensión sólida de la electrónica digital y la programación de microcontroladores,
habilidades que son esenciales en el campo de la tecnología y la ingeniería.
APÉNDICES.
• Código para el circuito 1.4:
float frecuencia;
int led=2;
int btn1=3;
int btn2=4;
int btn3=5;
void setup(){
pinMode(led,OUTPUT);
pinMode(btn1,INPUT);
pinMode(btn2,INPUT);
pinMode(btn3,INPUT);
void trnOnLed(float Hz){
if(Hz==0){
digitalWrite(led,LOW);
}
else{
float periodo,Mperiodo;
periodo = (1/(Hz));
Mperiodo = (periodo*1000)/2;
digitalWrite(led, HIGH);
delay(Mperiodo);
digitalWrite(led, LOW);
delay(Mperiodo);
}
}
void loop(){
frecuencia = 0;
if(digitalRead(btn1)==HIGH){
frecuencia = 1;
}
if(digitalRead(btn2)==HIGH){
frecuencia = 5;
}
if(digitalRead(btn3)==HIGH){
frecuencia = 10;
}
trnOnLed(frecuencia);
• Código para el circuito 1.5:
int frBN=0; //Fotoresistores ubicados en la avenia bordo de Xochiaca con direccion Nezahualcoyotl
int frBC=1; //Fotoresistores ubicados en la avenia bordo de Xochiaca con direccion Chimalhuacan
int frVZ=2; //Fotoresistores ubicados en la avenida villada con direccion al bordo de Xochiaca
int frVB=3; //Fotoresistores ubicados en la avenida villada con direccion a la avenida Zaragoza
int traficBN=0; //Valor numerico del trafico en la avenia bordo de Xochiaca con direccion Nezahualcoyotl
int traficBC=0; //Valor numerico del trafico en la avenia bordo de Xochiaca con direccion Chimalhuacan
int traficVZ=0; //Valor numerico del trafico en la avenida villada con direccion al bordo de Xochiaca
int traficVB=0; //Valor numerico del trafico en la avenida villada con direccion a la avenida Zaragoza
bool peatonB=false; //Presencia de peatones en avenida bordo
bool peatonV=false; //Presencia de peatones en avenida villada
void setup() {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,INPUT);
pinMode(11,INPUT);
pinMode(12,INPUT);
pinMode(13,OUTPUT);
pinMode(frBN,INPUT);
pinMode(frBC,INPUT);
pinMode(frVZ,INPUT);
pinMode(frVB,INPUT);
[Link](9600);
void loop() {
traficBN=analogRead(frBN); //Comprobacion del trafico
[Link](traficBN);
traficBC=analogRead(frBC);
[Link](traficBC);
traficVZ=analogRead(frVZ);
[Link](traficVZ);
traficVB=analogRead(frVB);
[Link](traficVB);
//lED VERDE 1 Y ROJO 1 ESTAN EN AVENIDA BORDO
//LED VERDE 2 Y ROJO 2 ESTAN EN AVENIDA VILLADA
if((traficBN+traficBC)>(traficVZ+traficVB)){
digitalWrite(6,LOW); //Apaga el led rojo 1
digitalWrite(4,HIGH); //Prende el led verde 1
digitalWrite(8,LOW); //Apaga el led verde 2
digitalWrite(13,HIGH); //Prende el led rojo 2
delay(15000);
digitalWrite(4,LOW); //Led verde 1 comienza a parpadear
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH); //Led verde 1 termina de parpadear
delay(300);
digitalWrite(4,LOW);
digitalWrite(5,HIGH); //Prende led amarillo 1
delay(5000);
digitalWrite(5,LOW);
digitalWrite(6,HIGH); //Prende led rojo 1
digitalWrite(13,LOW);
digitalWrite(7,HIGH); //Prende led verde 2
delay(25000);
digitalWrite(7,LOW); //Led verde 2 comienza a parpadear
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH); //Led verde 2 termina de parpadear
delay(300);
digitalWrite(7,LOW);
digitalWrite(8,HIGH); //Prende led amarillo 2
delay(5000);
}
else{
if((traficVZ+traficVB)>(traficBN+traficBC)){
digitalWrite(6,LOW);
digitalWrite(4,HIGH); //Prende el led verde 1
digitalWrite(8,LOW);
digitalWrite(13,HIGH); //Prende el led rojo 2
delay(25000);
digitalWrite(4,LOW); //Led verde 1 comienza a parpadear
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH); //Led verde 1 termina de parpadear
delay(300);
digitalWrite(4,LOW);
digitalWrite(5,HIGH); //Prende led amarillo 1
delay(5000);
digitalWrite(5,LOW);
digitalWrite(6,HIGH); //Prende led rojo 1
digitalWrite(13,LOW);
digitalWrite(7,HIGH); //Prende led verde 2
delay(15000);
digitalWrite(7,LOW); //Led verde 2 comienza a parpadear
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH); //Led verde 2 termina de parpadear
delay(300);
digitalWrite(7,LOW);
digitalWrite(8,HIGH); //Prende led amarillo 2
delay(5000);
else{
digitalWrite(6,LOW);
digitalWrite(4,HIGH); //Prende el led verde 1
digitalWrite(8,LOW);
digitalWrite(13,HIGH); //Prende el led rojo 2
delay(20000);
digitalWrite(4,LOW); //Led verde 1 comienza a parpadear
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH);
delay(300);
digitalWrite(4,LOW);
delay(300);
digitalWrite(4,HIGH); //Led verde 1 termina de parpadear
delay(300);
digitalWrite(4,LOW);
digitalWrite(5,HIGH); //Prende led amarillo 1
delay(5000);
digitalWrite(5,LOW);
digitalWrite(6,HIGH); //Prende led rojo 1
digitalWrite(13,LOW);
digitalWrite(7,HIGH); //Prende led verde 2
delay(20000);
digitalWrite(7,LOW); //Led verde 2 comienza a parpadear
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH);
delay(300);
digitalWrite(7,LOW);
delay(300);
digitalWrite(7,HIGH); //Led verde 2 termina de parpadear
delay(300);
digitalWrite(7,LOW);
digitalWrite(8,HIGH); //Prende led amarillo 2
delay(5000);
traficBN=analogRead(frBN); //Comprobacion del trafico
[Link](traficBN);
traficBC=analogRead(frBC);
[Link](traficBC);
traficVZ=analogRead(frVZ);
[Link](traficVZ);
traficVB=analogRead(frVB);
[Link](traficVB);
traficBN=analogRead(frBN); //Comprobacion del trafico
[Link](traficBN);
traficBC=analogRead(frBC);
[Link](traficBC);
traficVZ=analogRead(frVZ);
[Link](traficVZ);
traficVB=analogRead(frVB);
[Link](traficVB);
traficBN=analogRead(frBN); //Comprobacion del trafico
[Link](traficBN);
traficBC=analogRead(frBC);
[Link](traficBC);
traficVZ=analogRead(frVZ);
[Link](traficVZ);
traficVB=analogRead(frVB);
[Link](traficVB);
}