lunes, 4 de noviembre de 2013

Arduino: Filosofía OpenSource

Este artículo lo publiqué en Hackers & Developers, Número 2 el 31.12.2012
  
Nació en el Instituto de Diseño Interactivo Ivrea (Italia), a partir de un proyecto en el año 2005. La idea surgió por la necesidad de tener una herramienta para los estudiantes que fuera más moderna que las que estaban en el mercado y de bajo coste. Además, que funcionase con cualquier sistema operativo y que contase con documentación adaptada a gente que quiera empezar de cero.


Los inicios de Arduino contado por Massimo Banzi: 

“Cuando estaba trabajando en esto conocí a David Cuartelles y comenzó a echarme una mano con el proyecto…Hicimos juntos el primer hardware de Arduino, luego vino David Mellis, un estudiante mío, que se unió para escribir el software, luego Tom Igde entró como consejero y Gianluca Martino que era el que producía las placas. Así se formó el equipo, añadiendo gente según sus habilidades”.



Arduino se implementó, no obstante, sobre los cimientos de Wiring. Verán, en Ivrea también daba clases Casey Reas, uno de los fundadores de la plataforma de programación Processing. Banzi pensó en cómo hacer un Processing para hardware. Comenzó, entonces, a trabajar con un estudiante suyo, que había hecho una tesis sobre el tema, Hernando Barragán.
“Después de que Hernando hiciera Wiring pensamos en cómo hacer toda la plataforma más simple, más barata y sencilla de usar. Se comenzó a reimplementar todo como un proyecto open source para que todo el mundo pudiera venir y ayudar, contribuir”.

En la actualidad se pueden fabricar infinidad de prototipos y su uso se está expandiendo por todo el mundo.

“El hardware abierto significa tener la posibilidad de mirar lo que hay dentro de las cosas, que eso sea éticamente correcto, y que permita mejorar la educación. Educar en cómo funcionan las cosas…El hardware, aunque sea libre, no puede ser gratuito, es físico y cuesta dinero, lo que hicimos fue buscar el precio justo. Arduino no fabrica nada, diseña y mantiene un sitio web” Massimo Banzi
 

HARDWARE

Es una placa de circuito impreso donde va instalado el microcontrolador, las conexiones de entrada y salida, la conexión para el puerto USB y el botón reset.
Es decir, un pequeño circuito que contiene un ordenador completo en un chip (microcontrolador).
Microcontrolador.- realiza las instrucciones almacenadas en el programa de forma cíclica.
Algunos microcontroladores usados en las placas son el Atmega328, Atmega168, Atmeg1280, Armega168V, ATmega328p por su sencillez y bajo coste.
Puerto USB.- a través de él cargamos el programa (sketch) que hemos realizado en el entorno de programación de Arduino (IDE).
Pines de entrada/salida digital.- Estos pines pueden ser de entrada o salida, lo especificaremos mediante el sketch creado en el IDE.
Pines de entrada analógica.- Estos pines aceptan valores analógicos y los convierten en un número comprendido entre 0 y 1023.
Pines de salida analógica.- Realmente son pines digitales que se han reprogramado para salida analógica usando el sketch en el IDE.
Botón reset.- Permite resetear el programa y cargar uno nuevo.
Tenemos la posibilidad de adquirir nuestra placa Arduino o hacerla a mano, en esta dirección encontramos lo necesario:


“Arduino es una plataforma de electrónica abierta para la creación de prototipos basada en software y hardware flexibles y fáciles de usar. Se creó para artistas, diseñadores, aficionados y cualquiera interesado en crear entornos u objetos interactivos. “

Arduino Uno
Arduino Uno es una placa electrónica basada en el ATmega328. Cuenta con 14 pines de entrada/salidas digitales (de las cuales 6 se puede utilizar como salidas PWM), 6 entradas analógicas, un resonador cerámico 16 MHz, una conexión USB, , entrada de corriente, conector ICSP y botón de reset. Contiene todo lo necesario para hacer funcionar el microcontrolador; simplemente conectándolo al ordenador con el cable USB o aliméntalo con un trasformador o batería para empezar.




