Índice:

Toque capacitivo com microcontrolador PIC16F886: 3 etapas
Toque capacitivo com microcontrolador PIC16F886: 3 etapas

Vídeo: Toque capacitivo com microcontrolador PIC16F886: 3 etapas

Vídeo: Toque capacitivo com microcontrolador PIC16F886: 3 etapas
Vídeo: SENSOR DE TOQUE CAPACITIVO COM LED PARA O SEU PROJETO! 2024, Julho
Anonim
Toque capacitivo com microcontrolador PIC16F886
Toque capacitivo com microcontrolador PIC16F886

Neste tutorial, veremos como você pode usar um microcontrolador PIC16F886 para detectar diferenças na capacitância, isso pode ser usado posteriormente para saber se um touch pad está sendo pressionado. É bom estar familiarizado com os microcontroladores pic antes de fazer este projeto.

Etapa 1: conecte seu circuito

Ligue o seu circuito
Ligue o seu circuito

Primeiro, vamos começar ligando o circuito de acordo com o esquema acima. Para fazer o touch pad, você pode dobrar uma folha de alumínio em um quadrado e prender em um arame. Você pode experimentar diferentes valores para o resistor de 100k, descobri que 100k funcionou bem para mim.

O pino RC4 é usado para iniciar o carregamento / descarregamento da capacitância a ser medida. C12IN0 é conectado ao lado - de um comparador interno e o pino C1IN é conectado ao lado + do mesmo comparador. O microcontrolador vê a capacitância como totalmente carregada quando a tensão C12IN0 atinge acima da tensão C1IN. O divisor de tensão resistivo garante que C1IN esteja próximo a 5 volts.

Como o touch pad depende da existência de uma capacitância significativa entre você e o aterramento do circuito, é possível que a bateria não funcione.

Etapa 2: o arquivo de cabeçalho

O Arquivo de Cabeçalho
O Arquivo de Cabeçalho

Terminou com todas as conexões? Bom, continuaremos com o arquivo de cabeçalho. Estaremos usando o compilador XC8 e como o título sugere, agora você deve criar um novo arquivo de cabeçalho em seu projeto e copiar e colar o código a seguir. Você também pode copiar e colar acima do código principal, sem nenhum arquivo de cabeçalho.

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

contagem interna;

int calibraçãoValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // descarregar a capacitância a ser medida RC4 = 0; _delay_ms (DISCHARGE_TIME); // dar atraso suficiente para descarregar totalmente (quase totalmente) o "capacitor" // limpar o sinalizador de estouro do temporizador T0IF = 0; // espere o temporizador estourar, comece a contagem a partir de 0 while (! T0IF); T0IF = 0; // inicia o carregamento da capacitância a ser medida RC4 = 1; // espera que a capacitância seja carregada até a tensão de referência enquanto (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} contagem = (256 * overflowCount) + timerCount; // redefine o timerCount timerCount = 0; overflowCount = 0; contagem de retorno; }

int isTouching (int tolerância) {

// média de múltiplas amostras double average = 0; para (int i = 0; i calibraçãoValor + tolerância) média ++; } média / = TOUCH_SAMPLE; // a média será um número entre 0 e 1 if (média> 0,2) return 1; return 0; }

void calibrate () {

média interna = 0; amostras int [CALIBRATION_SAMPLE]; // obtém o valor médio para (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); média + = amostras ; } média / = CALIBRATION_SAMPLE; calibraçãoValue = média; // obtém os valores máx. / mín. maxCalibrationValue = samples [0]; minCalibrationValue = samples [0]; para (int i = 0; i maxCalibrationValue) maxCalibrationValue = amostras ; if (amostras <minCalibrationValue) minCalibrationValue = samples ; }}

void setupCapacitiveTouch () {

// configurando o pino de carga / descarga como saída, neste caso é RC4 TRISCbits. TRISC4 = 0; // configurando o timer0 T0CS = 0; PSA = 1; // configurando o comparador C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // limpar valores de contagem count = 0; // limpar os valores de calibração calibraçãoValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // executa a calibração no início calibrate (); }

Etapa 3: Escrevendo o código principal

Começando com o código principal, você precisará incluir o arquivo de cabeçalho criado na etapa anterior. O código a seguir é um exemplo de como você pode usar a função isTouching como uma chave. No meu caso, dei ao cabeçalho o nome capacitiveTouch.h.

#incluir

#include "capacitiveTouch.h"

// esta variável diz se o botão está ou não pressionado

int lastState = 0;

void main () {

// configurando RC5 como saída TRISCbits. TRISC5 = 0; // você precisa chamar esta função no início do programa setupCapacitiveTouch (); _delay_ms (1000); // calibrar após sua configuração exata calibrate (); while (1) {// verificar se o botão está sendo pressionado if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; senão RC5 = 1; lastState = 1; } // verificar se o botão está sendo liberado else if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

calibrar:

Quando esta função é chamada de variáveis calibraçãoValue, maxCalibrationValue e minCalibrationValue serão atualizados. calibraçãoValue é usado pela função isTouching. Lembre-se de que o touch pad deve ser deixado sozinho durante a calibração.

setupCapacitiveTouch:

Precisa ser chamado no início de seu programa. Ele configura os bits necessários usados pelas outras funções. Ele também executa uma calibração. No entanto, obtive melhores resultados ao esperar um segundo e executar a calibração novamente separadamente.

isTouching:

Esta função retorna 1 se detectar um aumento na capacitância no C12IN0 e retorna 0 se a capacitância estiver próxima à que estava durante a calibração. Simplesmente declarado, se alguém tocar o pad, a função isTouching retornará 1. A função também deseja um parâmetro como uma entrada, esta é a tolerância para o acionamento. Quanto maior o valor de tolerância, menos sensível ele se torna. Em minha configuração, descobri que 15 funcionou bem, mas como isso depende da frequência do ocsilador e de quanta capacitância é adicionada ao pressioná-lo, você deve fazer experiências com esse valor até encontrar algo que funcione para você.

getChargeTime:

Quando você quiser saber quanto tempo levaria para carregar a capacitância até a tensão CVREF, esta função irá testá-la e retornar um número inteiro. Para obter o tempo em segundos, use esta fórmula: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Esta fórmula também pode ser usada para obter a entrada de tolerância da função isTouching para segundos.

Recomendado: