Uno de los principales encantos que tiene la placa Arduino es que resulta ser ese chisme capaz de convertir en tangible y físico algo tan abstracto e inmaterial como la programación informática. De repente un bucle for/next cobra vida y deja de ser una sucesión de cálculos en el limbo electrónico de la cpu para convertirse en un cacharro cargado de cables capaz de volcar el café del escritorio. Pero de volcarlo de verdad, no virtualmente.

Arduino es una proyecto nacido en Italia y desarrollado sobre el concepto de hardware y software libre. Es decir sus especificaciones técnicas y sus herramientas de desarrollo son abiertas y públicas (y gratuitas mayormente), lo que ha favorecido que crezca a su alrededor una comunidad enorme que constantemente incorpora mejoras y nuevas funcionalidades. Hoy por hoy las posibilidades de expansión son ilimitadas. Existen accesorios, ampliaciones y gadgets para conexión inalámbrica (radio, infrarrojos, bluetooth), cámaras de fotografía, dispositivos GPS, motores de todo tipo, sensores de luz, gas, agua, corriente ó presión atmosférica, mandos y joystick, etcétera, etcétera , pues hacer lo inimaginable, todo tipo de robots autómatas, teledirigidos, mandos a distancias, invernaderos informatizados, pinta-murales callejeros…

Desde que hace años conocí de su existencia le tenía ganas. Eso de traer al mundo real los desvaríos informáticos era/es muy tentador. El problema es que soy un redomado paleto electrónico, para mí una resistencia seguirá siendo la que montaron los franceses en la Bastilla y un transistor pues lo que usaba hace años para escuchar Radio3 en el coche. Por eso, si yo he sido capaz de montar un LCD y que muestre la temperatura de un sensor es que resulta fácil de narices (al menos en lo correspondiente a hardware).

Esta semana pasada decidí pagarme el capricho y encargué el Arduino Lab Kit que venden en Cooking Hacks-Libelium por poco menos de 120 euros. El envío ha sido rapidísimo (Zaragoza-Cartagena). Vaya, y no exagero, me llegó antes el paquete que el tracking del paquete para seguirle por internet.

Llevo apenas una semana trasteando con el cacharro, así es que todo esta por mejorar, pero como siempre, seguro que habrá alguno que se sirva de algo. Asi es que a continuación algunas especificaciones técnicas para configuración de Arduino ( en GNU/Linux, openSuse 11.2 )

Instalación de software Arduino en GNU/Linux

Inicialmente la instalación del software (Processing adaptado) se me atrancó un poco porqué usé la versión 0019 (que no reconoce la nueva placa Arduino UNO). Además la v.0022 de los repositorios de software.opensuse.org no detectaba la conexión de la placa (/dev/ttyACMxx, puerto USB) en cambio la versión alpha Arduino v.0022 del sitio la reconocía sin problemas.

Cada vez que se conecta el dispositivo se vá creando un device nuevo (/dev/ttyACM0, /dev/ttyACM1,/dev/ttyACM2, etc…) para facilitar el trabajo he creado una regla UDEV que enlaza automáticamente el nuevo dispositivo en /dev/Arduino.
Simplemente en /etc/udev/rules.d/99-mis-reglas.rules añade algo como (el número de idVendor lo obtienes haciendo dmesg después de conectar la placa)#arduino
SYSFS{idVendor}=="2341", SYMLINK+="Arduino"

A continuación los programas que lean/envíen datos a la placa puede usar este nuevo device, por ejemplo haciendo algo como: stty -F /dev/Arduino 9600 cs8 cread clocal
tail -f /dev/Arduino
O con python haciendo simplementepython
>>import serial
>>s=serial.Serial("/dev/Arduino", 9600)
>>s.write("hola machote")

Programa sensores2lcd

No tengo el esquema de la instalación que aparece en el vídeo, pero no tiene mucha dificultad, básicamente es la conexión que podéis ver aquí arduino.cc/en/Tutorial/LiquidCrystal solo que puesto que no tengo potenciómetro la tercera conexión del LCD va directa a masa (GND).

A continuación he conectado los sensores de luz (LDR) y de temperatura (MCP) y el led verde tal y como se indican en otros tantos tutoriales que tenéis por la web.

Para el sensor de luz no encontré especificaciones de uso asi es que lo conecté directamente: una pata a masa GND y otra al pin analógico 0 y observé que las lecturas se movían entre 1024 y 0, pues listo: un simple cálculo de porcentajes y listo.

Para el sensor de temperaturas hizo falta más pruebas ya que en la web hay multitud de cálculos diferentes para convertir los miliVoltios de la lectura en grados Celsius. Al final me quedé con analogRead(pinTemp) * 4.8) / 1024.0
En la línea original se multiplica por 5, los voltios que recibe, pero esto me daba temperaturas 3-4 grados superiores a la real. En 4,8 dá lecturas similares a otros termómetros que tengo por aquí.

El codigo completo sería este: #include <LiquidCrystal.h>
int pinLuz=0; // pin analógico del sensor de luz
int pinTemp=1; // pin analógico del sensor de temperatura
int pinLed=9; // pin analógico del led verde
int numChequeos=15; // cuantos chequeos para obtener la media
int brilloLed=0;
float dataLuz;
float dataTemp;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
Serial.begin(9600);
lcd.begin(16,2);
lcd.clear();
lcd.print("Listo...");
pinMode(pinLed, OUTPUT); }

void loop() {
dataLuz=0;
dataTemp=0;
for(int n=0; n dataLuz=dataLuz + analogRead(pinLuz);
dataTemp=dataTemp + ((analogRead(pinTemp) * 4.8) / 1024.0);
delay(50); }

float mediaLuz = 100 - (( (dataLuz/numChequeos) / 1024 ) * 100);
float mediaTemp = ((dataTemp/numChequeos) - 0.5)/0.01;
brilloLed = 255 - (2.55 * mediaLuz);
analogWrite(pinLed, brilloLed);
Serial.print(mediaTemp);
Serial.print(" : ");
Serial.println(mediaLuz);
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.setCursor(7,0);
lcd.print(mediaTemp);
lcd.print(" C ");

lcd.setCursor(0,1);
lcd.print("Luz: ");
lcd.setCursor(7,1);
lcd.print(mediaLuz);
lcd.print(" % ");
delay(50);
}

Escuchar serial

Este programa simplemente atiende a los que se escriba en /dev/Arduino por otros programas y lo vuelca en el LCD haciendo los correspondientes saltos de línea y pausas.#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
String cadena = "";
int contador = 0;
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
delay(100);
lcd.print("Escuchando...");
}

void loop() {
lcd.setCursor(0,0);
if ( Serial.available() ) {
delay(100);
lcd.clear();
contador=0;

while (Serial.available() > 0) {
int buffer=(char)(Serial.read());
delay(10);
lcd.write(buffer);
contador++;
if ( contador == 16 ) lcd.setCursor(0,1);
if ( contador == 32 ) { lcd.setCursor(0,0); lcd.clear(); contador=0;}
}
}
}

Problemas

El mayor problema con que me he encontrado es que el Arduino Lab Kit llega con todos los componentes perfectamente embolsados y nulamente etiquetados. CERO documentación. Así es que hizo falta echar mano de la lupa para leer los dígitos impresos en componentes minúsculos para tratar de averiguar que es esto. No es que la documentación que mandan sea mala u obsoleta es que es inexistente, nada absolutamente ni en la factura que aparece un triste “Arduino Lab Kit” y para un paleto electrónico como yo… vaya, a día de hoy todavía tengo componentes que no sé ni lo que son, ya no te cuento sobre el “Como se conectan“….