Электронные клавиши.

26 марта 2013, 23:24

C помощью нескольких резисторов и нескольких кнопок мы собираемся сделать небольшой электро-клавишный инструмент.

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

С помощью этого приёма можно считывать нажатия нескольких клавиш, используя только один аналоговый вход. Это очень полезно, когда обнаруживается недостаток в цифровых входах. Несколько выключателей соединяются параллельно с аналоговым входом Arduino и плюсом, на минус они подключаются через общий резитор. На плюс большая часть выключателей подсоединяется через свой резитор. С таким подключением при нажатии различных кнопок на пине будет разное наряжение. Если нажать несколько кнопок одновременно, на входе получится другое значение, в зависимости от того какие резиторы оказались соединёнными параллельно.

Схема подключения этого всего к Arduino выглядит так:

Первый выключатель подсоединяется к плюсу напрямую без резистора, второй — через резистор на 220 Ом, третий — через резистор на 10кОм, четвёртый — через резистор на 1МОм. Вторые выходы выключателей соединяются с аналоговым входом Arduino и через общий резистор в 10кОм идут на 0. В общем получается схема делителя напряжения, которую мы уже использовали.

Собранный макет:

Программа, с помощью которой вся эта шарманка будет играть:

int notes[]={
  262,294,330,349};//ноты до-фа (массив)
int keys=A0;//клавиши
int speak=8;//пьезоэлемент

void setup(){
  pinMode(speak, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  int keysVal=0;//переменная для хранения значения клавиши
  keysVal=analogRead(keys);
  Serial.println(keysVal); 
  if  (keysVal==1023){
    tone(speak,notes[0]);
  }
  else if ( (keysVal>=990)&&(keysVal<=1010)){
    tone(speak,notes[1]);
  }
  else if ( (keysVal>=505 )&&(keysVal<=515)){
    tone(speak,notes[2]);
  }
  else if( (keysVal>=5)&&(keysVal<=10)){
    tone(speak,notes[3]);
  } 
  else{
    noTone(speak);//если ничего не нажато, замолчать
  }  
}

Для того, чтобы программа могла воспроизвести ноты, она должна где-то хранить список частот, для каждой ноты. Мы будем играть ноты до, ре, ми, фа (262Гц, 294Гц, 330Гц и 349Гц). Для этого в программе мы используем массив.

Массивы используют для хранения списков однотипных элементов, например, частоты нот, используя одно имя переменной. Это достаточно удобный инструмент для быстрого и эффективного доступа к информации.  Массив объявляется так же как и обычная переменная, но после её имени следует пара квадратных скобок []. Если нужно присвоить значения сразу всем элементам массива, то после знака равенства эти значения перечисляются через запятую и обрамляются фигурными скобками {}.

Для того, чтобы прочитать значения из массива, к массиву обращаются по имени и в квадратных скобках указать индекс (номер) конкретного элемента.  Номера элементов в массиве начинаются с нуля. Первый элемент имеет индек 0, второй — 1 и т. д.

Теперь небольшое описание программы:

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

В основной программе, сначала мы считываем значение с аналогового входа, затем выводим его на консоль. Этими двумя строчками мы ограничились в первом варианте программы и запустили её, записали значения, кототорые получали на входе при нажатии разных кнопок. Поскольку для каждой кнопки значения немного отличались для разных нажатий, то мы решили использовать не конкретные предпределённые значения, а интервалы. В зависимости от интервала, в котором находится считанное со входа значение, мы выдаем тот или иной тон, частоты берем из нашего массива. Если ни одна из кнопок не нажата, то даем команду «замолчать».

Небольшое видео:

Популярное