Skip to content

Instantly share code, notes, and snippets.

@CravApp
Created May 17, 2025 01:41
Show Gist options
  • Save CravApp/4740ff793deff155f39b12c94ae2a21e to your computer and use it in GitHub Desktop.
Save CravApp/4740ff793deff155f39b12c94ae2a21e to your computer and use it in GitHub Desktop.
Programar Arduino
/* Aprenda más -- Actividades de Análisis de Programas
1. ¡Analicemos este programa! El análisis de programas es una habilidad importante
para desarrollar ya que le ayuda a comprender el funcionamiento de un programa.
Instale su circuito ARPS2 encima de su Arduino y luego conecte
el Arduino a su computadora. Presione el botón Upload en la parte superior de
la pantalla del IDE -- es la flecha grande que apunta hacia la derecha. El IDE
comenzará a compilar el sketch del programa y cargará el programa en
el Arduino cuando se complete la compilación. Presione y suelte
el pulsador SW2 en su circuito ARPS2 mientras observa sus LEDs.
¿Qué sucede? ¿Cuántos LEDs parpadean? ¿Cuántas veces parpadea cada LED?
¿Vuelven a parpadear los LEDs si se presiona y suelta SW2 una
segunda vez? ¿Qué sucede si se mantiene presionado SW2? ¿Se detiene el patrón
de parpadeo inmediatamente cuando se suelta SW2?
Examine el programa e intente hacer coincidir sus observaciones con las
instrucciones del programa. Explique por qué todos los LEDs parpadean y
luego se apagan después de presionar SW2, y por qué cree que el patrón
de parpadeo continúa -- en lugar de detenerse inmediatamente -- después de que el
pulsador SW2 es liberado.
2. La primera línea de código en la función principal 'loop()' del programa es:
SW2State = digitalRead(SW2);
La función digitalRead(SW2) lee el voltaje presente en el
pin definido como SW2 y almacena el voltaje como uno de los dos posibles
estados en la variable SW2State. Un voltaje cercano al nivel del
voltaje de la fuente de alimentación hará que SW2State se convierta en HIGH, y
un nivel de voltaje más cercano a 0V hará que SW2State sea LOW.
La siguiente instrucción if (condicional):
if(SW2State == LOW) {
compara el valor almacenado en la variable SW2State con el valor
LOW. En C, y muchos otros lenguajes de programación, dos signos iguales
'==' son la verificación condicional de igualdad, mientras que un solo signo igual
asigna un valor. Si el valor almacenado en SW2State es LOW, la
condición será verdadera y todas las instrucciones del programa encerradas
dentro de las llaves '{ ... }' debajo de la instrucción if se ejecutarán.
Si SW2State es HIGH, la condición es falsa y todo el código
dentro de las llaves se omitirá.
Cuando la condición es verdadera, la primera instrucción de salida que se ejecuta es:
digitalWrite(LED2, HIGH);
Esta instrucción de salida establece el voltaje del pin definido como LED2
en alto, permitiendo que la corriente fluya a través del LED D2 en el circuito.
Unas líneas más abajo en el programa, otra instrucción de salida del LED
establece el pin LED2 en bajo:
digitalWrite(LED2, LOW);
Tanto las instrucciones de entrada (digitalRead) como de salida (digitalWrite)
utilizan los mismos términos HIGH y LOW para representar los voltajes de entrada y salida.
¿A qué voltajes del mundo real cree que corresponden los valores HIGH
y LOW en el Arduino UNO utilizado con su ARPS2?
3. Cada instrucción digitalWrite va seguida de un breve retardo:
delay(100);
La función 'delay()' hace que el microcontrolador se pause durante el
tiempo especificado dentro de sus paréntesis, en milisegundos.
Intente cambiar el valor del tiempo de retardo a 1000 ms (1 s) y cargue el
programa de nuevo. Presione SW2 mientras observa los LEDs. ¿Notó
el cambio? Experimente con valores de retardo entre 1 y 10000 y
observe el efecto que tiene en su programa. ¿Cuánto puede bajar
antes de que el retardo se vuelva imperceptible?
4. Comprender el funcionamiento de un circuito es tan importante como
comprender el programa al analizar y depurar circuitos de interfaz
(componentes de hardware controlados por o que interactúan con
software). Si tiene acceso a un voltímetro, puede usarlo para
confirmar las mediciones de voltaje en diferentes puntos de su circuito,
y específicamente para verificar los valores HIGH o LOW que predijo
anteriormente. Para poder leer los voltajes de los LEDs, es posible que necesite
alargar el retardo de tiempo después de la instrucción de salida que controla
el LED que se está midiendo.
Primero, intente medir el potencial a través de uno de los LEDs. Presione
SW2 y observe cómo cambia el voltaje. ¿Es el voltaje lo que
esperaba que fuera? Si no, use el esquema para buscar el número de pieza
de la resistencia conectada al LED que estaba midiendo,
y mida el potencial a través de la resistencia y el LED. ¿Es
esto más cercano al valor de voltaje que esperaba?
A continuación, mida el potencial a través de ambos terminales de uno de los
pulsadores mientras no se presiona. Los pines de entrada del pulsador
del microcontrolador se han configurado con resistencias pull-up internas
habilitadas, por lo que debería haber un voltaje presente en cada
pulsador tan pronto como el programa comience a ejecutarse. Mantenga presionado
el pulsador y debería observar un cambio en el voltaje
a través del pulsador. ¿Coincide este valor con su predicción?
¿Cómo se relaciona este valor con el valor utilizado por la instrucción de entrada
SW2?
5. Comparemos el funcionamiento de las estructuras 'if' y 'while' creando
dos nuevos bloques de programa que simularán el funcionamiento
de los botones momentáneos del mundo real. Copie y pegue el código del programa,
que se enumera a continuación, en su programa entre el bloque 'if' SW2 existente
y el retardo de suspensión de 10 ms (que se muestra por la ubicación del
comentario en el código del programa).
// Botón momentáneo usando una estructura if
SW4State = digitalRead(SW4);
if(SW4State == LOW) {
digitalWrite(LED4, HIGH);
}
else {
digitalWrite(LED4, LOW);
}
// Botón momentáneo usando una estructura while
SW5State = digitalRead(SW5);
while(SW5State == LOW) {
digitalWrite(LED5, HIGH);
SW5State = digitalRead(SW5);
}
digitalWrite(LED5, LOW);
Primero, presione y suelte el pulsador SW4. El LED D4 solo debería encenderse
mientras se presiona SW4.
A continuación, presione y suelte el pulsador SW5. El LED D5 debería funcionar
exactamente de la misma manera que el LED D4, permaneciendo encendido solo mientras
se presiona SW5. (En TinkerCad, hacer Shift-clic en el primer botón
hace que permanezca presionado para que pueda hacer clic en un segundo botón).
Si bien ambos bloques de conmutación del programa están diseñados para simular
efectivamente el funcionamiento de los pulsadores momentáneos del mundo real,
la implementación de estos mediante una secuencia de pasos de software hace que
se comporten de manera diferente a como lo harían los botones físicos. Para ver la
diferencia, mantenga presionado SW4 y, mientras mantiene presionado SW4, presione y
suelte SW5. ¿Siguen funcionando ambos interruptores como se esperaba?
Ahora, pruébelo en el orden opuesto. Mantenga presionado SW5 y luego
presione y suelte SW4. ¿Funcionan ambos interruptores como se esperaba?
Explique las diferencias en el funcionamiento de los bloques 'if' y 'while'
utilizados para crear las funciones de botón momentáneo. ¿Cómo afecta cada uno
al flujo del programa -- la ruta tomada por el microcontrolador
a través del bucle principal del programa? ¿Qué bloque sería más adecuado
para detectar ambos interruptores simultáneamente, como si estuvieran cableados como
circuitos paralelos separados?
6. Comente la segunda instrucción 'SW5State = digitalRead(SW5);' --
la que está dentro del bucle while -- agregando dos barras '//' al
principio de la línea, así: '//SW5State = digitalRead(SW5);'.
Vuelva a cargar su programa y pruebe SW5 nuevamente. Después de eso, intente probar
tanto SW4 como SW5. ¿Siguen funcionando? Si el programa parece estar
bloqueándose, presione y suelte el pulsador de RESET SW1 en ARPS2
para reiniciar el microcontrolador y reiniciar el programa. Explique
lo que cree que está sucediendo y por qué el microcontrolador podría estar
operando de esa manera.
7. A continuación, intentemos anidar condiciones if para simular un circuito de seguridad
del operador en una máquina industrial. Para evitar lesiones al operador,
algunas máquinas tienen dos botones de inicio muy separados que un operador
de la máquina debe presionar al mismo tiempo para activarla,
presionando un botón con cada mano y asegurándose de que ambas manos estén
seguramente alejadas de las partes peligrosas de la máquina.
Reemplace los bloques de programa de botón momentáneo agregados anteriormente con el
nuevo bloque de programa, a continuación. El programa combina dos condiciones if
para encender el LED4 (que representa nuestra máquina) solo cuando se presionan
tanto SW4 como SW5.
SW4State = digitalRead(SW4);
SW5State = digitalRead(SW5);
if(SW4State == LOW) {
if(SW5State == LOW) {
digitalWrite(LED4, HIGH);
}
else {
digitalWrite(LED4, LOW);
}
}
else {
digitalWrite(LED4, LOW);
}
Pruebe el código para asegurarse de que funciona como se esperaba. ¿Importa el orden
de las pulsaciones de los botones? ¿Cree que importa el orden de las comprobaciones
condicionales en el programa? Intente intercambiar las comprobaciones de entrada
condicionales para SW4 y SW5 y pruébelo de nuevo si no está seguro.
8. Como se muestra en el ejemplo anterior, anidar sentencias condicionales
funciona para asegurar que la luz se encienda cuando ambos interruptores están
presionados. Existe una forma más fácil y corta de lograr la
misma tarea implementando el operador condicional lógico AND
representado en C usando dos ampersands '&&'. Esta operación
condicional de software es el equivalente de programación de una puerta lógica AND.
Reemplace el código agregado en el paso anterior con este nuevo bloque de código
usando el operador lógico AND:
SW4State = digitalRead(SW4);
SW5State = digitalRead(SW5);
if(SW4State == LOW && SW5State == LOW) {
digitalWrite(LED4, HIGH);
}
else {
digitalWrite(LED4, LOW);
}
Ejecute el código y pruébelo para asegurarse de que funciona como se esperaba. ¿Puede
pensar en al menos dos ventajas de usar un operador condicional lógico
en lugar de usar estructuras if anidadas como se hizo en el
ejemplo anterior?
9. Si se puede implementar un operador lógico AND usando una sentencia
condicional, parece razonable esperar que también exista un operador
lógico OR. En los programas en lenguaje C, el operador lógico
OR se representa con dos barras verticales '||'. Reemplace
el doble ampersand '&&' con doble barra para que su programa
implemente una condición lógica OR. Su bloque de código ahora debería
verse así:
SW4State = digitalRead(SW4);
SW5State = digitalRead(SW5);
if(SW4State == LOW || SW5State == LOW) {
digitalWrite(LED4, HIGH);
}
else {
digitalWrite(LED4, LOW);
}
Ejecute el código y pruébelo. Enumere las condiciones bajo las cuales el LED D4
se enciende. ¿Coinciden estas condiciones con la tabla de verdad de una puerta
lógica OR?
10. El equivalente de la operación lógica XOR es la desigualdad -- la
salida será verdadera solo cuando una entrada sea diferente, o no
igual, a la otra. La desigualdad en los programas en C se representa con
el operador condicional '!=' (no igual a). Intente esto:
SW4State = digitalRead(SW4);
SW5State = digitalRead(SW5);
if(SW4State != SW5State) {
digitalWrite(LED4, HIGH);
}
else {
digitalWrite(LED4, LOW);
}
¿Imita correctamente la salida de una puerta XOR? ¿Puede
recrear la operación XOR usando el operador de igualdad '=='
en lugar de usar el operador de desigualdad '!=', y aún así producir
la misma salida? ¡Inténtelo!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment