Reporte de La Programacion
Reporte de La Programacion
Reporte de La Programacion
Se trata de una placa open hardware por lo que su diseño es de libre distribución y utilización, que incluso podemos
construirnos nosotros mismos (En la Figura 1 se observa el aspecto de la placa). En la siguiente web puede encontrarse
mucha información relativa a la placa:
Figura 1. Aspecto de la placa Arduino Duemilanove.
El programa se implementará haciendo uso del entorno de programación propio de arduino y se transferirá empleando
un cable USB. Si bien en el caso de la placa USB no es preciso utilizar una fuente de alimentación externa, ya que el propio
cable USB la proporciona, para la realización de algunos de los experimentos prácticos sí que será necesario disponer de
una fuente de alimentación externa ya que la alimentación proporcionada por el USB puede no ser suficiente. El voltaje
de la fuente puede estar entre 6 y 25 Voltios.
Entorno de desarrollo
Para programar la placa es necesario descargarse de la página web de Arduino el entorno de desarrollo (IDE). Se dispone
de versiones para Windows y para MAC, así como las fuentes para compilarlas en LINUX. En la Figura 2 se muestra el
aspecto del entorno de programación. En el caso de disponer de una placa USB es necesario instalar los drivers FTDI. Estos
drivers vienen incluidos en el paquete de Arduino mencionado anteriormente. Existen en la web versiones para distintos
sistemas operativos.
Lo primero que tenemos que hacer para comenzar a trabajar con el entorno de desarrollo de arduino es configurar las
comunicaciones entre la placa Arduino y el PC. Para ello deberemos abrir en el menú "Tools" la opción "Serial Port". En
esta opción deberemos seleccionar el puerto serie al que está conectada nuestra placa. En Windows, si desconocemos el
puerto al que está conectado nuestra placa podemos descubrirlo a través del Administrador de dispositivos (Puertos COM
& LPT/ USB Serial Port).
El primer paso para comprobar que todo lo que hemos hecho hasta ahora está bien y familiarizarnos con el interfaz de
desarrollo, es abrir uno de los ejemplos. Se recomienda abrir el ejemplo "Blink". Para ello debemos acceder a través del
menú File ( Sketchbook ( Examples ( Digital ( Blink.
El ejemplo "Blink" lo único que hace es parpadear un LED que está colocado en el pin número 13 de la placa. Vamos a ver
qué hay que hacer para subir el programa a la placa Arduino. Primero comprobamos que el código fuente es el correcto.
Para ello pulsamos el botón de verificación de código que tiene forma de triángulo inclinado 90 grados (Figura 3.a). Si todo
va bien deberá aparecer un mensaje en la parte inferior de la interfaz indicando "Done compiling". Una vez que el código
ha sido verificado procederemos a cargarlo en la placa. Para ello tenemos que pulsar el botón de reset de la placa (Figura
3.b) e inmediatamente después pulsar el botón que comienza la carga (Figura 3.c).
Durante la carga del programa, en la placa USB, se encenderán los LED que indican que se están enviando y recibiendo
información por el puerto serie: TX/RX. Si todo se ha realizado correctamente debe aparecer el mensaje "Done uploading".
Ahora tan sólo queda esperar unos 8 segundos aproximadamente para comprobar que todo ha salido bien. Si el led
colocado en el pin 13 de la placa se enciende y se apaga cada segundo entonces todo ha ido bien. Por fin tenemos todo
listo para empezar a trabajar con la placa Arduino.
Estructura de un programa
La estructura básica del lenguaje de programación de Arduino es bastante simple y se compone de al menos dos partes.
Estas dos partes necesarias, o funciones, encierran bloques que contienen declaraciones, estamentos o instrucciones.
void setup() //Primera Parte
{
estamentos;
}
void loop() //Segunda Parte
{
estamentos;
}
En donde setup() es la parte encargada de recoger la configuración y loop() es la que contiene el programa que se
ejecutará cíclicamente (de ahí el término loop –bucle-). Ambas funciones son necesarias para que el programa trabaje.
La función de configuración (setup) debe contener la declaración de las variables. Es la primera función a ejecutar en el
programa, se ejecuta sólo una vez, y se utiliza para configurar o inicializar pinMode (modo de trabajo de las E/S),
configuración de la comunicación en serie y otras.
La función bucle (loop) siguiente contiene el código que se ejecutara continuamente (lectura de entradas, activación de
salidas, etc) Esta función es el núcleo de todos los programas de Arduino y la que realiza la mayor parte del trabajo.
setup()
La función setup() se invoca una sola vez cuando el programa empieza. Se utiliza para inicializar los modos de trabajo de
los pins, o el puerto serie. Debe ser incluido en un programa aunque no haya declaración que ejecutar. Así mismo se puede
utilizar para establecer el estado inicial de las salidas de la placa.
void setup()
{
pinMode(pin, OUTPUT); // configura el 'pin' como salida
digitalWrite(pin, HIGH); // pone el ‘pin’ en estado HIGH
}
loop()
Después de llamar a setup(), la función loop() hace precisamente lo que sugiere su nombre, se ejecuta de forma cíclica,
lo que posibilita que el programa esté respondiendo continuamente ante los eventos que se produzcan en la placa.
void loop()
{
digitalWrite(pin, HIGH); // pone en uno (on, 5v) el 'pin'
delay(1000); // espera un segundo (1000 ms)
digitalWrite(pin, LOW); // pone en cero (off, 0v.) el 'pin'
delay(1000);
}
Funciones
Una función es un bloque de código que tiene un nombre y un conjunto de instrucciones que son ejecutadas cuando se
llama a la función. Son funciones setup() y loop() de las que ya se ha hablado. Las funciones de usuario pueden ser escritas
para realizar tareas repetitivas y para reducir el tamaño de un programa. Las funciones se declaran asociadas a un tipo de
valor “type”. Este valor será el que devolverá la función, por ejemplo 'int' se utilizará cuando la función devuelve un dato
numérico de tipo entero. Si la función no devuelve ningún valor entonces se colocará delante la palabra “void”, que
significa “función vacía”. Después de declarar el tipo de dato que devuelve la función se debe escribir el nombre de la
función y entre paréntesis se escribirán, si es necesario, los parámetros que se deben pasar a la función para que se
ejecute.
type nombreFunción(parámetros)
{
instrucción;
}
La función siguiente devuelve un número entero, delayVal() se utiliza para poner un valor de retraso en un programa que
lee una variable analógica de un potenciómetro conectado a una entrada de Arduino. Al principio se declara como una
variable local, 'v' recoge el valor leído del potenciómetro que estará comprendido entre 0 y 1023, luego se divide el valor
por 4 para ajustarlo a un margen comprendido entre 0 y 255, finalmente se devuelve el valor 'v' y se retornaría al programa
principal. Esta función cuando se ejecuta devuelve el valor de tipo entero 'v'.
int delayVal()
{
int v; // crea una variable temporal 'v'
v= analogRead(pot); // lee el valor del potenciómetro
v /= 4; // convierte 0-1023 a 0-255
return v; // devuelve el valor final
}
{} entre llaves
Las llaves sirven para definir el principio y el final de un bloque de instrucciones. Se utilizan para los bloques de
programación setup(), loop(), if.., etc.
type funcion()
{
instrucciones;
}
Una llave de apertura “{“ siempre debe ir seguida de una llave de cierre “}”, si no es así el programa dará errores.
El entorno de programación de Arduino incluye una herramienta de gran utilidad para comprobar el total de llaves. Sólo
tienes que hacer click en el punto de inserción de una llave abierta e inmediatamente se marca el correspondiente cierre
de ese bloque (llave cerrada).
; punto y coma
El punto y coma “;” se utiliza para separar instrucciones en el lenguaje de programación de Arduino. También se utiliza
para separar elementos en una instrucción de tipo “bucle for”.
int x = 13; /* declara la variable 'x' como tipo entero de valor 13 */
Nota: Olvidaos de poner fin a una línea con un punto y coma o se producirá en un error de compilación. El texto de error
puede ser obvio, y se referirá a la falta de una coma, o puede que no. Si se produce un error raro y de difícil detección lo
primero que debemos hacer es comprobar que los puntos y comas están colocados al final de las instrucciones.
Debido a que los comentarios son ignorados por el compilador y no ocupan espacio en la memoria de Arduino pueden ser
utilizados con generosidad. También pueden utilizarse para "comentar" bloques de código con el propósito de anotar
informaciones para depuración y hacerlo mas comprensible para cualquiera.
Nota: Dentro de una misma línea de un bloque de comentarios NO se puede escribir otro bloque de comentarios (usando
/*..*/).
// línea de comentarios
Una línea de comentario empieza con // y terminan con la siguiente línea de código. Al igual que los comentarios de
bloque, los de línea son ignoradas por el programa y no ocupan espacio en la memoria.
// esto es un comentario
Una línea de comentario se utiliza a menudo después de una instrucción, para proporcionar más información acerca de lo
que hace ésta o para recordarla más adelante.
Sentencias condicionales
El lenguaje de arduino permite realizar sentencias condicionales if, if... else, for, while, do... while. Su utilización es
similar a las funciones correspondientes en C.
Entradas y salidas digitales y analógicas
Función usada en la function setup() para configurar un pin dado para comportarse como INPUT o OUTPUT. Ej.
pinMode(pin, OUTPUT); configura el pin número 'pin' como de salida. Los pines de Arduino funcionan por defecto como
entradas, de forma que no necesitan declararse explícitamente como entradas empleando pinMode().
Función digitalRead(pin)
Lee el valor desde un pin digital específico. Devuelve un valor HIGH o LOW. El pin puede ser especificado con una variable
o una constante (0-13). Ej. v = digitalRead(Pin);
Introduce un nivel alto (HIGH) o bajo (LOW) en el pin digital especificado. De nuevo, el pin puede ser especificado con una
variable o una constante 0-13. Ej. digitalWrite(pin, HIGH);
Función analogRead(pin)
Lee el valor desde el pin analógico especificado con una resolución de 10 bits. Esta función solo funciona en los pines
analógicos (0-5). El valor resultante es un entero de 0 a 1023. Los pines analógicos, a diferencia de los digitales no necesitan
declararse previamente como INPUT o OUTPUT.
Escribe un valor pseudo-analógico usando modulación por ancho de pulso (PWM) en un pin de salida marcado como
PWM. Esta función está activa para los pines 3, 5, 6, 9, 10, 11. Ej analogWrite(pin, v); // escribe 'v' en el 'pin' analógico.
Puede especificarse un valor de 0 - 255. Un valor 0 genera 0 V en el pin especificado y 255 genera 5 V. Para valores de 0 a
255, el pin alterna rápidamente entre 0 V y 5 V, cuanto mayor sea el valor, más a menudo el pin se encuentra en HIGH (5
V). Por ejemplo, un valor de 64 será 0 V tres cuartas partes del tiempo y 5 V una cuarta parte. Un valor de 128 será 0 V la
mitad del tiempo y 5 V la otra mitad. Un valor de 192 será 0 V una cuarta parte del tiempo y 5 V tres cuartas partes.
delay(ms). Realiza una pausa en el programa la cantidad de tiempo en milisegundos especificada en el parámetro
(máximo 1000, mínimo 1).
millis(). Devuelve la cantidad de milisegundos que lleva la placa Arduino ejecutando el programa actual como un
valor long unsigned. Después de de 9 horas el contador vuelve a 0.
min(x,y). max(x,y). Devuelve el mínimo y el máximo respectivamente de entre sus parámetros.
Puerto serie
Serial.begin(rate). Abre un Puerto serie y especifica la velocidad de transmisión. La velocidad típica para
comunicación con el ordenador es de 9600 aunque se pueden soportar otras velocidades.
Serial.println(data). Imprime datos al puerto serie seguido por un retorno de línea automático. Este comando
tiene la misma forma que Serial.print() pero este último sin el salto de línea al final. Este comando puede
emplearse para realizar la depuración de programas. Para ello puede mandarse mensajes de depuración y valores
de variables por el puerto serie. Posteriormente, desde el entorno de programación de Arduino, activando el
"Serial Monitor" se puede observar el contenido del puerto serie, y, por lo tanto, los mensajes de depuración.
Para observar correctamente el contenido del puerto serie se debe tener en cuenta que el "Serial Monitor" y el
puerto serie han de estar configurados a la misma velocidad (Para configurar la velocidad del puerto serie se hará
con el comando Serial.begin(rate)).
Serial.read().Lee o captura un byte (un caracter) desde el puerto serie. Devuelve -1 si no hay ningún carácter en el
puerto serie.
Serial.available(). Devuelve el número de caracteres disponibles para leer desde el puerto serie.
void setup() {
Serial.begin(9600);
pinMode(infraPin1, INPUT);
pinMode(infraPin2, INPUT);
pinMode(m1,OUTPUT);
pinMode(m2,OUTPUT);
pinMode(m3,OUTPUT);zzzzz
pinMode(m4,OUTPUT);
pinMode(Trigger, OUTPUT);
pinMode(Echo, INPUT);
digitalWrite(Trigger, LOW);
pinMode(Trigger, OUTPUT);
pinMode(Echo, INPUT);
digitalWrite(Trigger, LOW);
}
void loop() {
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);
t = pulseIn(Echo, HIGH);
d = t/59;
long t1;
long d1;
digitalWrite(Trigger1, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger1, LOW);
t1 = pulseIn(Echo1, HIGH);
d1 = t1/59;
valorInfra1 = digitalRead(infraPin1);
valorInfra2 = digitalRead(infraPin2);
if((((d>30)&&(d1>30))&&((valorInfra1>0)&&(valorInfra2>0))))
{
digitalWrite(m1,HIGH);
digitalWrite(m2,HIGH);
digitalWrite(m3,HIGH);
digitalWrite(m4,LOW);
}
else{
if((((d<30)&&(d1<30))&&((valorInfra1>0)&&(valorInfra2>0))))
{
digitalWrite(m1,HIGH);
digitalWrite(m2,LOW);
digitalWrite(m3,LOW);
digitalWrite(m4,HIGH);
}
else{
if((valorInfra1<1))
{
digitalWrite(m1,LOW);
digitalWrite(m2,HIGH);
digitalWrite(m3,HIGH);
digitalWrite(m4,LOW);
}
}
}
}