Espruino:Примеры/Пианино с помощью Espruino Pico

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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


Пианино с помощью 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);

См.также

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