Пианино Arduino
В этом проекте мы будем использовать несколько мгновенных кнопок и пьезодинамик для создания простого пианино.
Необходимые части:
Arduino Uno
Макетная плата
Соединительные провода
Пьезоизлучатель
8 кнопок
8 1кОм резисторов
Как это работает
Каждая кнопка в нашем проекте (рис. 5-1) подключена к контакту Arduino, и при нажатии кнопки пьезоизлучатель издаст одну из восьми нот.
Рисунок 5-1: Кнопка и ее схема
При нажатии кнопка замыкает цепь, включая ее. Как только кнопка будет отпущена, соединение отскочит и разорвет эту цепь, отключив ее. Кнопочный переключатель также известен как мгновенный или нормально разомкнутый переключатель и используется, например, в компьютерных клавиатурах. Это отличается от тумблера, который остается либо включенным, либо выключенным, пока вы не переключите его в другое положение, например, выключатель света.
Этот тип кнопки имеет четыре контакта, но обычно для подключения одновременно используются только два. В этом проекте мы используем верхние контакты, чтобы легче было дотянуться до кнопки и воспроизвести мелодию, хотя два неиспользуемых контакта внизу выполняли бы ту же работу. Как показано на рисунке 5-2, контакты работают в цепи. Контакты A и C всегда подключены, как и контакты B и D. Когда кнопка нажата, схема завершена.
Рисунок 5-2: Разомкнутая схема кнопки
В пианино Arduino используется пьезоизлучатель, показанный на рис. 5-3, для создания частот, напоминающих узнаваемые ноты. Пьезозвуковые оповещатели, или просто пьезоэлементы для краткости, — это недорогие зуммеры, часто используемые в маленьких игрушках. Пьезоэлемент без пластикового корпуса выглядит как золотой металлический диск с подключенными положительным (обычно красным) и отрицательным (обычно черным) проводами. Пьезо способен только издавать щелкающий звук, который мы создаем, подавая напряжение.
Рисунок 5-3: Пьезоизлучатель
Мы можем делать узнаваемые ноты, заставляя пьезоэлемент щелкать сотни раз в секунду на определенной частоте, поэтому сначала нам нужно знать частоту различных тонов, которые нам нужны. В Таблице 5-1 показаны ноты и соответствующие им частоты. Период — это продолжительность цикла в микросекундах, при которой создается частота. Например, чтобы получить ноту C (261 Гц), нам нужно, чтобы пьезоэлектрический процессор работал с периодом 3,830 микросекунд. Мы уменьшаем период вдвое, чтобы получить значение timeHigh, которое используется в коде для создания заметки. (Тон вызван тем, что пьезоэлемент включается и выключается очень быстро, поэтому время, в течение которого пьезоэлемент включен или HIGH, составляет половину периода.)
Таблица 5-1: Музыкальные ноты и частоты, используемые в коде
НОТА
|
ЧАСТОТА
|
ПЕРИОД
|
TIMEHIGH
|
C
|
261 Гц
|
3,830
|
1915
|
D
|
294 Гц
|
3,400
|
1700
|
E
|
329 Гц
|
3,038
|
1519
|
F
|
349 Гц
|
2.864
|
1432
|
G
|
392 Гц
|
2.550
|
1275
|
A
|
440 Гц
|
2.272
|
1136
|
B
|
493 Гц
|
2.028
|
1014
|
C
|
523 Гц
|
1.912
|
956
|
Сборка
Вставьте кнопки в макетную плату так, чтобы штифты располагались по центру разлома макетной платы.
Глядя на лицевую сторону макетной платы, пронумеруйте кнопки 1-8 слева направо. Подключите верхний левый вывод (A) кнопки 1 к выводу 2 Arduino с помощью соединительного провода. Подключите верхние левые контакты других кнопок к Arduino, как показано ниже.
КНОПКА
|
НОТА
|
ARDUINO
|
1
|
C
|
2
|
2
|
D
|
3
|
3
|
E
|
4
|
4
|
F
|
5
|
5
|
G
|
6
|
6
|
A
|
7
|
7
|
B
|
8
|
8
|
C
|
9
|
Вставьте резистор 1 кОм в макетную плату на одной линии с верхним левым выводом первой кнопки, как показано на рисунке 5-4, и подсоедините другую сторону резистора к шине GND макетной платы. Повторите это для других кнопок. Резистор переводит переключатель в положение GND, когда кнопка не нажата, чтобы сообщить Arduino, что он не находится в положительном состоянии; когда кнопка нажата, при положительном питании звучит соответствующая нота.
Рисунок 5-4: Резистор 1 кОм соединяет вывод кнопки с GND
Подсоедините верхний правый вывод (B) каждой из кнопок к положительной шине питания макетной платы с помощью соединительного провода..
Подсоедините красный провод пьезоэлемента к контакту 13 Arduino, а его черный провод - к шине GND макетной платы, затем подсоедините шину питания к GND и +5V на Arduino..
Убедитесь, что ваша настройка соответствует принципиальной схеме на рисунке 5-5, а затем загрузите эскиз.
Рисунок 5-5: Принципиальная схема пианино Arduino
Скетч
Сначала на скетче определяется вывод, к которому подключается пьезозвук, и выводы для кнопок. Для каждой кнопки определяется значение, и в соответствии с этим значением присваивается звуковой сигнал. Кнопки задаются в качестве входных сигналов, а пьезозвук - в качестве выходного. Цикл loop проверяет каждую кнопку, воспроизводя соответствующий звуковой сигнал до тех пор, пока кнопка удерживается нажатой. Одновременно можно воспроизводить только одну ноту, потому что для каждой ноты требуется повторение цикла, поэтому, когда кнопка отпущена, пьезозвук прекращает воспроизведение сигнала и цикл начинается заново.
int speakerPin = 13; // Piezo defined as pin 13
int key_c = 2; // Define Arduino pins for the keys
int key_d = 3;
int key_e = 4;
int key_f = 5;
int key_g = 6;
int key_a = 7;
int key_b = 8;
int key_C= 9;
// Value for each key press
int keypress_c = 0; int keypress_d = 0; int keypress_e = 0;
int keypress_f = 0; int keypress_g = 0; int keypress_a = 0;
int keypress_b = 0; int keypress_C = 0;
// Define the frequency of each note
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
// 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C'
int keytone = 0; // Give a value for keytone
void setup() {
pinMode(key_c, INPUT); // Set up key pins as inputs
pinMode(key_d, INPUT);
pinMode(key_e, INPUT);
pinMode(key_f, INPUT);
pinMode(key_g, INPUT);
pinMode(key_a, INPUT);
pinMode(key_b, INPUT);
pinMode(key_C, INPUT);
pinMode(speakerPin, OUTPUT); // Set up piezo pin as an output
}
// Start a loop to read the press of each key
void loop() {
keypress_c = digitalRead(key_c); keypress_d = digitalRead(key_d);
keypress_e = digitalRead(key_e); keypress_f = digitalRead(key_f);
keypress_g = digitalRead(key_g); keypress_a = digitalRead(key_a);
keypress_b = digitalRead(key_b); keypress_C = digitalRead(key_C);
// And if the key press is HIGH, play the corresponding tone
if((keypress_c == HIGH) || (keypress_e == HIGH) ||
(keypress_g == HIGH) || (keypress_d == HIGH) ||
(keypress_f == HIGH) || (keypress_a == HIGH) ||
(keypress_b == HIGH) || (keypress_C == HIGH))
{
if (keypress_c == HIGH) {
keytone = tones[0];
}
if (keypress_d == HIGH) {
keytone = tones[1];
}
if (keypress_e == HIGH) {
keytone = tones[2];
}
if (keypress_f == HIGH) {
keytone = tones[3];
}
if (keypress_g == HIGH) {
keytone = tones[4];
}
if (keypress_a == HIGH) {
keytone = tones[5];
}
if (keypress_b == HIGH) {
keytone = tones[6];
}
if (keypress_C == HIGH) {
keytone = tones[7];
}
digitalWrite(speakerPin, HIGH); // Turn on piezo to play tone
delayMicroseconds(keytone);
digitalWrite(speakerPin, LOW); // Turn off after a short delay
delayMicroseconds(keytone);
}
else { // If no key is pressed, piezo remains silent
digitalWrite(speakerPin, LOW);
}
}
Отладка
Код компилируется, но некоторые или все кнопки не выдают звуковой сигнал:
Если пьезоанализатор вообще не издает шума, проверьте, что красный провод пьезоанализатора подключен к контакту 13, а его черный провод - к GND на макетной плате. Убедитесь, что вы подключили GND на Arduino к правильной шине питания макетной платы и что к Arduino подключено питание.
Если звук издают только некоторые кнопки, перепроверьте проводку на предмет бесшумных кнопок. Легко сместить соединительные провода на макетной плате так, чтобы они фактически не выстраивались в ряд с выводами кнопок.
Если у вас все еще есть проблема, попробуйте заменить неисправную кнопку на ту, которая, как вы знаете, работает; если это решит вашу проблему, возможно, ваша оригинальная кнопка была неисправна.
Достарыңызбен бөлісу: |