Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Mishka
2020-04-12 03:33:20

Обычно для определения обрыва линии обычно требуется постоянное КЗ на другом конце линии, то есть тут больше подходит кнопка с постоянно замкнутыми контактами, как посоветовал Lic Control. В таком случае нет необходимости нажимать на кнопку, чтобы проверить был ли обрыв. Соответственно, тогда и конденсатор тоже будет не нужен. Все, что необходимо - это через резистор подтянуть вывод, к которому подключена кнопка, на VDD (кстати, судя по рисунку выше, у Ардуино есть встроенный pull-up резистор), а кнопку саму подключить на землю. Если на выводе читается низкое напряжение, значит цепь работает и кнопка не нажата. Если высокое - то цепь оборвалась или нажали на кнопку. В таком случае проверьте вывод еще раз через некоторое время. Если после N проверок он будет в высоком состоянии, то, вероятно, был обрыв.

Ключевым моментом тут является то, что обрыв на линии генерирует событие - нажатие кнопки. Если кнопка будет стоять на замыкание, то необходимо догадываться - это обрыв или просто никто так и не нажал на кнопку.

Watchdog
2020-04-11 19:37:14
Олександр К пише:

Честно говоря я разочарован.
Казалось бы форумы созданы для того, чтобы помогать людям. Здесь же вместо попробовать реально помочь чем-то или свысока отвечают или бросают какие-то толстые книги, типа RTFM.
Надеюсь это просто так карантин влияет на людей. Все злые и хотят, чтобы это уже наконец закончилось. ...

Я понял о ком вы. Не судите всех по себе, и не читайте то что я вам показал.

Олександр К пише:

... Конденсатор может быть в пределах от 1нФ до 1 мкФ (по крайней мере я тестировал в этих пределах).

А больше, слабо? Начните с ТОЭ.

Олександр К пише:

Понимаю, что для использования в продуктиве нужно еще будет допилять напильником код, но в целом как прототип подходит. По крайней мере в симуляторе работает на 5+.

На наждаке будет эффективнее; реальность не симулятор.

Олександр К
2020-04-11 19:18:57

Честно говоря я разочарован.
Казалось бы форумы созданы для того, чтобы помогать людям. Здесь же вместо попробовать реально помочь чем-то или свысока отвечают или бросают какие-то толстые книги, типа RTFM.
Надеюсь это просто так карантин влияет на людей. Все злые и хотят, чтобы это уже наконец закончилось.
Ну ладно, это было лирическое отступление.
Пишу я не по поводу того, чтобы пожаловаться, а по поводу того, что все же нашел решение и хочу им поделиться. Вдруг кому-то тоже будет полезно.

Если коротко, то вместо считывать HIGH сигнал я решил воспользоваться INPUT_PULLUP и соответственно во время зарядки конденсатора считывать LOW. То есть если конденсатор присутствует, и нет разрывов цепи, то на входе получим LOW сигнал. В противном случае это будет сигнализировать о разрыве. После этой проверки нужно разрядить конденсатор. Это сделать нетрудно переведя оба пина в OUTPUT подав на них LOW, то есть запрем оба на землю тем самым дав конденсатору возможность разрядиться.

Привожу новую схему и скетч. В схему добавил DIP переключатель для симулирования разрыва цепи. Конденсатор может быть в пределах от 1нФ до 1 мкФ (по крайней мере я тестировал в этих пределах). Понимаю, что для использования в продуктиве нужно еще будет допилять напильником код, но в целом как прототип подходит. По крайней мере в симуляторе работает на 5+.

Psl1xVH.png

Скетч

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;
}
Konstantin
2020-04-10 23:25:42

Подобные схемы применяются для контроля целостности порта процессора.
Как например отличить нажатую кнопку от пробитой "ноги" процессора ?
В схеме топикстартера не хватает последовательных резисторов.
И да МайкМ правильно напомнило про T=RC ...

MikeM
2020-04-10 11:43:14

Насколько я понял, проблема в том, что конденсатор разряжается медленно. Для ускорения разряда нужно уменьшить его ёмкость или подключить параллельно ему резистор. Топикстартеру не помешает осознание формулы: T=R*C (время разряда до уровня 37% равно произведению ёмкости и сопротивления)

Watchdog
2020-04-09 19:07:14
Lic Control пише:

Вот упрощенная принципиальная схема входа/выхода микроконтроллера ATMEGA
https://cf.ppt-online.org/files1/slide/8/8zhj1x7N5iZQP6KTcJUE4IHatAYCbyGuL2Drvs/slide-1.jpg

Осторожней!!! Вдруг Мазуренко А.В. в суд подаст, за нарушение его авторского права на иллюстрацию функций портов американских микроконтроллеров. lol

Lic Control
2020-04-09 18:41:16

Вот упрощенная принципиальная схема входа/выхода микроконтроллера ATMEGA
slide-1.jpg
А по этой ссылке можете подробнее прочитать о принципе работы входов/выходов Arduino.
Надеюсь, разберетесь.

Watchdog
2020-04-09 18:15:31
Олександр К пише:

Я хорошо разбираюсь в программировании, а вот радиоэлектронику знаю поверхностно. ...
Но теперь я понимаю, что не все так просто. И хочу понимать принцип по которому работает микроконтроллер Ардуино. А именно определяет сигнал. Мне понадобится в будущем.

Почитайте: https://forum.arduino.ua/viewtopic.php?pid=27671#p27671 И руководства с даташитами на микроконтроллеры, конечно, а не на Ардуино.

Олександр К
2020-04-09 15:31:07

Я хорошо разбираюсь в программировании, а вот радиоэлектронику знаю поверхностно. Это хорошо, что вы знаете как сделать это по-другому. И я вам благодарен за это. Попробую разобраться.
Но меня больше интересует почему я получаю тот результат, который получаю. Исходя из моих знаний для меня он нелогичен. Был бы признателен если бы кто-нибудь объяснил почему происходит именно так. Может я неправильно понимаю как Ардуино определяет сигнал на входном пине? Я раньше думал, что входной пин это что-то типа делителя напряжения. Так я прочитал в каком-то блоге:

https://blog.stratifylabs.co/device/201 … ller-GPIO/

Но теперь я понимаю, что не все так просто. И хочу понимать принцип по которому работает микроконтроллер Ардуино. А именно определяет сигнал. Мне понадобится в будущем.

Lic Control
2020-04-09 14:52:37

Знаете, ваш вопрос, как вопрос ребенка: "почему вода мокрая?". Даже не знаешь, как коротко ответить не вдаваясь в длительное объяснение.
Может быть проще - эта схема сюда не походит.
Если вы хотите постоянно контролировать цепь кнопки, воспользуйтесь способом, который применяется в системах сигнализации. Там все кнопки и контакты - постоянно (нормально) замкнутые. Нажатия на кнопку или сработка датчика - разрыв цепи.
Различить потерю контакта (разрыв проводов) и нажатие на нормально замкнутую кнопку можно по длительности разрыва цепи. Короткие разрывы (0.1 - 1.0с) - нажатие кнопки, остальное все что больше 3-5 с - потеря контакта.
Поищите информацию по ключевому слову Arduino Debounce. Там это подробно поясняется.

Как-то так...

Олександр К
2020-04-09 13:38:39

Есть вот такая схемка.

3NXEOFQ.png

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

Но, к сожалению почему-то получается, что если подать напряжение на конденсатор, то на входном пине будет считываться 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);
}

Підвал форуму