26 марта 2013-го
Электронные клавиши.
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() указываем режим работы выхода, к которому подключен пьезоэлемент и включаем консоль (она нам нужна, чтобы определить какие значения за аналоговом входе будут выдавать нажатия различных кнопок).
В основной программе, сначала мы считываем значение с аналогового входа, затем выводим его на консоль. Этими двумя строчками мы ограничились в первом варианте программы и запустили её, записали значения, кототорые получали на входе при нажатии разных кнопок. Поскольку для каждой кнопки значения немного отличались для разных нажатий, то мы решили использовать не конкретные предпределённые значения, а интервалы. В зависимости от интервала, в котором находится считанное со входа значение, мы выдаем тот или иной тон, частоты берем из нашего массива. Если ни одна из кнопок не нажата, то даем команду «замолчать».
Небольшое видео: