Espruino:Примеры/Создание звуков и музыки: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Создание звуков и музыки<ref>[https://www.espruino.com/Making+Music www.espruino.com - Making Sounds and Music]</ref>= | ||
[https://www.youtube.com/watch?v=Jk5lTqQzoKA Espruino - Making Music with Microcontrollers] | |||
[[Espruino]] недостаточно мощна для того, чтобы проигрывать музыкальные файлы формата [[MP3]] или [[WAV]], но в то же время способна генерировать писки на разных частотах при помощи [[ШИМ]]. В этом руководстве мы научимся генерировать звуки при помощи динамика от старого [[ПК]]. | |||
== Нам понадобятся == | |||
* Плата [[Espruino]] (я воспользовался [[STM32 F3 Discovery]]) | |||
* [https://www.espruino.com/Speaker Динамик] | |||
== Подсоединение == | |||
Подключите два провода динамика к плате [[Espruino]]: один к контакту '''GND''', а второй – к сигнальному контакту, умеющему генерировать [[ШИМ]]. Чтобы узнать список контактов, которые умеют так делать, напечатайте [[analogWrite()]]. | |||
'''Примечание:''' Сразу скажем, что вся эта затея может обернуться для вашей [[Espruino]] довольно плачевно. Идеально было бы добавить в цепь [[транзистор]], чтобы усилить сигнал, или хотя бы последовательно подключить [[резистор]], чтобы ограничить силу тока. Но платы [[Espruino]] не особо дорогие, так что можете попробовать сделать проект и безо всех этих ''«добавок»''. | |||
== Код == | |||
Сначала давайте зададим контакт, к которому подключен динамик. Я на своей '''F3''' решил воспользоваться контактом '''A9''': | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
var BUZZER=A9; | |||
</syntaxhighlight> | |||
Теперь мы можем сгенерировать на этом контакте [[ШИМ]] и посмотреть, что произойдёт: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
analogWrite(BUZZER, 0.5); | |||
</syntaxhighlight> | |||
Это должно издать звук, но для управления частотой нам надо задать дополнительный аргумент: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
analogWrite(BUZZER, 0.5, { freq: 1000 } ); | |||
</syntaxhighlight> | |||
Это издаст писк с частотой [[1 КГц]]. Чтобы выключить этот писк, в аргументе надо задать ''«0»'': | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
digitalWrite(BUZZER,0); | |||
</syntaxhighlight> | |||
Теперь давайте создадим функцию, которая будет проигрывать любую необходимую нам частоту. Если мы зададим ей ''«0»'', она остановит писк: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
function freq(f) { | |||
if (f===0) digitalWrite(BUZZER,0); | |||
else analogWrite(BUZZER, 0.5, { freq: f } ); | |||
} | |||
</syntaxhighlight> | |||
Давайте протестируем эту функцию: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
freq(1000); | |||
freq(1500); | |||
freq(0); | |||
</syntaxhighlight> | |||
А теперь давайте сыграем какую-нибудь музыку. Нам понадобятся вот эти два сайта: | |||
* Частоты музыкальных нот | |||
* Детские песенки, где ноты обозначены буквами | |||
На втором сайте буквы ''«a-g»'' используются для обозначения низких тонов, а ''«A-G»'' – для высоких тонов. Давайте создадим функцию, которая будет обрабатывать строку символов (по одному за раз) и проигрывать мелодию, заданную с их помощью. | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
var pitches = { | |||
'a':220.00, | |||
'b':246.94, | |||
'c':261.63, | |||
'd':293.66, | |||
'e':329.63, | |||
'f':349.23, | |||
'g':392.00, | |||
'A':440.00, | |||
'B':493.88, | |||
'C':523.25, | |||
'D':587.33, | |||
'E':659.26, | |||
'F':698.46, | |||
'G':783.99 | |||
}; | |||
function step() { | |||
var ch = tune[pos]; | |||
if (ch !== undefined) pos++; | |||
if (ch in pitches) freq(pitches[ch]); | |||
else freq(0); // выключаем | |||
} | |||
</syntaxhighlight> | |||
Теперь давайте зададим мелодию при помощи переменной '''tune''', а также создадим переменную '''pos''', которая будет обозначать позицию в мелодии. | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
var tune = "c c c d e e d e f g C C C g g g e e e c c c g f e d c"; | |||
var pos = 0; | |||
</syntaxhighlight> | |||
Теперь давайте воспроизведём эту мелодию: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
setInterval(step, 100); | |||
</syntaxhighlight> | |||
Чтобы перезапустить мелодию, просто напишите: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
pos=0; | |||
</syntaxhighlight> | |||
Вы также можете загрузить другую мелодию: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
var tune = "g e g g e g A A g f e d e f"; | |||
pos=0; | |||
</syntaxhighlight> | |||
А если вы хотите перезапускать мелодию при нажатии на кнопку, просто напечатайте: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
setWatch("pos=0", BTN, true); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Версия от 18:29, 13 июля 2021
Создание звуков и музыки[1]
Espruino - Making Music with Microcontrollers
Espruino недостаточно мощна для того, чтобы проигрывать музыкальные файлы формата MP3 или WAV, но в то же время способна генерировать писки на разных частотах при помощи ШИМ. В этом руководстве мы научимся генерировать звуки при помощи динамика от старого ПК.
Нам понадобятся
- Плата Espruino (я воспользовался STM32 F3 Discovery)
- Динамик
Подсоединение
Подключите два провода динамика к плате Espruino: один к контакту GND, а второй – к сигнальному контакту, умеющему генерировать ШИМ. Чтобы узнать список контактов, которые умеют так делать, напечатайте analogWrite().
Примечание: Сразу скажем, что вся эта затея может обернуться для вашей Espruino довольно плачевно. Идеально было бы добавить в цепь транзистор, чтобы усилить сигнал, или хотя бы последовательно подключить резистор, чтобы ограничить силу тока. Но платы Espruino не особо дорогие, так что можете попробовать сделать проект и безо всех этих «добавок».
Код
Сначала давайте зададим контакт, к которому подключен динамик. Я на своей F3 решил воспользоваться контактом A9:
var BUZZER=A9;
Теперь мы можем сгенерировать на этом контакте ШИМ и посмотреть, что произойдёт:
analogWrite(BUZZER, 0.5);
Это должно издать звук, но для управления частотой нам надо задать дополнительный аргумент:
analogWrite(BUZZER, 0.5, { freq: 1000 } );
Это издаст писк с частотой 1 КГц. Чтобы выключить этот писк, в аргументе надо задать «0»:
digitalWrite(BUZZER,0);
Теперь давайте создадим функцию, которая будет проигрывать любую необходимую нам частоту. Если мы зададим ей «0», она остановит писк:
function freq(f) {
if (f===0) digitalWrite(BUZZER,0);
else analogWrite(BUZZER, 0.5, { freq: f } );
}
Давайте протестируем эту функцию:
freq(1000);
freq(1500);
freq(0);
А теперь давайте сыграем какую-нибудь музыку. Нам понадобятся вот эти два сайта:
- Частоты музыкальных нот
- Детские песенки, где ноты обозначены буквами
На втором сайте буквы «a-g» используются для обозначения низких тонов, а «A-G» – для высоких тонов. Давайте создадим функцию, которая будет обрабатывать строку символов (по одному за раз) и проигрывать мелодию, заданную с их помощью.
var pitches = {
'a':220.00,
'b':246.94,
'c':261.63,
'd':293.66,
'e':329.63,
'f':349.23,
'g':392.00,
'A':440.00,
'B':493.88,
'C':523.25,
'D':587.33,
'E':659.26,
'F':698.46,
'G':783.99
};
function step() {
var ch = tune[pos];
if (ch !== undefined) pos++;
if (ch in pitches) freq(pitches[ch]);
else freq(0); // выключаем
}
Теперь давайте зададим мелодию при помощи переменной tune, а также создадим переменную pos, которая будет обозначать позицию в мелодии.
var tune = "c c c d e e d e f g C C C g g g e e e c c c g f e d c";
var pos = 0;
Теперь давайте воспроизведём эту мелодию:
setInterval(step, 100);
Чтобы перезапустить мелодию, просто напишите:
pos=0;
Вы также можете загрузить другую мелодию:
var tune = "g e g g e g A A g f e d e f";
pos=0;
А если вы хотите перезапускать мелодию при нажатии на кнопку, просто напечатайте:
setWatch("pos=0", BTN, true);
См.также
Внешние ссылки