Шумы на аналоговом входе

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Может кто чего подскажет. Задача: есть два провода, при прикосновении к которым зажигается свет. То есть взялись за один провод - ничего, за второй - ничего. А вместе, за первый и второй одновременно (первый в левой руке, второй в правой) появилось сопротивление тела - зажегся свет. Все отлично, все хорошо. Делаем на ардуино просто делитель с одним резистором и считываем значения с аналогового входа. То есть фактически измеряем сопротивление тела человека. Работает. Но есть ложные срабатывания, когда касаешься просто аналогового вывода. Пробовал с датчиком уровня жидкости. Работает стабильней, но все равно ложные срабатывания есть. Что делать? Понятно, что у всех людей сопротивление разное. У кого-то 500 Ом. У кого-то 500 кОм. Или мегаомы. Но как-то ведь можно сделать? Почему когда берешься за один провод идут помехи (ложные срабатывания)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Емкость человечского тела порядка 50-80 пкФ. Когда Вы берётесь за провод, Вы его по сути заземляеете и в то время пока идёт заряд "конденсатора" по Вашему делителю течёт ток. Когда заряд закончится - всё устаканивается. Теперь думайте, как с этим бороться. 

arduinec
Offline
Зарегистрирован: 01.09.2015

Недавно поднималась тема по этому поводу. Сопротивление сухих рук человека несколько мегаОм, сопротивление внутренних органов (мокрых рук) около 1 килоОма.

ptr
Offline
Зарегистрирован: 28.05.2016

Crazy_Lazy пишет:

Почему когда берешься за один провод идут помехи (ложные срабатывания)?

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

ВН
Offline
Зарегистрирован: 25.02.2016

У ТС вопрос в том, что тело это антенна, которая ловит на себя всякие наводки и, в перую очередь, наводку со стороны сети. 

Далее вопрос входного сопротивления, если мегаомы по входу и мегаомы собственное сопротивление, то амплитуда наводки может достигать десятков вольт. 

зы. Много кругом разговоров о осцилах, а вот что там на нем видно от щупа в руках ........ не пора ли посмотреть. 

зы2. "Пробовал с датчиком уровня жидкости." Видимо следует понимать, как вход через компаратор

 

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Дело даже не в том, что тело выступает как антена. Просто при обычной схеме с делителем на резисторе (резистор 10 кОм на 5v одним концом и на аналоговый вход другим, земля - это один провод для рук и от аналового входа - второй провод). То есть по логике вещей на аналоговом входе должно быть напряжение от делителя, которое и выводит ардуино. Но при прикосновении только к проводу, который висит на аналоговом входе ардуина начинает кидаться значениями, как будто делитель уже вступил в работу и я взялся за оба провода. Как от этого избавиться. Пробовал чисто математически найти хоть какую-то закономерность типа дребезга, но нет. Есть что-то подобное на дребезг, но это не 100% результат. То есть если я не касаюсь проводов, ардуина выдает например 1023, 1023, 1023, 1023. Затем я касаюсь обоих проводов - ардуина выдает 877, 965, 977, 932. Но смысл в том, что если я касаюсь одного провода, того, который подключен к А0, то ардуина выдает 977, 1023, 767, 866. А может выдать и как с двумя проводами. Как отследить за один провод взялись или за два? С точки зрения последовательности - мне кажется никак. Может можно какую-нибудь RC цепочку поставить в землю. Посоветуйте что-нибудь. Резисторы подбирал. Брал и мегаомы и килоомы. Результат примерно одинаковый. Цифры только меняются. А на провод также реагирует. Или бросить ардуино и попробовать сделать на транзисторе? Хотя он тоже от прикосновения к базе открывается.

Алексей Н
Offline
Зарегистрирован: 02.01.2016

Я может быть не совсем правильно понял задачу, но отследить помехи на одном проводе вы можете? Так может взять два провода и подключить к двум аналоговым входам? И проверять на скольких (один или два) входах помехи? Или надо именно задействовать один вход? И я прошу прощения за глупый вопрос, но делитель это разве не два резистора?

Может это видео чем-то поможет?

https://www.youtube.com/watch?v=BHQPqQ_5ulc

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Вторым резистором выступает тело человека, который берется за два провода. Два входа можно использовать, только что это даст? Будут такие же случайные значения по двум входам.

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

За основу я брал вот эту статью.

http://littleredrat.blogspot.ru/2013/02/arduio.html

ptr
Offline
Зарегистрирован: 28.05.2016

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

