Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Una vez descargado ejecutarlo. Después de efectuar una rápida verificación del
archivo se mostrara la primera ventana que pide aceptar los términos de la licencia,
hacer clic en “I Agree”
La siguiente ventana debe tener todas las opciones habilitadas, hacer clic en “Next>”
_____________________________________________________________________________________________________________________
A continuación escoger la ruta de instalación, o dejar la misma por defecto, hacer clic
en “Install”.
Esperar a que se instale el software, una vez finalizado hacer clic en “Close”
_____________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________
Conectar la tarjeta a un Puerto USB, recordar que para posteriores usos de la tarjeta
Arduino es recomendable utilizar el mismo puerto USB. Al efectuar esta operación el
sistema operativo mostrara la siguiente ventana:
Escoger la primera opción, tal como muestra el grafico y hacer clic en “Siguiente”,
aparecerá la siguiente ventana:
_____________________________________________________________________________________________________________________
Como puede observarse en la anterior ventana, escoger la segunda opción, hacer clic
en examinar y buscar la carpeta Archivos de programa – Arduino – Drivers – FTDI USB
Drivers, seleccionar la misma, hacer clic en “Aceptar” y luego clic en “Siguiente”.
Para el caso de Arduino de procedencia China buscar la carpeta “CH341SER” en la
documentación del presente seminario, seleccionar la misma y hacer clic en “Aceptar”.
_____________________________________________________________________________________________________________________
Una vez realizadas las anteriores operaciones el sistema operativo instalará el driver
respectivo para el chip que permite comunicarnos con la tarjeta Arduino Uno a través de
un Puerto USB.
Y aquí podemos observar que el puerto para la placa Arduino es “COM 5”, tomar nota
de este detalle y cerrar todas las ventanas abiertas.
Ojo, este valor puede cambiar de una computadora a otra, lo importante es que el
adaptador sea reconocido por Windows y podamos averiguar que numero de puerto le
fue asignado.
_____________________________________________________________________________________________________________________
Como toda aplicación Windows, esta ventana muestra una barra de título en la parte
superior, la primera parte que dice “sketch_jul01a” es el nombre por defecto que
Arduino asigna al programa que vamos a realizar (sketch se podría traducir como:
bosquejo, croquis o esquema); la segunda parte del texto mostrado en la barra de titulo
no se puede modificar, indica el nombre del programa y la versión utilizada.
Para comenzar veamos como guardar un programa y como cambiar el nombre por
defecto del mismo, para ello ir al menú “Archivo”, escoger la opción “Guardar como…”,
escoger la ruta donde se desea guardar este primer programa, asignar un nombre para
el mismo y hacer clic en “Guardar”, de esta manera, en la ubicación escogida se habrá
creado una carpeta con el nombre asignado y en la misma un archivo con extensión
“ino” que también lleva el mismo nombre.
Para mi caso asigne como nombre Javier 01 y la barra de titulo queda de la siguiente
manera:
_____________________________________________________________________________________________________________________
Bien, Ahora observemos la parte central de la ventana, el espacio en fondo blanco, todo
programa para Arduino requiere de dos bloques, el primero de configuración que lleva
el nombre “setup”, y el segundo de repetición o bucle, identificado como “loop”. El inicio
y final de un bloque ó de una estructura de control están identificados por los símbolos
de llave abierta y llave cerrada, a partir de ahora toda llave abierta que veamos o
escribamos significa “comienzo”, y toda llave cerrada significara “fin”; siempre que se
coloque una llave abierta, esta deberá ir acompañada de su respectiva pareja, la llave
cerrada.
Para identificar las parejas de llaves sugiero colocarlas en la misma columna y no como
lo hace el entorno de Arduino por defecto, las líneas de texto que comienzan con doble
barra inclinada son solamente comentarios, por el momento ellas no son de gran ayuda
(a menos que tengan conocimientos de inglés), entonces podemos proceder a
borrarlas, si seguimos ambos consejos los bloques de programación deberán quedar
así:
Ahora sí, estamos listos para comenzar a codificar nuestro primer programa, y si hay
suerte subirlo al módulo Arduino y verlo funcionar. Para guardar las modificaciones
realizadas hasta el momento ir al menú “Archivo” y escoger la opción “Salvar”.
Entonces, como vamos a realizar un programa que sea capaz de encender y apagar un
LED, comencemos por escoger el terminal digital al cual conectaremos nuestro
indicador luminoso, recomiendo escoger el terminal 13, en cuyo caso la conexión del
mencionado LED deberá ser efectuada tal como muestra el siguiente gráfico:
_____________________________________________________________________________________________________________________
Para elaborar la parte que corresponde al software, comenzaremos por indicar que el
terminal 13 actuara como salida, para ello la instrucción a utilizar es “pinMode”, esta
requiere dos parámetros encerrados entre paréntesis, el número de terminal y el tipo,
finalmente un punto y coma.
Para el tipo de terminal, si el mismo será una salida digital escribiremos “OUTPUT”, si
se requiriera que un terminal actué como entrada digital se deberá digitar “INPUT”; esta
codificación se la realiza en el bloque de configuración (setup), entonces el programa
quedara con el siguiente aspecto:
Dos detalles a tomar en cuenta, cada instrucción en el entorno Arduino termina con un
punto y coma, para poder observar con mayor claridad el par de llaves que indican
inicio y final del bloque de configuración, las instrucciones escritas en el interior de la
misma deberán tener sangría, para ello presionar la tecla de tabulación una o dos veces
antes de comenzar a digitar las mismas o utilizar la tecla espaciadora unas 3 veces.
_____________________________________________________________________________________________________________________
Todas las instrucciones escritas al interior del bloque “loop” se repiten de manera
automática e indefinida, recordar hacer uso de sangría al escribir las instrucciones que
encienden y apagan el LED.
_____________________________________________________________________________________________________________________
El mensaje dice más o menos “Falta ; antes de digitalWrite”; ahora supongamos que
olvido la “H” de “HIGH”, el resultado es este:
Toma a “HIG” como una variable que no ha sido declarada; pongamos todo en orden y
procedamos a subir nuestro programa a la placa Arduino; antes de efectuar esta
operación debemos conectar la misma a un puerto USB mediante el cable
correspondiente, ahora configuramos el tipo de placa que tenemos mediante el menú
“Herramientas” escogiendo la opción que comienza con “Placa:” y para la misma
seleccionamos “Arduino/Genuino Uno”
_____________________________________________________________________________________________________________________
A continuación seleccionamos el puerto serial que utiliza la placa Arduino, este número
de puerto debe ser el mismo que se generó cuando instalamos el driver de la tarjeta, se
acuerdan ¿verdad?, caso contrario vuelvan a leer el subtítulo “Instalación Driver
Arduino Uno”.
Ojo, el número de puerto serial (COM) puede variar de una computadora a otra, lo
importante es que en la ventana anterior podamos escoger el puerto asignado al
controlador de Arduino, incluso no es raro que aparezca más de un puerto serial, de
todos los que se muestren escoger el generado para Arduino y procurar utilizar siempre
el mismo puerto USB del computador.
Con todo listo no queda más que hacer clic sobre el icono de “Subir”, identificado por
una flecha a la derecha:
_____________________________________________________________________________________________________________________
Realmente son lo máximo, para aquellos compañer@s que no lograron estos objetivos
se merecen un jalón de orejas, luego de hacerlo (el jalón quiero decir) vuelvan a leer la
presente guía desde el principio.
_____________________________________________________________________________________________________________________
Los terminales a utilizar serán del 6 al 13, entonces nuestro hardware quedara
de la siguiente manera:
_____________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________
5.2. Variables
_____________________________________________________________________________________________________________________
Los valores que utiliza la función delay con de tipo entero (int), entonces la
variable que almacenara el valor para la mencionada función también será de
este tipo, la declaración y asignación de valor se la realiza de la siguiente
manera:
Como puede observarse, la declaración está escrita antes del bloque “setup”,
comienza con la palabra “int” que determina el tipo de datos que se almacenara,
a continuación el nombre o identificador de la variable, en este caso “tiempo” y
luego de un signo de igual el valor inicial que adoptara la mencionada variable;
esta parte de asignación de valor inicial es opcional.
void loop()
{
digitalWrite (13,0);
digitalWrite (12,0);
digitalWrite (11,0);
digitalWrite (10,0);
digitalWrite (9,0);
digitalWrite (8,1);
delay (tiempo);
digitalWrite (13,0);
digitalWrite (12,0);
digitalWrite (11,0);
digitalWrite (10,0);
digitalWrite (9,1);
digitalWrite (8,1);
delay (tiempo);
.
.
.
.
_____________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________
Son aquellas que combinan operaciones aritméticas con una o más variables,
estas se utilizan en estructuras de control, como la “for: mencionada
anteriormente.
En los últimos cuatro casos del anterior listado, el valor de “y” puede ser
reemplazado por un valor constante (un número cualquiera).
Son aquellas que permiten efectuar comparaciones entre valores y/o variables
en estructuras de control o cualquier otro lugar que el programador requiera, las
que están disponibles en el entorno de desarrollo para Arduino son las
siguientes:
x == y // x es igual a y
x != y // x es distinto a y
x<y // x es menor que y
x>y // x es mayor que y
x <= y // x es menor igual que y
x >= y // x es mayor igual que y
_____________________________________________________________________________________________________________________
void setup()
{
pinMode (13, OUTPUT);
}
void loop()
{
digitalWrite (13,1);
delay (tiempo1);
digitalWrite (13,0);
delay (tiempo1);
digitalWrite (13,1);
delay (tiempo1);
digitalWrite (13,0);
delay (tiempo1);
digitalWrite (13,1);
delay (tiempo1);
digitalWrite (13,0);
delay (tiempo1);
digitalWrite (13,1);
delay (tiempo1);
digitalWrite (13,0);
delay (tiempo1);
digitalWrite (13,1);
delay (tiempo1);
digitalWrite (13,0);
delay (tiempo2);
}
_____________________________________________________________________________________________________________________
Un detalle que se me olvidaba, para hacer uso de una estructura for se requiere
una variable, de tipo entera preferiblemente, la cual será la encargada de llevar el
conteo, es decir, esta variable cambiara de valor comenzando en 1 y terminando
en 5 para este ejemplo en particular.
Para finalizar este ejemplo: el nuevo código a escribir para conseguir que el LED
del terminal 13 se encienda y apague 5 veces, y luego una pausa de 3 segundos
será:
int tiempo1 = 500;
int tiempo2 = 3000;
int conteo;
void setup()
{
pinMode (13, OUTPUT);
}
void loop()
{
for ( conteo=1 ; conteo <= 5 ; conteo ++ )
{
digitalWrite (13,1);
delay (tiempo1);
digitalWrite (13,0);
delay (tiempo1);
}
delay (tiempo2);
}
Fácil, ¿no ve?, de esta manera se puede hacer que una porción de código se
repita n veces, y nada impide que el valor de la variable contador, o la misma
variable sea utilizada al interior del código que ejecuta esta estructura. Esto lo
veremos en ejemplos posteriores.
_____________________________________________________________________________________________________________________
Este trabajo lo tendrá que realizar nuestro programa, para ello utilizaremos el
método de división sucesiva donde los residuos obtenidos de cada operación
forman el equivalente binario.
Entonces, como nuestras combinaciones son de 6 bits debemos efectuar 6
divisiones sucesivas obteniendo en cada operación los residuos que serán
enviados a cada una de los terminales que actúan como salidas en la placa
Arduino; el código que efectúa esta operación puede tener el siguiente aspecto:
void setup()
{ pinMode (13, OUTPUT);
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
}
void loop()
{ dato=7;
digitalWrite(8,dato % 2);
dato=dato/2;
digitalWrite(9,dato % 2);
dato=dato/2;
digitalWrite(10,dato % 2);
dato=dato/2;
digitalWrite(11,dato % 2);
dato=dato/2;
digitalWrite(12,dato % 2);
dato=dato/2;
digitalWrite(13,dato % 2);
}
5.11. Vectores
_____________________________________________________________________________________________________________________
void setup()
{ pinMode (13, OUTPUT);
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
}
void loop()
{
for ( conta = 0 ; conta <= 6 ; conta++ )
{
dato=vector[conta];
digitalWrite(8,dato%2);
dato=dato/2;
digitalWrite(9,dato%2);
dato=dato/2;
digitalWrite(10,dato%2);
dato=dato/2;
digitalWrite(11,dato%2);
dato=dato/2;
digitalWrite(12,dato%2);
dato=dato/2;
digitalWrite(13,dato%2);
delay(tiempo);
}
}
_____________________________________________________________________________________________________________________
.
Tomar nota del siguiente detalle, al generar la secuencia de 7 combinaciones, la
estructura for utilizada hacia un conteo de 0 a 6, justamente para recorres las 7
posiciones del vector, para la anterior tabla el contador automático deberá ir de 0
a 17.
Ahora una pequeña modificación en los rangos del contador automático, presten
mucha atención: como todo vector comienza en posición cero vamos a
aprovechar esta primera ubicación para indicar la cantidad de combinaciones
que tiene nuestra secuencia, este valor luego podrá ser utilizada por la estructura
for para que el conteo solo llegue hasta el valor indicado, de esta manera será
aún más fácil programar secuencias.
void setup()
{ pinMode (13, OUTPUT);
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
}
void loop()
{
for ( conta = 1 ; conta <= vector [0] ; conta++ )
{
dato=vector[conta];
digitalWrite(8,dato%2);
dato=dato/2;
digitalWrite(9,dato%2);
dato=dato/2;
digitalWrite(10,dato%2);
dato=dato/2;
digitalWrite(11,dato%2);
dato=dato/2;
digitalWrite(12,dato%2);
dato=dato/2;
digitalWrite(13,dato%2);
delay(tiempo);
}
}
Y listo, para crear secuencias solo modificar la declaración del vector.
_____________________________________________________________________________________________________________________
Esta instrucción es la que permite leer el estado lógico que recibe una entrada
binaria, para utilizarla solo debe especificarse el número de terminal que fue
declarado como entrada digital. El valor leído puede ser almacenado en una
variable.
Dato = digitalRead (2);
El valor obtenido puede ser llevado a una variable o ser utilizada en operaciones
de comparación. Si se opta por la segunda opción se deberá hacer uso de
alguna estructura de control para determinar las acciones a realizar de acuerdo
al valor recibido, entre las más utilizadas para este propósito están:
Estructura de control if
Estructura de control if – else
Estructura de control while
8.2. Estructura if
if ( dato == valor )
{
Instrucción
Instrucción
......
}
Para nuestro cuarto ejemplo “dato” podría ser el valor leído de una entrada
digital; “valor” puede ser “0” o “1” y las instrucciones encerradas entre llaves
serán las encargadas de encender o apagar el LED conectado a la salida binaria
_____________________________________________________________________________________________________________________
El programa solicitado debe leer las seis entradas digitales, y de acuerdo al valor
encontrado las salidas binarias deberán adoptar el mismo valor, la relación de
correspondencia entre una salida y una entrada será la siguiente:
void setup()
{
pinMode (13, OUTPUT);
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
void loop()
{
digitalWrite(13,0);
digitalWrite(12,0);
digitalWrite(11,0);
digitalWrite(10,0);
digitalWrite(9,0);
digitalWrite(8,0);
if(digitalRead(2)==1)
{ digitalWrite(13,1);
}
if(digitalRead(3)==1)
{ digitalWrite(12,1);
}
if(digitalRead(4)==1)
{ digitalWrite(11,1);
}
if(digitalRead(5)==1)
{ digitalWrite(10,1);
_____________________________________________________________________________________________________________________
Observar que el programa al inicio coloca a “0” todas las salidas binarias, luego
de efectuar una comparación con el valor “1” si esta resulta cierta la salida
binaria correspondiente es puesta también en “1”. Subir el programa a la placa
para verificar su funcionamiento.
Cuando una estructura de control ejecuta una sola instrucción el par de llaves
puede obviarse, pero es mejor ir acostumbrándose a utilizarlas ya que obviar las
mismas puede generar errores difíciles de encontrar.
if ( dato == valor )
{
Instrucción
Instrucción
......
}
else
{
Instrucción
Instrucción
......
}
void loop()
{
if(digitalRead(2)==1)
_____________________________________________________________________________________________________________________
if(digitalRead(3)==1)
{ digitalWrite(12,1);
}
else
{ digitalWrite(12,0);
}
if(digitalRead(4)==1)
{ digitalWrite(11,1);
}
else
{ digitalWrite(11,0);
}
if(digitalRead(5)==1)
{ digitalWrite(10,1);
}
else
{ digitalWrite(10,0);
}
if(digitalRead(6)==1)
{ digitalWrite(9,1);
}
else
{ digitalWrite(9,0);
}
if(digitalRead(7)==1)
{ digitalWrite(8,1);
}
else
{ digitalWrite(8,0);
}
Notar que en este caso no se requiere inicializar los valores de las salidas
digitales cada vez que inicia el bloque loop.
void loop()
{
if(digitalRead(2)==0)
{ digitalWrite(13,1);
}
else
{ digitalWrite(13,0);
}
if(digitalRead(3)==0)
{ digitalWrite(13,1);
digitalWrite(12,1);
}
else
{ digitalWrite(13,0);
digitalWrite(12,0);
}
if(digitalRead(4)==0)
{ digitalWrite(13,1);
digitalWrite(12,1);
digitalWrite(11,1);
}
else
{ digitalWrite(13,0);
digitalWrite(12,0);
digitalWrite(11,0);
}
if(digitalRead(5)==0)
{ digitalWrite(13,1);
digitalWrite(12,1);
digitalWrite(11,1);
digitalWrite(10,1);
}
else
{ digitalWrite(13,0);
digitalWrite(12,0);
digitalWrite(11,0);
digitalWrite(10,0);
}
if(digitalRead(6)==0)
{ digitalWrite(13,1);
digitalWrite(12,1);
digitalWrite(11,1);
_____________________________________________________________________________________________________________________
if(digitalRead(7)==0)
{ digitalWrite(13,1);
digitalWrite(12,1);
digitalWrite(11,1);
digitalWrite(10,1);
digitalWrite(9,1);
digitalWrite(8,1);
}
else
{ digitalWrite(13,0);
digitalWrite(12,0);
digitalWrite(11,0);
digitalWrite(10,0);
digitalWrite(9,0);
digitalWrite(8,0);
}
A estas alturas del partido se acuerdan del programa para generar secuencias
recurriendo a un vector, espero que si, ahora añadiremos una mejora a dicho
programa, aprovechando que aprendimos a utilizar las entradas digitales
utilizaremos dos de ellas como control de velocidad, la idea es que al presionar
_____________________________________________________________________________________________________________________
Para que el valor de retardo cambie a intervalos de 100 ms haremos que el valor
de la variable “tiempo” sea multiplicada por 100 al asignarse este a la función
“delay”; tomar en cuenta que el valor del retardo no puede reducirse a valores
inferiores a cero y tampoco es conveniente que se incremente hasta valores muy
grandes, por este motivo se deberá controlar los valores máximo y mínimo que
podrá adoptar la variable “tiempo”. El mínimo será 1 ( 1 x 100 ms = 100 ms) y el
máximo para este ejemplo no sobrepasara el valor 9 ( 9 x 100 ms = 900 ms).
El control del valor máximo y mínimo que puede adoptar la variable “tiempo” se la
efectuara a través de estructuras if, el resultado de la codificación para este
programa podría tener el siguiente aspecto:
void setup()
{ pinMode (13, OUTPUT);
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
void loop()
{
for ( conta = 1 ; conta <= vector [0] ; conta++ )
{
dato = vector[conta];
digitalWrite( 8 , dato%2 );
dato=dato/2;
digitalWrite( 9 , dato%2 );
dato=dato/2;
digitalWrite( 10 , dato%2 );
dato=dato/2;
digitalWrite( 11 , dato%2 );
_____________________________________________________________________________________________________________________
if ( digitalRead(2) == 0)
{ if (tiempo >= 2)
{ tiempo = tiempo - 1;
}
}
if ( digitalRead(3) == 0)
{ if (tiempo <= 8)
{ tiempo = tiempo + 1;
}
}
}
}
Para este ejemplo desarrollaremos una aplicación que puede ser denominada
“Secuencial Múltiple”, la misma tendrá programadas múltiples secuencias las
cuales se podrán ir cambiando mediante dos entradas binarias, al igual que se
hace con el control de velocidad del anterior ejemplo, para ello recurriremos a un
vector de múltiples dimensiones, el cual suele ser denominado matriz.
_____________________________________________________________________________________________________________________
Al igual que en una variable, o en un vector, para poder utilizar una matriz lo
primero es declararla, para ello asignamos un nombre y entre dos pares de
corchetes la cantidad de filas y columnas (en ese orden) que podrán utilizarse,
ejemplo:
int secuencias[3][10] =
{
{ 2 , 1 , 2 , 4 , 8 , 16 , 32 },
{ 9 , 32 , 16 , 8 , 4 , 2 , 1 , 0 },
{ 1 ,33 , 18 , 12},
};
Primera secuencia:
Segunda secuencia:
_____________________________________________________________________________________________________________________
Tercera secuencia:
Cuarta secuencia:
Quinta secuencia
_____________________________________________________________________________________________________________________
byte secuencias[5][13] =
{
{ 6 , 1 , 2 , 4 , 8 , 16 , 32 },
{ 6 , 32 , 16 , 8 , 4 , 2 , 1 },
{ 12 , 0 , 32 , 48 , 56 , 60 , 62 , 63 , 31 , 15 , 7, 3 , 1 },
{ 5 , 48 ,12 , 3 , 12, 48 },
{ 5 , 33 ,18 , 12 , 18 , 33 },
};
byte secuencias[5][13] =
{
{ 6 , 1 , 2 , 4 , 8 , 16 , 32 },
{ 6 , 32 , 16 , 8 , 4 , 2 , 1 },
{ 12 , 0 , 32 , 48 , 56 , 60 , 62 , 63 , 31 , 15 , 7, 3 , 1 },
{ 5 , 48 ,12 , 3 , 12, 48 },
{ 5 , 33 ,18 , 12 , 18 , 33 },
};
void setup()
{ pinMode (13, OUTPUT);
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
void loop()
{ for (conta = 1 ; conta <=secuencias[efecto][0] ; conta++)
{ dato = secuencias [ efecto ] [ conta ] ;
digitalWrite ( 8 , dato%2 );
dato = dato / 2;
digitalWrite ( 9 , dato%2 );
dato = dato / 2;
digitalWrite ( 10 , dato%2 );
dato = dato / 2;
digitalWrite ( 11 , dato%2 );
dato = dato / 2;
digitalWrite ( 12 , dato%2 );
dato = dato / 2;
digitalWrite ( 13 , dato%2 );
delay ( tiempo * 100 ) ;
if ( digitalRead(2) == 0 )
if ( tiempo >= 2 )
tiempo = tiempo - 1;
if ( digitalRead(3) == 0)
if (tiempo <= 8)
tiempo = tiempo + 1;
if( digitalRead(4) == 0 )
if( efecto >= 1 )
efecto = efecto - 1;
if( digitalRead(5) == 0 )
if( efecto <= 3 )
efecto = efecto + 1;
}
}
_____________________________________________________________________________________________________________________