Përmbajtje:
Video: Prekje kapacitive me mikrokontrollues PIC16F886: 3 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:25
Në këtë tutorial ne do të kalojmë se si mund të përdorni një mikrokontrollues PIC16F886 për të zbuluar dallimet në kapacitet, kjo më vonë mund të përdoret për të treguar nëse një tastierë prekëse është duke u shtypur. Goodshtë mirë të njiheni me mikrokontrolluesit e fotografisë para se të bëni këtë projekt.
Hapi 1: Lidhni qarkun tuaj
Së pari, le të fillojmë duke instaluar qarkun sipas skemës së mësipërme. Për të bërë jastëkun e prekjes mund të palosni fletë alumini në një katror dhe të ngjisni në një tel. Ju mund të eksperimentoni me vlera të ndryshme për rezistencën 100k, kam gjetur se 100k ka punuar mirë për mua.
Kunja RC4 përdoret për të filluar karikimin/shkarkimin e kapacitetit që duhet matur. C12IN0 është i lidhur me anën - e një krahasuesi të brendshëm dhe kunja C1IN është e lidhur me anën + të të njëjtit krahasues. Mikrokontrolluesi e sheh kapacitetin si të ngarkuar plotësisht kur tensioni C12IN0 arrin mbi tensionin C1IN. Ndarësi i tensionit rezistues sigurohet që C1IN të jetë afër 5 volt.
Meqenëse blloku i prekjes varet nga fakti që ka një kapacitet të rëndësishëm midis jush dhe tokës së qarkut, ekziston mundësia që një bateri të mos funksionojë.
Hapi 2: Skedari i kokës
Përfunduar me të gjitha lidhjet? Mirë, ne do të vazhdojmë me skedarin e kokës. Ne do të përdorim përpiluesin XC8 dhe siç sugjeron titulli ju tani do të krijoni një skedar të ri header në projektin tuaj dhe kopjoni-ngjisni kodin e mëposhtëm. Ju gjithashtu mund ta kopjoni-ngjisni atë mbi kodin tuaj kryesor pa ndonjë skedar titulli.
#përcakto CALIBRATION_SAMPLE 20 #përcakto TOUCH_SAMPLE 10 #përcakto DISCHARGE_TIME 5
int numërimi;
int calibrationValue, maxCalibrationValue, minCalibrationValue;
int getChargeTime () {
int timerCount = 0; int overflowCount = 0; // kapaciteti i shkarkimit që do të matet RC4 = 0; _vonesë_ms (DISCHARGE_TIME); // jepni vonesë të mjaftueshme për të shkarkuar plotësisht (pothuajse plotësisht në të vërtetë) "kondensatorin" // pastroni flamurin e tejkalimit të kohëmatësit T0IF = 0; // prisni që kohëmatësi të mbushet, filloni numërimin nga 0 ndërsa (! T0IF); T0IF = 0; // filloni kapacitetin e karikimit për t'u matur RC4 = 1; // prisni që kapaciteti të ngarkohet deri në tensionin e referencës ndërsa (C1OUT) {timerCount = TMR0; nëse (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // rivendos timerCount timerCount = 0; overflowCount = 0; numërimi i kthimit; }
int isTouching (int toleranca) {
// mesatarja e mostrave të shumta mesatarja e dyfishtë = 0; për (int i = 0; i kalibrimitVlera+tolerancë) mesatare ++; } mesatare /= TOUCH_SAMPLE; // mesatarja do të jetë një numër midis 0 dhe 1 nëse (mesatarja> 0.2) kthehet 1; kthimi 0; }
kalibrimi i pavlefshëm () {
mesatarja int = 0; mostrat int [CALIBRATION_SAMPLE]; // merrni vlerën mesatare për (int i = 0; i <CALIBRATION_SAMPLE; i ++) {mostra = getChargeTime (); mesatare += mostra ; } mesatare /= CALIBRATION_SAMPLE; calibrationValue = mesatare; // merrni vlerat max/min maxCalibrationValue = mostrat [0]; minCalibrationValue = mostra [0]; për (int i = 0; i maxCalibrationValue) maxCalibrationValue = mostra ; nëse (mostrat <minCalibrationValue) minCalibrationValue = mostrat ; }}
void setupCapacitiveTouch () {
// vendosja e pinit të ngarkimit/shkarkimit si dalje, në këtë rast është RC4 TRISCbits. TRISC4 = 0; // vendosja e kohëmatësit0 T0CS = 0; PSA = 1; // vendosja e krahasuesit C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // pastrimi i vlerave të numërimit numërimi = 0; // pastrimi i vlerave të kalibrimit calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // drejtoni kalibrimin në kalibrimin fillestar (); }
Hapi 3: Shkrimi i Kodit Kryesor
Duke filluar me kodin kryesor, do t'ju duhet të përfshini skedarin e titullit të krijuar në hapin e mëparshëm. Kodi i mëposhtëm është një shembull se si mund ta përdorni funksionin isTouching si ndërprerës. Në rastin tim i dhashë titullit emrin capacitiveTouch.h.
#përfshi
#include "capacitiveTouch.h"
// kjo ndryshore tregon nëse butoni është ose nuk është shtypur tashmë
int lastState = 0;
void kryesore () {
// vendosja e RC5 si dalje TRISCbits. TRISC5 = 0; // ju duhet ta thërrisni këtë funksion në fillim të programit setupCapacitiveTouch (); _vonesë_ms (1000); // kalibroni pas konfigurimit tuaj të saktë kalibroni (); ndërsa (1) {// kontrolloni nëse butoni po shtypet nëse (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; tjetër RC5 = 1; shteti i fundit = 1; } // kontrolloni nëse butoni po lëshohet tjetër nëse (lastState == 1 &&! isTouching (15)) lastState = 0; _vonesë_ms (20); }}
kalibro:
Kur ky funksion quhet variablat calibrationValue, maxCalibrationValue dhe minCalibrationValue do të përditësohen. calibrationValue përdoret nga funksioni isTouching. Mbani në mend se blloku i prekjes duhet të lihet vetëm gjatë kalibrimit.
setupCapacitiveTouch:
Duhet të thirret në fillim të programit tuaj. Ai vendos bitët e nevojshëm të përdorur nga funksionet e tjera. Gjithashtu drejton një kalibrim. Sidoqoftë, unë mora rezultate më të mira duke pritur një sekondë dhe kalova përsëri kalibrimin veç e veç.
ështëTouching:
Ky funksion kthen 1 nëse zbulon një rritje të kapacitetit në C12IN0 dhe kthen 0 nëse kapaciteti është afër atij që ishte gjatë kalibrimit. Thënë thjesht, nëse dikush prek jastëkun funksioni isTouching do të kthehet 1. Funksioni gjithashtu dëshiron një parametër si hyrje, kjo është toleranca që ajo të shkaktojë. Sa më e lartë vlera e tolerancës aq më pak e ndjeshme bëhet. Në konfigurimin tim kam gjetur se 15 punojnë mirë, por sepse kjo varet nga frekuenca e okcillatorit dhe sa kapacitet shtohet kur e shtypni atë, duhet të eksperimentoni me këtë vlerë derisa të gjeni diçka që funksionon për ju.
getChargeTime:
Kur doni të dini sa kohë do të duhej për të ngarkuar kapacitetin në tensionin CVREF, ky funksion do ta testojë atë dhe do të kthejë një numër të plotë. Për të marrë kohën në sekonda përdorni këtë formulë: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Kjo formulë mund të përdoret gjithashtu për të marrë inputin e tolerancës nga funksioni isTouching në sekonda.
Recommended:
Një orë LED pa mikrokontrollues: 12 hapa
Një orë LED pa mikrokontrollues: Siç duket, më pëlqen të bëj orë të ndryshme. Unë kam ndërtuar dhe projektuar orë të shumta elektronike dhe mekanike dhe kjo është një tjetër. Ora ime e parë elektronike kërkoi disa përsëritje dhe mësova shumë. Dizajni i paraqitur është i improvizuar
Orë dixhitale por pa mikrokontrollues [Hardcore Electronics]: 13 hapa (me fotografi)
Ora Dixhitale Por Pa Mikrokontrollues [Hardcore Electronics]: prettyshtë shumë e lehtë të ndërtosh qarqe me një mikrokontrollues, por ne i harrojmë plotësisht tonet e punës që një mikrokontrollues duhej të kalonte për të përfunduar një detyrë të thjeshtë (edhe për ndezjen e një led). Pra, sa e vështirë do të ishte të bësh një orë dixhitale të kompletuar
Mostër audio e bazuar në DFPlayer me sensorë kapacitivë: 9 hapa
Mostër Audio i Bazuar në DFPlayer Me Sensorë Kapacitivë: HyrjePasi eksperimentova me ndërtimin e sintetizatorëve të ndryshëm, fillova të ndërtoj një mostër audio, e cila ishte lehtësisht e përsëritshme dhe e lirë. Për të pasur cilësi të mirë audio (44.1 kHz) dhe kapacitet të mjaftueshëm për ruajtje, modaliteti DFPlayer
Tre qarqe me sensorë me prekje + Qarku i kohëmatësit me prekje: 4 hapa
Tre Qarqet e Sensorit të Prekjes + Qarku i Kohëmatësit të Prekjes: Sensori i Prekjes është një qark i cili ndizet kur zbulon prekjen në Kunjat e Prekjes. Punon në baza kalimtare, domethënë ngarkesa do të jetë ON vetëm për kohën kur prekja bëhet në kunjat. Këtu, unë do t'ju tregoj tre mënyra të ndryshme për të bërë një prekje sen
Filloni me Paketën Prekëse Kapacitive: 4 Hapa
Filloni me Çantën Prekëse Kapacitive: Për projektin tim të ardhshëm do të përdor një tastierë prekëse kapacitive, dhe para se ta lëshoj atë, vendosa të bëj një mësim të vogël në lidhje me kompletin që mora për DFRobot