Sensor capacitivo

Los sensores capacitivos se utilizan comúnmente para la detección de objetos. Pueden utilizarse, por ejemplo, para detectar el paso de un objeto en una cinta transportadora o para detectar el nivel de un líquido en un tanque. Los sensores capacitivos se usan en pantallas táctiles o como interruptores. En esta entrada veremos cómo crear un sensor capacitivo utilizando un simple conductor y un microcontrolador.

Principio de funcionamiento

Un sensor capacitivo funciona como una antena que genera un campo eléctrico. Cuando un material se acerca a la antena, cambiará la capacidad de este campo. El microcontrolador detecta esta diferencia y puede determinar la proximidad del objeto. Con esta tecnología, es posible transformar cualquier objeto conductor en un sensor.

capacitive-touch-principle

Esquema

Para crear un sensor táctil en un tablero de Arduino. Necesitaremos una resistencia y un cable. La resistencia conecta el pin de medición con el objeto de referencia, es decir, el cable va desde el pin de medición a una hoja de papel de aluminio, pintura conductora, un a fruta o similar (algo conductor de corriente). El valor de la resistencia definirá la sensibilidad del sensor. Cuanto más alto sea el valor de la resistencia, más capaz será el sensor de detectar un objeto a distancia. Usamos una resistencia de 1MOhm pero puede elegir la más adecuada para su aplicación entre 500k y 40Mohm.

Hay microcontroladores como el NodeMCU (ESP8266 o ESP32) con sensores táctiles integrados. En este caso, un solo conductor conectado a la clavija es suficiente para crear un sensor capacitivo.

capacitve-touch-sensor-arduino_bb

Código

Para usar el objeto Capacitivo usaremos la biblioteca CapacitiveSensor.h. Para inicializar el sensor, tenemos que especificar los pines utilizados (aquí, 2 y 3). Es posible ajustar la sensibilidad del sensor durante la función de llamada cs.capacitiveSensor(sensitivity). Para tener más control sobre la precisión del sensor, usamos un promedio móvil gestionado por la función smooth() para filtrar las mediciones del sensor.


#include <CapacitiveSensor.h>

//Parameters

const int numLec = 10;
long lecturas[numLec];
int index = 0;
long total = 0, lectura=0;
const int sensitivity = 1000;
CapacitiveSensor cs = CapacitiveSensor(2, 3);

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
delay(1000);
cs.set_CS_AutocaL_Millis(0xFFFFFFFF);
}

void loop() {
// put your main code here, to run repeatedly:
lectura = lecturaMedia();
if (lectura >0)
Serial.println(lectura);
}

long lecturaMedia() {
long media=0;

// leer sensor y añadir la lectura
lecturas[index] = cs.capacitiveSensor(sensitivity);

// acumular
total = total + lecturas[index];
index = index + 1;
if (index >= numLec) {
index = 0;
media = total / numLec;
total = 0;
}
return media;
}

Si quisiéramos hacer un piano, por ejemplo con frutas:

piano frutas

En este caso y como tendremos 7 sensores no podemos utilizar el método para leer varias veces y recoger la media, eso nos obligaría a tener 7 métodos, uno por sensor, o hacer una programación orientada a objetos.

 

#include <CapacitiveSensor.h>

//la resistencia de 1M la colocamos entre los pines 3,4,5,6,7,8,9 y 2.
//Declaramos 7 sensores
CapacitiveSensor miSensor1 = CapacitiveSensor(2, 3);
CapacitiveSensor miSensor2 = CapacitiveSensor(2, 4);
CapacitiveSensor miSensor3 = CapacitiveSensor(2, 5);
CapacitiveSensor miSensor4 = CapacitiveSensor(2, 6);
CapacitiveSensor miSensor5 = CapacitiveSensor(2, 7);
CapacitiveSensor miSensor6 = CapacitiveSensor(2, 8);
CapacitiveSensor miSensor7 = CapacitiveSensor(2, 9);

//almacenamos las notas en nota[i]
int nota[7] = {262, 294, 330, 350, 392, 440, 494};

int piezo=10; //el piezo lo conectamos en el pin 10

void setup() {
// put your setup code here, to run once:
pinMode(piezo, OUTPUT);
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
if (miSensor1.capacitiveSensor(30) > 500) {
tone(10, nota[0], 100);
delay(100);
}
else
noTone(10);
if (miSensor2.capacitiveSensor(30) > 500) {
tone(10, nota[1], 100);
delay(100);
}
else
noTone(10);
if (miSensor3.capacitiveSensor(30) > 500) {
tone(10, nota[2], 100);
delay(100);
}
else
noTone(10);
if (miSensor4.capacitiveSensor(30) > 500) {
tone(10, nota[3], 100);
delay(100);
}
else
noTone(10);
if (miSensor5.capacitiveSensor(30) > 500) {
tone(10, nota[4], 100);
delay(100);
}
else
noTone(10);
if (miSensor6.capacitiveSensor(30) > 500) {
tone(10, nota[5], 100);
delay(100);
}
else
noTone(10);
if (miSensor7.capacitiveSensor(30) > 500) {
tone(10, nota[6], 100);
delay(100);
}
else
noTone(10);

}