Ви не увійшли.
Сторінки 1
Есть вот такая схемка.
В целом идея такова: если зажать кнопку то происходит определенное действие. Конденсатор было добавлено с целью периодической проверки целостности проводов.
С моим дилетантским знанием радиоелетроники я думал, что, если подать напряжение на конденсатор, то сразу же после этого я на входном пине увижу это напряжение, и буквально через несколько миллисекунд это напряжение упадет до нуля (ведь сопротивление конденсатора станет бесконечно большим). Таким образом я думал, что если подать напряжение и сразу же его считать и через некоторое время оно пропадет, то это значит, что разрывов нет. Если же мы подали напряжение и через некоторое время оно все же не пропало, то это значит, что пользователь зажал кнопку и должно исполниться определенное действие.
Но, к сожалению почему-то получается, что если подать напряжение на конденсатор, то на входном пине будет считываться HIGH сигнал вплоть пока не подать LOW сигнал с выходного пина.
Скетч:
const int PIN_OUT = 7;
const int PIN_IN = 8;
void setup()
{
Serial.begin(9600);
pinMode(PIN_IN, INPUT);
pinMode(PIN_OUT, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
char userCmd = Serial.read();
if (userCmd == '+')
{
digitalWrite(PIN_OUT, HIGH);
}
else if (userCmd == '-')
{
digitalWrite(PIN_OUT, LOW);
}
int val = digitalRead(PIN_IN);
digitalWrite(13, val);
Serial.println(val);
delay(700);
}
Неактивний
Знаете, ваш вопрос, как вопрос ребенка: "почему вода мокрая?". Даже не знаешь, как коротко ответить не вдаваясь в длительное объяснение.
Может быть проще - эта схема сюда не походит.
Если вы хотите постоянно контролировать цепь кнопки, воспользуйтесь способом, который применяется в системах сигнализации. Там все кнопки и контакты - постоянно (нормально) замкнутые. Нажатия на кнопку или сработка датчика - разрыв цепи.
Различить потерю контакта (разрыв проводов) и нажатие на нормально замкнутую кнопку можно по длительности разрыва цепи. Короткие разрывы (0.1 - 1.0с) - нажатие кнопки, остальное все что больше 3-5 с - потеря контакта.
Поищите информацию по ключевому слову Arduino Debounce. Там это подробно поясняется.
Как-то так...
Неактивний
Я хорошо разбираюсь в программировании, а вот радиоэлектронику знаю поверхностно. Это хорошо, что вы знаете как сделать это по-другому. И я вам благодарен за это. Попробую разобраться.
Но меня больше интересует почему я получаю тот результат, который получаю. Исходя из моих знаний для меня он нелогичен. Был бы признателен если бы кто-нибудь объяснил почему происходит именно так. Может я неправильно понимаю как Ардуино определяет сигнал на входном пине? Я раньше думал, что входной пин это что-то типа делителя напряжения. Так я прочитал в каком-то блоге:
https://blog.stratifylabs.co/device/201 … ller-GPIO/
Но теперь я понимаю, что не все так просто. И хочу понимать принцип по которому работает микроконтроллер Ардуино. А именно определяет сигнал. Мне понадобится в будущем.
Неактивний
Я хорошо разбираюсь в программировании, а вот радиоэлектронику знаю поверхностно. ...
Но теперь я понимаю, что не все так просто. И хочу понимать принцип по которому работает микроконтроллер Ардуино. А именно определяет сигнал. Мне понадобится в будущем.
Почитайте: https://forum.arduino.ua/viewtopic.php?pid=27671#p27671 И руководства с даташитами на микроконтроллеры, конечно, а не на Ардуино.
Вот упрощенная принципиальная схема входа/выхода микроконтроллера ATMEGA
А по этой ссылке можете подробнее прочитать о принципе работы входов/выходов Arduino.
Надеюсь, разберетесь.
Неактивний
Вот упрощенная принципиальная схема входа/выхода микроконтроллера ATMEGA
https://cf.ppt-online.org/files1/slide/8/8zhj1x7N5iZQP6KTcJUE4IHatAYCbyGuL2Drvs/slide-1.jpg
Осторожней!!! Вдруг Мазуренко А.В. в суд подаст, за нарушение его авторского права на иллюстрацию функций портов американских микроконтроллеров.
Насколько я понял, проблема в том, что конденсатор разряжается медленно. Для ускорения разряда нужно уменьшить его ёмкость или подключить параллельно ему резистор. Топикстартеру не помешает осознание формулы: T=R*C (время разряда до уровня 37% равно произведению ёмкости и сопротивления)
Неактивний
Подобные схемы применяются для контроля целостности порта процессора.
Как например отличить нажатую кнопку от пробитой "ноги" процессора ?
В схеме топикстартера не хватает последовательных резисторов.
И да МайкМ правильно напомнило про T=RC ...
Честно говоря я разочарован.
Казалось бы форумы созданы для того, чтобы помогать людям. Здесь же вместо попробовать реально помочь чем-то или свысока отвечают или бросают какие-то толстые книги, типа RTFM.
Надеюсь это просто так карантин влияет на людей. Все злые и хотят, чтобы это уже наконец закончилось.
Ну ладно, это было лирическое отступление.
Пишу я не по поводу того, чтобы пожаловаться, а по поводу того, что все же нашел решение и хочу им поделиться. Вдруг кому-то тоже будет полезно.
Если коротко, то вместо считывать HIGH сигнал я решил воспользоваться INPUT_PULLUP и соответственно во время зарядки конденсатора считывать LOW. То есть если конденсатор присутствует, и нет разрывов цепи, то на входе получим LOW сигнал. В противном случае это будет сигнализировать о разрыве. После этой проверки нужно разрядить конденсатор. Это сделать нетрудно переведя оба пина в OUTPUT подав на них LOW, то есть запрем оба на землю тем самым дав конденсатору возможность разрядиться.
Привожу новую схему и скетч. В схему добавил DIP переключатель для симулирования разрыва цепи. Конденсатор может быть в пределах от 1нФ до 1 мкФ (по крайней мере я тестировал в этих пределах). Понимаю, что для использования в продуктиве нужно еще будет допилять напильником код, но в целом как прототип подходит. По крайней мере в симуляторе работает на 5+.
Скетч
const int PIN_S1 = 7;
const int PIN_S2 = 8;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(PIN_S1, OUTPUT);
pinMode(PIN_S2, OUTPUT);
dischargeCapacitor();
Serial.println("Let's start!");
}
void loop()
{
if (checkAlarm())
Serial.println("ALARM!");
dischargeCapacitor();
//
if (checkButton())
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
//
dischargeCapacitor();
delay(500);
}
void dischargeCapacitor()
{
pinMode(PIN_S2, INPUT);
pinMode(PIN_S1, OUTPUT);
//
digitalWrite(PIN_S1, HIGH);
delay(1);
digitalWrite(PIN_S1, LOW);
pinMode(PIN_S2, OUTPUT);
digitalWrite(PIN_S2, LOW);
delay(1);
}
bool checkAlarm()
{
pinMode(PIN_S1, OUTPUT);
digitalWrite(PIN_S1, LOW);
delay(1);
pinMode(PIN_S2, INPUT_PULLUP);
int val = digitalRead(PIN_S2);
if (val != LOW)
return true;
return false;
}
bool checkButton()
{
pinMode(PIN_S1, OUTPUT);
digitalWrite(PIN_S1, LOW);
delay(1);
pinMode(PIN_S2, INPUT_PULLUP);
int val = digitalRead(PIN_S2);
if (val == LOW)
{
delay(300);
val = digitalRead(PIN_S2);
if (val == LOW)
return true;
}
return false;
}
Неактивний
Честно говоря я разочарован.
Казалось бы форумы созданы для того, чтобы помогать людям. Здесь же вместо попробовать реально помочь чем-то или свысока отвечают или бросают какие-то толстые книги, типа RTFM.
Надеюсь это просто так карантин влияет на людей. Все злые и хотят, чтобы это уже наконец закончилось. ...
Я понял о ком вы. Не судите всех по себе, и не читайте то что я вам показал.
... Конденсатор может быть в пределах от 1нФ до 1 мкФ (по крайней мере я тестировал в этих пределах).
А больше, слабо? Начните с ТОЭ.
Понимаю, что для использования в продуктиве нужно еще будет допилять напильником код, но в целом как прототип подходит. По крайней мере в симуляторе работает на 5+.
На наждаке будет эффективнее; реальность не симулятор.
Обычно для определения обрыва линии обычно требуется постоянное КЗ на другом конце линии, то есть тут больше подходит кнопка с постоянно замкнутыми контактами, как посоветовал Lic Control. В таком случае нет необходимости нажимать на кнопку, чтобы проверить был ли обрыв. Соответственно, тогда и конденсатор тоже будет не нужен. Все, что необходимо - это через резистор подтянуть вывод, к которому подключена кнопка, на VDD (кстати, судя по рисунку выше, у Ардуино есть встроенный pull-up резистор), а кнопку саму подключить на землю. Если на выводе читается низкое напряжение, значит цепь работает и кнопка не нажата. Если высокое - то цепь оборвалась или нажали на кнопку. В таком случае проверьте вывод еще раз через некоторое время. Если после N проверок он будет в высоком состоянии, то, вероятно, был обрыв.
Ключевым моментом тут является то, что обрыв на линии генерирует событие - нажатие кнопки. Если кнопка будет стоять на замыкание, то необходимо догадываться - это обрыв или просто никто так и не нажал на кнопку.
Неактивний
Сторінки 1