Arduino:Библиотеки/CapacitiveSensing

Материал из Онлайн справочника
Версия от 21:01, 4 марта 2017; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Библиотека CapacitiveSensor[1]

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

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

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

Загрузка

Версию 05, поддерживающую Arduino Due и другие платы без AVR, можно скачать отсюда.

Применение

Измерение электроемкости применяется в ситуациях, когда желательно, чтобы человек не прикасался к определенной поверхности. Таким образом, при помощи Arduino, библиотеки CapacitiveSensor и изоляционного материала (пластика, дерева, керамики и пр., но не металла) можно сделать так, чтобы датчик чувствовал прикосновение за полсантиметра от себя. Кроме того, это позволяет замаскировать датчик.

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

Как это работает

Функция capasitiveSensor() переключает отправляющий контакт платы в новое состояние, а затем ждет, пока принимающий контакт не примет то же состояние, что и отправляющий контакт. Чтобы синхронизировать изменение состояния у принимающего контакта, внутри цикла while() увеличивается специальная переменная. После этого функция возвращает значение переменной (в произвольных единицах измерения).

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

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

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

Функции

Библиотека содержит три главных функции и несколько вспомогательных функций.

CapacitiveSensor CapacitiveSensor(byte sendPin, byte receivePin)

Создает экземпляр библиотеки. Пожалуйста, обратите внимание на заглавные буквы – этим настоящая функция отличается от функции ниже.

long capacitiveSensorRaw(byte samples)

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

Если значение с электроемкостью будет выше значения CS_Timeout_Millis (в миллисекундах), то capacitiveSensorRaw() вернет значение «-2». По умолчанию значение для CS_Timeout_Millis составляет 2000 миллисекунд (2 секунды).

long capacitiveSensor(byte samples)

Требует всего один параметр (samples) и возвращает значение типа long – добавленную (измеренную) электроемкость (в произвольных единицах измерения). Отслеживает нижайшее значение базовой (т.е. когда на датчик ничего не влияет) электроемкости, а затем вычитает ее из добавленной (т.е. когда на датчик начинает что-то влиять) электроемкости. Следовательно, если на датчик ничто не влияет, эта функция должна показывать низкие значения.

Базовая электроемкость – это значение, которое постоянно калибруется по интервалам, заданным в значении CS_Autocal_Millis. По умолчанию это значение составляет 200000 миллисекунд (20 секунд). Эту рекалибровку можно выключить, задав в CS_Autocal_Millis максимальное значение при помощи функции set_CS_Autocal_Millis().

void set_CS_Timeout_Millis(unsigned long timeout_millis)

Используется, чтобы задать значение CS_Timeout_Millis, то есть таймаут, который запускается, когда принимающего (сенсорного) контакта не получается переключиться в то же состояние, что и отправляющий контакт. Этот таймаут необходим, потому что если его не будет, то цикл while() заблокирует работу скетча. По умолчанию значение CS_Timeout_Millis составляет 2000 миллисекунды (2 секунды).

void reset_CS_AutoCal()

Используется, чтобы запустить принудительную калибровку функции capacitiveSensor().

void set_CS_Autocal_Miilis(unsigned long autoCal_millis)

Используется, чтобы задать интервал для рекалибровки базового значения, используемого в функции long capacitiveSensor(). Рекалибровку можно выключить, выставив значение CS_AutocaL_Millis на «0xFFFFFFFF».

Выбор резистора

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

  • Чтобы датчик чувствовал прикосновение, используйте резистор на 1 МОм (или меньше)
  • Чтобы датчик чувствовал человеческое тело на расстоянии в 10-15 см, используйте резистор на 40 МОм
  • Чтобы датчик чувствовал человеческое тело на расстоянии в 30-60 см, используйте резистор на 40 МОм (зависит от размера фольги). Впрочем, резисторы на 40 МОм встречаются нечасто, поэтому вы можете просто припаять четыре резистора на 10 МОм
  • Один из негативных побочных эффектов больших резисторов заключается в том, что повышение чувствительности замедляет работу датчика. Кроме того, если измеряющая часть датчика – это ничем не прикрытый металл, то может случиться так, что отправляющий контакт никогда не сможет поменять состояние на принимающем (сенсорном) контакте. В результате датчик будет постоянно находиться в состоянии ожидания.
  • Также имеет смысл поэкспериментировать с подключением между «землей» и принимающим (сенсорным) контактом маленького конденсатора (100 пФ – 1 мкФ). Он должен повысить стабильность датчика.

Обратите внимание, что принимающих контактов может быть несколько (для оперирования несколькими датчиками), а отправляющий – только один. Более подробно смотрите в скетче-примере.

Заземление и другие известные проблемы

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

Кроме того, измерению электроемкости может помешать ноутбук, не подключенный к сети энергопитания. Ноутбук сам становится чем-то вроде датчика, поэтому поднесение руки к ноутбуку будет влиять на возвращаемое значение.

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

Еще одно решение (по крайней мере, на один раз) – это подложить под сенсорной фольгой (изолированной пластиком, бумагой и т.д.) другой кусочек фольги, а затем подключить его проводом к «земле». Это должно стабилизировать значения датчика и резко увеличить его чувствительность.

Потенциометры типа «scroll wheel»

Для успешной работы с так называемыми «scroll wheel» (можно перевести как «колесиковые потенциометры»; это разновидность линейных потенциометров) достаточно двух контактов и цепи транзисторов. Базовую схему можно наблюдать в даташите датчика Quantum Scrollwheel.

Код выстраивается примерно так:

CapacitiveSensor Left32  = CapacitiveSensor(3, 2); // провод от 2-ого контакта к левой стороне цепи резисторов
CapacitiveSensor Right23 = CapacitiveSensor(2, 3); // провод от 3-его контакта к правой стороне цепи резисторов

То есть здесь 2-ой и 3-ий контакты меняются своими ролями, становясь то принимающими, то отправляющими. Кроме того, мы имеем дело с цепью линейно подключенных резисторов, поэтому приближение пальца к отправляющему контакту будет давать более низкие значения – дело в снижении сопротивления из-за того, что источник электроемкости находится, как правило, вне цепи.

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

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

Сообщения об ошибках

Если указать неправильный параметр с контактом, то capacitiveSensor() и capacitiveSensorRaw() должны вернуть «-1», но на момент написания этой статьи эта функция еще не работает.

Если запустится таймаут, то capacitiveSensor() и capacitiveSensorRaw() должны вернуть «-2». Это происходит при превышении ограничения, заданного в CS_Timeout_Millis, которое по умолчанию составляет 2000 миллисекунд (2 секунды). Зачастую это происходит из-за недостающего резистора или резистора, подключенного к неправильному контакту. Кроме того, это может быть вызвано самим датчиком, который заземлен или подключен к +5V.

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

Установка

Загрузите ZIP-файл с библиотекой по этой ссылке. Распакуйте библиотеку и поместите ее по адресу «Документы/Arduino/libraries». Далее, чтобы добавить в новый скетч библиотеку CapacitiveSensor, кликните в IDE Arduino на Скетч > Подключить библиотеку > CapacitiveSensor (Sketch > Include Library > CapacitiveSensor).

Примеры

См.также

Внешние ссылки