Tabla de contenido:

Táctil capacitivo con microcontrolador PIC16F886: 3 pasos
Táctil capacitivo con microcontrolador PIC16F886: 3 pasos

Video: Táctil capacitivo con microcontrolador PIC16F886: 3 pasos

Video: Táctil capacitivo con microcontrolador PIC16F886: 3 pasos
Video: 44.- Pantalla Touch Nextion | Curso Microcontroladores PIC 2024, Mes de julio
Anonim
Táctil capacitivo con microcontrolador PIC16F886
Táctil capacitivo con microcontrolador PIC16F886

En este tutorial repasaremos cómo puede usar un microcontrolador PIC16F886 para detectar diferencias en la capacitancia, esto luego se puede usar para saber si se está presionando un panel táctil. Es bueno estar familiarizado con los microcontroladores pic antes de realizar este proyecto.

Paso 1: Conecte su circuito

Conecte su circuito
Conecte su circuito

Primero, comencemos por cablear el circuito de acuerdo con el esquema anterior. Para hacer el panel táctil, puede doblar papel de aluminio en un cuadrado y pegarlo con cinta adhesiva. Puede experimentar con diferentes valores para la resistencia de 100k, encontré que 100k funcionó bien para mí.

El pin RC4 se usa para comenzar a cargar / descargar la capacitancia que se va a medir. C12IN0 está conectado al lado - de un comparador interno y el pin C1IN está conectado al lado + del mismo comparador. El microcontrolador considera que la capacitancia está completamente cargada cuando el voltaje C12IN0 supera el voltaje C1IN. El divisor de voltaje resistivo asegura que C1IN esté cerca de 5 voltios.

Dado que el panel táctil depende de que haya una capacitancia significativa entre usted y la tierra del circuito, existe la posibilidad de que una batería no funcione.

Paso 2: el archivo de encabezado

El archivo de encabezado
El archivo de encabezado

¿Terminaste con todas las conexiones? Bien, procederemos con el archivo de encabezado. Usaremos el compilador XC8 y, como sugiere el título, ahora deberá crear un nuevo archivo de encabezado en su proyecto y copiar y pegar el siguiente código. También puede copiarlo y pegarlo sobre su código principal sin ningún archivo de encabezado.

#define CALIBRATION_SAMPLE 20 # define TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5

int count;

int CalibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // capacitancia de descarga a medir RC4 = 0; _delay_ms (DISCHARGE_TIME); // dar suficiente retardo para descargar completamente (casi completamente) el "condensador" // borrar el indicador de desbordamiento del temporizador T0IF = 0; // esperar a que el temporizador se desborde, empezar a contar desde 0 while (! T0IF); T0IF = 0; // iniciar la carga de la capacitancia a medir RC4 = 1; // esperar a que la capacitancia se cargue hasta el voltaje de referencia mientras (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} cuenta = (256 * overflowCount) + timerCount; // restablecer timerCount timerCount = 0; overflowCount = 0; recuento de devoluciones; }

int isTouching (int tolerancia) {

// promedio de múltiples muestras doble promedio = 0; para (int i = 0; i CalibrationValue + tolerancia) average ++; } promedio / = TOUCH_SAMPLE; // el promedio será un número entre 0 y 1 si (promedio> 0.2) return 1; return 0; }

void calibrate () {

int promedio = 0; int samples [CALIBRATION_SAMPLE]; // obtener el valor promedio para (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); promedio + = muestras ; } promedio / = CALIBRATION_SAMPLE; CalibrationValue = promedio; // obtener los valores máximo / mínimo maxCalibrationValue = samples [0]; minCalibrationValue = samples [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = muestras ; if (samples <minCalibrationValue) minCalibrationValue = samples ; }}

void setupCapacitiveTouch () {

// configurando el pin de carga / descarga como salida, en este caso es RC4 TRISCbits. TRISC4 = 0; // configurando timer0 T0CS = 0; PSA = 1; // configurando el comparador C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // borrar los valores de conteo count = 0; // borrar los valores de calibración calibraciónValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // ejecutar la calibración al iniciar calibrate (); }

Paso 3: escribir el código principal

Comenzando con el código principal, deberá incluir el archivo de encabezado creado en el paso anterior. El siguiente código es un ejemplo de cómo puede utilizar la función isTouching como interruptor. En mi caso, le di al encabezado el nombre capacitiveTouch.h.

#incluir

#include "capacitiveTouch.h"

// esta variable dice si el botón está o no ya presionado

int lastState = 0;

vacío principal(){

// establecer RC5 como salida TRISCbits. TRISC5 = 0; // necesita llamar a esta función al inicio del programa setupCapacitiveTouch (); _delay_ms (1000); // calibre después de su configuración exacta calibrate (); while (1) {// comprobando si se presiona el botón if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; si no RC5 = 1; lastState = 1; } // comprobando si se suelta el botón else if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

calibrar:

Cuando se llame a esta función, se actualizarán las variables CalibrationValue, maxCalibrationValue y minCalibrationValue. CalibrationValue es utilizado por la función isTouching. Tenga en cuenta que el panel táctil debe dejarse solo durante la calibración.

setupCapacitiveTouch:

Necesita ser llamado al comienzo de su programa. Configura los bits necesarios utilizados por las otras funciones. También ejecuta una calibración. Sin embargo, obtuve mejores resultados al esperar un segundo y ejecutar la calibración nuevamente por separado.

isTouching:

Esta función devuelve 1 si detecta un aumento en la capacitancia en el C12IN0 y devuelve 0 si la capacitancia está cerca de la que estaba durante la calibración. En pocas palabras, si alguien toca el pad, la función isTouching devolverá 1. La función también quiere un parámetro como entrada, esta es la tolerancia para que se dispare. Cuanto mayor sea el valor de tolerancia, menos sensible se vuelve. En mi configuración, encontré que 15 funcionó bien, pero debido a que esto depende de la frecuencia del ocsilador y de cuánta capacitancia se agrega cuando lo presiona, debe experimentar con este valor hasta que encuentre algo que funcione para usted.

getChargeTime:

Cuando desee saber cuánto tiempo tomaría cargar la capacitancia al voltaje CVREF, esta función lo probará y devolverá un número entero. Para obtener el tiempo en segundos, use esta fórmula: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Esta fórmula también se puede usar para obtener la entrada de tolerancia de la función isTouching en segundos.

Recomendado: