[Лирическое отступление]Эх.. Не так я себе представлял свой первый пост на этом сайте, но увы. Со времён микроэлектроники в университете прошло уже достаточно времени, чтобы забылись основы.[/Лирическое отступление]
Попалась мне на глаза статья на Хабре, где рассказывается про изготовление оригинального подарка — кристалла в рюмке, который от прикосновения разгорается и потухает, когда его отпускают. И был там раскрыт принцип действия датчика прикосновения, который я и попытался безуспешно повторить на ардуине.
А дальше подробнее и вопросы.
Суть датчика и его «обоснование» можно прочесть по ссылке на Хабре.
На Ардуине я изобразил это так:
Сопротивление стоит 600 кОм.
Дальше собственно скетч.
/////////////////// // TouchBlinker // // v1.0 // /////////////////// int tPin = 4; //Пин, на который мы посылаем сигнал int pPin = 3; //Пин, который выполняет роль приёмника int ledPin = 9; //Пин, к которому подключён светодиод int freedelay = 0; //----------------- void setup() { pinMode(pPin, OUTPUT); pinMode(tPin, INPUT); Serial.begin(9600); } void loop() { GetDelay(); } int GetDelay() { int t1=0; //Время, когда посылаем сигнал int t2=0; //Время, когда сигнал пришёл на контрольный пин int dt=0; //Задержка t1=micros(); digitalWrite(pPin,HIGH); //Посылаем сигнал на сенсор while(digitalRead(tPin)==LOW); //Ждём, пока сигнал дойдёт до контрольного пина t2=micros(); dt=t2-t1; //Задержка Serial.println(dt); //Выводим digitalWrite(pPin,LOW); //Обнуляем сенсор return dt; }
Процесс, как он должен происходить:
— когда я не трогаю проводок-сенсор, задержка между подачей сигнала на пин и его появлением на контрольном пине должна быть ничтожно малой.
— когда я дотрагиваюсь до проводка-сенсора, задержка должна возрастать на несколько порядков.
Но этого не происходит.
В консоль стабильно выпадает 12-20 микросекунд.
Вобщем-то, главный вопрос — почему оно не реагирует на касание, хотя должно?))
Буду признателен, если кто-нибудь откликнется и попробует помочь разобраться.
4 комментария на «“«Датчик пальца» на Arduino. Вопросы…”»
хм… только что проверил ваш скетч. Всё работает 🙂
Только в loop() добавил после вызова функции GetDelay(); небольшую задержку:
Вот что выдаётся в порт без касания:
а вот, что выдаётся при прикосновении к проводу:
так что остаётся просто усреднить и вперёд 🙂
СCapacitive Sensing Library срабатывание почётче будут… Там на мегаомном резюке — без касания — еденицы с касанием тыщщи лезуть…
Спасибо за ссылку. Посмотрел и нашёл очень схожим с тем, что читал на хабре) Понятно теперь откуда товарищ брал обоснование) Попробую на этой библиотеке собрать. Хотя, думаю, что алгоритм тот же будет)
Спасибо за помощь!
Поставил паузу, всё равно не заработало. Закрались подозрения. Пересобрал макет, в итоге всё начало работать. Проводок, который шёл к пальцу оказался перебитым…
Впрочем, радовался я недолго, т.к. минут через 30 после того как всё заработало, задержка при касании стала мало чем отличаться от задержки в холостом режиме.
Грешу на «дребезг контактов». На выходных посажу всё на пайку и поставлю мегаомный резистор.