Ajustar una conección serial Inalámbrica con el hardware Wiring usando Bluetooth

Por Mitchell Page Mpag5967 [at] mail.usyd.edu.au
Key Centre of Design Computing and Cognition, University of Sydney , Australia

Normalmente debería usar un cable serial USB conectado de su computador a la tarjeta Wiring para recibir datos enviados desde un computador corriendo Processing a su tarjeta.

Este tutorial demuestra como ejecutar el mismo proceso, pero inalambricamente usando Bluetooth. Probaremos esto encendiendo y apagando un LED inalámbricamente. Necesitará usar un adaptador para alimentar su tarjeta en este tutorial. Este tutorial cubre la comunicación desde su computador a la tarjeta: no desde la tarjeta al computador.

 

Equipamento:

Necesitará un Bluetooth Dongle para su computador y un Bluetooth Modem para conectar la tarjeta Wiring. Nosotros usamos especificamente lo siguiente

http://www.sparkfun.com/products/9434 y http://www.sparkfun.com/commerce/product_info.php?products_id=158

Este tutorial fue desarrollado para un computador corriendo Windows XP Service Pack 2 (el cual ha incluido soporte Bluetooth). No ha sido probado en Mac o Linux.

 

Proceso:

Paso 1. Primero necesita instalar el módulo Bluetooth en su computador e instalar los drivers. Si el módulo viene con un CD, introduzca el disco y luego conecte el módulo en un puerto USB libre. En Windows debería detectar automáticamente el dispositivo y si pregunta por drivers, dirijalo al CD_ROM. Una vez hayan sido instalados los drivers, Windows podría necesitar ser reiniciado.

Paso 2 . Una vez su computador haya sido reiniciado, conecte su módulo Bluetooth (si no lo ha hecho aún). Un ícono Bluetooth debería aparecer en su barra de tareas (Windows XP SP2 tiene esta característica de soporte). Su módulo Bluetooth no está asignado ni corriendo como un puerto serial. Ahora necesitamos ajustar el modem en la tarjeta Wiring.

