La plataforma Arduino se programa mediante el uso de un lenguaje propio basado en el lenguaje
de programacin de alto nivel Processing. Sin embargo, es posible utilizar otros lenguajes de programacin y aplicaciones populares en Arduino, 21 debido a que Arduino usa la transmisin serial de datos soportada por la mayora de los lenguajes mencionados. Para los que no soportan el formato serie de forma nativa, es posible utilizar software intermediario que traduzca los mensajes enviados por ambas partes para permitir una comunicacin fluida. Algunos ejemplos son: 3DVIA Virtools: aplicaciones interactivas y de tiempo real. Adobe Director BlitzMax (con acceso restringido) C C++ (mediante libSerial o en Windows) C# Cocoa/Objective-C (para Mac OS X) Flash (mediante ActionScript) Gambas Isadora (Interactividad audiovisual en tiempo real) Instant Reality (X3D) Java Liberlab (software de medicin y experimentacin) Mathematica Matlab MaxMSP: Entorno grfico de programacin para aplicaciones musicales, de audio y multimedia Minibloq: Entorno grfico de programacin, corre tambin en las computadoras OLPC Perl Php Physical Etoys: Entorno grfico de programacin usado para proyectos de robtica educativa Processing Pure Data Python Ruby Scratch for Arduino (S4A): Entorno grfico de programacin, modificacin del entorno para nios Scratch, del MIT) Squeak: Implementacin libre de Smalltalk SuperCollider: Sntesis de audio en tiempo real VBScript Visual Basic .NET VVVV: Sntesis de vdeo en tiempo real
Funciones bsicas y operadores Arduino est basado en C y soporta todas las funciones del estndar C y algunas de C++. 22 A continuacin se muestra un resumen con la estructura y sintaxis del lenguaje Arduino: Sintaxis Bsica Delimitadores:;, {} Comentarios: //, /* */ Cabeceras: #define, #include Operadores aritmticos: +, -, *, /, % Asignacin: = Operadores de comparacin: ==, !=, <, >, <=, >= Operadores Booleanos: &&, ||, ! Operadores de acceso a punteros: *, & Operadores de bits: &, |, ^, ~, <<, >> Operadores compuestos: Incremento y decremento de variables: ++, -- Asignacin y operacin: +=, -=, *=, /=, &=, |= Estructuras de control Condicionales: if, if...else, switch case Bucles: for, while, do... while Bifurcaciones y saltos: break, continue, return, goto Variables En cuanto al tratamiento de las variables tambin comparte un gran parecido con el lenguaje C. Constantes HIGH/LOW: representan los niveles alto y bajo de las seales de entrada y salida. Los niveles altos son aquellos de 3 voltios o ms. INPUT/OUTPUT: entrada o salida. false (falso): Seal que representa al cero lgico. A diferencia de las seales HIGH/LOW, su nombre se escribe en letra minscula. true (verdadero): Seal cuya definicin es ms amplia que la de false. Cualquier nmero entero diferente de cero es "verdadero", segn el lgebra de Boole, como en el caso de -200, - 1 o 1. Si es cero, es "falso". Tipos de datos void, boolean, char, unsigned char, byte, int, unsigned int, word, long, unsigned long, float, double, string, array.
Conversin entre tipos
Estas funciones reciben como argumento una variable de cualquier tipo y devuelven una variable convertida en el tipo deseado. char(), byte(), int(), word(), long(), float() Cualificadores y mbito de las variables static, volatile, const Utilidades sizeof() Funciones Bsicas E/S Digital[ pinMode(pin, modo) digitalWrite(pin, valor) int digitalRead(pin) E/S Analgica analogReference(tipo) int analogRead(pin) analogWrite(pin, valor) E/S Avanzada shiftOut(dataPin, clockPin, bitOrder, valor) unsigned long pulseIn(pin, valor) Tiempo unsigned long millis() unsigned long micros() delay(ms) delayMicroseconds(microsegundos) Matemticas min(x, y), max(x, y), abs(x), constrain(x, a, b), map(valor, fromLow, fromHigh, toLow, toHigh), pow(base, exponente), sqrt(x) Trigonometra sin(rad), cos(rad), tan(rad) Nmeros aleatorios randomSeed(semilla), long random(mx), long random(mn, mx) Bits y Bytes lowByte(), highByte(), bitRead(), bitWrite(), bitSet(), bitClear(), bit() Interrupciones externas attachInterrupt(interrupcin, funcin, modo) detachInterrupt(interrupcin) Interrupciones interrupts(), noInterrupts() Comunicacin por puerto serie Las funciones de manejo del puerto serie deben ir precedidas de la palabra "Serial" aunque no necesitan ninguna declaracin en la cabecera del programa. Por esto se consideran funciones base del lenguaje. 23 Estas son las funciones para transmisin serial: begin(), available(), read(), flush(), print(), println(), write() Manipulacin de puertos Los registros de puertos permiten la manipulacin a ms bajo nivel y de forma ms rpida de los contactos de entrada/salida del microcontrolador de las placas Arduino. 24 Los contactos elctricos de las placas Arduino estn repartidos entre los registros B(0-7), C (analgicos) y D(8-13). Mediante estas variables ser observado y modificado su estado: DDR[B/C/D]: Data Direction Register (o direccin del registro de datos) del puerto B, C D. Es una variable de Lectura/Escritura que sirve para especificar cuales contactos sern usados como entrada y salida. PORT[B/C/D]: Data Register (o registro de datos) del puerto B, C D. Es una variable de Lectura/Escritura. PIN[B/C/D]: Input Pins Register (o registro de pines de entrada) del puerto B, C D. Variable de slo lectura. Por ejemplo, para especificar los contactos 9 a 13 como salidas y el 8 como entrada (puesto que el puerto D usa los pines de la placa Arduino 8 al 13 digitales) bastara utilizar la siguiente asignacin: DDRD = B11111110; Como se ha podido comprobar, el conocimiento del lenguaje C, permite la programacin en Arduino debido a la similitud entre ste y el lenguaje nativo del proyecto, lo que implica el aprendizaje de algunas funciones especficas de que dispone el lenguaje del proyecto para manejar los diferentes parmetros. Se pueden construir aplicaciones de cierta complejidad sin necesidad de muchos conceptos previos.
AVR Libc Los programas compilados con Arduino (salvo en las placas con CorteX M3) se enlazan contra AVR Libc 22 por lo que tienen acceso a algunas de sus funciones. AVR Libc es un proyecto de software libre con el objetivo de proporcionar una biblioteca C de alta calidad para utilizarse con el compilador GCC sobre microcontroladores Atmel AVR. Se compone de 3 partes: avr-binutils avr-gcc avr-libc La mayora del lenguaje de programacin Arduino est escrita con constantes y funciones de AVR y ciertas funcionalidades slo se pueden obtener haciendo uso de AVR. 25
Interrupciones Las seales de interrupcin son las siguientes: cli(): desactiva las interrupciones globales sei(): activa las interrupciones Esto afectar al temporizador y a la comunicacin serial. La funcin delayMicroseconds() desactiva las interrupciones cuando se ejecuta. Temporizadores La funcin delayMicroseconds() crea el menor retardo posible del lenguaje Arduino que ronda los 2s. Para retardos ms pequeos se debe utilizar la llamada de ensamblador 'nop' (no operacin). Cada sentencia 'nop' se ejecutar en un ciclo de mquina (16 MHz) de aproximadamente 62.5ns. Manipulacin de puertos La manipulacin de puertos con cdigo AVR es ms rpida que utilizar la funcin digitalWrite() de Arduino. Establecer Bits en variables cbi y sbi son mecanismos estndar (AVR) para establecer o limpiar bits en PORT y otras variables. Diferencias con Processing La sintaxis del lenguaje de programacin Arduino es una versin simplificada de C/C++ y tiene algunas diferencias respecto de Processing. 26
27 Debido a que Arduino est basado en C/C++ mientras que Processing se basa en Java, existen varias diferencias en cuanto a la sintaxis de ambos lenguajes y el modo en que se programa: Arreglos Arduino Processing int bar[8]; int[] bar = new int[8]; bar[0] = 1; bar[0] = 1; int foo[] = { 0, 1, 2 }; int foo[] = { 0, 1, 2 }; o bien int[] foo = { 0, 1, 2 }; Impresin de cadenas Arduino Processing Serial.println("hello world"); println("hello world"); int i = 5; Serial.println(i); int i = 5; println(i); int i = 5; Serial.print("i = "); Serial.print(i); Serial.println(); int i="5;" println("i =" + i); Ejemplo sencillo de programacin en Arduino El primer paso antes de comprobar que la instalacin es correcta y empezar a trabajar con Arduino, es usar ejemplos prcticos que vienen disponibles con el dispositivo. Se recomienda abrir el ejemplo led_blink el cual crea una intermitencia por segundo en un led conectado en el pin 13. El cdigo necesario es el siguiente: # define LED_PIN 13 void setup () { // Activado del contacto 13 para salida digital pinMode (LED_PIN, OUTPUT); } // Bucle infinito void loop () { // Encendido del diodo LED enviando una seal alta digitalWrite (LED_PIN, HIGH); // Tiempo de espera de 1 segundo (1000 ms) delay (1000); // Apagado del diodo LED enviando una seal baja. digitalWrite (LED_PIN, LOW); // Tiempo de espera de 1 segundo delay (1000); } Bibliotecas en Arduino Las bibliotecas estndar que ofrece Arduino son las siguientes: 28
Serial Lectura y escritura por el puerto serie. EEPROM Lectura y escritura en el almacenamiento permanente. 29
read(), write() Ethernet Conexin a Internet mediante Arduino Ethernet Shield. Puede funcionar como servidor que acepta peticiones remotas o como cliente. Se permiten hasta cuatro conexiones simultneas. 30 Los comandos usados son los siguientes: Servidor: Server(), begin(), available(), write(), print(), println() Cliente: Client(), connected(), connect(), write(), print(), println(), available(), read(), flush(), stop() Firmata Es una biblioteca de comunicacin con aplicaciones informticas utilizando el protocolo estndar del puerto serie. 31
LiquidCrystal Control de LCDs con chipset Hitachi HD44780 o compatibles. 32 La biblioteca soporta los modos de 4 y 8 bits. Servo Biblioteca para el control de servo motores. 33 A partir de la versin 0017 de Arduino la biblioteca soporta hasta 12 motores en la mayora de las placas Arduino y 48 en la Arduino Mega. Estos son los comandos usados: attach(), write(), writeMicroseconds(), read(), attached(), detach() SoftwareSerial Comunicacin serie en contactos digitales. 34 Por defecto Arduino incluye comunicacin slo en los contactos 0 y 1 pero gracias a esta biblioteca puede realizarse esta comunicacin con los restantes. Stepper Control de motores paso a paso unipolares o bipolares. 35
Wire Envo y recepcin de datos sobre una red de dispositivos o sensores mediante Two Wire Interface (TWI/I2C). 36
Las bibliotecas Matrix y Sprite de Wiring son totalmente compatibles con Arduino y sirven para manejo de matrices de diodos LED. Tambin se ofrece informacin sobre diversas bibliotecas desarrolladas por diversos colaboradores que permiten realizar muchas tareas. Creacin de bibliotecas Los usuarios de Arduino tienen la posibilidad de escribir sus propias bibliotecas. 37 Ello permite disponer de cdigo que puede reutilizarse en otros proyectos, mantener el cdigo fuente principal separado de las bibliotecas y la organizacin de los programas construidos es ms clara. Ejemplo de biblioteca El siguiente ejemplo permite el envo de caracteres mediante el cdigo Morse: Se crea el archivo Morse.h que incluye la definicin de la clase Morse que tiene 3 funciones: un constructor (Morse()), una funcin para enviar 1 punto (dot()) y una funcin para enviar una raya (dash()). La variable _pin permite indicar el contacto a usar. /* Morse.h - Biblioteca para el envo de Cdigo Morse. Creado por David A. Mellis, el 2 de Noviembre de 2007. Liberado al dominio pblico. */
# ifndef Morse_h # define Morse_h
# include "WProgram.h"
class Morse { public: Morse(int pin); void dot(); void dash(); private: int _pin; };
# endif Debe ser creado el archivo Morse.cpp con el cdigo, es decir con la implementacin de los mtodos declarados: /* Morse.cpp - Biblioteca para el envo de Cdigo Morse. Creado por David A. Mellis, el 2 de Noviembre de 2007. Liberado al dominio pblico. */
void Morse::dash() { digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250); } La biblioteca creada as puede ser usada mediante el comando #include. Si se desea enviar una peticin de auxilio SOS por el contacto 13 bastara con llamar a Morse(13) y ejecutar la siguiente secuencia: morse.dot(); morse.dot(); morse.dot(); morse.dash(); morse.dash(); morse.dash(); morse.dot(); morse.dot(); morse.dot(); Instalacin en diferentes entornos[editar] Windows Los pasos a seguir son los siguientes:
Interfaz del entorno de desarrollo Arduino en el Sistema Operativo Windows. Descargar las versiones ms reciente de Java Runtime Enviroment (J2RE) y del IDE Arduino. Instalar los controladores FTDI USB, con la placa Arduino conectada. Ejecutar el IDE Arduino para abrir la interfaz y configurar el puerto USB donde est conectada la placa.
GNU/Linux
Interfaz del entorno de desarrollo Arduino S.O. GNU/Linux. Para instalar Arduino en un sistema GNU/Linux necesitamos los siguientes programas para resolver las dependencias: Sun java runtime, jre. avr-gcc, compilador para la familia de microcontroladores avr de atmel. avr-libc, libc del compilador avr-gcc. En algunas distribuciones conviene desinstalar, si no es necesario, el programa "brltty" que permite el acceso al terminal a personas invidentes. Para concluir, se descarga el framework de Arduino, se descomprime y ejecuta. Equipo de desarrollo El ncleo del equipo de desarrollo de Arduino est formado por Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino,David Mellis y Nicholas Zambetti.
Pduino
Patch Pduino. Pduino nace de la fusin de los proyectos Pure Data y Arduino. Ambos proyectos de fuente abierta permiten trabajar con interfaz grfica. Cargando el firmware de Pure Data (PD) a la placa Arduino se puede acceder a ella mediante el lenguaje de programacin grfico. Minibloq
Pantalla de Minibloq.
Combinacin de una computadora de bajo costo OLPC, el software Minibloq y una placa Arduino. Minibloq es un entorno grfico de programacin que puede generar cdigo nativo de Arduino y escribirlo directamente en la memoria flash de la placa. Tiene un modo que permite visualizar el cdigo generado, el cual tambin puede ser copiado y pegado en el Arduino-IDE, para los usuarios que intentan hacer el pasaje de una herramienta grfica a la programacin en sintaxis C/C++. Minibloq es de uso libre y sus fuentes tambin estn disponibles gratuitamente. Una caracterstica importante, es que puede correr tambin en la computadora porttil OLPC, mediante el software Wine. Physical Etoys
Proyecto de un semforo realizado con Arduino y Physical Etoys Physical Etoys es una extensin libre y gratuita que permite que diversos dispositivos electrnicos como Lego NXT, las placas Arduino, Sphero, Kinect, Joystick Wiimote, entre otros, puedan ser programados fcilmente y que interacten entre s gracias a su sistema de bloques. En el caso de Arduino, Physical Etoys ofrece dos modos de programacin: 1. El modo "directo", en el cual los programas se ejecutan en la computadora del usuario y las rdenes se transmiten inmediatamente a travs del puerto serie. 2. El modo "compilado", en el cual los programas se traducen a C++ y se bajan a la placa, para luego ejecutarse de manera independiente de la computadora. El modo "directo" permite modificar los programas y ver los cambios producidos de manera inmediata en el comportamiento del robot, lo cual facilita la programacin, sobre todo al usuario inexperto. Asimismo, permite ver constantemente los valores de los sensores y utilizar el robot, por ejemplo, como para adquirir datos. El modo compilado, por su parte, elimina el retardo que introduce la comunicacin con la computadora, lo cual lo hace preferible para el desarrollo de tareas autnomas, en las cuales la velocidad de respuesta del robot debe ser ptima.