Arduino Leonardo
El Leonardo Arduino es una placa electrónica basada en el ATmega32u4 . Tiene 20 pines de entrada/salida digitales (de los cuales 7 se pueden utilizar como salidas de PWM y 12 como entradas analógicas), un oscilador de cristal de 16 MHz, una conexión micro USB,, entrada de corriente, conector ICSP y botón de reset.
Destaca por la incorporación de un único procesador encargado tanto de la conversión de Serie a USB, cómo de la funciones principales de procesamiento y de una nueva distribución de los pines. Esta última característica se aplicará también a los modelos anteriores. Entre las nuevas incorporaciones, destaca también la llegada del nuevo pin, IOREF, con el que podremos ajustar el voltaje del procesador y la compatibilidad con teclado y ratón.


Arduino Mega
El Arduino Mega está basada ATmeg1280. Tiene 54 entradas/salidas digitales (de las cuales 14 proporcionan salida PWM), 16 entradas digitales, 4 UARTS (puertos serie por hardware), un cristal oscilador de 16MHz, conexión USB, entrada de corriente, conector ICSP y botón de reset. El Mega es compatible con la mayoría de shields diseñados para el Arduino Duemilanove o Diecimila.


Shields.- Son placas que se colocan encima de la placa Arduino y añaden una nueva función, para controlar diferentes aparatos, adquirir datos, etc.

Arduino Ethernet Shield
El Arduino Ethernet Shield permite a una placa Arduino conectarse a Internet. Se basa en el chip Wiznet W5100 Ethernet. Nos proporciona una red red IP, con soporte para cuatro conexiones socket simultáneas.



Fritzing nos ofrece un entorno gráfico para proyectos Arduino. Podemos usarlo para diseñar trazados de placa, esquemas y tarjetas de circuito impresas (PCB).
Para instalarlo en Arch:
$ yaourt -S fritzing
  
En el panel lateral tenemos las tres vistas principales organizadas en pestañas.
Esta aplicación incluye varios proyectos de ejemplo que pueden ser útiles para familiarizarse con la misma.
Protoboard o Placa de prototipos: En ella se mostrará la visión real del proyecto. Podremos realizar las conexiones de manera muy sencilla, colocando los componentes y uniéndolos entre sí. Permite añadir notas para una mejor compresión del diseño.
La Vista de Esquema: Presenta una forma más abstracta de ver los componentes y las conexiones. Esta vista nos permite comprobar las conexiones realizadas anteriormente y es muy útil para crear la documentación del proyecto.
Vista de PCB o placa del circuito impreso: Desde esta vista iremos diseñando cómo se acoplarán los componentes dentro de la placa de circuito impreso. Se pude cambiar el tamaño y la complejidad de las conexiones, según sea necesario. Cuando están colocados los componentes, se puede utilizar el botón autorregulo para que se generen las líneas de cobre.
 

SOFTWARE: el lenguaje y entorno de programación

La programación se realiza en un entorno de desarrollo integrado (IDE), nos permite escribir sketches en un lenguaje de programación basado en Processing.

2.1 LENGUAJE ARDUINO
Este lenguaje está basado en C/C++. Un programa Arduino se ejecuta en dos partes:
void setup().- Es donde colocamos el código de inicialización, es decir las instrucciones que configuran la placa antes de que inicie el bucle principal del sketch.
void loop().- Contiene el código principal del sketch.
Operadores de comparación
== igualdad
!= distinto
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que

Operadores booleanos
&& (AND), || (OR), !(NOT)

