Capacitive Sensing

Скачать CapacitiveSensor04.zip В этой обновленной версии CapacitiveSensor 05 добавлена ​​поддержка Arduino Due и других плат, отличных от AVR.

обзор Библиотека Емкостный датчик превращает два или более выводов Arduino в емкостный датчик, который может измерять электрическую емкость человеческого тела. Все, что требуется для установки датчика - это резистор от среднего до высокого значения, кусок провода и маленький (до большого) кусок алюминиевой фольги на конце. В своем самом чувствительном, датчик начнет чувствовать руку или тело в дюймах от датчика.

В версии 04 добавлена ​​поддержка Arduino 1.0, а также исправлены непонятные возможные условия гонки с Tone, Servo и другими библиотеками, которые выполняют ввод / вывод в контексте прерывания.

Версия 03 была обновлена ​​до C ++ и поддерживает несколько входов. Он также включает в себя некоторые служебные функции, чтобы было удобно изменять значения времени ожидания.

Приложения Емкостное зондирование может использоваться в любом месте, где желательно сенсорное сенсорное восприятие человека с низкой или нулевой силой. Arduino и библиотека могут быть использованы для обнаружения прикосновения человека через более чем четверть дюйма из пластика, дерева, керамики или другого изоляционного материала (но не из любого вида металла), что позволяет сенсору полностью скрыться визуально.

Емкостный датчик, покрытый бумагой или другим изолятором, также действует как довольно хороший (сенсорный) датчик давления с приблизительно логарифмическим откликом. В этом отношении он может превосходить резисторы, чувствительные к силе, в некоторых применениях.

Как это устроено

Метод CapitiveSensor переключает вывод отправки микроконтроллера в новое состояние, а затем ожидает, пока вывод приема изменится на то же состояние, что и вывод отправки. Переменный увеличиваются внутри в то время цикла время прием изменения состояния булавочного. Затем метод сообщает значение переменной в произвольных единицах.

Посмотрите короткую демонстрацию видео ( YouTube )

Физическая установка включает в себя резистор от среднего до высокого значения (100 кОм - 50 Мом) между контактом передачи и контактом приема (датчика). Приемный контакт является клеммой датчика. Провод, соединенный с этим контактом с кусочком фольги на конце, является хорошим датчиком. Для многих применений более полезный диапазон значений получается, если датчик покрыт бумагой, пластиком или другим изолирующим материалом, так что пользователи фактически не касаются металлической фольги. Исследования показали, что небольшой конденсатор (100 пФ) или около того от контакта датчика к земле улучшает стабильность и повторяемость.

Когда отправляющий контакт меняет состояние, он в конечном итоге изменит состояние принимающего контакта. Задержка между изменением отправляющего контакта и изменением приемного контакта определяется постоянной времени RC, определяемой как R * C, где R - это значение резистора, а C - это емкость на приемном штыре плюс любая другая емкость (например, взаимодействие человека с телом), присутствующее на контакте датчика (приемника). Добавление небольшого конденсатора (20 - 400 пФ) параллельно с емкостью корпуса также крайне желательно, так как оно стабилизирует воспринимаемые показания.

Методы библиотеки Библиотека содержит три основных метода и несколько служебных методов:

CapacitiveSensor CapacitiveSensor (байт sendPin, байт receivePin) CapacitiveSensor создает экземпляр библиотеки (обратите внимание на заглавные буквы, это не тот же метод, что и ниже)

long ЕмкостныйSensorRaw (байтовые выборки) Для параметра CapitiveSensorRaw требуется один параметр, выборка и возврат длинного целого числа, содержащего абсолютную емкость, в произвольных единицах. Параметр samples может использоваться для увеличения возвращаемого разрешения за счет более низкой производительности. Возвращаемое значение не усредняется по количеству выборок, и сообщается общее значение.

Емкость емкостного_сенсора возвращает -2, если значение емкости превышает значение CS_Timeout_Millis (в миллисекундах). Значение по умолчанию для CS_Timeout_Millis 2000 миллисекунд (2 секунды).

длинный емкостной датчик (байтовые выборки) Для емкостного датчика требуется один параметр, выборка и возврат длинного, содержащего добавленную (измеренную) емкость, в произвольных единицах. Емкостный датчик отслеживает наименьшую базовую (неизведанную) емкость и вычитает ее из измеренной емкости, поэтому он должен сообщать о низком значении в неизменном состоянии.

Базовая линия - это значение, которое повторно калибруется с интервалами, определенными CS_Autocal_Millis. Значение по умолчанию составляет 200000 миллисекунд (20 секунд). Эта повторная калибровка может быть отключена путем установки высокого значения CS_Autocal_Millis с помощью метода set_CS_AutocaL_Millis ().

void set_CS_Timeout_Millis (unsigned long timeout_millis); Метод set_CS_Timeout_Millis может быть использован для установки значения CS_Timeout_Millis, которое определяет, сколько времени потребуется методу для истечения времени ожидания, если вывод приема (измерения) не сможет переключиться в том же направлении, что и вывод отправки. Тайм - аут необходимо , потому что в то время как цикл будет блокировать вверх эскиз , если тайм - аут не предоставляется. Значение по умолчанию CS_Timeout_Millis составляет 2000 миллисекунд (2 секунды).

void reset_CS_AutoCal () reset_CS_AutoCal может использоваться для принудительной немедленной калибровки функции емкостного датчика.

void set_CS_AutocaL_Millis (длинная строка без знака autoCal_millis) Метод set_CS_AutocaL_Millis (unsigned long autoCal_millis) может использоваться для установки интервала тайм-аута функции емкостного датчика. Повторную калибровку можно отключить с помощью set_CS_AutocaL_Millis, чтобы установить для CS_AutocaL_Millis значение «0xFFFFFFFF».

Выбор резистора Вот некоторые рекомендации для резисторов, но обязательно поэкспериментируйте для получения желаемого ответа.

Используйте резистор 1 МОм (или, может быть, меньше) для абсолютного прикосновения для активации. С резистором 10 МОм датчик начнет реагировать на расстоянии 4-6 дюймов. С резистором 40 МОм датчик начнет реагировать на расстоянии 12-24 дюймов (в зависимости от размера фольги). Общие размеры резисторов обычно заканчиваются на 10 МОм, поэтому вам может понадобиться спаять четыре резистора по 10 МОм. Одним из недостатков больших резисторов является то, что повышенная чувствительность датчика означает, что он медленнее. Кроме того, если датчик открыт металлическим, возможно, что отправляющий контакт никогда не сможет вызвать изменение в приемном (сенсорном) контакте, и датчик отключится. Также поэкспериментируйте с маленькими конденсаторами (100 пФ - 0,01 мкФ) на землю, на выводе датчика. Они улучшают стабильность датчика. Обратите внимание, что аппаратное обеспечение может быть настроено с одним sPin и несколькими резисторами и rPin для вызовов на различные емкостные датчики. Смотрите пример эскиза.

Заземление и другие известные проблемы Заземление платы Arduino очень важно для емкостного считывания. Плата должна иметь некоторое соединение с землей, даже если это не путь с низким импедансом, такой как провод, присоединенный к водопроводу.

Емкостное восприятие имеет некоторые странности с ноутбуками, не подключенными к электросети. Сам ноутбук имеет тенденцию становиться чувствительным, и поднесение руки к ноутбуку изменит возвращенные значения.

Подсоединения зарядного шнура к ноутбуку обычно достаточно для правильной работы. Подключение заземления Arduino к заземлению (например, к водопроводу) может быть другим решением.

Другое решение, которое, по-видимому, хорошо сработало, по крайней мере, для одной установки, - это запустить плоскость заземления фольги под фольгой датчика (изолированную пластиком, бумагой и т. Д.) И соединить проводом с землей. Это очень хорошо работало для стабилизации значений датчика, а также, по-видимому, резко увеличивало чувствительность датчика.

Колеса прокрутки (ну, в любом случае, слайд-поты) Эксперименты с линейным датчиком скользящего типа были успешными, всего с двумя штырьками и лестницей сопротивления. Базовая компоновка показана в техническом паспорте датчика Quantum Scrollwheel.

Код использует этот тип расположения

CapacitiveSensor Left32 = CapacitiveSensor (3, 2); провод от контакта 2 к левой стороне резисторной лестницы \ CapacitiveSensor Right23 = CapacitiveSensor (2, 3); провод от контакта 3 к правой стороне резисторной лестницы Где контакты переключают свои позиции отправки и получения. При использовании линейной линейной схемы сопротивления палец, расположенный ближе к штырю передачи, сообщит о более низких значениях, поскольку сопротивление ниже по потоку от емкости в основном находится вне схемы.

Таким образом, таким образом, когда палец перемещается от одного контакта к другому, два вызова CapitiveSensorRaw сообщат о дополнительных значениях, которые имеют приблизительно постоянное значение для них. Сложность возникает при попытке справиться с тем, какой объем контакта (емкости) присутствует, что повышает (или понижает) оба значения, но не обязательно линейным образом.

