Мда, карантин и работа на удаленке не приезжая в офис - вещь очень полезная для какого-нибудь гик-крафта.
Валяется у меня дома детский синтезатор. Yamaha PSR-75. Мой мелкий сын время от времени про него вспоминает, и даже издает на нем какие-то звуки (и потихоньку приобщается к музыке).
Но проблема в том, что данный прибор кроме, как для ребенка, больше ничем не интересен. А иногда у меня возникает необходимость понажимать клавиши и загнать какую-то мелодию в миди. Покупать для этого отдельную миди-клавиатуру - ну... можно конечно - но может сначала попробовать сделать "аддон" для уже имеющейся. )
В общем задача встала такая - не убивая существующую функциональность - прикрутить миди с помощью ардуинки к данному девайсу.
Гуглил схему - нашел за деньги на ибее, но на одной из фоток схемы - в общем-то видно то, что нас интересует.
Полная схема:Конечно же я сразу прогуглил - а не имеет ли чип, который использован в данном синтезаторе уже в стоке выхода миди, который просто не развели на плате? Увы - YMW270-F (GEW7) - не имеет ни UART ни миди. (
Так же на схеме видно строение клавиатуры:
Т.е. обычная матрица 6x9 со строками и столбцами. Эх, о динамической клавиатуре можно забыть... Но - запал уже зажжен, и едем дальше.
Чтож - если это обычная матрица 6x9, то нам нужно по сути 15 входов в ардуине. На Arduino Nano у нас 14 цифровых входов-выходов, и 8 аналоговых. Оставим в покое выводы 0, 1 (Rx/Tx) а так же 13 (на нем висит светодиод через резистор, что в общем-то нам не мешает, но мало ли - понадобится вдруг моргать). Соответсвенно у нас остается 11 цифровых и 8 аналоговых входов (которые тоже можно использовать как цифровые, бинарные ноги).
Т.е. для того, чтобы подключить 49 клавиш - нам понадобится только 6 аналоговых и 9 цифровых. Т.е. что-то еще остается на пару доп-крутилок или кнопок. )
Подключать это дело будем к ардуине следующим способом:
да, так выглядят все 49 клавиш.
Для работы мы будем использовать библиотеку Keypad для ардуины.
"общие" провода для каждой секции из 6 кнопок - это будут столбцы (columns) - 9шт, а индивидуальные - это будут строки (rows) - 6шт.
Так же хотелось бы, чтобы клавиша звучала пока будет нажата, и не звучала, если не нажата. Ну и полифонию тоже бы хотелось (одновременное нажатие нескольких клавиш).
В итоге получился такой вот скетч для ардуины нано:
#include <MIDI.h>
#include <Keypad.h>
MIDI_CREATE_DEFAULT_INSTANCE();
const byte ROWS = 6; //four rows
const byte COLS = 9; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'0','25','31','37','43','49','55','61','67'},
{'0','26','32','38','44','50','56','62','68'},
{'0','27','33','39','45','51','57','63','69'},
{'0','28','34','40','46','52','58','64','70'},
{'0','29','35','41','47','53','59','65','71'},
{'24','30','36','42','48','54','60','66','72'},
};
byte rowPins[ROWS] = {A7, A6, A5, A4, A3, A2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {10, 9, 8, 7, 6, 5, 4, 3, 2}; //connect to the column pinouts of the keypad
int lenRowPins = 6;
int lenColPins = 9;
//int LIST_MAX = 10;
Keypad psr75Keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(115200);
for (int i=0; i<lenRowPins; i++)
{
pinMode(rowPins[i], INPUT_PULLUP);
}
for (int i=0; i<lenColPins; i++)
{
pinMode(colPins[i], INPUT_PULLUP);
}
}
void loop() {
if (psr75Keypad.getKeys())
{
for (int i=0; i<LIST_MAX; i++)
{
if ( psr75Keypad.key[i].stateChanged )
{
switch (psr75Keypad.key[i].kstate) {
case PRESSED:
MIDI.sendNoteOn(psr75Keypad.key[i].kchar,127, 1);
break;
case HOLD:
break;
case RELEASED:
MIDI.sendNoteOff(psr75Keypad.key[i].kchar,0, 1);
break;
case IDLE:
break;
}
}
}
}
}
Чтож... Пошел собирать в железе теперь все это.
Дальше будет больше.