Если мое понимание верно, то у Вас два пути:

1. Если задача только иметь выключатель, срабатывающий при прикосновении, то мерять не сопротивление, а емкость. Будет обычный емкостной датчик. Схем в инете навалом.

2. Если хочется измерять именно сопротивление, то напряжение надо увеличить на порядок, если не два, а ток ограничить, например 1ма. Насколько я еще помню ПУЭ, безопасным током для человека во влажных помещениях считается до 10ма. Так что, по идее, ток в 1ма человек не почуствует. То есть, если напряжение 240 вольт (после выпрямления будет до 340), то токоограничивающий резистор должен быть не менее 340К. Если детектировать ток в 500мка, то нужен будет 640К резистор. Точнее пара резисторов - на плюс и минус выпрямителя. Ну и к МК уже только через оптрон, который нужно будет предварительно раскачать транзистором. Как-то так.

P.S. Знаю, что резистор будет не 340K, а, скорее, 470К. И не 640К, а, скорее, 680К. Ближайший больший. Но вдруг ТС из Е98 поставит ровно 340К, а из Е192 642К? )))

ptr
Offline
Зарегистрирован: 28.05.2016

Crazy_Lazy пишет:

За основу я брал вот эту статью.

Так там омметр, а не мегомметр. Разница существенна.

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Сопротивление моего тела 200 кОм. Я видел людей, у которых сопротивление 40 кОм. Схема вполне может измерить 200 кОм. Но она не измеряет. Вернее измеряет, но при этом существуют ложные измерения от одного провода.

ptr
Offline
Зарегистрирован: 28.05.2016

При чем тут тело? Тут главную роль играет сопротивление кожи. Если мозолем коснуться, то больше мегома будет однозначно.

На своем мозоле проверил. 1 - 1.5 мегома. Наводка между мной и батареей - 200-250 милливольт. Что еще немного, так как только альфа-ритм у человека имеет амплитуду 50-100 милливольт. А у Вас напряжение на входе АЦП меняется всего на 200-500 милливольт. То есть, помеха от 50 до 125%. Что Вы и видите.

Алексей Н
Offline
Зарегистрирован: 02.01.2016

Crazy_Lazy пишет:

Вторым резистором выступает тело человека, который берется за два провода. Два входа можно использовать, только что это даст? Будут такие же случайные значения по двум входам.

If (вход1 != 1023) & ( вход2 != 1023){

лампочка гори}

 

Не сработает?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Алексей Н пишет:

If (вход1 != 1023) & ( вход2 != 1023){

лампочка гори}

 

Не сработает?

А если за провода взялись 2 разных человека?

ВН
Offline
Зарегистрирован: 25.02.2016

Алексей Н пишет:
Не сработает?

адын птыц с два нога на одна провода сидеть не мога? 

Алексей Н
Offline
Зарегистрирован: 02.01.2016

Про двух человек я не подумал. А это обязательное условие, что для одного человека? И зачем тогда обязательно два провода?

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Вообще, изначально задумка была следующая: есть две пластины, к которым можно прикоснуться. Растояние между ними больше того, до чего может дотянуться один человек. В комнату заходит два человека. Один берется за одну пластину, другой за вторую. Ничего не происходит. После чего они берутся за руки (не отпуская пластин) - открывается дверь. Квест в реальности. Как реализовать? Есть мысли у кого?

ptr
Offline
Зарегистрирован: 28.05.2016

Есть еще вариант. Гнать модулированный сигнал. В простейшем виде - определенной частоты. А на входе убеждаться в наличии именно этой частоты.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Crazy_Lazy,  Для варианта, описанного ptr есть полностью готовый скетч. Взяться руками за 8 и 11 пин.

Алексей Н
Offline
Зарегистрирован: 02.01.2016

Забавная задачка :)

