Learning Examples | Foundations | Hacking | Links
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();
}
}
}