Learning   Examples | Foundations | Hacking | Links

Sensor qt401

Pronto habrá un tutorial completo.

 
/* Demostración qt401
 * ------------------
 *
 * El qt401 de qprox http://www.qprox.com es un sensor capacitivo lineal
 * que está preparado para leer la posición de un dedo al tocar el sensor
 * la superficie del sensor está dividida en 128 posiciones
 * el pin qt401_prx detecta cuando una mano está cerca del sensor mientras que
 * qt401_det determina cuando alguien está actualmente tocando el sensor
 * este puede dejarse desconectado si dispones de pocos pines libres 
 *
 * Lee la hoja de referencia (''datasheet'') para entender los parámetros pasados al iniciar el sensor.
 *
 * Creado en enero de 2006
 * Massimo Banzi http://www.potemkin.org
 * 
 * basado en el código C escrito por Nicholas Zambetti
 */


// define el mapa de pines
int qt401_drd = 2; // dato disponible
int qt401_di  = 3; // dato entrante (desde el sensor)
int qt401_ss  = 4; // selecciona esclavo
int qt401_clk = 5; // reloj
int qt401_do  = 6; // dato saliente (al sensor)
int qt401_det = 7; // detección 
int qt401_prx = 8; // proximidad  


byte result;

void qt401_init() {
  // define pin directions
  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);


  // inicia los pines
  digitalWrite(qt401_clk,HIGH);
  digitalWrite(qt401_ss, HIGH); 
}

//
//  espera que el qt401 esté preparado
//
void qt401_waitForReady(void)
{
  while(!digitalRead(qt401_drd)){
    continue;
  }
} 



//
//  intercambia un byte (octeto) con el sensor
//

byte qt401_transfer(byte data_out)
{
  byte i = 8;

  byte mask = 0;
  byte data_in = 0;

  digitalWrite(qt401_ss,LOW); // selección esclavo poniéndo a LOW el pin ss
  delayMicroseconds(75); // espera 75 microsegundos

  while(0 < i) {

    mask = 0x01 << --i; // genera la máscara de bits apropiada para obtener el primer MSB

    // set out byte
    if(data_out & mask){ // elige el bit.

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

    }
    else{

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

    }

    // Pone a LOW el pin de reloj, esto indica al sensor que lea el bit que nosotros le enviamos.
    digitalWrite(qt401_clk,LOW); // tick

    // otorga tiempo al sensor para que pueda leer el dato

    delayMicroseconds(75);

    // Devuelve al reloj el estado anterior.

    digitalWrite(qt401_clk,HIGH); // tock

    // da al sensor algo de tiempo para pensar

    delayMicroseconds(20);

    // ahora lee un bit que viene del sensor.
    if(digitalRead(qt401_di)){

      data_in |= mask;

    }

    // da al sensor algo de tiempo para pensar

      delayMicroseconds(20);

  }

  delayMicroseconds(75);  //  da al sensor algo de tiempo para pensar

  digitalWrite(qt401_ss,HIGH); // termina la adquisición.

  return data_in;
}

void qt401_calibrate(void)
{
  // calibración
  qt401_waitForReady();
  qt401_transfer(0x01);
  delay(600);

  // la calibración termina 
  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();

    }
  }

}

Share