(EN PROCESO DE TRADUCCIÓN Y AMPLIACIÓN --> FALTA EL ESQUEMA + FOTO) (LEER ESPECIFICACIONES PARA ENTENDER EL FUNCIONAMIENTO Y ESCRIBIR COMENTARIOS)

EJERCICIO Manejando un sensor de tacto QPROX QT401

Descripción del ejercicio

El sensor QPROX QT401 es un sensor lineal capacitivo que es capaz de detectar la posición de un dedo en contacto con la superficie del sensor, que está dividida en 128 posiciones. En este ejercicio lo que pretendemos es mostrar a través del puerto serie los valores que proporciona al interactuar con él.

Imágen del sensor QPROX QT401

Detalle del conexionado del sensor QPROX QT401

(ESQUEMA --> FALTA)

Esquema

(FOTO --> FALTA)

Imágen del sensor conectado a la Arduino

Elementos necesarios

  • Un sensor QPROX QT401
  • Cables para realizar las conexiones.

Código fuente

/* Demo con un QPROX QT401

 * -----------------------
 *
 * El QPROX QT401 (http://www.qprox.com) es un sensor lineal capacitivo que
 * es capaz de detectar la posición de un dedo que toque la superficie del
 * sensor dividida en 128 posiciones.
 *
 * El pin qt401_prx detecta cuando una mano está cerca del sensor, mientras
 * que el PIN qt401_det detecta cuando alguien está tocando .
 * Estos dos últimos pueden estar desconectados si no tienes PIN-es libres
 *
 * Es importante leer la descripción del producto para entender los parámetros
 * que se pasan al sensor para su inicialización.
 *
 * Created January 2006
 * Massimo Banzi http://www.potemkin.org
 * 
 * based on C code written by Nicholas Zambetti
 */

// Definición del mapeado de PIN-es

int qt401_drd = 2; // data ready int qt401_di = 3; // data in (desde el sensor) int qt401_ss = 4; // slave select int qt401_clk = 5; // clock int qt401_do = 6; // data out (hacia sensor) int qt401_det = 7; // detect int qt401_prx = 8; // proximity

byte result;

void qt401_init() {

  // Configuación de los PIN-es como entradas y
  // salidas digitales.

  pinMode(qt401_drd, INPUT);
  pinMode(qt401_di,  INPUT);
  pinMode(qt401_ss,  OUTPUT);
  pinMode(qt401_clk, OUTPUT);
  pinMode(qt401_do,  OUTPUT);
  pinMode(qt401_det, INPUT);
  pinMode(qt401_prx, INPUT);

  // Inicializa los PIN-es

  digitalWrite(qt401_clk,HIGH);
  digitalWrite(qt401_ss, HIGH); 

}

// // Espera a que el QT401 esté listo //

void qt401_waitForReady(void) {

  while(!digitalRead(qt401_drd)){
    continue;
  }

}

// // Intercambia un byte con el sensor //

byte qt401_transfer(byte data_out) {

  byte i = 8;

  byte mask = 0;
  byte data_in = 0;

  digitalWrite(qt401_ss,LOW);       // Selecciona "slave" pooniendo a nivel bajo el PIN ss
  delayMicroseconds(75);            // Espera 75 microsegundos

  while(0 < i) {

    mask = 0x01 << --i;             // Genera una máscara de bit-s con el bit más significativo (MSB) primero

    // Byte de "set out"

    if(data_out & mask){            // Bit de "choose"

      digitalWrite(qt401_do,HIGH);  // Envía 1

    }
    else{

      digitalWrite(qt401_do,LOW);   // Envía 0

    }

    // Pone a nivel bajo el PIN de "clock". Este le indica al sensor que lea el bit
    // que acabamos de colocar

    digitalWrite(qt401_clk,LOW);    // tick

    // Da tiempo al sensor para que lea los datos

    delayMicroseconds(75);

    // Recupera la seña de "clock"

    digitalWrite(qt401_clk,HIGH);   // tock

    // Da tiempo al sensor para pensar

    delayMicroseconds(20);

    // Ahora lee un bit que viene del sensor

    if(digitalRead(qt401_di)){

      data_in |= mask;

    }

    //  Da tiempo al sensor para pensar

      delayMicroseconds(20);

  }

  delayMicroseconds(75);            // Da tiempo al sensor para pensar
  digitalWrite(qt401_ss,HIGH);      // Hace un barrido de adquisición de datos
  return data_in;

}

void qt401_calibrate(void) {

  // Calibración
  qt401_waitForReady();
  qt401_transfer(0x01);
  delay(600);

  // Fin de calibaración 
  qt401_waitForReady();
  qt401_transfer(0x02);
  delay(600);

}

void qt401_setProxThreshold(byte amount) {

  qt401_waitForReady();
  qt401_transfer(0x40 & (amount & 0x3F));

}

void qt401_setTouchThreshold(byte amount) {

  qt401_waitForReady();
  qt401_transfer(0x80 & (amount & 0x3F));

}

byte qt401_driftCompensate(void) {

  qt401_waitForReady();
  return qt401_transfer(0x03);

}

byte qt401_readSensor(void) {

  qt401_waitForReady();
  return qt401_transfer(0x00);

}

void setup() {

  // Configura el sensor
  qt401_init();
  qt401_calibrate();
  qt401_setProxThreshold(10);
  qt401_setTouchThreshold(10);

  beginSerial(9600);

}

void loop() {

  if(digitalRead(qt401_det)){
    result = qt401_readSensor();
    if(0x80 & result){ 
      result = result & 0x7f;

      printInteger(result);
      printNewline();

    }
  }

}

Referencias