Espruino:Примеры/Пианино с помощью Espruino Pico: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
Строка 32: Строка 32:
Вставьте в левую часть [[Web IDE]] код ниже:
Вставьте в левую часть [[Web IDE]] код ниже:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var BUZZER = B4;
var BUZZER = B4;


Строка 62: Строка 62:
Теперь давайте привяжем контакты, которых будем касаться, к нотам, которые будем проигрывать.
Теперь давайте привяжем контакты, которых будем касаться, к нотам, которые будем проигрывать.


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var notes = {
var notes = {
   B15 : 'a',
   B15 : 'a',
Строка 76: Строка 76:
Теперь давайте напишем код, который будет проверять изменение состояния всех контактов и проигрывать ноту:
Теперь давайте напишем код, который будет проверять изменение состояния всех контактов и проигрывать ноту:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
// Подаём напряжение на контакт A8
// Подаём напряжение на контакт A8
// (к которому подключен провод-перемычка):
// (к которому подключен провод-перемычка):
Строка 105: Строка 105:
Код ниже загружает звук ''«дзинь»'', а затем проигрывает его:
Код ниже загружает звук ''«дзинь»'', а затем проигрывает его:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var s = atob("f4GBgoODh5GtnmgkE1m435g/MobgzYJbd41YHkHD/7UoEZPysyscl/K5PSqLy5tLToqdfHGdrXI1V7vUeiVIqceEUG2kmWVfj6qIWFuKpZFpXXiXknNthZB9cH6LgG5vgJKSdWF7oZVoXHuRioJ8c3iJjHtweomLf3JygpCHdHOCiYJ8fYCBg4ODgn53d4CGiIZ8cHGAjo1+dn6Jh3pzeoWHfXd8hYd8d3+Gg3t1e4F9d36KiHp0fYZ+cneLlol3cnyEgXt8g4WBeXV8hoqDdnOCjoNxc4aRhnd3f4J6cXmNlIJxd4mKeXJ5iI2Denh9fX1/f4B/g4N2bnuSlYJzdoOIgXp7g4V+dnmDhoF9gIF+eHqDioJyb3+Oi3xzeIOHgXp7gIB+fH+DgHt8hIh/cnOEjoVzb32Mi3pxeYeLf3N2hIqBdXaBhoB7fYSGfXZ7hYeAeXl9goJ9e36BgYGCgoF8e4GDgHp6f4ODgHo=");
var s = atob("f4GBgoODh5GtnmgkE1m435g/MobgzYJbd41YHkHD/7UoEZPysyscl/K5PSqLy5tLToqdfHGdrXI1V7vUeiVIqceEUG2kmWVfj6qIWFuKpZFpXXiXknNthZB9cH6LgG5vgJKSdWF7oZVoXHuRioJ8c3iJjHtweomLf3JygpCHdHOCiYJ8fYCBg4ODgn53d4CGiIZ8cHGAjo1+dn6Jh3pzeoWHfXd8hYd8d3+Gg3t1e4F9d36KiHp0fYZ+cneLlol3cnyEgXt8g4WBeXV8hoqDdnOCjoNxc4aRhnd3f4J6cXmNlIJxd4mKeXJ5iI2Denh9fX1/f4B/g4N2bnuSlYJzdoOIgXp7g4V+dnmDhoF9gIF+eHqDioJyb3+Oi3xzeIOHgXp7gIB+fH+DgHt8hIh/cnOEjoVzb32Mi3pxeYeLf3N2hIqBdXaBhoB7fYSGfXZ7hYeAeXl9goJ9e36BgYGCgoF8e4GDgHp6f4ODgHo=");
var w = new Waveform(s.length);
var w = new Waveform(s.length);
Строка 120: Строка 120:
Теперь давайте отредактируем функцию '''freq()''', чтобы она проигрывала волнообразные сигналы:
Теперь давайте отредактируем функцию '''freq()''', чтобы она проигрывала волнообразные сигналы:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
function freq(f) {  
function freq(f) {  
   if (f!==0) {
   if (f!==0) {
Строка 133: Строка 133:
Если вам нужен весь код целиком, чтобы его можно было сразу вставить в правую часть [[Web IDE]], то вот он:
Если вам нужен весь код целиком, чтобы его можно было сразу вставить в правую часть [[Web IDE]], то вот он:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var BUZZER = B4;
var BUZZER = B4;



Текущая версия от 06:53, 24 мая 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Пианино с помощью Espruino Pico[1]

В этом руководстве мы создадим очень простое стилофонное пианино при помощи Espruino Pico.

В результате, касаясь проводом-перемычкой верхнего ряда контактов Pico, мы сможем проигрывать разные ноты.

Нам понадобятся

Подсоединение

  • Подключите Espruino Pico к макетной плате так, чтобы её USB-коннектор смотрел влево, и как можно выше (чтобы ниже можно было подключить динамик).
  • Подключите динамик к макетной плате под Espruino как можно левее (в итоге он подключится к контактам GND и B4).
  • Подключите резистор на 10 кОм между самым правым нижним контактом Pico (A8) и следующим контактом макетной платы справа.
  • Подключите один конец провода-перемычки к контакту макетной платы, который находится в том же столбце, что и контакт, к которому мы подключили вторую ножку резистора в шаге выше. Другой конец оставьте свободным, т.к. с его помощью мы будем проигрывать ноты.

Код

Сначала давайте скопируем код из руководства «Создание звуков и музыки», который проигрывает ноты, но поменяв название контакта, к которому подключен динамик, чтобы он соответствовал нашему контакту (B4).

Вставьте в левую часть Web IDE код ниже:

var BUZZER = B4;

function freq(f) { 
  if (f===0) digitalWrite(BUZZER,0);
  else analogWrite(BUZZER, 0.5, { freq: f } );
}

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
};

Вы можете воспроизвести ноту, напечатав freq(pitches.a), и остановить её проигрывание, напечатав freq(0).

Теперь давайте привяжем контакты, которых будем касаться, к нотам, которые будем проигрывать.

var notes = {
  B15 : 'a',
  B14 : 'b',
  B13 : 'c',
  B10 : 'd',
  B1  : 'e',
  A7  : 'f',
  A6  : 'g',
  A5  : 'A'};

Теперь давайте напишем код, который будет проверять изменение состояния всех контактов и проигрывать ноту:

// Подаём напряжение на контакт A8
// (к которому подключен провод-перемычка):
digitalWrite(A8, 1); 
function setupPin(pin) {
 // Включаем внутренний стягивающий резистор:
  pinMode(pin, "input_pulldown");
  // Если/когда состояние контакта изменится...
  setWatch(function(e) {
    // В зависимости от того, касается ли провод-перемычка
    // контакта или нет, проигрываем ноту
    // или останавливаем её проигрывание:
    if (e.state)
      freq(pitches[notes[pin]]);
    else
      freq(0);
  }, pin, { repeat: true, debounce:10 });
}

// Настраиваем каждый контакт...
for (var pin in notes) setupPin(pin);

Готово – у нас работающее пианино! Возьмите свободный конец провода-перемычки и проведите им по верхнему ряду контактов Espruino Pico. Каждый контакт будет генерировать свою собственную ноту. Самый левый контакт – это контакт Bat, это не входной контакт, так что он никакого звука генерировать не будет.

Кроме того, Espruino умеет генерировать волнообразные сигналы, так что мы можем издавать не просто писки. Например, мы можем воспроизвести звуковой эффект типа «дзинь». Я нашёл его на Audacity, экспортировал в виде 8-битного файла, а затем преобразовал в base64-строку при помощи конвертера на этой странице.

Код ниже загружает звук «дзинь», а затем проигрывает его:

var s = atob("f4GBgoODh5GtnmgkE1m435g/MobgzYJbd41YHkHD/7UoEZPysyscl/K5PSqLy5tLToqdfHGdrXI1V7vUeiVIqceEUG2kmWVfj6qIWFuKpZFpXXiXknNthZB9cH6LgG5vgJKSdWF7oZVoXHuRioJ8c3iJjHtweomLf3JygpCHdHOCiYJ8fYCBg4ODgn53d4CGiIZ8cHGAjo1+dn6Jh3pzeoWHfXd8hYd8d3+Gg3t1e4F9d36KiHp0fYZ+cneLlol3cnyEgXt8g4WBeXV8hoqDdnOCjoNxc4aRhnd3f4J6cXmNlIJxd4mKeXJ5iI2Denh9fX1/f4B/g4N2bnuSlYJzdoOIgXp7g4V+dnmDhoF9gIF+eHqDioJyb3+Oi3xzeIOHgXp7gIB+fH+DgHt8hIh/cnOEjoVzb32Mi3pxeYeLf3N2hIqBdXaBhoB7fYSGfXZ7hYeAeXl9goJ9e36BgYGCgoF8e4GDgHp6f4ODgHo=");
var w = new Waveform(s.length);
w.buffer.set(s);

analogWrite(BUZZER, 0.5, {freq:20000}); 
w.startOutput(BUZZER,4000);

То есть мы будем генерировать квадратную волну с частотой 20 КГц (которая вам, скорее всего, слышна не будет) и со временем менять коэффициент её заполнения, чтобы сгенерировать волнообразный сигнал.

Сгенерированный звук, впрочем, будет гораздо тише писка.

Теперь давайте отредактируем функцию freq(), чтобы она проигрывала волнообразные сигналы:

function freq(f) { 
  if (f!==0) {
    if (w.running) w.stop();
    w.startOutput(BUZZER, 4000*f/400);
  }
}

И теперь наше пианино будет проигрывать загруженный звук.

Если вам нужен весь код целиком, чтобы его можно было сразу вставить в правую часть Web IDE, то вот он:

var BUZZER = B4;

function freq(f) { 
  if (f!==0) {
    if (w.running) w.stop();
    w.startOutput(BUZZER, 10*f);
  }
}

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
};

var notes = {
  B15 : 'a',
  B14 : 'b',
  B13 : 'c',
  B10 : 'd',
  B1  : 'e',
  A7  : 'f',
  A6  : 'g',
  A5  : 'A'};

// Подаём напряжение на контакт A8
// (к которому подключен провод-перемычка):
digitalWrite(A8, 1); 

// В этой функции мы задаём каждый контакт, который хотим прослушать:
function setupPin(pin) {
 // Включаем внутренний стягивающий резистор:
  pinMode(pin, "input_pulldown");
  // Если/когда контакт изменит своё состояние... 
  setWatch(function(e) {
    // В зависимости от того, касается ли провод-перемычка
    // контакта или нет, проигрываем ноту
    // или останавливаем её проигрывание:
    if (e.state)
      freq(pitches[notes[pin]]);
    else
      freq(0);
  }, pin, { repeat: true, debounce:10 });
}
// Настраиваем каждый контакт...
for (var pin in notes) setupPin(pin);

var s = atob("f4GBgoODh5GtnmgkE1m435g/MobgzYJbd41YHkHD/7UoEZPysyscl/K5PSqLy5tLToqdfHGdrXI1V7vUeiVIqceEUG2kmWVfj6qIWFuKpZFpXXiXknNthZB9cH6LgG5vgJKSdWF7oZVoXHuRioJ8c3iJjHtweomLf3JygpCHdHOCiYJ8fYCBg4ODgn53d4CGiIZ8cHGAjo1+dn6Jh3pzeoWHfXd8hYd8d3+Gg3t1e4F9d36KiHp0fYZ+cneLlol3cnyEgXt8g4WBeXV8hoqDdnOCjoNxc4aRhnd3f4J6cXmNlIJxd4mKeXJ5iI2Denh9fX1/f4B/g4N2bnuSlYJzdoOIgXp7g4V+dnmDhoF9gIF+eHqDioJyb3+Oi3xzeIOHgXp7gIB+fH+DgHt8hIh/cnOEjoVzb32Mi3pxeYeLf3N2hIqBdXaBhoB7fYSGfXZ7hYeAeXl9goJ9e36BgYGCgoF8e4GDgHp6f4ODgHo=");
var w = new Waveform(s.length);
w.buffer.set(s);

analogWrite(BUZZER, 0.5, {freq:20000});
w.startOutput(BUZZER,4000);

См.также

Внешние ссылки