La vaca cegahisto.cat



04-12-2016  (1220 ) Categoria: Arduino

Arduino - Manual programaci贸

Caracter铆stiques generals de la placa

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:

http://arduino.cc/

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: Linux, Windows, MAC-IOS

Figura 2. Entorno de desarrollo.

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.

Figura 3. a) Compilar programa. b) Bot贸n de reset. c) Transferir programa a la placa.


Estructura b脿sica d'un programa

La estructura b谩sica de programaci贸n de Arduino es bastante simple y divide la ejecuci贸n en dos partes: setup y loop. Setup() constituye la preparaci贸n del programa y loop() es la ejecuci贸n. En la funci贸n Setup() se incluye la declaraci贸n de variables y se trata de la primera funci贸n que se ejecuta en el programa. Esta funci贸n se ejecuta una 煤nica vez y es empleada para configurar el pinMode (p. ej. si un determinado pin digital es de entrada o salida) e inicializar la comunicaci贸n serie. La funci贸n loop() incluye el c贸digo a ser ejecutado continuamente (leyendo las entradas de la placa, salidas, etc.).

 
void setup() { 
   inMode(pin, OUTPUT); 	// Establece 'pin' como salida 
} 
void loop() {
   digitalWrite(pin, HIGH);	// Activa 'pin'
   delay(1000); 		// Pausa un segundo 
   digitalWrite(pin, LOW); 	// Desactiva 'pin'
   delay(1000);
} 
 

Como se observa en este bloque de c贸digo cada instrucci贸n acaba con ; y los comentarios se indican con //. Al igual que en C se pueden introducir bloques de comentarios con /* ... */.

Funcions

 
Una funci贸 es un bloque de c贸digo identificado por un nombre y que es ejecutado cuando la funci贸n es llamada. 
La declaraci贸n de una funci贸n incluye en primer lugar el tipo de datos que devuelve la funci贸n
(e.j. int si lo que devuelve es un valor entero). Despu茅s del tipo de datos se especifica el nombre de la funci贸n

int delayVal()
{
int v; // crea una variable temporal 'v' v = analogRead(pot); // lee el valor del potenci贸metro v /= 4; // convierte los valores 0-1023 a 0-255 return v; // devuelve el valor final de la variable }

Variables

Una variable debe ser declarada y opcionalmente asignada a un determinado valor. En la declaraci贸n de la variable se indica el tipo de datos que almacenar谩 (int, float, long)

int inputVariable = 0; 
 
Una variable puede ser declarada en el inicio del programa antes de setup(), localmente a una determinada funci贸n e incluso dentro de un bloque como pueda ser un bucle. El sitio en el que la variable es declarada determina el 谩mbito de la misma. Una variable global es aquella que puede ser empleada en cualquier funci贸n del programa. Estas variables deben ser declaradas al inicio del programa (antes de la funci贸n setup()).
 
int v; 			// 'v' es visible en todo el programa
void setup() { 
			// no se requiere setup 
} 
void loop() { 
   for (int i=0; i<20;)	// 'i' es visible solo en el bucle
   i++; 
   float f;	// 'f' es visible 煤nicamente en la funci贸n loop()
}
 

Tipus de dades

Arduino permite manejar los siguientes tipos de datos:

  • Byte. Almacena un valor num茅rico de 8 bits. Tienen un rango de 0-255.
  • Int. Almacena un valor entero de 16 bits con un rango de 32,767 a -32,768.
  • Long. Valor entero almacenado en 32 bits con un rango de 2,147,483,647 a -2,147,483,648.
  • Float. Tipo coma flotante almacenado en 32 bits con un rango de 3.4028235E+38 a -3.4028235E+38.
  • Arrays Se trata de una colecci贸n de valores que pueden ser accedidos con un n煤mero de 铆ndice (el primer valor del 铆ndice es 0). Ejemplos de utilizaci贸n:
    • Definici贸n y asignaci贸n. int myArray[] = {value0, value1, value2...}
    • Definici贸n. int myArray[5]; // declara un array de 6 enteros
    • Asignaci贸n del cuarto componente. myArray[3] = 10;
    • Recuperar el cuarto componente y asignarlo a x. x = myArray[3];

Operadors aritm猫tics

Empleando variables, valores constantes o componentes de un array pueden realizarse operaciones aritm茅ticas y se puede utilizar el operador cast para conversi贸n de tipos. Ej. int a = (int)3.5; Adem谩s pueden hacerse las siguientes asignaciones:
	x ++. Lo mismo que x = x + 1.
	x --. Lo mismo que x = x - 1, or decrements x by -1.
	x += y. Lo mismo que x = x + y, or increments x by +y.
	x -= y. Lo mismo que x = x - y .
	x *= y. Lo mismo que x = x * y. 
	x /= y. Lo mismo que x = x / y. 
Para su utilizaci贸n en sentencias condicionales u otras funciones Arduino permite utilizar los siguientes operadores de comparaci贸n:
	x == y. x es igual a y.
	x != y. x no es igual a y.
	x < y, x > y, x <= y, x >= y. 
Y los siguientes operadores l贸gicos:
	Y l贸gico:  if (x > 0 && x < 5). Cierto si las dos expresiones lo son.
	O l贸gico:  if (x > 0 || y > 0). Cierto si alguna expresi贸n lo es.
	NO l贸gico: if (!x > 0). Cierto si la expresi贸n es falsa. 
El lenguaje de Arduino presenta las siguientes constantes predefinidas:
	TRUE / FALSE.
HIGH/LOW. Estas constantes definen los niveles de los pines como HIGH o LOW y son empleados cuando se leen o escriben en las entradas o salidas digitales. HIGH se define como el nivel l贸gico 1 (ON) o 5 V. LOW es el nivel l贸gico 0, OFF, o 0 V.
INPUT/OUTPUT. Constantes empleadas con la funci贸n pinMode() para definir el tipo de un pin digital usado como entrada INPUT o salida OUTPUT. Ej. pinMode(13, OUTPUT); 
 

Sentencias condicionales

El lenguaje de arduino permite realizar sentencias condicionales
if, if... else, for, while, do... while.
Su utilizaci贸n es la misma de las funciones correspondientes en C.

Entradas y salidas digitales y anal贸gicas

9.1. Funci贸n pinMode(pin, mode)

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().

9.2. 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);

