Created
May 17, 2025 01:41
-
-
Save CravApp/4740ff793deff155f39b12c94ae2a21e to your computer and use it in GitHub Desktop.
Programar Arduino
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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