"Датчик пальца" на Arduino. Вопросы...

[Лирическое отступление]Эх… Не так я себе представлял свой первый пост на этом сайте, но увы. Со времён микроэлектроники в университете прошло уже достаточно времени, чтобы забылись основы.[/Лирическое отступление]

Попалась мне на глаза статья на Хабре, где рассказывается про изготовление оригинального подарка — кристалла в рюмке, который от прикосновения разгорается и потухает, когда его отпускают. И был там раскрыт принцип действия датчика прикосновения, который я и попытался безуспешно повторить на ардуине.

А дальше подробнее и вопросы.
Суть датчика и его «обоснование» можно прочесть по ссылке на Хабре.
На Ардуине я изобразил это так:

Сопротивление стоит 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 микросекунд.

Вобщем-то, главный вопрос — почему оно не реагирует на касание, хотя должно?))
Буду признателен, если кто-нибудь откликнется и попробует помочь разобраться.
  • +1
  • 23 января 2011, 23:57
  • Nauro

Комментарии (4)

RSS свернуть / развернуть
+
0
хм… только что проверил ваш скетч. Всё работает :)
Только в loop() добавил после вызова функции GetDelay(); небольшую задержку:
delay(10);
Вот что выдаётся в порт без касания:
16
16
16
16
16
16
16
16
16
а вот, что выдаётся при прикосновении к проводу:
2080
116
12
80
148
12
1172
4672
176
12
460
152
12
780
так что остаётся просто усреднить и вперёд :)
avatar

admin

  • 24 января 2011, 23:44
+
0
С Capacitive Sensing Library срабатывание почётче будут… Там на мегаомном резюке — без касания — еденицы с касанием тыщщи лезуть…
avatar

Zoltberg

  • 24 января 2011, 23:58
+
0
Спасибо за ссылку. Посмотрел и нашёл очень схожим с тем, что читал на хабре) Понятно теперь откуда товарищ брал обоснование) Попробую на этой библиотеке собрать. Хотя, думаю, что алгоритм тот же будет)
avatar

Nauro

  • 25 января 2011, 10:25
+
0
Спасибо за помощь!
Поставил паузу, всё равно не заработало. Закрались подозрения. Пересобрал макет, в итоге всё начало работать. Проводок, который шёл к пальцу оказался перебитым…
Впрочем, радовался я недолго, т.к. минут через 30 после того как всё заработало, задержка при касании стала мало чем отличаться от задержки в холостом режиме.
Грешу на «дребезг контактов». На выходных посажу всё на пайку и поставлю мегаомный резистор.
avatar

Nauro

  • 25 января 2011, 10:23

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.