Не работает емкостный сенсор
- Войдите на сайт для отправки комментариев
Решил добавить в свой проект емкостный выключатель.
Использовал вот эту библиотеку http://cyber-place.ru/showthread.php?t=102.
Немного доработал программу , в простом варианте вот так
#include <CapSense.h> // подключить библиотеку CapSense Sensor1 = CapSense(4,2); // назначить пины для сенсора int state1=0; int knopka=0; void setup() { pinMode(7,OUTPUT); pinMode(5,OUTPUT); } void loop() { digitalWrite(5,HIGH); long temp1 = Sensor1.capSense(30); // измерить емкость и сохранить в temp1 if (temp1 >10) { state1=1; delay(100); } else { state1=0; } if(state1==1&&knopka==0) { knopka=1; digitalWrite(7,!digitalRead(7)); delay(1000); } if(state1==0&&knopka==1) { knopka=0; } }
Т.е. при срабатывании сенсора 7 пин меняет состояние.
Все работало нормально.
Свой проект я вынес на отдельную плату , прошиваю ее через ардуину (пробросил провода rx,tx,reset,gnd)
Прошивка проходит нормально , проблема не в этом.
Проблема в том что когда плата подключена к дуине (в роли программатора) , а дуина к компу - все работает нормально.
Но стоит мне отключить плату от дуины или дуину от компа - все! Либо ложняки , либо вообще не работает.
С подключением плат и питания друг к другу все нормально.
Опытным путем было определено что стабильная работа возможно только тогда когда минус платы прицеплен к минусу компа.
Никогда не встречал таких тупых костылей , даже не знаю в какую сторону курить.
Викладывайте схему и плату тогда уже можно будет вместе курить.
А резистор какого номинала установлен?
Пробовал эту библиотеку. Мне не понравилась. Чем больше кнопок тем дольше идёт обработка состояний. Мне кажется не очень удачная библиотека. По поводу проблемы. Попробуй полностью отключить дуину от платы. Иногда я тоже замечаю такие проблемы.
Попробуй полностью отключить дуину от платы.
Вообще-то автор и пишит, что так не работает.
Схема платы стандартная . МК , ULN2003 , два метра светодиодной ленты . Резистор 2 мОМ (пробовал 4 мОМ , то же самое).
Попробуйте 20, 30 или 40 МОм.
Из оригинальной статьи: The physical setup includes a medium to high value (100 kilohm - 50 megohm) resistor between the send pin and the receive (sensor) pin.
Конденсатор между землей и питанием? Для сглаживания помех в питании.
http://arduino.cc/en/Main/ArduinoBoardSerialSingleSided
Особенно правый
leshak , схема питания собрана нормально , хотя не мешало бы поставить на входе 1000мкф (вместо 220).
Определилась новая фишка . Датчик отлично работает на стандартной ардуино (с автономным питанием) отключеной от компа.
Теперь я почти уверен что дело в стабилизаторе напруги (7805).
Попробуй полностью отключить дуину от платы.
Вообще-то автор и пишит, что так не работает.
А там не совсем ясно. Не ясно даже от чего он питает отдельную плату. Может он RX,TX оставляет, а землю обрывает.
Поэтому совет отключить ПОЛНОСТЬЮ таки имеет смысл. А вероятность этого не маленькая. Учитывая что в перечисленых деталях автономной платы отсуствует упоминание FTDI или чего-то подобного. Скорее всего при этом таки используется ардуина.
2nestandart:
у всех соедененных устройст должны быть связаны земли. Без этого мало того что глючить будет, так еще и попалить что-нибудь можно.
Земля - это последние что нужно разъединять. Только если устройство полностью автономно. Имеет свой блок питания, ни с кем не связывается. Как только подключили его к дуине - связывайте земли. Подключать только RX,TX - нельзя.
Если фраза "Но стоит мне отключить плату от дуины..." - означает, что дуина отключается не полностью, то да, совет стоящий.
А вероятность этого не маленькая. Учитывая что в перечисленых деталях автономной платы отсуствует упоминание FTDI или чего-то подобного. Скорее всего при этом таки используется ардуина.
Ну если этого упоминания:
Свой проект я вынес на отдельную плату , прошиваю ее через ардуину (пробросил провода rx,tx,reset,gnd)
.... плата подключена к дуине (в роли программатора) , ...
вам мало то да скорее всего...
>>Может он RX,TX оставляет, а землю обрывает.<<
Если бы оборвал землю прошивка бы не прошла . Логично ?
Дуина запитана от компа , а плата от бп 12 30Вт gnd общий.
>>у всех соедененных устройст должны быть связаны земли. Без этого мало того что глючить будет, так еще и попалить что-нибудь можно. <<
Я не первый год занимаюсь электроникой и изготовлением плат чтобы не замечать таких простейших ошибок.
>>Учитывая что в перечисленых деталях автономной платы отсуствует упоминание FTDI или чего-то подобного. Скорее всего при этом таки используется ардуина.<<
Да , так и есть ( я писал это в первом посте).
>>Земля - это последние что нужно разъединять. Только если устройство полностью автономно.<<
В данном случае общая земля нужна только для прошивки камня .
>>Если фраза "Но стоит мне отключить плату от дуины..." - означает, что дуина отключается не полностью, то да, совет стоящий.<<
Что значит "Не полностью" ? Достаточно разорвать GND чтобы схемы были неподключены.
На самом деле нормальная работа прекращается при обрыве минуса.
Еще фишка , если плата подключена к дуине ( а та к компу) , то при выключении компа все работает , но стоит выдернуть шнурок USB и все.
..skip...
Ну если этого упоминания:
Свой проект я вынес на отдельную плату , прошиваю ее через ардуину (пробросил провода rx,tx,reset,gnd)
.... плата подключена к дуине (в роли программатора) , ...
вам мало то да скорее всего...
Да мало. Одно дело режим "прошивки" и другое "работа устройства". И в эти моменты подключение может быть совершенно разное. Тем более "отключают дуину от комьютера" - какая прошивка в этот момент? И, как выяснилось, при этом разрывают только землю между устройствами, но не RX,TX пины.
>Я не первый год занимаюсь электроникой и изготовлением плат чтобы не замечать таких простейших ошибок.
А вы думаете опытные не допускают случайных ошибок?
>Что значит "Не полностью" ? Достаточно разорвать GND чтобы схемы были неподключены.
Не первый год говорите? А провода RX,TX при обрыве земли сразу становятся обрывами? Ток по ним пройти теперь не может никогда и ни при каких условиях?
>На самом деле нормальная работа прекращается при обрыве минуса
Нормальная - да. А не нормальная? IMHO в ситуации когда схема выкаблучивается гораздо проще проверить совет который дал LEVV2006 чем доказывать свою опытность и спорить. Неужеле отсоеденить два проводка, проверить и сказать "не, не помогло" дольше и труднее чем доказывать что этого быть не может?
>Да , так и есть ( я писал это в первом посте).
Где? Не вижу там никаких упоминаний о том подключены ли RX,TX при работе схемы. И используется компорт в логике работы скетча. Вы жаловлись на проблему с прошивкой или на работу скетча? Так почему ссылаетесь на то что упомянули как прошиваете?
>>Где? Не вижу там никаких упоминаний о том подключены ли RX,TX при работе схемы.<<
Прошиваю , сбрасываю rx , tx , reset (они мне больше не нужны) , стоит откинуть GND и все (при подключеных или отключеных rx , tx ).
Так и +5 тоже откидывай. Кроме того ты писал что вынес проект на отделанную плату. Может флюс остался? Флюс сознаёт ёмкость!
Какаие +5 ?
Между дуиной и платой нет питающей напруги (на плате стоит свой 7805).
Дуина питается от компа , плата от своего БП. Они связаны GND.
Решил вот опять подергать этот сенсор. Результат тот же.
ORduino nano , подключеная к компу, нормально исполняет простой скетч. При питании от отдельного БП - полный хаос.
Доброго времени суток.
Дабы не плодить темы, напишу здесь.
По этой статье и оттуда взяв библиотеку CapacitiveSensor04.zip подключил небольшую (20см. Х 15см.) платку текстолита (одностороннюю) через резистор в 4,7МОм к ардуино нано. Больше ничего не подключено. Ардуина питается от USB-порта компьютера (причем для стабильной работы хватает даже дежурки БП-шника).
Скетч:
Смысл данного скетча - два раза (с периодичностью 10мс. - небольшая защита от ложных сработок) читаем показания и если оба раза больше определенного порога (cap) инвертируем светодиод. Получается как-бы сенсорный выключатель света (в моем случае именно для этого).
Все работает, все здорово. Но вот беда - около часа.
То есть около часа плата лежит и работает, на прикосновения реагирует правильно, опытным путем установлено значение cap=200 - расстояние до руки около 5см. - срабатывает отлично. В обычном состоянии показываем значение ~ от 0 до 180.
Как только проходит время (около часа) значаения измеренные становятся не меньше 600-700. Плата лежит, никто не трогает. Ну и соответственно, светодиод начинает изменять свое состояние.
Понимаю, если б сразу, но что влияет на плату (или код?) через час?
Помогите разобраться. Спасибо.
Попробуйте, время от времени делать
leshak, спасибо за совет, но не помогло :(
Скетч:
Я так понимаю, что данный скетч равносилен совету?
>>leshak, спасибо за совет, но не помогло :(<<
Может быть потому что вы вставили автокалибровку в setup ?
Т.е. каклибровка выполняется не раз в цикл а один раз при запуске программы.
>leshak, спасибо за совет, но не помогло :(
А как именно "не помогло"? "Ничего не изменилось" или "теперь вообще не работает"?
>Я так понимаю, что данный скетч равносилен совету?
Немного не понял вас. Вы имеете ввиду правильно ли вы применили мой совет в своем скетче?
Если вы имели ввиду это, то не совсем верно. А сказал "время от времени", а вы "постоянно" делаете ресет (если раскоментировать строку 31).
Я вот что-то такое имел ввиду:
>leshak, спасибо за совет, но не помогло :(
А как именно "не помогло"? "Ничего не изменилось" или "теперь вообще не работает"?
Сам не телепат, но думал, что под фразой "не помогло" абсолютно понятное значение = "ничего не изменилось", ибо иначе было бы примерно "вообще перестал работать".
>>leshak, спасибо за совет, но не помогло :(<<
Может быть потому что вы вставили автокалибровку в setup ?
Т.е. каклибровка выполняется не раз в цикл а один раз при запуске программы.
Если вы имели ввиду это, то не совсем верно. А сказал "время от времени", а вы "постоянно" делаете ресет (если раскоментировать строку 31).
Я вот что-то такое имел ввиду:
А разве строка
не указывает на интервал автокалибровки?
Зачем сложности с millis(), когда есть set_CS_AutocaL_Millis?
Ведь отсюда:
>Сам не телепат, но думал, что под фразой "не помогло" абсолютно понятное значение = "ничего не изменилось"
Ну вот. Теперь будете знать, что вы ошибались с "абсолютно понятно". И поверьте случев когда "думаю одно", а пишут другое - тут на форуме предостаточно. Так что если есть вероятность двоякого толкования - лучше переспросить (а иногда даже когда нет неоднозначности - все равно переспросить).
>Зачем сложности с millis(), когда есть set_CS_AutocaL_Millis?
Ну хотя-бы потому, что set_CS_AutocaL_Millis не дал желаемого эффекта. Автор библиотеки мог ошибится? Мы же выдвигаем версии и проверяем их. Иногда проще библиотеку рассматривать как "черный ящик" (который ведет себя не так как мы хотим) чем лезть в его нутрености. Раз не работает как нужно "делаем руками", если помогло - тогда уже лезем внутрь и смотрим "почему штатное средство не работает".
Кстати интервал 1000 - для рекалибровки - IMHO маловато будет. По дефолту CS_Timeout_Millis=2000 ms. Рекалибровка чаще чем интервал таймаута - лень вникать, но тоже может проблемки вызвать.
Еще версии "почему значения увеличиваются" (и как вообще работает "рекалибровка"). Логика там примерно такая:
1. Меряем значение на сенсоре
2. Отнимаем от этого значения "исторический минимум" (минимальное значения сенсора при прошлых измерениях) - и возвращаем вам разницу. Это то что вы полуаете при вызове capacitiveSensor()
То есть, если у нас при измерениях "пробежало" маленькое значение сенсора, все последующие значения - будут задраны вверх (до ближайшей рекалибровки. рекалибровка в этом и состоит - сбросить "исторически минимальное значение"). Причем там есть еще одно причина по которой включится "рекалибровка". Если значение сенсора отличается от минимального - меньше чем на 10%, тор включается рекалибровка . .... хм. а вот тут как раз и может быть причина. Если сенсор у нас "просел" достаточно на долго . То.... включилась рекалибровка, сенсор не успел востановится и.... откалибровался на "просевшие значения..."
Вообщем нужно "копатся исследовать". Я бы подходил вот так:
1. Выводил в лог какую-то дополнительную метку, если capacitiveSensor(30) вернул 0 (по идее это будет признаком или произошедшей автокалибровки или обнаружения нового "исторического минимума". Посмотреть "когда оно срабатывает". По времени или от значения сенсора. Какие значения были перед этим и т.п.
2. Повыводил бы значения capacitiveSensorRaw(). Это реально "чистые" намерянные значения. Без вычитания "исторического минимума" и проч. С помощью нее можно увидить что там реально происходит или написать свою версию "калибровки" (скажем считать что "сенсор нажат" если произошло изменение значения больше чем на сколько-то процентов. То есть не просто "(temp > cap) & (tmp_prev > cap)", а что-то типа (temp<temp_prev*0.8) (если упало больше чем на 20%)
Так же, я бы обяъявил temp и temp_prev не как int, а как long (в соотсветсвии с сигнатурой функций capacitiveSensor() и capacitiveSensorRaw()). Возможно из-за того что мы обрезаем под int - мы теряем какие-то значения. Посмотреть не станут ли у нас видны какие-то "очень большие или очень мальнкие значения" ("очень" - это реально "очень", что-то типа -2,147,483,648 и т.п.)
Итого:
1. С помощью capacitiveSensorRaw() - посмотреть что в реальности меряет датчик
2. Для принятия решения о необходимости включить светодиод пользоватся не абсолютными значениями (int cap = 200 и т.п.), так как они могут менятся при рекалибровке, а относительными (проценты от прошлых измерений, скорость изменения и т.п.)
Спасибо за столь развернутый ответ.
Сейчас нет возможности, но когда приду домой обязательно выведу RAW-значения. Значения temp и tmp_prev выводил. Не заметил закономерности появления 0 от каких-то предыдущих и последующих значений.
Смущает, что похоже, такая проблема только у меня, раз никто о ней не пишет. Вечером попробую с другим источником питания и на другой ардуине.
По поводу long - дельный совет - не подумал об этом. Хотя, ИМХО, не должно быть.
По поводу рекалибровки - ИМХО она не играет никакой роли, т.к. с отключенной рекалибровкой ситуация не меняется ни в лучшую ни в худшую сторону (еще раз обращаю внимание - данную рекалибровку отключал - ничего не изменилось - опред. промежуток времени и "срыв" значений, как будто ноль подвинулся к 600-700). Но обязательно попробую с использованием millis(). Вот сейчас подумал выввести еще millis() в терминал и посмотреть, когда "срыв" происходит - есть ли закономерность.
Насчет включения светодиода по процентному соотношению измерений врядли получится, т.к. значения могут "упасть" в сериал примерно такие: 2 - 185 (тут более 20% верно? А порог 200 - будет ложная сработка), а могут такие: 255 - 280 (тут менее 20% - сработки не будет, а нужно включить). Я понимаю, что 20% - это просто пример, но не в данном случае. Ведь tmp_prev специально и вводился, чтоб убрать ложные "сработки", ибо иногда в порт сыпятся значения и за 300 (но одно, следом за ним маленькое) при просто лежащем тектолите (никто не трогает). Вообще, конечно, разброс значений велик (в состоянии покоя): реально от 0 до 200. И закономерности (либо рост, либо рост и спад - а-ля синусоида) не прослеживается.
>промежуток времени и "срыв" значений, как будто ноль подвинулся к 600-700
Ну так так и есть... "калибровка" это и есть "двигание нуля"
Вот как оно выглядит в long CapacitiveSensor::capacitiveSensor(uint8_t samples)
Строка (6) у нас и сдвигает ноль на "исторический минимум". total - это сумма что там датчик намерял за samples попыток.
А рекалиборвка сводится к уставноки leastTotal (исторический минимум) к заведомо большому значению (поэтому следующий же Total попадеть в leastTotal). Вот как это в библиотеке выглядит:
Так что "отключил рекалибровку", не означает "отключил калибровку".
"Калиборвка" все равно идет постоянно. А ваше отключение только предотвращает ее "сбросить и начать заново калибровать".
>Ведь tmp_prev специально и вводился, чтоб убрать ложные "сработки"
Это понятно. Но, судя по коду библиотеки привязываться к каким-то абсолютным значениям - ну никак нельзя. Все плавает, все меняется :) Ноль у вас, в любой момент может "уплыть вниз". Если реальный датчик вам выдал 250,300,250,300,150,300, то вы получити 0,50,0,50,0,150
В одном случае при реальных 300 вы получили 50, а вдругом 150 :) В одном случае 0 означал "реальные" 250, а в другом 150. Ну как же тут можно привязатся к абсолютному значению? Только смотреть за тем "как меняется сигнал". Может не так лобово... может еще время привзать... типа "упал дольше чем....", или "игнорировать изменения короче XXX msec", или пытатся вычислить первую/вторую производную. Или вообще нейросеть прикрутить :) Для распознавания ситуации (а это и есть задача "распознать").
Можете еще попробовать увеличить количество измерений. не Sensor1.capSense(30), а Sensor1.capSense(100) попробовать.
ну и, раз "только у вас" - можно еще поигратся с материалами на которых лежит пластина, что под ней, нет ли где-то поблизости блока питания, не проходит рядом провод, да и просто... нет ли железок поблизости...
И еще... а к чему подключается все это? Проблемы так же могут быть еще если вы работаете не от внешнего кварца (или он глючит, не знаю бывает ли такое с ними).
>Так что "отключил рекалибровку", не означает "отключил калибровку".
Да, но в случае "калибровки", насколько я понимаю из кода ноль может подвинуться только вниз. То есть при выключенной "рекалибровке" (сколько не калибруй далее) ноль выше не подвинешь - только ниже. У меня же ситуация описанная кодом именно этой "рекалибровки". Единственные мысли на которые наводят эти "рекалибровки" и "калибровки" если дело именно в них - это что-то с типами данных (писали оних ранее).
>Или вообще нейросеть прикрутить :)
Спасибо. Поржал ))))
>Можете еще попробовать увеличить количество измерений. не Sensor1.capSense(30), а Sensor1.capSense(100) попробовать.
Это идея, хотя и не очень хорошая в данной ситуации (увеличивается время реакции контроллера на данный сенсор ровно как в моем случае почти пропадает смысл в нем).
>И еще... а к чему подключается все это? Проблемы так же могут быть еще если вы работаете не от внешнего кварца (или он глючит, не знаю бывает ли такое с ними).
Я писал выше - ардуина nano подключена к комповскому БП (читай - к USB компа). Пластина (кусок односторннего текстолита) лежит на столе (дерево). Конечно же железки поблизости есть - пробовал поменять дислокацию, изменений не заметил. Кварц конечно глючить может - раньше занимался ремонтом теелфонов - частенько наблюдал на USB-флешках (после падения особенно) глюки кварца с разными артефактами в ФС и оклонениями ))) Я писал выше - приду домой обязательно (для чистоты эксперимента) попробую от другого питателя (стационарный БП) с другой ардуиной (есть в наличии Pro mini) - может дело где-то и там.
Я долго бился с этой библиотекой. В итоге куча программного мусора и нестабильная работа. Сейчас заказал готовые модули AT42QT1011-TSHR. Протестирую - отпишу.
Сорри за оффтоп.
nestandart, почитал об этих микросхемах - достаточно "вкусно". Но ценник на том же ebay кусается. Где и почем заказывал, если не секрет?
>>Где и почем заказывал, если не секрет?<<
ДКО Электронщик http://www.electronshik.ru/item/at42qt1011-tshr-f1841594RL , 37р. за штуку.
Микрухи приехали , немного потестил. Сначала перепутал кондер настройки чувствительности, вместо 223(22нф) поставил 220(22пф) в итоге получил нулевую чувствительность. Ставил 0.1мкф , очень высокая чувствительность , нестабильная работа, защелкивание и т.д. Экспериментально вывел диапазон емкостей , от 1нф (только прямой контакт с металлом) до 60нф ( 20 - 30мм по воздуху). Ложных срабатываний нет.
Питание 3.3 - 5в работает нормально при любом напряжении.
Выход TTL не инвертированый. Вроде как есть возможность инвертировать , но мне это не нужно.
Разведу нормальную плату - буду тестить чувствительность через твердые предметы.
Подключал по этой схеме.
Кстати, ноги 3 и 4 находятся в районе цифры 11 на корпусе МС.
nestandart, а к ним на 3-й пин что вешал? Текстолит? Можно размеры?
Повесил текстолит 10*10. Но работает и без пластины , срабатывает при касании ноги резистора.
А вообще , размеры были в даташите.
nestandart, как успехи с микрухами? Есть новости? У меня почему-то все равно не получается добиться нормальной устойчивой работы.
Питается все (с ардуиной про мини) от импульсника китайского (типа такого - http://www.aliexpress.com/snapshot/6058170887.html). Ардуина и сенсор через DC-DC (5В).
Опытным путем подобрал емкости и резисторы. На столе вроде рабортает нормально. Не защелкивается. Вешаю на стену (в выключетель, предварительно выкинув все "потроха") - вроде как сутки работает более-менее (если и глюкнет, то один раз). Но по истечении примерно суток начинаются ложные срабатывания, защелкивания и т.д. Сбросишь питание сенсора - опять сутки живет. Какой-то барабашка...