Вот на страничке http://www.learningaboutelectronics.com/Projects/ есть описание разных сенсоров и выключателей на прикосновение (где-то в середине страницы). Есть и на транзисторах и на микросхемах. Может найдете что-то подходящее для себя?

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Вариант отличный, но скетч не полностью рабочий. При включении светодиод горит постоянно, а когда берешься руками за два пина (8 и 11) светодиод тухнет. Но я мало что понимаю в этом коде. Он сильно оптимизирован. Плюс к этому, скетч не работает как нужно. Если взяться и сильно нажать на провод 8 пина, то светодиод тоже гаснет, как и при замыкании двух проводов. Да и на 11-ой можно тоже приловчиться и нажать так, чтобы он потух. Стабильности нет. Попробуйте сами на своей ардуине. Может у меня с ардуиной чего?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Crazy_Lazy, выводы контроллера не рассчитаны  на подобные вещи, но тем не менее у меня работает идеально. По отдельности никакой реакции, хоть вонзай провод как иголку в тело :) (на всякий случай -проверял на китайской UNO, проводки подключены короткие, по 10 см)

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Странно, может у меня правда что-то с ардуиной, а я уже мозг весь сломал? Попробую завтра на другой - отпишусь. Хотя эта оригинальная UNO. Странно.

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Попробовал. Действительно косяк с питанием ардуино. Питал ее изначально от USB шнура. Может наводки, может длина USB шнура большая. В общем, распаял ее на блок питания - все запустилось. Вроде бы не глючит. Сейчас еще реле примонстрячу и все.

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Реле как-то нестабильно работало, трещало, наверное частота большая? В общем пришлось написать и отладить вот такой код. Теперь 100% срабатывание. Ложных срабатываний нет. Всем спасибо за помощь.

int value_one = 0; // первый контакт (смотрит единичку на входе)
int value_two = 0; // второй контакт (смотрит ноль на входе)
int counter = 0; // счетчик правильных положений (10)
void setup(){
Serial.begin(9600);
pinMode (2,INPUT); // первый контакт (вход)
pinMode(11,OUTPUT); // второй контат (выход)
pinMode(13,OUTPUT); // реле
digitalWrite(13,HIGH); //инициализируем реле
}
void loop(){
begin:
counter = 0;
for (int i=0; i <= 100; i++){
digitalWrite(11,HIGH);
digitalWrite(2,LOW);
value_one = digitalRead(2);
delay (5); // небольшая задержка от дребезга
digitalWrite(11,LOW);
digitalWrite(2,HIGH);
value_two = digitalRead(2);
delay (5);
// смотрим правильность полученных значений
if (value_one == 1 && value_two == 0){
  counter=counter+1;
}
// если 10 раз правильно за цикл из 100 положений, то включаем реле
if (counter == 10){
digitalWrite(13,LOW);
delay (2000);
digitalWrite(13,HIGH);
goto begin;
}
}  
}

 

toc
Offline
Зарегистрирован: 09.02.2013

так вот как он выглядит. Этот хитро-редкий оператор goto. :)
кажется, если его и метку тут убрать ничегошеньки не изменится.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

toc пишет:
goto. :) кажется, если его и метку тут убрать ничегошеньки не изменится.
Ну, как ничего?  Он же в цикле for. А как ещё из цикла выходить? Лоховский break - не наш метод!!! "Настоящие программисты не используют Паскаль"!!! :)))) 

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Рано обрадовался. При наращивании длины проводов появились ложные срабатывания. Просмотрев содержимое переменных был сделан следующий вывод - один провод работает как хорошая передающая антена, второй провод - как хорошая приемная. 100% срабатывание без прикасаний, на длинных проводах. Че делать? Как сделать из проводов очень плохую антену? Прокидывать экранированные? Тоже не вариант, так как площадки соприкосновения тоже железные и большие. Какие-нибудь мысли будут у кого-нибудь?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Лоховский break - не наш метод!!! "Настоящие программисты не используют Паскаль"!!! :)))) 

А что, в Паскале есть break?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

ЕвгенийП пишет:

Лоховский break - не наш метод!!! "Настоящие программисты не используют Паскаль"!!! :)))) 

А что, в Паскале есть break?

Вообще-то есть (правда, там это процедуры). Там и goto есть. Но здесь речь не о них, а о С'шном break. А "Настоящие программисты не используют Паскаль" - это название статьи в которой описывается феномен настоящих программистов, которые не боятся goto и плюют на стуктурность:)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чего только не узнаешь на старости лет...

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Жалкая перепевка оригинала из Communication of the Asm за 1978г кажется .. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

Жалкая перепевка оригинала из Communication of the Asm за 1978г кажется .. :)

Вы как-то уже говорили, что читали это в оригинале. Правда,ни год, ни журнал правильно назвать не смогли (и сейчас тоже). Успокойтесь уж, мы в курсе. что Вы читали.

И кстати, слово "Computing" начинается с "С", а не с "S" (хотя, Вы разумеется, в оригинале его видели).

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Crazy_Lazy пишет:

Понятно, что у всех людей сопротивление разное. У кого-то 500 Ом. У кого-то 500 кОм. Или мегаомы.

