Статьи

Разблокировка ваших IoT кнопок

Работа в области Интернета вещей (IoT) быстро привела меня к пониманию, что я больше не могу полагаться только на свое понимание разработки программного обеспечения, не зная обо всем, что связано с аппаратным обеспечением, и надеясь, что об этом позаботится умное оборудование. инженер. Ясно, что в аппаратном обеспечении будет много всего, чему я должен научиться, но это нормально, на самом деле мне очень нравится изучать новые вещи. Обучение на этих выходных вращалось вокруг разборки коммутаторов с использованием RC-цепей. И я подумал, что поделюсь некоторыми деталями для всех других разработчиков программного обеспечения, которые пытаются догнать аппаратное обеспечение, как я

большая красная кнопка

Хорошо, это не тот переключатель, который я подключил к схеме восстановления, но всем нравится большая красная кнопка

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

кнопка

Когда мы замыкаем цепь, напряжение на выводе должно переходить от высокого значения к низкому, и, конечно же, оно будет. Однако, с точки зрения микроконтроллера, прикрепленного к выводу (PIN), это может быть не совсем чистый переход от высокого к низкому уровню, который мы ожидаем. Причина этого заключается в том, что контакт измеряет цифровой сигнал, но переключатель контролирует аналоговое напряжение. Аналоговое напряжение интерпретируется как высокое или низкое цифровое значение на основе двух пороговых напряжений. Высокое входное напряжение (V IH ) относится к минимальному напряжению, которое можно считать цифровым высоким. Низкое напряжение на входе (V IL ) относится к максимальному напряжению, которое можно считать цифровым низким. Когда переключатель замкнут, быстро меняющийся поток тока может привести к переходу напряжения на выводе через V IH. и V IL несколько раз, прежде чем, наконец, отправиться на GND Эквивалентно, когда переключатель разомкнут, аналогичный набор переходов может произойти до того, как напряжение на выводе станет VDC. В результате одиночный переход состояния (открытый / закрытый) на переключателе может привести к множественным переходам состояний (высокий / низкий) на цифровом выводе. Это то, что называется отказов, и это может вызвать проблемы, если разработчик или инженер не учел это.

Отмена нажатия кнопки означает удаление этих дополнительных переходов между состояниями на цифровом выводе. Это может быть достигнуто с помощью аппаратного или программного обеспечения. Для целей этого урока мы будем отлаживать кнопку с помощью RC-цепи (резисторного конденсатора). Тщательно выбирая правильные значения для резисторов и конденсаторов в нашей схеме, мы можем сгладить переход напряжения на цифровом выводе. Давайте посмотрим на схему RC, которую мы будем использовать.

ButtonDebounceCircuit

Верхняя часть цепи подключена к 3,3 В, а нижняя часть цепи заземлена. Резисторы R1 и R2 будут управлять зарядкой и разрядкой конденсатора C. И элемент схемы, помеченный PIN-кодом, подключен к цифровому входному контакту на Raspberry Pi — обратите внимание, что приложенное напряжение составляет 3,3 В, поскольку Raspberry Pi использует логические уровни 3,3 В , Схема относительно проста в построении, но нам все равно нужно будет рассчитать значения R1, R2 и C для использования. Прежде чем мы перейдем к уравнениям (я люблю уравнения), давайте на секунду посмотрим, как эта схема ведет себя с открытым и закрытым переключателем.

Когда переключатель разомкнут, на конденсаторе имеется разность потенциалов. Это различие позволяет конденсатору заряжаться со скоростью, определенной R1, R2 и C. При зарядке на выводе должно отображаться значение 3,3 В.

Когда переключатель замкнут, накопленный заряд на конденсаторе может истечь — так как больше нет разности потенциалов на конденсаторе. Скорость, с которой заряд истощается, будет определяться значением R2 и C.

