(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