мне не понятно.

картинко для привлечения внимания:

wp21e55015_05_06.jpg

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Сопротивление между двумя руками имеется ввиду. Ладно. Поставил я транзистор составной (дарлингтона), сделал, что при прикосновении руками напряжение на выходе у меня меняется от 2.2 вольта до 3.2 вольта. Ардуиной это как-то можно потом отследить? Эксперимент с аналоговым входом ничего не дал. В нем просто идет какая-то чушь. Как-будто он в воздухе висит. Скетч из стандартных analogReadSerial. Напругу подавал через резистор 1 кОм. Плюс на A0 минус на землю. Что я делаю не так?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Crazy_Lazy, всё не так, неверная идеология. Изменится влажность рук -и напряжение станет другим.   В #18 и #19  вас направили на верный путь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Crazy_Lazy пишет:

Поставил я транзистор составной (дарлингтона), сделал, что при прикосновении руками напряжение на выходе у меня меняется от 2.2 вольта до 3.2 вольта. Ардуиной это как-то можно потом отследить? Эксперимент с аналоговым входом ничего не дал. В нем просто идет какая-то чушь. Как-будто он в воздухе висит.

База к земле не притянута, правильно?

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

Притянута через резистор 1 МОм.

Crazy_Lazy
Offline
Зарегистрирован: 04.09.2016

В 18 и 19 все очень интересно, конечно. Но при длине проводов довольно больших и при непритянутых на землю выводах там полная чушь. А при притянутых - нет ничего. Как-то так. Жаль конечно. Идея очень хорошая. Мне нравится, но не получается у меня реализовать. Если интересно - напишите код, чтобы срабатывало реле. Коснулись - сработало. А потом попробуйте на длинных проводах. Достаточно 2-3 метров. У меня не работает. И вообще, цифровые выводы они ж должны логические единицы ловить, а откуда им там взяться? Сопротивление тела высокое. Может я что-то не понимаю в вашем коде, но он у меня совсем криво работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Crazy_Lazy пишет:

Притянута через резистор 1 МОм.

А не многовато? Обычно ставт в 10-100 раз больше, чем резистор в базе (чаще в 10). А 1МОм - по мне так многовато.

ВН
Offline
Зарегистрирован: 25.02.2016

без селекции это все танцы с бубном 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Crazy_Lazy пишет:

В 18 и 19 все очень интересно, конечно. Но при длине проводов довольно больших и при непритянутых на землю  Достаточно 2-3 метров. У меня не работает. И вообще, цифровые выводы они ж должны логические единицы ловить, а откуда им там взяться? Сопротивление тела высокое. Может я что-то не понимаю в вашем коде, но он у меня совсем криво работает.

Вы напрасно надеятесь, что всё можно решить только кодом. Это уже аналоговый мир, здесь не всё так просто.  Вполне логично что сигнал перед подачей на  тактовый вход МК нужно усилить, а лучше ещё и пропустить через полосовой фильтр, что-б выделить частоту 20 кГц , или хотя бы отделить фон 50Гц фильтром низкой частоты. Аналогичная проблема при передачи сигнала от ик-пульта  к устройству. Сигнал нужно выделить на фоне всего мусора, усилить и привести в удобоваримый вид, и всё это успешно решает тот-же фотоприёмник типа TSOP,  но в вашем случае нет такого готового устройства, но гугль уже в нетерпении предложить вам схемы усилителей и фильтров ;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Евгений, меня всегда улыбают ваши придирки к мелочам, особливо когда вы прочно сидите в лужах по крупняку. Продолжайте и дальше в этом духе. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

Евгений, меня всегда улыбают ваши придирки к мелочам, особливо когда вы прочно сидите в лужах по крупняку. Продолжайте и дальше в этом духе. :)

Вас хватило только на полгода? Ну-ну, валяйте.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Евгений, Так не важно как на самом деле звался оригинал .. он был опубликован задолго до интернетов. И куда как смешнее, особенно на аглицком и содержал куда больше реально характерных признаков. Акромя того изобиловал именами корифеев, в т.ч. способных по телефону оказать помощь конечному юзверю, правя его руками код IBM OS360 "удаленно". В этом суть моего замечания, а вовсе не в том как пишется слово Asm через "s" или через "c", как Вы не преминули "заметить"... чего к ерунде цепляться? :) Сами начинаете, а потом плачетесь ..

Впрочем, завязываю с оффтопами. И ссыль и обсуждение - всё есть оффтоп.