В какой-то момент я опубликую эскиз здесь.

Сообщения об ошибках емкостные и емкостные датчики вернут -1 с неверным выбором параметра вывода, но, похоже, эта функция не работает при этой записи. Инженеры работают над этим, готовьтесь …

емкостный сенсор и емкостный сенсор вернут -2, если время ожидания истекло. Это вызвано тем, что число превышает значение CS_Timeout_Millis, для которого установлено значение по умолчанию 2000 миллисекунд (2 секунды). Это чаще всего вызвано отсутствием резистора или резистора в неправильном выводе. Это также может быть вызвано датчиком, который заземлен или подключен к +5 В.

Тайм - аут необходим потому , что в то время как цикл , который делает синхронизацию в CapacitiveSensor методе, будет блокировать вверх эскиз (функция никогда не вернется) , если, например, резистор между sendPin и receivePin отсоединен.

Монтаж Скачать CapacitiveSensor04.zip Разархивируйте и добавьте в Arduino / аппаратные средства / библиотеки / Чтобы добавить емкостный датчик в новый эскиз, выберите Sketch→ Import Library→ CapacitiveSensor Демо Эскиз #include

/ * * Demo Sketch библиотеки CapitiveSense * Пол Баджер 2008 * Используется резистор высокого значения, например, 10 МОм между контактом отправки и приемом * Чувствительность резисторных эффектов, эксперимент со значениями, 50 кОм - 50 МОм. Большие значения резистора дают большие значения датчика. * Приемный контакт - это контакт датчика - попробуйте различные количества фольги / металла на этом контакте * Наилучшие результаты достигаются, если сенсорная фольга и провод покрыты изолятором, таким как бумага или пластиковый лист * /

CapacitiveSensor cs_4_2 = CapacitiveSensor (4,2); 10 МОм резистор между контактами 4 и 2, контакт 2 - контакт датчика, добавление провода, фольга CapacitiveSensor cs_4_5 = CapacitiveSensor (4,5); 10 МОм резистор между контактами 4 и 6, контакт 6 - контакт датчика, добавление провода, фольга CapacitiveSensor cs_4_8 = CapacitiveSensor (4,8); резистор 10 МОм между контактами 4 и 8, контакт 8 - контакт датчика, добавление провода, фольга void setup () { cs_4_2.set_CS_AutocaL_Millis (0xFFFFFFFF); отключаем автокалибровку на канале 1 - просто в качестве примера

 Serial.begin (9600);

}

void loop () {

  длинный старт = миллис ();
  long total1 = cs_4_2.capacitiveSensor (30);
  long total2 = cs_4_5.capacitiveSensor (30);
  long total3 = cs_4_8.capacitiveSensor (30);
  Serial.print (millis () - начало); // проверка производительности в миллисекундах
  Serial.print ( "\ т"); // символ табуляции для интервала окна отладки
  Serial.print (всего1); // вывод на печать датчика 1
  Serial.print ( "\ т");
  Serial.print (total2); // вывод на печать датчика 2
  Serial.print ( "\ т");
  Serial.println (total3); // вывод на печать датчика 3
  задержка (10); // произвольная задержка для ограничения данных последовательным портом

}

Пример кода: Порог Вместо использования конденсаторов вы можете использовать функцию для подсчета соответствующих значений и сброса счетчика при обнаружении более низких значений (помех). Это пример кода для сенсорной лампы. Требуется либо прикоснуться к проводу контакта 8, либо приблизиться к антенне, и он останавливает показания при достижении порога. Вы можете настроить значения A, B и C в соответствии с вашим конкретным проектом.

#include CapacitiveSensor cs_7_8 = CapacitiveSensor (7,8); 10М резистор между контактами 7 и 8, вы также можете подключить антенну к контакту 8 unsigned long csSum; void setup () { Serial.begin (9600); } void loop () { CSread (); } void CSread () { long cs = cs_7_8.capacitiveSensor (80); a: разрешение датчика установлено на 80

if (cs> 100) {// b: произвольное число
	csSum + = cs;
	Serial.println (CS); 
	if (csSum> = 3800) // c: это значение является пороговым значением, значение High означает, что для запуска требуется больше времени
	{
		Serial.print («Триггер:»);
		Serial.println (csSum);
		if (csSum> 0) {csSum = 0; } //Сброс
		cs_7_8.reset_CS_AutoCal (); // Останавливает показания
	}
} еще {
	csSum = 0; // Тайм-аут из-за плохих показаний
}

}