Spisu treści:
Wideo: Dotyk pojemnościowy z mikrokontrolerem PIC16F886: 3 kroki
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:31
W tym samouczku omówimy, w jaki sposób można użyć mikrokontrolera PIC16F886 do wykrywania różnic w pojemności, które można później wykorzystać do sprawdzenia, czy wciśnięty jest panel dotykowy. Dobrze jest zapoznać się z mikrokontrolerami pic przed wykonaniem tego projektu.
Krok 1: Podłącz obwód
Najpierw zacznijmy od okablowania obwodu zgodnie z powyższym schematem. Aby wykonać touchpad, możesz zwinąć folię aluminiową w kwadrat i przykleić taśmą drut. Możesz poeksperymentować z różnymi wartościami rezystora 100k, stwierdziłem, że 100k działa dobrze dla mnie.
Pin RC4 służy do rozpoczęcia ładowania/rozładowywania mierzonej pojemności. C12IN0 jest podłączony do strony - wewnętrznego komparatora, a pin C1IN jest podłączony do strony + tego samego komparatora. Mikrokontroler widzi pojemność jako w pełni naładowaną, gdy napięcie C12IN0 przekroczy napięcie C1IN. Rezystancyjny dzielnik napięcia zapewnia, że C1IN jest zbliżone do 5 woltów.
Ponieważ panel dotykowy zależy od znacznej pojemności między tobą a masą obwodu, istnieje możliwość, że bateria może nie działać.
Krok 2: Plik nagłówkowy
Skończyłeś ze wszystkimi połączeniami? Dobrze, będziemy kontynuować z plikiem nagłówkowym. Będziemy używać kompilatora XC8 i jak sugeruje tytuł, teraz utwórz nowy plik nagłówkowy w swoim projekcie i skopiuj i wklej poniższy kod. Możesz równie dobrze skopiować i wkleić go nad głównym kodem bez żadnego pliku nagłówkowego.
#define CALIBRATION_SAMPLE 20#define TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5
liczba int;
int CalibrationValue, maxCalibrationValue, minCalibrationValue;
int pobierzCzasObładowania(){
int licznik licznika = 0; int overflowCount = 0; //mierzona pojemność rozładowania RC4 = 0; _delay_ms(DISCHARGE_TIME); //daj wystarczająco dużo opóźnienia, aby całkowicie (prawie w pełni) rozładować "kondensator" //wyczyść flagę przepełnienia timera T0IF = 0; //czekaj na przepełnienie timera, rozpocznij liczenie od 0 while(!T0IF); T0JEŻELI = 0; //rozpocznij pomiar pojemności ładowania RC4 = 1; //czekaj na naładowanie pojemności do napięcia odniesienia while(C1OUT){ timerCount = TMR0; if(T0IF){ overflowCount++; T0JEŻELI = 0; } } count = (256 * overflowCount) + timerCount; //resetuj licznik licznika licznik licznika = 0; overflowCount = 0; liczba zwrotów; }
int dotyka(int tolerancja){
//średnia z wielu próbek podwójna średnia = 0; for(int i = 0; i wartośćkalibracji + tolerancja) średnia++; } średnia /= TOUCH_SAMPLE; //średnia będzie liczbą z zakresu od 0 do 1 if(średnia > 0,2) return 1; zwróć 0; }
pusta kalibracja (){
średnia int = 0; próbki int[CALIBRATION_SAMPLE]; //pobierz średnią wartość for(int i = 0; i < CALIBRATION_SAMPLE; i++){ sample = getChargeTime(); średnia += próbki; } średnia /= CALIBRATION_SAMPLE; WartośćKalibracji = średnia; //pobierz wartości max/min maxCalibrationValue = sample[0]; minCalibrationValue = sample[0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = sample; if(samples < minCalibrationValue) minCalibrationValue = sample; } }
void setupCpacitiveTouch(){
//ustawienie pinu ładowania/rozładowania jako wyjścia, w tym przypadku jest to RC4 TRISCbits. TRISC4 = 0; //ustawianie timera0 T0CS = 0; PSA = 1; //ustawianie komparatora C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; //czyszczenie wartości licznika count = 0; //kasowanie wartości kalibracyjnych CalibrationValue = 0; maxCalibrationValue = 0; minWartośćKalibracji = 0; //uruchom kalibrację przy starcie kalibruj(); }
Krok 3: Pisanie kodu głównego
Zaczynając od głównego kodu, musisz dołączyć plik nagłówkowy utworzony w poprzednim kroku. Poniższy kod jest przykładem użycia funkcji isTouching jako przełącznika. W moim przypadku nadałem nagłówkowi nazwę capacitiveTouch.h.
#włączać
#include "capacitiveTouch.h"
// ta zmienna mówi, czy przycisk jest już naciśnięty, czy nie
int ostatni stan = 0;
nieważne główne () {
//ustawienie RC5 jako wyjścia TRISCbits. TRISC5 = 0; //musisz wywołać tę funkcję przy starcie programu setupCapacitiveTouch(); _delay_ms(1000); //kalibruj po dokładnym ustawieniu kalibracja(); while(1){ //sprawdzenie, czy przycisk jest naciśnięty if(isTouching(15) && lastState == 0){ if(RC5) RC5 = 0; w przeciwnym razie RC5 = 1; ostatni stan = 1; } //sprawdzenie, czy przycisk jest zwalniany else if(lastState == 1 && !isTouching(15)) lastState = 0; _delay_ms(20); } }
kalibrować:
Gdy ta funkcja zostanie wywołana, zmienne CalibrationValue, maxCalibrationValue i minCalibrationValue zostaną zaktualizowane. CalibrationValue jest używana przez funkcję isTouching. Należy pamiętać, że podczas kalibracji tabliczkę dotykową należy pozostawić samą.
konfiguracjaCapacitiveTouch:
Musi zostać wywołany na początku twojego programu. Konfiguruje niezbędne bity używane przez inne funkcje. Prowadzi również kalibrację. Jednak lepsze wyniki uzyskałem, odczekując sekundę i ponownie przeprowadzając kalibrację osobno.
dotyka:
Ta funkcja zwraca 1, jeśli wykryje wzrost pojemności na C12IN0 i zwraca 0, jeśli pojemność jest zbliżona do tej, którą była podczas kalibracji. Mówiąc prosto, jeśli ktoś dotknie padu, funkcja isTouching zwróci 1. Funkcja również potrzebuje parametru jako wejścia, jest to tolerancja na jej wyzwolenie. Im wyższa wartość tolerancji, tym mniej wrażliwa. W mojej konfiguracji stwierdziłem, że 15 działa dobrze, ale ponieważ zależy to od częstotliwości oscylatora i tego, ile pojemności dodaje się po naciśnięciu, powinieneś poeksperymentować z tą wartością, aż znajdziesz coś, co działa dla ciebie.
getChargeTime:
Jeśli chcesz wiedzieć, ile czasu zajmie naładowanie pojemności do napięcia CVREF, ta funkcja przetestuje ją i zwróci liczbę całkowitą. Aby uzyskać czas w sekundach, użyj następującej formuły: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Ta formuła może być również wykorzystana do obliczenia tolerancji danych wejściowych z funkcji isTouching na sekundy.
Zalecana:
Pojemnościowy wysuwany wskaźnik: 4 kroki
Pojemnościowy wysuwany wskaźnik: Pojemnościowa technologia dotykowa jest dziś bardzo powszechna, szczególnie w kuchni. Dla osób o mniejszym wzroście lub ograniczonym zasięgu dostęp do elementów sterujących tymi technologiami może być trudny. Konwencjonalne wskaźniki rozszerzeń nie będą działać, ponieważ
Licznik segmentów 0-9 z mikrokontrolerem CloudX: 3 kroki
Licznik 0-9 segmentowy Z mikrokontrolerem CloudX: W tym projekcie używamy siedmiosegmentowego wyświetlacza LED do liczenia od 0 do 9. Siedmiosegmentowy wyświetlacz LED składa się z ośmiu diod LED i jest idealny do wyświetlania liczb. piny używane przez wyświetlacz, wszystkie anody lub katody n
Wielokrotny 7-segmentowy licznik z mikrokontrolerem CloudX: 4 kroki
Wielokrotny 7-segmentowy licznik z mikrokontrolerem CloudX: Ten projekt wyjaśnia, jak wyświetlać dane na dwóch 7-segmentowych za pomocą mikrokontrolera CloudX
Dotyk pojemnościowy z Eveve (kontroler oparty na Arduino): 6 kroków (ze zdjęciami)
Pojemnościowy dotyk z Eveve (kontroler oparty na Arduino): Czy wiesz, jak działa ekran dotykowy Twojego smartfona? Smartfon ma szereg czujników dotykowych pod szklanym ekranem. Obecnie jest on oparty na technologii wykrywania dotyku pojemnościowego, a nawet delikatny dotyk jest łatwo wykrywalny. Dotyk pojemnościowy jest wyczuwany
DIY studyjny mikrofon pojemnościowy: 4 kroki
DIY studyjny mikrofon pojemnościowy: Zbuduj studyjnej jakości mikrofon pojemnościowy z zasilaniem fantomowym +48 V za mniej niż 35 USD! - http://www.diycondensermics.comTe mikrofony są bardzo czułe i należy je skonfigurować tak, aby korzystały z baterii 9V, jeśli nie masz zasilania fantomowego. Możesz je umieścić w prawie wszystkim