El microcontrolador ESP32 dispone de 10 sensores táctiles capacitivos.
Se caracterizan por tener un circuito de detección de capacitancia de bajo ruido y alta sensibilidad, permitiendo detectar variaciones por contacto o proximidad.
En la siguiente tabla se recogen los PINs asociados:
*Si se utiliza como sensor capacitivo algún PIN de los anteriores cuando esté conectado con una resistencia pullup o pulldown, se obtendrá un error al ejecutar el script: ValueError: invalid pin for touchpad.
MicroPython implementa la clase machine.TouchPad para controlar los sensores capacitivos.
machine.TouchPad( )
El constructor de clase machine.TouchPad es:
class machine.TouchPad(Pin(id))
El parámetro id es el número de PIN (GPIO) que se habilita como sensor capacitivo.
La clase tiene dos métodos:
- read mide el valor de la capacitancia, los valores son relativos y varían en función de la placa.
- El valor es más grande cuando no hay contacto (puede superar 1000).
- Cuando se toca el valor baja proporcionalmente a la intensidad del contacto.
- config establece el valor máximo de capacitancia que provocará un reinicio del microcontrolador, cuando el sensor se utilice para reiniciarlo de los modos de ahorro de energía lightsleep o deepsleep.
EJEMPLOS DE USO
Para hacer uso de los PINs con sensor capacitivo, en primer lugar será necesario comprobar los PINs disponibles en cada placa. Por ejemplo en la DOIT ESP32 DEVKIT V1 – 30 PINES están disponibles los siguientes:
Se puede hacer una lectura de cada PIN con un script similar al siguiente, en el que se lee el GPIO04 (T0):
import machine T0 = machine.TouchPad(machine.Pin(4)); print("T0:", T0.read())
O el siguiente, que es equivalente, pero que consume menos recursos de memoria:
from machine import Pin, TouchPad T0 = TouchPad(Pin(4)); print("T0:", T0.read())
El circuito asociado es simplemente un cable conectado al PIN para hacer contacto, de esta forma se puede comprobar como varía la capacitancia en función de la intensidad del contacto:
El mismo circuito sirve para reiniciar el microcontrolador del modo light-sleep:
import machine, esp32, time T0 = machine.TouchPad(machine.Pin(4)) T0.config(200) # Configura el umbral de reinicio (en el que el pin se considera tocado) esp32.wake_on_touch(True) print("El ESP32 entra en modo LIGHT-SLEEP. Toca el GPIO04 para salir del modo LIGHT-SLEEP.") time.sleep_ms(10) # Retardo para que permita escribir el anterior texto antes de entrar en modo light-sleep machine.lightsleep(); # El ESP32 entra en modo LIGHT-SLEEP print("El ESP32 ha salido del modo LIGHT-SLEEP") print("T0 =", T0.read()) # Imprime el valor de la capacitancia que ha provocado el reinicio
O para reiniciarlo del modo deep-sleep:
import machine, esp32 T0 = machine.TouchPad(machine.Pin(4)) T0.config(200) # Configura el umbral de reinicio (en el que el pin se considera tocado) esp32.wake_on_touch(True) print("El ESP32 entra en modo DEEP-SLEEP. Toca el GPIO04 para salir del modo DEEP-SLEEP.") machine.deepsleep() # El ESP32 entra en modo LIGHT-SLEEP hasta que se toque el sensor
Otro ejemplo, un poco más elaborado, es el siguiente script en el que se comprueba cada 100 ms la capacitancia del GPIO04. Cuando la capacitancia sea inferior a 300 – T0.read()<300 – se encenderá el LED conectado con el GPIO23:
from machine import Pin, TouchPad import time T0 = TouchPad(Pin(4)); LED23 = Pin(23, mode=Pin.OUT, value=0) # se inicializa el GPIO23 como salida del LED23 y se deja apagado tiempoLimite = time.ticks_add(time.ticks_ms(), 100) # se define la variable tiempoLimite para comprobar T0 # tiempo RTC + 100 ms while True: if time.ticks_diff(tiempoLimite, time.ticks_ms()) <= 0: # se compruebas si el tiempoLimite se ha agotado if T0.read()<300: # si el tiempo se ha agotado y T0 tiene contacto... LED23.on() # ... se enciende el LED else: # si el tiempo se ha agotado y T0 no tiene contacto... LED23.off() # ...se apaga el LED tiempoLimite = time.ticks_add(time.ticks_ms(), 100) #nuevo tiempoLimite (tiempo RTC + 100 ms)
El circuito asociado al script es el siguiente:
Leave a Reply
Tu correo electrónico está seguro.
You must be logged in to post a comment.