Мы начнем с выбора значения C. Конденсатор с емкостью 1 мкФ является общедоступным и подходящим компонентом. С набором C мы можем вычислить значение R2. При открытом переключателе конденсатор C будет заряжаться. Когда переключатель замкнут, конденсатор разрядится через R2. Уравнение, описывающее этот разряд, определяется как:

CapacitorDischargeEquation

где V cap (t) — напряжение на конденсаторе в момент времени t, R — сопротивление цепи, а C — емкость цепи. Переставляя это уравнение, мы имеем:

CapacitorDischargeEquationRearrange

Последнее, что нам нужно сделать, чтобы вычислить значение R, это выбрать значение для t. Значение, которое мы выбираем для t, должно быть достаточно большим, чтобы все отскоки происходили до этого времени. Выбор этого значения может быть сложным, если у вас нет доступа к осциллографу — прицел даст вам действительно четкое представление о сигналах напряжения и времени. У меня не было доступа к области действия, поэтому я вышел в Интернет и нашел статью того, кто это сделал. В статье Ganssle Group было  предложено 20 мс в качестве разумного времени для всех отскоков, которые произошли для ряда общих пинов, которые они тестировали.

При значениях t (20 мс), C (1 мкФ), V cap  — для разряда V IL  — (1,8 В) и V 0 (3,3 В) мы можем рассчитать R — или, более конкретно, R2 в нашей схеме выше — как ( прибл.) 21,5 кОм. Я округлил это до 22 кОм, поскольку у меня был один под рукой.

Чтобы вычислить значение R1, мы смотрим на уравнение, необходимое для зарядки конденсатора. Вот когда выключатель открывается. Уравнение, которое описывает заряд в конденсаторе:

CapacitorChargeEquation

Где V cap — это напряжение на конденсаторе, V 0 — это напряжение, до которого конденсатор, наконец, возрастет, C — это емкость, t — время, а R — сопротивление, в данном случае R1 + R2. Перестановка у нас есть:

CapacitorChargeEquationRearrange

Подставляя в значения T (20ms), С (1 мкФ), V колпачок  — который для зарядки V IH  — (1.8V) и V 0 (3,3) , мы можем вычислить R — или , более конкретно R1 + R2 — в (прибл .) 73 кОм. Что означало, что R1 должно быть 51 кОм. У меня было 47 кОм и резистор на 3900 Ом, поэтому я подключил их последовательно, чтобы получить сопротивление R1 50,900 Ом.

Установив значения R1, R2 и C, я построил схему. Затем я подключил его к Arduino Due (который имеет те же логические уровни и очень похожие пороговые напряжения с Raspberry Pi) для тестирования и написал короткий Sketch для обнаружения повышающихся и понижающихся напряжений с использованием аппаратных прерываний.

ArdPlusCircuit

Как и ожидалось (или, по крайней мере, надеялись), я получил чистые переходы при нажатии кнопки. Теперь осталось только взглянуть на код и посмотреть результаты только с резистором и цепями резистор-конденсатор. Наслаждайтесь!

volatile int rises = 0;
volatile int falls = 0;

int prev_rises = rises;
int prev_falls = falls;

void rise(void)
{
  rises++;
}

void fall(void)
{
  falls++;
}

void setup() {
  // put your setup code here, to run once:
  attachInterrupt(2,rise,RISING);
  attachInterrupt(3,fall,FALLING);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int i;

  Serial.println("**** Begin loop ****");

  for(i=prev_rises;
      i<rises;
      i++){
        Serial.println("A rise");
      }
  prev_rises = rises;

  for(i=prev_falls;
      i<falls;
      i++){
        Serial.println("A fall");
      }
  prev_falls = falls;

  Serial.println("**** End loop ****");
  delay(1000);
}

С выходом:

Вывод

Изображение слева — это выход для схемы только резистора, а изображение справа — это выход для цепи резистор-конденсатор. Оба изображения соответствуют одному нажатию кнопки.