Inhaltsverzeichnis:
- Schritt 1: Verdrahten Sie Ihre Schaltung
- Schritt 2: Die Header-Datei
- Schritt 3: Schreiben des Hauptcodes
Video: Kapazitiver Touch mit Mikrocontroller PIC16F886 - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:20
In diesem Tutorial erfahren Sie, wie Sie einen PIC16F886-Mikrocontroller verwenden können, um Kapazitätsunterschiede zu erkennen. Dies kann später verwendet werden, um festzustellen, ob ein Touchpad gedrückt wird. Es ist gut, sich mit Pic-Mikrocontrollern vertraut zu machen, bevor Sie dieses Projekt durchführen.
Schritt 1: Verdrahten Sie Ihre Schaltung
Beginnen wir zunächst mit der Verdrahtung der Schaltung gemäß dem obigen Schema. Um das Touchpad herzustellen, können Sie Aluminiumfolie zu einem Quadrat falten und auf einen Draht kleben. Sie können mit verschiedenen Werten für den 100k-Widerstand herumexperimentieren, ich fand 100k gut für mich.
Der RC4-Pin wird verwendet, um das Laden/Entladen der zu messenden Kapazität zu starten. C12IN0 ist mit der - Seite eines internen Komparators verbunden und der C1IN Pin ist mit der + Seite desselben Komparators verbunden. Der Mikrocontroller sieht die Kapazität als vollständig geladen an, wenn die Spannung C12IN0 die Spannung C1IN überschreitet. Der ohmsche Spannungsteiler stellt sicher, dass C1IN nahe 5 Volt liegt.
Da das Touchpad von einer erheblichen Kapazität zwischen Ihnen und der Schaltungsmasse abhängt, besteht die Möglichkeit, dass eine Batterie nicht funktioniert.
Schritt 2: Die Header-Datei
Fertig mit allen Anschlüssen? Gut, wir fahren mit der Header-Datei fort. Wir verwenden den XC8-Compiler und wie der Titel schon sagt, erstellen Sie jetzt eine neue Header-Datei in Ihrem Projekt und kopieren den folgenden Code. Sie können es auch ohne Header-Datei über Ihren Hauptcode kopieren und einfügen.
#define CALIBRATION_SAMPLE 20#define TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5
int zählen;
int CalibrationValue, maxCalibrationValue, minCalibrationValue;
int getChargeTime(){
int TimerCount = 0; int overflowCount = 0; // zu messende Entladekapazität RC4 = 0; _delay_ms(ENTLADEN_ZEIT); // genügend Verzögerung geben, um den "Kondensator" vollständig (fast vollständig) zu entladen // das Timer-Überlauf-Flag löschen T0IF = 0; // Warten Sie, bis der Timer überläuft, beginnen Sie mit der Zählung von 0 while (!T0IF); T0IF = 0; // zu messende Ladekapazität starten RC4 = 1; // warten, bis die Kapazität bis zur Referenzspannung aufgeladen ist, während (C1OUT) {timerCount = TMR0; if (T0IF) { overflowCount ++; T0IF = 0; } } count = (256 * overflowCount) + TimerCount; // TimerCount zurücksetzen TimerCount = 0; Überlaufzähler = 0; Rücklaufzahl; }
int isTouching(int Toleranz){
// Durchschnitt mehrerer Stichproben doppelter Durchschnitt = 0; for(int i = 0; i CalibrationValue + Toleranz) Average++; } Durchschnitt /= TOUCH_SAMPLE; //Durchschnitt ist eine Zahl zwischen 0 und 1 if (Durchschnitt > 0,2) return 1; 0 zurückgeben; }
Leere kalibrieren () {
int-Durchschnitt = 0; int-Beispiele[CALIBRATION_SAMPLE]; // Durchschnittswert abrufen für (int i = 0; i < CALIBRATION_SAMPLE; i ++) { Samples = getChargeTime (); Durchschnitt += Proben; } Durchschnitt /= CALIBRATION_SAMPLE; Kalibrierwert = Durchschnitt; //Max/Min-Werte abrufen maxCalibrationValue = Samples[0]; minCalibrationValue = Samples[0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = Samples; if(samples < minCalibrationValue) minCalibrationValue = Samples; } }
void setupCapacitiveTouch(){
// Lade-/Entlade-Pin als Ausgang einstellen, in diesem Fall RC4 TRISCbits. TRISC4 = 0; // Timer0 einrichten T0CS = 0; PSA = 1; // Komparator C1CH0 einrichten = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // Zählwerte löschen count = 0; // Kalibrierwerte löschen CalibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // Kalibrierung beim Start ausführen kalibrieren (); }
Schritt 3: Schreiben des Hauptcodes
Beginnend mit dem Hauptcode müssen Sie die im vorherigen Schritt erstellte Header-Datei einschließen. Der folgende Code ist ein Beispiel dafür, wie Sie die isTouching-Funktion als Schalter verwenden können. In meinem Fall habe ich dem Header den Namen capacitiveTouch.h gegeben.
#enthalten
#include "capacitiveTouch.h"
// diese Variable sagt, ob die Taste bereits gedrückt ist oder nicht
int lastState = 0;
Leere Haupt(){
// RC5 als Ausgang einstellen TRISCbits. TRISC5 = 0; // Sie müssen diese Funktion beim Start des Programms aufrufen setupCapacitiveTouch (); _verzögerung_ms(1000); // nach Ihrem genauen Setup kalibrieren calibrate (); Während (1) {// prüfen, ob die Schaltfläche gedrückt wird if (isTouching (15) && lastState == 0) { if (RC5) RC5 = 0; sonst RC5 = 1; lastState = 1; } //Überprüfen, ob die Schaltfläche freigegeben wird else if(lastState == 1 && !isTouching(15)) lastState = 0; _verzögerung_ms(20); } }
kalibrieren:
Beim Aufruf dieser Funktion werden die Variablen CalibrationValue, maxCalibrationValue und minCalibrationValue aktualisiert. CalibrationValue wird von der isTouching-Funktion verwendet. Denken Sie daran, dass das Touchpad während der Kalibrierung in Ruhe gelassen werden sollte.
setupCapacitiveTouch:
Muss am Anfang Ihres Programms aufgerufen werden. Es richtet die notwendigen Bits ein, die von den anderen Funktionen verwendet werden. Es führt auch eine Kalibrierung durch. Ich habe jedoch bessere Ergebnisse erzielt, indem ich eine Sekunde gewartet und die Kalibrierung erneut separat durchgeführt habe.
ist berührend:
Diese Funktion gibt 1 zurück, wenn sie einen Kapazitätsanstieg am C12IN0 erkennt, und gibt 0 zurück, wenn die Kapazität nahe der während der Kalibrierung liegt. Einfach ausgedrückt, wenn jemand das Pad berührt, gibt die isTouching-Funktion 1 zurück. Die Funktion möchte auch einen Parameter als Eingabe, dies ist die Toleranz, die sie auslösen kann. Je höher der Toleranzwert, desto weniger empfindlich wird er. In meinem Setup fand ich 15 gut funktioniert, aber da dies von der Oszillatorfrequenz abhängt und wie viel Kapazität beim Drücken hinzugefügt wird, sollten Sie mit diesem Wert herumexperimentieren, bis Sie etwas finden, das für Sie funktioniert.
getChargeTime:
Wenn Sie wissen möchten, wie lange es dauern würde, die Kapazität auf die CVREF-Spannung aufzuladen, testet diese Funktion sie und gibt eine ganze Zahl zurück. Um die Zeit in Sekunden zu erhalten, verwenden Sie diese Formel: (4 * getChargeTime) /oszillatorFrequency = chargeTimeInSeconds Diese Formel kann auch verwendet werden, um die Toleranzeingabe von der isTouching-Funktion in Sekunden zu erhalten.
Empfohlen:
Heimwerken -- Einen Spinnenroboter herstellen, der mit einem Smartphone mit Arduino Uno gesteuert werden kann – wikiHow
Heimwerken || Wie man einen Spider-Roboter herstellt, der mit einem Smartphone mit Arduino Uno gesteuert werden kann: Während man einen Spider-Roboter baut, kann man so viele Dinge über Robotik lernen. Wie die Herstellung von Robotern ist sowohl unterhaltsam als auch herausfordernd. In diesem Video zeigen wir Ihnen, wie Sie einen Spider-Roboter bauen, den wir mit unserem Smartphone (Androi
Einführung in den CloudX-Mikrocontroller: 3 Schritte
Einführung in den CloudX-Mikrocontroller: Der CloudX-Mikrocontroller ist ein Open-Source-Hardware- und -Software-Mikrocomputer, mit dem Sie Ihre eigenen interaktiven Projekte erstellen können. CloudX ist eine kleine Chipplatine, die es Benutzern ermöglicht, ihr zu sagen, was zu tun ist, bevor sie etwas unternehmen. Es akzeptiert verschiedene k
Einführung in ADC im AVR-Mikrocontroller - für Anfänger: 14 Schritte
Einführung in ADC im AVR-Mikrocontroller | für Anfänger: In diesem Tutorial erfahren Sie alles über ADC im avr-Mikrocontroller
Einen Touch-Schalter mit einem Mosfet herstellen – wikiHow
Wie man einen Berührungsschalter mit einem Mosfet herstellt: WIE MAN EINEN BERÜHRUNGSSCHALTER MIT NUR EINEM MOSFET-TRANSISTOR HERSTELLTIn vielerlei Hinsicht sind die MOSFETs besser als normale Transistoren normaler Schalter mit dem h
So wählen Sie einen Mikrocontroller aus: 21 Schritte (mit Bildern)
So wählen Sie einen Mikrocontroller aus: Früher war die Anzahl der verschiedenen Mikrocontroller-Chips, die dem Bastler zur Verfügung standen, ziemlich begrenzt. Man musste alles verwenden, was man beim Chip-Versandhändler kaufen konnte, und das schränkte die Auswahl auf eine kleine Anzahl von Ch