Learning   Examples | Foundations | Hacking | Links

Sensor de golpes

Aquí usaremos un piezoeléctrico para detectar sonido, lo que nos permitirá detectar golpes. Utilizamos la capacidad de los microcontroladores de leer señales a través del CAD (Conversor analógico Digital, ADC en inglés). Estos conversores leen el voltaje y lo transforma en un valor entre 0 y 1024. 0 representa 0 voltios, 1024 representa 5 voltios a la entrada de uno de los seis pines analógicos.

Un piezoeléctrico es un elemento electrónico que se usa para reproducir y detectar tonos. En nuestro ejemplo vamos a conectar el piezoeléctrico en la entrada analógica número 0, que soporta la funcionalidad de leer un valor entre 0 y 5 voltios, y no sólo un valor lógico (HIGH o LOW).

La otra cosa a recordar es que los piezoeléctricos tienen polaridad, los modelos comerciales normalmente tienen un cable rojo y otro negro para indicar como conectarlo a la placa. Nosotros conectaremos el negro a tierra (GND) y el rojo a una de las entradas. También conectaremos una resistencia del orden de Megaohmios en paralelo con el piezoeléctrico; en este ejemplo lo hemos conectado directamente al conector hembra. Alguans veces es posible adquirir un piezoeléctrico sin la carcasa protectora de plástico, en este caso parecen un disco metálico y son más fáciles de utilizar como sensores de entrada.

El código ejemplo capturará el golpe y si este es más fuerte que un umbral dado, devolverá la cadena "Knock!" de vuelta al ordenador a través del puerto serie. Para que podamos ver este texto utilizaremos un programa en terminal que pueda leer datos desde el puerto serie y mostrarlos en una ventana, o también podemos crear nuestro propios programas por ejemplo en Processing. Después en este artículo proponemos un programa que funciona con el software desarrollado por Reas y Fry.

" "Ejemplo de la conexión de un piezoeléctrico al pin 0 con una resistecia"

 
/* Knock Sensor
 * ----------------
 *
 * Programa que utiliza un piezoeléctrico como si fuese un sensor
 * de golpes
 *
 * Básicamente escuchamos al pin analógico y detectamos
 * si la señal está por encima de un determinado umbral.
 * Escribimos "knock" al puerto serie si el umbral es sobrepasado
 * y encenderá el led del pin 13.
 *
 * (cleft) 2005 D. Cuartielles for K3
 */

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("Knock!");
    printByte(10);
    printByte(13);
  }
  delay(100);  // Tenemos que hacer un retraso para evitar sobrecarga del puerto serie
}

Representando el ruido en Processing

Si por ejemplo queremos capturar este "knock" desde la placa de Arduino, tenemos que mirar en la información transferida desde la placa a tra´ves del puerto serie. Primero miramos que el ruido es mayor que el umbral, el programa enviará "Knock!" al puerto serie. Directamente después de enviar el byte 10, que es el estándar por EOLN (End Of LiNe, fin de línea) y el byte 13 (CR - Retorno de carro). Estos 2 símbolos nos son útiles para determinar cuando un mensaje es enviado. Una vez que ocurre, el programa en processing activará el color de la pantala y mostrará "Knock!" en la línea de comando.

 
// Knock In 
// Por David Cuartielles <http://www.0j0.org>
// Basado en  Analog In by Josh Nimoy <http://itp.jtnimoy.com>


//Lee un valor desde el puerto serie e intercambia el color de fondo
//cuando hay un golpe en el piezoeléctrico usado como sensor de 
//entrada.
//Para lanzar este ejemplo es necesario que tengamos una placa
//Arduino como periférico hardware que envíe valores y añada
//EOLN + CR al final. Puedes encontrar mas información en las páginas
//de arduino: http://www.arduino.cc

// Creado 23 November 2005
// Actualizado 23 November 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);  // <-- Sustituye COMXX por tu puerto serie
}

void draw()
{
  // Procesa cada evento recibido por el puerto serie
  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);
    // Captura el string y lo muestra por la línea de comandos
    // Tenemos que coger desde la posición 1 porque el sketch
    // 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 = "";
   }
}

Share