Разработка модели SDK для реального устройства

Доброго времени суток, уважаемые читатели! В этом посте я продолжу начатые ранее рассуждения и затрону сразу 2 задачи из поста: разработка собственного SDK. Этими задачами было: порассуждать о будущем протокола, что его ждёт, куда он будет развиваться и с учётом этого спроектировать модель будущего SDK.

Читать полностью

Так сбываются мечты

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

Читать полностью

Реализация собственного SDK

Доброго времени суток, уважаемые читатели! Я снова занимаюсь своим блогом! В ближайшее время блог будет ждать кардинальное обновление, возможно, переделаю даже рубрики и поменяю структуру. Т.к. многое изменилось в моей жизни и моих интересах со времен последних постов.

Читать полностью

О Петербурге

Петербург – сказочный город. Сколько произведений было написано в нём и о нём? Петербург славен многими событиями и вещами: Царями, революциями, флотом, каналами, архитектурой и даже погодой. Этот список можно продолжать бесконечно, но я бы хотел остановится на последних двух: архитектуре и погоде.

Читать полностью

Устраняем программно дребезг кнопок и переключателей

Здравствуйте! Кнопки и прочие переключатели — являются неотъемлемой частью, практически любого устройства. Однако, реализация этих устройств приводит к такому нежелательному явлению для микроконтроллерной техники, как дребезг контактов. Что такое дребезг? Давайте разбираться!

Рассмотрим дребезг на примере обычной кнопки, которая представляет из себя 2 контакта, замыкающиеся между собой при нажатии кнопки, т.е. в нажатом состоянии кнопка проводит электрический ток, а в не нажатом не проводит. Также следует иметь ввиду, что в данной статье мы будем рассматривать дребезг на примере подпружининной кнопки — которая сама возвращается в исходное положение и размыкает цепь, если её отпустить, но все высказанные мною мысли справедливы и для кнопок с фиксацией положения: нажал — кнопка нажалась и осталась нажатой, нажал ещё раз — кнопка вернулась в исходное положение.

При замыкании кнопки напряжение начинает скакать, что связано с тем, что до полного нажатия происходят многократные замыкания-размыкания кнопки. Таким образом, в момент нажатия кнопки её состояние некоторое время изменяется случайным образом и спустя некоторого время, обычно 10-20 мс, хотя зависит от конкретной кнопки, значение стабилизируется. Если кнопка подключена к контроллеру, то контроллер регистрирует этот дребезг как многократное нажатие. Если бы не было защиты от требезга, то нажимая на клавиатуре букву — вы бы получали, например, 7 букв на экране, затем при попытке стереть их нажатием кнопки backspace, вы бы стирали случайное число символов, напрмиер 5. Работать на такой клавиатуре было бы не возможно. Осцилограмма напряжения на такой кнопке выглядит следующим образом. На фото дребезг длиться ровно 10 мс.

Дребезг контактов

По хорошему же осциллограмма должна выглядеть следующим образом. Интересный факт, эта осциллограмма является идеальной: как видно из рисунка, переключение происходит мнгновенно, так что для этой кнопки можно не устранять дребезг. Для впечатления, вспомните сколько длится дребезг (я упомянул об этом ранее), и посмотрите на эту осциллограмму, где одна клетка — это 250 нс (1000 нс = 1 мкс). Фото кликабельна — жмите для увеличения картинки.

Идеальная кнопка

Для получения стабильного значения предлагаю следующий алгоритм: контроллер слушает порт (пин), к которому подключена кнопка. Если пин изменяет своё логическое знчение, по сравнению с прошлым состоянием, которое мы тоже запоминаем, то начинаем процедуру проверки: трижды проверяем через равные промежутки времени текущее значение пина и прошлое. Если значения трижды совпали, то можно считать, что значение стабилизировалось и функция возвращает логическое значение пина. Для реализации этого алгоритма предлагаю следующую программу на C. Время задержки между проверками подбирается экспериметально. В случае ошибок в определении — увеличивайте время задержки. Помните, что 1000 мкс = 1 мс. Это общий код, как переделать его под Arduino и язык processing я объясню ниже в этой статье. Код снабжён комментариями, но если что-либо останется для Вас непонятным — я всегда жду Ваши вопросы в комментариях к этому посту.

#define BUTTON PORTC.B2 // Порт, к которому подключена кнопка: в нашем случае PORTC.B2
#define DEBOUNCE_DELAY 5000 // Время между проверками в микросекундах.

int buttonDebounce(void);

void main() { 
	if(buttonDebounce() == 1) {
		// действие если кнопка нажата
	} else {
		// действие если кнопка не нажата
	}
}

int buttonDebounce(void) {
   int result, i, currState, lastState;
   result = lastState = 0;

   if(BUTTON != lastState) {
		lastState = BUTTON; // Запоминаем последнее состояние кнопки
		Delay_us(DEBOUNCE_DELAY); // Делаем задержку
         for(i = 3; i > 0; --i) { // Трижды сравниваем значение кнопки через равные промежутки времени. 
               currState = BUTTON;
               if (currState != lastState) { // Если текущее состояние не совпало с прошлым - завершаем все циклы.
                  break;
               }
               Delay_us(DEBOUNCE_DELAY);
               lastState = currState;
               if(i == 1) {
                    result = BUTTON; // Если трижды значение было одинаково, то возвращаем его в качестве значения функции
               }
         }

   }

   return result; 
}

Читать полностью