Paso 3. Construimos la configuración como en la Figura 1. Primero que todo conecte su LED a la tarjeta Wiring en cualquier pin, excepto los pines 2 o 3 (hemos usado el Pin 8 en este tutorial). Vea este ejemplo para entender como conectar un LED ( http://wiring.org.co/learning/examples/led_blinks.html ). Una vez haya conectado su LED a la tarjeta, es tiempo de conectar su modem Bluetooth, El modem Bluetooth con el que estamos trabajando tiene 4 pines etiquetados, PWR, GND, Rx y Tx. Es muy sencillo: conecte el pin PWR al pin de 5V en Wiring, conecte el pin GND al pin GROUND en Wiring. Después conecte el pin Rx al pin Tx de Wiring (pin digital 3) y conecte el pin Tx al pin Rx de Wiring (pin digital 2). Una vez este conectado, conecte su adaptador AC a la tarjeta, si todo está conectado correctamente un pequeño LED verde empezará a parpadear en el modem Bluetooth.

FIGURA 1.

Paso 4. Ahora necesitamos ajustar una conección desde su computador al modem Bluetooth. Con su módulo Bluetooth conectado, de doble click en el icono de Bluetooth en la barra de tareas y seleccione ‘ADD’. Debería encontrar un dispositivo llamado BlueRadios – el cual es su modem. Seleccionelo para conectarlo. Preguntará por una clave. La clave para el modem Bluetooth que está usando es ‘default' (ver http://www.sparkfun.com/datasheets/RF/BlueSMiRF_v1.pdf ). Si usa un modem Bluetooth diferente al que estamos usando, necesitará revisar la documentación para encontrar la clave. Una vez haya ingresado la clave, su computador recordará el modem Bluetooth y será capaz de comunicarse con el ahora y en el futuro.

Paso 5. Necesitamos encontrar en que puerto COM nuestro comunicación Bluetooth está activa. De doble click en el icono Bluetooth en la barra de tareas otra vez y seleccione el dispositivo BlueRadios de la pestaña de dispositivos, luego de click en la pestaña de COM ports y tome nota del número del puerto que está siendo usado por la conección Bluetooth. En nuestro caso, el puerto COM es COM7.

Paso 6. Ya que ha conectado todos los componentes, necesita cargar su programa en la tarjeta Wiring. NECESITA USAR EL CABLE USB PARA CARGAR EL PROGRAMA – NO PUEDE USAR BLUETOOTH INALÁMBRICO PARA CARGAR LOS PROGRAMAS A LA TARJETA. El código del programa que usaremos está adjunto más abajo. Una vez que haya conectado el cable serial USB, cargue su programa. Una vez haya cargado satisfactoriamente, de reset a su tarjeta y remueva el cable.

Paso 7. Ahora necesitamos configurar el código de Processing. El código que usaremos está adjunto más abajo. Necesita encontrar cual número en el arreglo es el puerto COM Bluetooth. Corra el código una vez y tome nota de los puertos COM que aparencen en el panel de salida.

Ej. COM1 COM3 COM7 en nuestro caso, el Bluetooth estaba conectado en COM7, el cual es el número 2 en la posición de nuestro arreglo serial (COM1 = 0, COM3 = 1, COM7 = 2). Luego actualizamos el código de Processing así usará la conección Bluetooth para enviar datos seriales. Una vez haya actualizado este código, corra el programa otra vez (ver Paso 8).

Paso 8. Después de haber corrido el programa por primera vez, el computador establecerá una conección con los modems Bluetooth – verá una luz roja parpadeando en el modem – finalmente se quedará rojo una vez establecida la comunicación pero puede tomar cerca de 10 segundos ante de poder recibir datos. El proceso de conección tomará cerca de 15 segundos para ajustarse compleatamente. Después de cerca de 15 o 20 segundos, su programa de Processing estará conectado a la tarjeta Wiring inalámbricamente . Ahora presione los botones en la interfase de Processing y mire encender y apagar el LED.

 

Código:

Código de Wiring – este código esperará por la señal desde Processing. Cuando recibe una señal 'H', el LED en el pin 8 se encenderá. Cuando recibe una señal 'L' el LED en el pin 8 se apagará.

char val;         // varaible para recibir datos desde el puerto serial
int ledpin = 8;  // LED conectado al pin 48 (LED de la tarjeta)


void setup() {
  pinMode(ledpin, OUTPUT);  // pin 48 (LED de la tarjeta) como OUTPUT
  Serial1.begin(9600);          // inicia la comunicación serial a 9600bps
}


void loop() {
  if( Serial1.available() )         // si data esta disponible para leer
  {
    val = Serial1.read();          // leala y almacenela en 'val'
  }
  if( val == 'H' )                     // si 'H' fue recibida
  {
    digitalWrite(ledpin, HIGH);  // encienda el LED
  } else { 
    digitalWrite(ledpin, LOW);   // de otro modo apaguelo OFF
  }
  delay(100);                         // espere 100ms para la siguiente lectura
}
    

 

Código de Processing – este código crea dos botones. Cuando se hace click en el botón de la izquierda, enviará una señal 'H' a la tarjeta y encenderá el LED o si se hace click en el botón de la derecha, enviará una señal 'L' a la tarjeta Wiring para apagar el LED.

//importa las clases para ajustar la comunicación serial con la tarjeta Wiring
import processing.serial.*; 
Serial port; 


//asignación de botones
color currentcolor;
RectButton rect1, rect2;
boolean locked = false;


void setup() {
  //ajuste de la ventana
  size(200, 200);
  color baseColor = color(102, 102, 102);
  currentcolor = baseColor;
  
  // La lista de los puertos seriales disponibles en el panel de salida. 
  // Necesitará escoger de la lista el puerto al que Wiring está 
  // conectada. El primer puerto en la lista es  
  // el puero #0 y el tercer puerto en la lista es el puerto #2. 
  println(Serial.list()); 
  
  // Abra el puerto al que está conectada Wiring (en este caso 1
  // el cual es el segundo puerto abierto en el arreglo) 
  // Asegurese abrir el puerto a la misma velocidad usada en Wiring (9600bps) 
  port = new Serial(this, Serial.list()[1], 9600);
  
  // Defina y cree un botón rectangular #1
  int x = 30;
  int y = 100;
  int size = 50;
  color buttoncolor = color(153, 102, 102);
  color highlight = color(102, 51, 51); 
  rect1 = new RectButton(x, y, size, buttoncolor, highlight);
  
  // Defina y cree un botón rectangular #2
  x = 90;
  y = 100; 
  size = 50;
  buttoncolor = color(153, 153, 153);
  highlight = color(102, 102, 102); 
  rect2 = new RectButton(x, y, size, buttoncolor, highlight);
}


void draw() {
  background(currentcolor);
  stroke(255);
  update(mouseX, mouseY);
  rect1.display();
  rect2.display();
}


void update(int x, int y) {
  if(locked == false) {
  
    rect1.update();
    rect2.update();
  } else {
    locked = false;
  }
  
  //Enciende y apaga el LED si el botón está presionado donde
  //H = encendido (high) y L = apagado (low)
  if(mousePressed) {
    if(rect1.pressed()) {            //boton ON
      currentcolor = rect1.basecolor;
      port.write('H');
    } else if(rect2.pressed()) {    //boton OFF
      currentcolor = rect2.basecolor;
      port.write('L');
    }
  }
}


class Button {
  int x, y;
  int size;
  color basecolor, highlightcolor;
  color currentcolor;
  boolean over = false;
  boolean pressed = false;   
  
  void update() {
    if(over()) {
      currentcolor = highlightcolor;
    } else {
      currentcolor = basecolor;
    }
  }
  
  boolean pressed() {
    if(over) {
      locked = true;
      return true;
    } else {
      locked = false;
      return false;
    }    
  }
  
  boolean over() { 
    return true; 
  }
  
  void display() { 
  
  }
}

class RectButton extends Button {
  RectButton(int ix, int iy, int isize, color icolor, color ihighlight) {
    x = ix;
    y = iy;
    size = isize;
    basecolor = icolor;
    highlightcolor = ihighlight;
    currentcolor = basecolor;
  }
  
  boolean over() {
    if( overRect(x, y, size, size) ) {
      over = true;
      return true;
    } else {
      over = false;
      return false;
    }
  }
  
  void display() {
    stroke(255);
    fill(currentcolor);
    rect(x, y, size, size);
  }
}

boolean overRect(int x, int y, int width, int height) {
  if (mouseX >= x && mouseX <= x+width && 
      mouseY >= y && mouseY <= y+height) {
    return true;
  } else {
    return false;
  }
}