Оглавление:
Видео: Емкостное касание с микроконтроллером PIC16F886: 3 шага
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
В этом уроке мы рассмотрим, как вы можете использовать микроконтроллер PIC16F886 для обнаружения различий в емкости, позже это можно будет использовать для определения нажатия на сенсорную панель. Перед созданием этого проекта хорошо ознакомиться с микроконтроллерами pic.
Шаг 1: Подключите вашу схему
Во-первых, давайте начнем с подключения схемы в соответствии со схемой выше. Чтобы сделать тачпад, вы можете сложить алюминиевую фольгу в квадрат и закрепить лентой на проводе. Вы можете поэкспериментировать с разными значениями резистора 100 кОм, я обнаружил, что 100 кОм мне подходит.
Вывод RC4 используется для начала зарядки / разрядки измеряемой емкости. C12IN0 подключается к отрицательной стороне внутреннего компаратора, а вывод C1IN подключается к положительной стороне того же компаратора. Микроконтроллер считает емкость полностью заряженной, когда напряжение C12IN0 превышает напряжение C1IN. Резистивный делитель напряжения обеспечивает напряжение C1IN близким к 5 вольт.
Поскольку сенсорная панель зависит от наличия значительной емкости между вами и заземлением цепи, существует вероятность того, что аккумулятор может не работать.
Шаг 2: Заголовочный файл
Закончили со всеми подключениями? Хорошо, приступим к заголовочному файлу. Мы будем использовать компилятор XC8, и, как следует из названия, теперь вы должны создать новый файл заголовка в своем проекте и скопировать и вставить следующий код. Вы можете просто скопировать и вставить его поверх основного кода без какого-либо файла заголовка.
#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; // измеряемая разрядная емкость RC4 = 0; _delay_ms (DISCHARGE_TIME); // даем достаточно задержки для полного (почти полного) разряда «конденсатора» // сбросить флаг переполнения таймера T0IF = 0; // ждем переполнения таймера, начинаем отсчет с 0 while (! T0IF); T0IF = 0; // запускаем зарядку измеряемой емкости RC4 = 1; // ждем пока емкость зарядится до эталонного напряжения while (C1OUT) {timerCount = TMR0; если (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // сбросить timerCount timerCount = 0; overflowCount = 0; счетчик возврата; }
int isTouching (int толерантность) {
// среднее из нескольких выборок double average = 0; for (int i = 0; i калибровочное значение + допуск) среднее ++; } средний / = TOUCH_SAMPLE; // среднее значение будет числом от 0 до 1, если (среднее> 0,2) return 1; возврат 0; }
void calibrate () {
int среднее = 0; int образцы [CALIBRATION_SAMPLE]; // получить среднее значение для (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); среднее + = образцы ; } средний / = CALIBRATION_SAMPLE; CalibrationValue = среднее значение; // получение макс. / мин. значений maxCalibrationValue = samples [0]; minCalibrationValue = образцы [0]; для (int i = 0; i maxCalibrationValue) maxCalibrationValue = samples ; if (samples <minCalibrationValue) minCalibrationValue = samples ; }}
void setupCapacitiveTouch () {
// установка вывода заряда / разряда в качестве выхода, в данном случае это RC4 TRISCbits. TRISC4 = 0; // установка таймера 0 T0CS = 0; PSA = 1; // настройка компаратора C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // очистка значений счетчика count = 0; // очистка значений калибровки. CalibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // запускаем калибровку при запуске calibrate (); }
Шаг 3: написание основного кода
Начиная с основного кода, вам необходимо включить файл заголовка, созданный на предыдущем шаге. Следующий код является примером того, как вы можете использовать функцию isTouching в качестве переключателя. В моем случае я дал заголовку имя CapacitiveTouch.h.
#включают
#include "capacityTouch.h"
// эта переменная сообщает, нажата кнопка или еще не нажата
int lastState = 0;
пустая функция(){
// установка RC5 в качестве вывода TRISCbits. TRISC5 = 0; // вам нужно вызвать эту функцию при запуске программы setupCapacitiveTouch (); _delay_ms (1000); // калибровка после вашей точной настройки calibrate (); while (1) {// проверяем, нажимается ли кнопка if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; иначе RC5 = 1; lastState = 1; } // проверка отпускания кнопки else if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}
откалибровать:
Когда эта функция вызывается, переменные CalibrationValue, maxCalibrationValue и minCalibrationValue будут обновлены. CalibrationValue используется функцией isTouching. Помните, что во время калибровки сенсорную панель следует оставить в покое.
setupCapacitiveTouch:
Должен быть вызван в начале вашей программы. Он устанавливает необходимые биты, используемые другими функциями. Также выполняется калибровка. Однако я получил лучшие результаты, если подождал секунду и снова запустил калибровку отдельно.
isTouching:
Эта функция возвращает 1, если она обнаруживает увеличение емкости на C12IN0, и возвращает 0, если емкость близка к той, которая была во время калибровки. Проще говоря, если кто-то коснется пэда, функция isTouching вернет 1. Функция также хочет параметр в качестве входа, это допуск для его срабатывания. Чем выше значение допуска, тем менее чувствительным он становится. В моей настройке я обнаружил, что 15 работает хорошо, но поскольку это зависит от частоты осциллятора и от того, сколько емкости добавляется при нажатии на него, вам следует поэкспериментировать с этим значением, пока не найдете то, что работает для вас.
getChargeTime:
Если вы хотите узнать, сколько времени потребуется, чтобы зарядить емкость до напряжения CVREF, эта функция проверит его и вернет целое число. Чтобы получить время в секундах, используйте эту формулу: (4 * getChargeTime) / осцилляторFrequency = chargeTimeInSeconds. Эту формулу также можно использовать для получения ввода допуска от функции isTouching в секундах.
Рекомендуемые:
Создайте свою собственную плату разработки с микроконтроллером: 3 шага (с изображениями)
Создайте свою собственную плату разработки с микроконтроллером: Вы когда-нибудь хотели создать свою собственную плату разработки с микроконтроллером, и вы не знали, как это сделать. В этой инструкции я покажу вам, как это сделать. Все, что вам нужно, это знания в области электроники и проектирования схем и программирование. Если у вас есть квест
Как сделать дешевое емкостное пианино: 5 шагов
Как сделать дешевое емкостное пианино: я большой поклонник технологий и музыки, и я решил сделать это после того, как меня вдохновила моя прежняя жизнь, когда я учился игре на фортепиано. В любом случае … В этом уроке я покажу вам, как сделать дешевое емкостное сенсорное пианино, используя Arduino, динамик и бумагу. Я
Система безопасности женщин в одно касание: 5 шагов
Система БЕЗОПАСНОСТИ ЖЕНЩИН в одно касание: в современном мире безопасность женщин является наиболее важным вопросом в каждой стране. Сегодня женщины подвергаются преследованиям и тревогам, а иногда и тогда, когда требуется срочная помощь. Нет необходимого места, если женщины, чтобы люди могли помочь, необходимо, чтобы мы
Arduino MusicStump: свет, захватывающее касание и зуммер: 3 шага
Arduino MusicStump: свет, захватывающее касание и зуммер: интерактивное дерево со светодиодным кольцом вверху, зуммером для звука и встроенным сенсорным датчиком, который меняет цвет при прикосновении. Чтобы сделать эту забавную вещичку, вам понадобится следующее: Электроника: - 1x Arduino Uno- 15x кабелей- 1x так
Емкостное касание с Evive (контроллер на базе Arduino): 6 шагов (с изображениями)
Емкостное касание с Evive (контроллер на базе Arduino): знаете ли вы, как работает сенсорный экран вашего смартфона? Смартфон имеет множество сенсорных датчиков под стеклянным экраном. В настоящее время он основан на емкостной технологии определения касания, и даже легкое прикосновение легко обнаруживается. Обнаруживается емкостное прикосновение