9.3. Funcion digitalWrite(pin, value)

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);

9.4. 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.

9.5. Funci贸n analogWrite (pin, value)

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.

Funciones de tiempo y matem谩ticas

  • 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.

Funciones de generaci贸n aleatoria

  • randomSeed(seed). Especifica un valor o semilla como el punto de inicio para la funci贸n random(). Este par谩metro debe ser realmente aleatorio y para ello puede emplearse la funci贸n millis() o incluso analogRead() para leer ruido el茅ctrico desde una entrada anal贸gica.
  • random(max), random(min, max). Esta funci贸n devuelve un valor aleatorio entre el rango especificado.

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.

Ejemplos de c贸digo

Salida digital

En este ejemplo el LED conectado al pin 13 parpadea cada segundo.

 
int ledPin = 13; 		// LED que se encuentra en el pin 13
   void setup(){ 
   pinMode(ledPin, OUTPUT);	// El p1n 13 ser谩 una salida digital 
} 
void loop(){ 
   digitalWrite(ledPin, HIGH);	// Enciende el LED
   delay(1000); 				// Pausa de 1 segundo 
   digitalWrite(ledPin, LOW); 	// Apaga el LED 
   delay(1000);				// Pausa de 1 segundo 
} 
 

Salida digital II

En este ejemplo el LED conectado al pin 13 parpadea en un intervalo de tiempo variable que depende del n煤mero de veces que se ejecuta el programa (funci贸n loop)

 
int ledPin = 13;	// LED que se encuentra en el pin 13
int n = 0;  	//Entero que contar谩 el paso por la funci贸n loop
void setup(){ 
   pinMode(ledPin, OUTPUT);	// El p1n 13 ser谩 una salida digital 
} 
void loop(){ 
   digitalWrite(ledPin, HIGH);	// Enciende el LED
   delay(1000); 				// Pausa de 1 segundo 
   digitalWrite(ledPin, LOW);		// Apaga el LED 
   n++;					//Incrementamos n
   delay(delayVal(n));			//Pausa de un tiempo variable
}
 

//Funci贸n que devuelve un valor tipo entero seg煤n el par谩metro pasado

 
int delayVal(int f){
   return f*100;
}
 

Entrada digital

Este ejemplo lee el valor de un interruptor conectado en el pin 2. Cuando el interruptor est谩 cerrado en el pin de entrada habr谩 un estado alto (HIGH) y se encender谩 el LED.

 
int ledPin = 13; 	// Pin de salida para el LED 
int inPin = 2; // Pin de entrada (donde est谩 conectado el interruptor) 
void setup() { 
   pinMode(ledPin, OUTPUT); 
   pinMode(inPin, INPUT); 
} 
void loop() { 
   if (digitalRead(inPin) == HIGH){	// Si se activa interruptor
      digitalWrite(ledPin, HIGH);	// Enciende el LED 
      delay(1000); 			// Pause de 1 segundo 
      digitalWrite(ledPin, LOW); 	// Apaga el LED 
      delay(1000); 			// Pausa de 1 segundo 
   } 
}
 

Salida PWM

Modulaci贸n por ancho de pulso (PWM) puede emplearse, por ejemplo, para establecer el brillo de un led o controlar un servomotor. En el siguiente ejemplo se va aumentando y decrementando el brillo del pin 9 mediante PWM.

 
int ledPin = 9; 				// Pin controlado por PWM 
void setup(){} 
void loop() { 
   for (int i=0; i<=255; i++){ 
      analogWrite(ledPin, i); 	// Establece el brillo a i 
      delay(100); 				// Pausa de 100 ms 
   } 
   for (int i=255; i>=0; i--) { 
      analogWrite(ledPin, i); 
      delay(100); 
   } 
}
 

Entrada a partir de un potenci贸metro

En el siguiente c贸digo se emplea arduino para controlar la frecuencia de parpadeo de un LED.

 
int potPin = 0; 		// Pin de entrada para el potenci贸metro 
int ledPin = 13; 		// Pin de salida para el LED
void setup() { 
   pinMode(ledPin, OUTPUT); 	// Declara el pin del LED como de salida
} 
void loop() { 
   digitalWrite(ledPin, HIGH);	// Enciende el LED 
   delay(analogRead(potPin));		// Lee el valor del potenci贸metro 
   digitalWrite(ledPin, LOW);		// Apaga el LED 
   delay(analogRead(potPin)); 	 
}