Crear pulsador táctil capacitivo sencillo

Arduino, STM32 (Maple), ESP8266, ESP32, etc
Avatar de Usuario
Naguissa
Administrador del Sitio
Mensajes: 416
Registrado: 04 Jul 2016, 11:17
Agradecido: 85 veces
Agradecimiento recibido: 131 veces

Crear pulsador táctil capacitivo sencillo

Mensaje por Naguissa » 17 Oct 2019, 11:50

Tras ver un tutorial para crear un pulsador capacitivo de manera sencilla he pasado a probarlo, clarificar y simplificar el sistema para crear una versión tremensamente simple.

Su funcionamiento se basa en usar la capacitancia de la parte metálica como condensador, cargarlo a través de una resistencia y comprobar cuanto tarda en cargarse para decidir si está en situación normal o hay alguien tocándolo. Tras comprobarlo, se procede a descargar esa capacitancia usando el mismo pin pero con polaridad negativa.

El esquema es el siguiente:
Diagrama pulsador táctil
Diagrama pulsador táctil
Tactil.png (5.64 KiB) Visto 883 veces


El condensador del diagrama es realmente una tira o placa metálica, que es lo que hace la función táctil.


El programa demostrativo es el siguiente:

Código: Seleccionar todo

#define CHARGE_PIN 12
#define INPUT_PIN 14
#define LED_PIN 33
#define DEBOUNCE_MS 175
#define TRAININGS 25

unsigned long maxTime = 50;

unsigned char ledOn = 0;
unsigned long debounceStop = 0;

void setup() {
  Serial.begin(57600);
  
  // Set up the switch pins.
  pinMode(CHARGE_PIN, OUTPUT);
  pinMode(INPUT_PIN, INPUT);
  
  // Set up the LED pin.
  pinMode(LED_PIN, OUTPUT);

  Serial.println("Pins done");
  train();
  Serial.println("Train done");

}

unsigned long tactileCycle() {
  unsigned long startTime = micros(), stopTime, ret;
  uint8_t loopCount = 0;
  digitalWrite(CHARGE_PIN, HIGH); // CHarge the circuit.
  while(!digitalRead(INPUT_PIN) && loopCount < 254) { // Count the loops until the input pin is charged.
    loopCount++;
  }
  digitalWrite(CHARGE_PIN, LOW); // Turn off the charge pin
  if (loopCount >= 254) {
    return 0;
  }
  stopTime = micros();
  if (stopTime > startTime) {
    ret = stopTime - startTime;
    updateLimits(ret);
  } else {
    ret = maxTime;
  }
  return ret;
  
}


void updateLimits(const unsigned long actual) {
  unsigned long partActual = actual * 0.75;
  if (partActual > maxTime) {
    maxTime = partActual;
  }
}


void train() {
  uint8_t i = 0;
  for (i = 0; i < TRAININGS; i++) {
    tactileCycle();
  }
}


void loop() {
  unsigned long actMs = millis();
  unsigned long measured = tactileCycle();
  if (actMs > debounceStop && measured > maxTime) {
      debounceStop = actMs + DEBOUNCE_MS;
      ledOn = !ledOn;
      Serial.print("Trigger! ");
      Serial.print(measured);
      Serial.print("ms vs ");
      Serial.print(maxTime);
      Serial.println("ms");
  }
    digitalWrite(LED_PIN, ledOn);
}

Los parámetros a modificar son:

CHARGE_PIN - El pin usado para cargar y descargar la lámina, el que está unido a la resistencia.
INPUT_PIN - El pin usado para monitorizar el estado de carga de la lámina, directamente conectado a ella.
maxTime - El tiempo barrera inicial. El sistema se entrena solo pero ajustando este valor se puede mejorar el proceso. Depende de la lámina metálica y, en general, del montaje.
DEBOUNCE_MS - El tiempo mínimo entre pulsaciones.
LED_PIN - El led para la demostración.
TRAININGS - El ajuste inicial que hace automáticamente; podéis dejar este valor.




Idea sacada de: https://www.instructables.com/id/Capaci ... r-Arduino/

Video del interruptor funcionando en un Maple Mini (STM32) programado con el IDE Arduino:

https://www.youtube.com/watch?v=DY1Ve8udQ5o


Tags:

  • Similar Topics
    Respuestas
    Vistas
    Último mensaje