Site icon ИнтерДрайв — гидравлика, пневматика, приводная техника, оборудование

Как сделать самому резистивную клавиатуру для arduino

Сегодня про так называемую резистивную клавиатуру или как подключить много кнопок на один аналоговый вход. Для этого был собран вот такой модуль, на котором 5 кнопок и несколько SMD резисторов, а так же 3 штырька для питания и выхода. В общем как это все устроено.

Я надеюсь все знают как работает делитель напряжения. Есть 2 резистора подключенных последовательно в цепь питания и от средней точки этих резисторов снимается напряжение, величина которого зависит от падения напряжения на этих самых резисторах. А если совсем просто, то если на входе й нас 5 вольт и 2 резистора по 1кОм, то со средней точки мы будем снимать 2,5 вольт.

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

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

Это даже можно продемонстрировать. Ниже пример, который отправляет значение в serial которое считывает функцией analogread на выходе А0 к которому подключена клавиатура. Когда ничего не нажато в мониторе порта будет 1023, если надавить на кнопку это значение будет отличаться и зависеть от нажатой кнопки.

Осталось только различать эти значения в коде без условия if здесь не обойтись, а лучше вообще это вынести в отдельную функцию. К примеру эта функция будет key() и возвращает она байт

byte key(){  
  int val = analogRead(0); // считываем значение с аналогового входа в переменную val
    if (val < 50) return 1; // сверяем переменную, если val меньше 50 возвращаем 1 (первая кнопка)
    else if (val < 150) return 2; // если val меньше 150 вторая кнопка и т.д.
 
    else if (val < 350) return 5;
    else if (val < 500) return 4;
    else if (val < 800) return 3;
    else return 0;  // если ничего не подошло возвращаем 0
}

Дальше в цикле отправляем в serial, то что возвращает функция key

void loop() {
 int sensorValue = analogRead(A0); // считываем значения с А0. Пригодится для отладки
 Serial.print(key()); // выводим номер кнопки в serial   
 Serial.print(" ");
 Serial.println(sensorValue); // выводим значения с А0. Пригодится для отладки
 delay(1);        // задержка между считываниями для стабильности
}

 Весь код

byte key(){  
 int val = analogRead(0);
   if (val < 50) return 1;
   else if (val < 150) return 2;
   else if (val < 350) return 5;
   else if (val < 500) return 4;
   else if (val < 800) return 3;
   else return 0;  
}
 
// the setup routine runs once when you press reset:
void setup() {
 // initialize serial communication at 9600 bits per second:
 Serial.begin(9600);
}
 
// the loop routine runs over and over again forever:
void loop() {
 // read the input on analog pin 0:
 int sensorValue = analogRead(A0);
 // print out the value you read:
 Serial.print(key());
 Serial.print(" ");
 Serial.println(sensorValue);
 delay(1);        // delay in between reads for stability
}

Exit mobile version