Páginas

domingo, 22 de abril de 2012

[Emb Comb Lab] Programando en Arduino

Bueno, en esta entrada tratare de abarcar un poco sobre la programación en Arduino.

Entorno de desarrollo


Para programar en Arduino es necesario descargar el entorno de desarrollo (IDE). Hay versiones para Windows, MAC y LINUX.

En mi caso, descargue la versión para Linux 64bits. No es necesario compilar simplemente seguimos estos pasos:
  1. Instalar librerias:
    sudo apt-get install gcc-avr avr-libc
  2. Vamos a la pagina oficial de Arduino y descargamos la versión necesitemos. Enlace: Arduino Software
  3. Una vez que la descargamos simplemente la descomprimirmos.
  4. Desde la terminal, nos ubicamos en la carpeta que acabamos de descomprimir y corremos el archivo arduino, se vera algo asi:
  5. ... y a su vez se iniciara el entorno gráfico:
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á conectado nuestro Arduino.

Para verificar que lo hemos hecho bien, podemos probar alguno de los ejemplos incluidos, utilizaremos el ejemplo Blink: FILE > EXAMPLES > 1.Basics > Blink
El ejemplo "Blink" lo único que hace es parpadear un LED que está colocado en el pin número 13 de la placa. Lo que hay que hacer para subir el programa a la placa Arduino, primero comprobamos que el código fuente es el correcto con el botón "Verify". 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 e inmediatamente después pulsar el botón que comienza la carga.


El código


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);
}
Cada instrucción acaba con ; y los comentarios se indican con //. Al igual que en C se pueden introducir bloques de comentarios con /* ... */.

Caracteristicas del Código



Tipos de Datos

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:
    • 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];


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()
}
Constantes
  • HIGH / LOW: niveles alto y bajo en pines. Los niveles altos son aquellos de 3 voltios o más.
  • INPUT / OUTPUT: entrada o salida
  • true / false


Funciones

Una función 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. Por ejemplo:
int functionName(int param1, float param2, char param3) { 
   //All the statements
}


Operadores

  • Aritméticos: +, -, *, /, %
  • Asignación: =
  • Operadores de comparación: ==, !=, <, >, <=, >=
  • Operadores Booleanos: &&, ||, !
  • Operadores de acceso a punteros: *, &
  • Operadores de bits: &, |, ^, ~, <<, >>
  • Operadores compuestos:
    • Incremento/decremento de variables: ++, --li
    • Asignación y operación: +=, -=, *=, /=, &=, |=li


Condiciones

IF, IF ELSE, ELSE IF
if (algunaCondicion) {
   // ejecutar si la condicion es verdadera
}
if (algunaCondicion) {
   // ejecutar si la condicion es verdadera
} else {
   // ejecutar si la condicion es falsa
}
if (algunaCondicion) {
   // ejecutar si la condicion es verdadera
} else if (otraCondicion) {
   // ejecutar si la primera y segunda condiciones son verdaderas
}
FOR
for (inicializacion; condicion; incremento) {
   // codigo
}
WHILE
for (inicializacion; condicion; incremento) {
   // codigo
}
DO... WHILE
do {
    // codigo
} while (condicionDePrueba);
SWITCH
switch (variable) {
    case 1:
      // ejecutar cuando la variable sea igual a 1
      break;
    case 2:
      // ejecutar cuando la variable sea igual a 1
      break;
    default: 
      // si ninguna de las anteriores es valida
      // ejecutar este código
      // default es opcional
  }


Entradas y salidas digitales y analógicas


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


Algunas funciones utiles


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


Funciones del puerto serial


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


Referencia

1 comentario: