Господа и, маловероятно, дамы, приветствую вас! Наткнулся в инете на одну шикарную статью по изготовлению емкостного сенсора из простейших компонентов: http://www.pjrc.com/teensy/td_libs_CapacitiveSensor.html Вместо медной ленты я использовал пищевую фольгу с алюминием. Отправляющий пин подключал через 220КОм, принимающий через 10Ом. Все работает, но! Работает только при непосредственном прикосновении, через слой бумаги приходится продавливать пальцем, через один слой офисного файлика - так же приходится продавливать чтоб получить контакт. На данном примере у товарища все работает через слой пластика. Увеличил сопротивление резисторов: отправляющий 40МОм, принимающий 220КОм. Результат абсолютно тот же. В скетче использовал код из примера библиотеки (тот, что указан по ссылке выше). Неужели вся проблема в том, что я использую фольгу, а не медь?
Что подразумеваете под "откалибровать"? При запуске в serial порту показывает значения 0 и 1, если не касаемся. Как только дотрагиваемся до фольги, значения мгновенно возрастают до 59 и 60. Хотя на видео, значения при касании значительно выше, как и значения в режиме ожидания касания. Скажите мне, что все дело только в фольге) Использовал фольгу и напрямую от резисторов и через медные провода длинной 10см. Результат без изменений.
Очевидно, у ваших площадок получается другая емкость, особенно если вы меняете диэлектрик (воздух, бумага, полиэтилен и т.п.), и время разряда-заряда тоже изменяется. Вам нужно вместо "30" в вызове "capacitiveSensor(30);" использовать другое значение для ваших площадок, либо включить (не отключать в setup() ) автокалибровку, чтобы библиотека сама подстроила характерное время перезаряда емкости под ваши площадки.
Использовал другое значение в вызове "capacitiveSensor(30", отключил автокалибровку. Все, чего смог добиться - при касании вместо 59 и 60, начали появляться цифры большим значением. Теперь это от 200 до 600. Но опять же - только при прикосновении. С бумагой или файликом - так же 0 эффекта. не говоря уже о пластике. Код (C++): #include <CapacitiveSensor.h> CapacitiveSensor cs_4_2 = CapacitiveSensor(4,2); void setup() { //cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF); Serial.begin(9600); } void loop() { long start = millis(); long total1 = cs_4_2.capacitiveSensor(1000); Serial.print(millis() - start); Serial.print("\t"); Serial.println(total1); delay(100); } Использовал калибровку и 1, и 300 и 500 и 1000.
Изменение емкости без прикосновения намного меньше, чем с таковым, и оно у вас не регистрируется. Насколько я понял, способ измерения емкости здесь такой же, как и в Makey Makey, его мне на практике не удалось заставить работать бесконтактным образом. Попробуйте увеличить площадь сенсорной площадки.
пробовал ещё изначально, на результат не влияет. А какой нибудь другой способ измерения емкости, который можно заставить работать бесконтактным образом, вы можете посоветовать? У кого ещё какие мысли на этот счет?
Для измерения меньших емкостей, насколько я помню, используется несколько другая техника - емкость формируется между одной опрашиваемой площадкой и всеми остальными. Площадки по умолчанию подключены через 10кОм резисторы, но если контроллер не успевает, то сопротивление можно увеличить до 100кОм или даже до 1МОм. Площадки могут быть подключены к АЦП, тогда измеряется напряжение через фиксированное время, но можно обойтись и без этого, если измерять время перехода от 0 к 1 и/или обратно. Т.е. нет отдельно передающих и принимающих пинов, используется схема один пин - одна площадка. Пины динамически переключаются между режимами входов и выходов, а в режиме выхода между 0 и 1. Точное описание технологии можно найти у Atmel в документации по Proximity Sensors.