Lee un sensor de Knock





Aquí usaremos un piezo eléctrico para detectar el sonido, lo que nos permitirá usarlo como un sensor para golpes o “toques” (puedes pegar el piezo eléctrico a una superficie por ejemplo). Para esto podemos aprovechar la capacidad de leer señales análogas del CAD - convertidor análogo a digital. Estos conversores leen el valor de un voltaje y lo transforman en un valor entre 0 y 1024. 0 representa 0 V y 1024 representa 5 V en la entrada de uno de los 6 pines análogos.

Un piezo eléctrico no es otra cosa que un dispositivo electrónico que puede ser usado para reproducir o detectar tonos. En nuestro ejemplo hemos conectado el piezo eléctrico en el pin de entrada análoga número 0, que puede leer un valor entre 0 V y 5 V, y no solamente HIGH o LOW (pines digitales).

Un punto importante es que los piezo eléctricos tienen polaridad, la cual, en los dispositivos comerciales, se indica normalmente con un cable rojo y uno negro para saber cómo conectarlo a la placa. Debemos conectar el negro en la tierra y el rojo en el pin de entrada. Además debemos conectar una resistencia en el rango de los Megaomhnios en paralelo al piezo; en el ejemplo lo hemos hecho directamente en los conectores hembra.

El siguiente código capturará el tono y si sobrepasa cierto límite, enviará la cadena “Golpe” hacia el computador a través del puerto serial. Para poder ver este texto, puedes usar un programa de terminal, que leerá los datos del puerto serial y los mostrará en una ventana o puedes usar en Processing el código que se encuentra más abajo.



Sensor de golpes.

/* Sensor de golpes

 * ----------------
 *
 * Programa para usar un Piezo eléctrico como sensor de golpes.
 *
 * Básicamente se escucha un pin análogo y se evalúa si
 * la señal sobrepasa cierto límite. Escribirá "Golpe"
 * si el límite es sobrepasado, y enciende el Led del pin 13.
 *
 * (cleft) 2005 D. Cuartielles for K3
 * Traducción por Juan C. Carvajal.
 */

int ledPin = 13;
int knockSensor = 0;
byte val = 0;
int statePin = LOW;
int THRESHOLD = 100;

void setup() {

 pinMode(ledPin, OUTPUT); 
 beginSerial(9600);

}

void loop() {

  val = analogRead(knockSensor);     
  if (val >= THRESHOLD) {
    statePin = !statePin;
    digitalWrite(ledPin, statePin);
    printString("Golpe");
    printByte(10);
    printByte(13);
  }
  delay(100);  // Debemos esperar un poco para
               // no sobrecargar el puerto serial.

}

Capturando el Golpe en Processing.

Si quisiéramos capturar este Golpe desde la placa del Arduino, tenemos que ver cómo es transferida la información desde la placa hacia el puerto serial. En primer lugar vemos que cada vez que hay un golpe que sobrepasa el límite, el programa de arduino imprime (envía) "Golpe" a través del puerto serial. Justamente después envía el byte 10, que representa EOLN (fin de línea) y el byte 13 que es CR (retorno de carro). Este par de símbolos serán útiles para determinar cuando el mensaje enviado por la placa terminó. Cuando eso sucede el programa de processing cambiará el color de fondo en la pantalla y escribirá "Golpe" en la línea de comando.

// Captura de un Golpe // por David Cuartielles <http://www.0j0.org>
// Basado en: "Analog In" por Josh Nimoy <http://itp.jtnimoy.com>
// Traducción por Juan C. Carvajal.
// Lee un valor desde el puerto serial y cambia el color de fondo
// si se encuentra un piezo eléctrico como un sesor de golpes.
// este ejemplo requiere tener conectada una placa de arduino
// como periférico que envíe valores con los caracteres EOLN + CR
// al final. Más información puede ser encontrada en las páginas de
// arduino: http://www.arduino.cc, http://www.arduino.es
// Creado el 23 de noviembre 2005
// Actualizado el 23 de noviembre 2005

import processing.serial.*;

String buff = ""; int val = 0; int NEWLINE = 10;

Serial port;

void setup() {

  size(200, 200);

  // Open your serial port
  port = new Serial(this, "COMXX", 9600);
  // ¡reemplaze COMXX con el
  // nombre de su puerto serial!

}

void draw() {

  // Process each one of the serial port events
  while (port.available() > 0) {
    serialEvent(port.read());
  }
  background(val);

}

void serialEvent(int serial) {

  if(serial != NEWLINE) { 
    buff += char(serial);
  } else {
    buff = buff.substring(1, buff.length()-1);
    // Lee la cadena y la imprime en la línea de comando,
    // debemos empezar desde la posición número 1 puesto que
    // el programa de arduino envía EOLN (10) y CR (13)

    if (val == 0) {
      val = 255;
    } else {
      val = 0;
    }
    println(buff);
    // Limpia el valor de "buff"
    buff = "";
   }

}