Как стать автором
Обновить

Комментарии 17

Пробовал в Arduino IDE написать функцию для чтения состояния кнопок, в протеусе почему-то не работает, а в реальном железе проверить возможности пока что нет.

image

Не судите строго, писал ночью
#define PIN1 10
#define PIN2 11

#define DOWN 1
#define OK 2
#define UP 3
#define SET 4

void setup()
{
  Serial.begin(9600);
}

char checkKeys()
{ // понеслась

  pinMode(PIN1, OUTPUT);
  digitalWrite(PIN1, LOW);
  pinMode(PIN2, OUTPUT);
  digitalWrite(PIN2, LOW);

  int keysRead = 0;
  for (keysRead = 1; keysRead <= 4; keysRead++) {
    switch (keysRead) {
      case DOWN:
        digitalWrite(PIN1, INPUT_PULLUP); 
        if (digitalRead(PIN1) == false) {

          return DOWN;
        }
      break;

      case OK:
        pinMode(PIN1, OUTPUT);
        digitalWrite(PIN1, LOW);
        digitalWrite(PIN2, INPUT_PULLUP);
        if (digitalRead(PIN2) == false) {

          return OK;
        }
      break;

      case UP:
        pinMode(PIN2, OUTPUT);
        digitalWrite(PIN2, LOW);
        digitalWrite(PIN1, INPUT_PULLUP);
        if (digitalRead(PIN1) == false) {

          return UP;
        }
      break;

      case SET:
        digitalWrite(PIN2, INPUT_PULLUP); 
        if (digitalRead(PIN2) == false) {

          return SET;
        }
      break;
      default:
        return 0;

    }
  }
}


void loop()
{
  int keyScan = checkKeys();
  Serial.print(keyScan);
  Serial.print(" ");
  switch (keyScan) {
    case DOWN:
      Serial.println("DOWN");
      break;
    case OK:
      Serial.println("OK");
      break;
    case UP:
      Serial.println("UP");
      break;
    case SET:
      Serial.println("SET");
      break;
  }

  delay(500);
}



А если диоды на шотки поменять?
delay в цикле опять же можно покороче сделать, возможно все нажатия попадали в эти 500мс.
Ну и для отладки одну из кнопок OK/UP просто закоротить.
Это потому что оригинал выглядит как-то так (для 2х независимых сетов по 3 кнопки):
https://www.circuitlab.com/editor/#?id=482uh3
Правда 10к по-моему не нужны, автор просто подстраховался.

Китайцы мылость подзабили на резисторы (или автор не нашел) и схема не очень рабочая. Я не знаю что там за пулл-апы в мегах, но обычно там ничего серьезного.

Достаточно понять, что при нажатии DOWN и отжатых других кнопках получаем КЗ (ну защита порта сработает если там диоды стоят). Но нужно счать падение напряжения на конкретном диоде, значения приблизительные.

Хотя странно, что они не замутили это на 1 порт с сетью резисторов как раньше.
Действительно, хитро. Если все входы АЦП заняты и нельзя поставить несколько кнопок последовательно с резисторами то да, это выход. Но как расширить на больше чем две кнопки между выводами?
Расширить можно увеличивая количество используемых выводов.
Для трех выводов — 9 кнопок (3 напрямую плюс 2 на каждую пару выводов).
Для четырех — 18.
Но там сама схема и логика становится безумной.
Проще взять сдвиговый регистр с параллельным входом/последоательным выходом и на него повесить сколько угодно кнопок.
image
Есть еще обратная задача, тоже хитро решается в т.ч. и китайцами, зовется Charlieplexing.
image
Вот тоже хотел написать про Чарлиплексинг (кстати, картинка походу с Изи), но есть и чуть другое решение — если очень катастрофически не хватает кнопок, возьмите другой МК самый дешевый, хоть 2313, хоть 90S1200 за копейки — и подключайте туда мегадофига кнопок, хоть тыщу. А если еще и регистры приделать… Я в своем девайсе это решил просто — внешний PS/2 разьём и клавиатуру. Простой протокол, стандартные клавиатуры — и хоть занажимайся. На одну стандартную PS/2 клаву — 2 GPIO. Всё просто и совместимо.
Это прекрасно, тут тебе и нажатие и повтор и отжатие и несколько кнопок за раз — блеск, но громоздко, а если не громоздко то уже недешево. Может просто UART RX-TX? Подключай любой терминал хардварный, софтварный и не только на ввод, но и на вывод вся эта кухня работать будет )
К тому же ps/2 клавиатуру скоро еще и поискать придется.
Я в свое время опрашивал поле клавиш телефона с помощью трех портов МК и внешней микросхемы счетчика с дешифратором серии 561.

Один из портов МК увеличивал счетчик на 1, два других — принимали сигналы от клавиш. Так как дешифратор на выходе счетчика имел 10 выходов, то 9 я пустил на клавиши, реализовав матрицу 2x9. Можно было иметь до 18 клавиш. Десятый вывод дешифратора я соединил с клавишными входами МК напрямую. Тем самым удалось реализовать синхронизацию состояния счетчика с программой МК.
что в вашем понимании значит порт: «Для первого порта», «уже для второго порта»!? (по картинке тоже не понятно).
18й/17й пин у микроконтроллера, я полагаю.
Это такой «флажок», который показывает уровень статьи.
Тут еще надо бы уточнить, что одновременное нажатие двух кнопок приводит к разного рода неопределённостям и их надо бы детектировать и разруливать во избежание неверных интерпретаций. Если нажата самая верхняя или нижняя кнопка, очевидно что определить нажатие внутренних будет невозможно. К тому же, попытка определить нажатие внутренних кнопок при нажатой внешней может привести к КЗ выхода контроллера, это надо учесть программно ЛИБО включить на каждый вывод порта по резистору в 500 Ом чтобы ограничить ток КЗ на безопасном уровне.
Одновременное нажатие в простых поделках часто не нужно определять. Ну а КЗ там не будет, потому что для подтяжки вверх используется встроенный пулл-ап (резистор), а ставить пин на выход в ноль — не страшно, ибо снаружи кнопки коммутируют также на ноль.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации