Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción a Arduino
Iván Ferrari*
Abril, 2021
1
Arduino: módulos adicionales Laboratorio I
Contenido
1 Curso de Introducción a Arduino 3
1.1 ¿Qué es Arduino? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
5 Programación en Arduino 9
5.1 Programa mínimo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.2 Importando librerías y comentando el código . . . . . . . . . . . . . . . . . . . . . . . 9
5.3 Encencer un Led . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5.4 Comunicación Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5.5 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.6 Operadores de comparación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.7 Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.8 Control de flujo: if, if/else, if/else if/ else . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.9 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.10 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.11 Uso del pulsador y pin de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.12 Uso de pulsador estable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.13 Buenas prácticas de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.14 Pseudocódigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.15 Comparación entre Arduino y PLCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
No necesitan tener una placa real, ni ningún otro elemento más que un navegador web para seguir
este curso!
1.2 Microcontrolador
Es un circuito integrado programable, capaz de ejecutar las órdenes grabadas en su memoria.
Compuesto de varios bloques funcionales que cumplen una tarea específica. Incluye en su interior
las tres principales unidades funcionales de una computadora: * cpu * memoria * perisféricos de
entrada y salida
Es un computador completo en un solo circuito integrado. Por
ejemplo, el arduino UNO utiliza un micropocesador atmega 328p:
Sin embargo,no tiene el poder de cálculo de una computadora de escritorio moderna. No se puede
instalar un sistema operativo. El microprocesador es pequeño y limitado por ejemplo un arduino
Uno tiene 2KB de RAM (siendo 1GB igual a ~1 millon de KB)
Sirve para proyectos electrónicos que debajo consumo y pequeño tamaño.
También es ampliamente usado en áreas en desarrollo como internet de las cosas (IOT), domótica
y robótica ligera de código abierto
* micro-
controlador * pines de energía, pines analógicos, pines digitales pwm y comunicación, * com-
ponentes de almentación y regulación de voltaje * componentes de conexión USB para energía y
comunicación, chip de usb a serial IC(integrated circuit)y Bootloader
(antes se programaba el micropocesador y luego se montaba en el circuito, en arduino es mas facil
porque incluye el dispositibo necesario para programar conectando desde un usb)
Se programan con el mismo lenguaje, pero varían en su capacidad de cálculo, cada año sale nuevas
versiones y nuevos modelos
4.1 Protoboard
Placa para realizar conexiones de prueba
5 Programación en Arduino
El lenguaje usado por Arduino es un subconjunto del lenguaje C++ con varias funciones propias
para el uso del microcontrolador.
[ ]: void setup() {
}
void loop() {
}
De esta forma se importan las distintas librerías que ser requieran para el código. La librería
Arduino.h es la que trae todas las funciones básicas específicas de Arduino y siempre es incluida
por el compilador por lo que no es necesario declararla. Aquí se incluye a modo de ejemplo.
Además se muuestran dos formas re realizar comentarios. Los comentarios son textos que serán
ignorados por el compilador pero son fundamentales para documentar el código y hacerlo más
legible. Ya sea cuando el código lo lee un programador distinto al que lo escribió, o cuando lo lee
el mismo tiempo despues de olvidar los detalles de funcionamiento del mismo.
• Utilizando /* inicia un bloque de comentarios que termina con */
• Utilizando // se crea un comentario hasta el siguiente salto de línea
Producir un código bien documentado es parte de las buenas prácticas de programación. Los
comentarios de el siguiente código sirven a modo de ejemplo e introducción. No deben re-
alizarse cometnarios de cosas que resulten evidentes y en general es mejor que los nombres de
las funciones y variables muestren clarametne su función, a esto se le denomina un código auto-
documentado. El objetivo final es siempre auntar la claridad del código
[ ]: /*
Esto es un bloque de comentario, será ignorado por el compilador
es útil para documentar el código
*/
void setup() {
//Aquí va el código que se ejecuta una sola vez
}
void loop() {
//Aquí va el código que se ejecuta en una y otra vez de forma continua
}
En la im-
agen se muestra la conexión de componentes a la placa Arduino, se considera que los ejemplos
posteriores siguen usando la última conexión mostrada hasta que se presente una nueva.
[ ]: void setup(){
pinMode(13, OUTPUT);
Serial.begin(9600); // inicia la comunicación por el puerto serial a
,→9600 baudios
void loop(){
digitalWrite(13, HIGH);
Serial.print("ON\n") // imprime el mensaje "ON" usa "\n" para el salto
,→de línea
delay(1000);
digitalWrite(13, LOW);
Serial.println("OFF"); // imprime "OFF", la función Serial.println()
,→incluye el salto de línea
delay(1000);
}
5.5 Variables
Hasta ahora tenemos un ejemplo de base donde controlamos un led, establecimos comunicación
con nuestra computadora y podemos ver los mensajes por el monitor serial. Es buen momento
para introducir algunos conceptos básicos de programación.
Empecemos viendo los tipos de datos que se usan en el lenguaje de Arduino, pueden ver la lista
completa en este enlace.
<img src=“i/variables.png” width=“10000”)>
En el siguiente ejemplo se muestra el uso de los tipos de datos más comunes en Arduino. Lo
primero que hay que destacar es que cada variable se define con:
<tipo de dato> <nombre de la variable> = <valor de inicialización>;
Aunque en realidad podríamos
Ver en simulador
[ ]: /*
Sketch con ejemplo en el uso de variables
*/
# define LED 13 // define reemplaza el valor antes de
,→compilar
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
Serial.println(texto);
Serial.print(textoEntero);
Serial.println(numeroEntero);
Serial.println(numeroDecimal);
Serial.println(2*numeroDecimal2);
}
void loop(){
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}
A && B A and B
A continuación, una lista de valos operadores lógicos más comunes, con sus dos formas de expre-
sión posible dentro del lenguaje * and, && * or, ||
• not, !
Otros operadores lógicos. . . * xor, ˆ * and_eq, &= * bitand, & * bitor, | * not_eq, != * or_eq, |= *
xor_eq, ˆ=
[ ]: /*
Sketch condicionales para encender un led
*/
int a=1;
int b;
String mensaje;
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600); // inicia la comunicación serial
}
void loop(){
mensaje=Serial.readString();
if(mensaje!=""){
b=mensaje.toInt();
if(a>b){
digitalWrite(13,HIGH);
Serial.println("mayor");
delay(1500);
digitalWrite(13,LOW);
}
else if(a==b){
digitalWrite(12, HIGH);
Serial.println("igual");
delay(1500);
digitalWrite(12,LOW);
}
else{
digitalWrite(11, HIGH);
Serial.println("menor");
delay(1500);
digitalWrite(11,LOW);
}
}
}
Podríamos colocar tantos “else if” anidados como necesitemos, pero para aquellas situaciones
en las que tenemos que controlar el flujo entre varias opciones tenermos la estructura de control
switch. . . case
[ ]: switch (mensaje) {
case "":
// statements
break;
case "ON_led1":
encender_led_1();
// statements
break;
default:
// statements
break;
}
5.9 Funciones
Podemos tomar el código anterior y modificarlo de modo que el bloque que se ejecuta para en-
cender cada led esté contenido en una función void. De este modo el código del loop resulta más
claro, además las funciones podrían reutilizarse en otra parte del código. simulador
[ ]: /*
Sketch básico ejemplo de uso de fucniones
*/
int a=1;
int b;
String mensaje;
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600); // inicia la comunicación serial
void loop(){
mensaje=Serial.readString();
b=mensaje.toInt();
if(a>b){
rojo(); // llama a la función del led rojo
}
else if(a==b){
azul(); // llama a la función del led azul
}
else{
verde(); // llama a la función del led verde
}
}
[ ]: # define rojo 13
# define azul 12
# define verde 11
void setup(){
pinMode(rojo, OUTPUT);
pinMode(azul, OUTPUT);
pinMode(verde, OUTPUT);
Serial.begin(9600); // inicia la comunicación serial
}
void loop(){
mensaje=Serial.readString();
if (mensaje!=""){
b=mensaje.toInt();
if(a>b){
encender_led(rojo, "mayor");
}
else if(a==b){
encender_led(azul, "igual");
}
else{
encender_led(verde, "menor");
}
}
}
5.10 Bucles
Es muy común en un programa, tener que realizar una operación similar varias veces, para esto
existen estructuras de control llamadas bucles. En esta sección veremos las dos más usadas for,
while y do. . . while. Existen otras estructuras que pueden consultar en la web de referencia de
Arduino
Veamos un ejemplo donde queremos ver por el monitor serial los n primeros números natu-
rales,para n=3
[ ]: /*
Sketch con ejemplos para usar bucles
*/
int n=3;
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
for (int i=1; i<4; i++){ // para i=0 hasta i<4, en cada paso i=i+1
(actualiza i)
,→
void loop()
{
for: 1
for: 2
for: 3
while: 1
while: 2
while: 3
do...while: 1
do...while: 2
do...while: 3
Diferencia entre while y do. . . while
En el siguiente ejemplo se muestra como podemos usar los bucles definidos para controlar varios
leds. ver en el simulador
[ ]: /*
Sketch con ejemplos para controlar leds usando bucles
*/
int n=3;
void setup()
{
Serial.begin(9600);
void loop()
{
int j=1; // j=1
do{ // ejecuta este bloque al menos una vez ...
digitalWrite(j,HIGH); // ...
delay(500);
j++; // j=j+1 (actualiza j)
for (int i=3; i>0; i--){ // para i=0 mientras i<4, en cada paso i=i+1
(actualiza i)
,→
[ ]: void setup(){
pinMode(13, OUTPUT);
pinMode(2, INPUT);
Serial.begin(9600); //inicia comunicación serial
}
void loop(){
if(digitalRead(2)==HIGH){
digitalWrite(13, HIGH);
Serial.print("ON\n");
}
else{
digitalWrite(13, LOW);
Serial.println("OFF");
}
}
pulsador 2
[ ]: bool anterior=0;
bool actual=0;
bool encendido=0;
void setup(){
pinMode(13, OUTPUT);
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop(){
actual = pulsar(anterior); //lee el estado sin "rebotes"
if (anterior == LOW && actual == HIGH){ // si fue presionado el botón
encendido = !encendido; // cambia el estado del led
}
anterior = actual; // resetea el valor del botón
digitalWrite(13, encendido); // cambia el estado del led
}
5.14 Pseudocódigo
pseudocódigo herramienta para expresar un algoritmo en forma natural, muestra el orden de
ejecución de las acciones de un programa de forma clara
representa la solución de un algoritmo de forma detallada y paso a paso de forma similar a lo que
va a ejecutar el programa real
es una abstracción q permite plantear la solución a un problema sin preocuparse por la sintáxis
específica de un lenguaje
dentro de la industria es para todas nuevas aplicaciones de monitoreo de datos con dispositivos
del denominado IOT (internet of things) y la industria 4.0. En donde la baja en los costos para
sensores y comunicación permite levantar datos en numerosos puntos de un proceso. Datos que
luego serán procesados para generar modelos matemáticos que permitan optimizar y predecir el
comportamiento de los sistemas estudiados.
Visite los siguientes enlaces para conocer más sobre productos derivados y compatibles con ar-
duino diseñados para uso industrial:
• https://www.industrialshields.com/es_ES/
• https://www.controllino.biz/
• https://industruino.com/
• https://www.arduino.cc/pro/hardware/product/portenta-h7