Estructuras de control
if (condición) {}: Sirve para discriminar si se dio una determinada condición. Utilizaremos para la condición operadores de comparación. Todo lo que figure entre las llaves será ejecutado si la condición es verdadera.
if (condición) {} else {}: Si la condición es verdadera, ejecuta lo que figure entre las llaves, y sino, lo que está a continuación del else.
switch case (selector): Nos permite ejecutar un bloque de instrucciones, según sea el valor de selector. La instrucción break, termina la ejecución del case. Es necesaria incluirla al final de cada case pues, una vez se cumple la condición, se ejecutan las instrucciones linealmente hasta el final (aunque ya pertenezcan a otros case) o hasta encontrar un break.
switch case (selector)
{
case etiqueta1:
instrucciones1
break;
case etiqueta2:
instrucciones2
break;
.........................
default:
instrucciones3
}

while (condición) {}: Repite las instrucciones que estén entre las llaves mientras se cumpla la condición.
do { } while (condición): Su funcionamiento es similar al while pero con una diferencia: al menos una vez ejecuta las instrucciones.
for: Nos permite repetir las instrucciones una cantidad especificada de veces. En el siguiente ejemplo se repetirán cinco veces:
for (int i=0; i<5; i++){
<instrucciones>
}

continue: Se utiliza dentro de los bucles para que, una vez se ejecuta, volver a testear la condición, saltándose el resto de instrucciones que haya a continuación de él.


Constantes

HIGH → 5v True 1
LOW 5v – False – 0

Funciones de entrada y salida.
pinMode (pin, modo): Nos permite declarar un pin digital como entrada (INPUT) o como salida (OUTPUT).
digitalWrite (pin,HIGH/LOW): Nos permite activar o desactivar el pin digital. Ejemplo:
digitalWrite(8,HIGH); //activa el pin digital 8
digitalRead(pin,LOW); // desactiva el pin digital 8

analogRead(pin): Lee el voltaje aplicado a un pin analógico de entrada y devuelve un número comprendido entre 0 y 1023.
analogWrite(pin, val): Cambia la velocidad del PWN en uno de los pines marcados como PWN. El ancho se codifica en 256 niveles, es decir, podremos introducir un número del 0 (apagado) al 255 (encendido) en el parámetro val.
PWM (Pulse width Modulation): La modulación por anchura de pulso es una técnica que se emplea para producir señales digitales que, filtradas, se comportarán como señales analógicas. El PWN en Arduino funciona a una frecuencia bastante próxima a 500Hz, lo que equivale a periodos de 2 milisegundos cada uno.

Temporizadores
millis ().- Devuelve el tiempo en milisegundos transcurridos desde que la placa activó el programa actual.
micros ( ).- Es lo mismo que millis pero en microsegundos.
delay(ms).- Sirve para pausar los procesos de la placa durante un cierto tiempo, especificado por el parámetro ms (milisegundos).
delayMicroseconds(us).- Es lo mismo que delay(ms) pero en microsegundos.
Para consultar más instrucciones: http://arduino.cc/es/Reference/HomePage

Ejemplo para hacer que un LED aumente y disminuya su intensidad de brillo de forma cíclica:

const int LED = 9;   // definimos el pin para el ledint i = 0;                  // vamos a usar esta variable como contador

void setup() {
    pinMode(LED, OUTPUT); // indicamos que el led es una salida
}

/*
loop () es donde especificamos como debe comportarse nuestro
dispositivo. Éste, no dejará de repetirse hasta que apaguemos
la placa. 

*/

void loop() {

      // Aumenta la intensidad de brillo

      while(i < 255) {
             analogWrite(LED, i);
             delay(15)
             i++;
      }

     // Disminuye la intensidad del brillo

     for(i=255; i>0; i--) {
         analogWrite(LED, i);
         delay(15);
     }
}


2.2 EL ENTORNO DE DESARROLLO
El IDE estándar de Arduino está escrito en Java. El comando necesario para instalar en ArchLinux:
$ yaourt -S arduino




Gnoduino es una alternativa realizada en Python:
$ yaourt -S gnoduino


Referencias :

2 comentarios: