Самодельные электронные ударные

Тема в разделе "Arduino & Shields", создана пользователем Dan, 24 дек 2016.

  1. Dan

    Dan Гик

    Спасибо большое, буду дальше разбираться
     
  2. Onkel

    Onkel Гуру

    у меня ЗП-5 есть, вот что я получил на осциллографе (R=10^6 Ohm), напряжение в В, время в мс. Так что с ZP5_two_graphs.gif
    диодом Шоттки можно получить в режиме 8 бит десяток точек и вытянуть несколько параметров для миди.
     
  3. Dan

    Dan Гик

    А звук при этом какой?ударили по датчику и все как нужно?я постараюсь выслать звук, который у меня получается по простейшему скетчу

    P.S. У меня оборудования нет вообще, поэтому получить более менее адекватные данные смогу только благодаря советам этой ветки
     
  4. Onkel

    Onkel Гуру

    нет звука, просто щелчок ногтем по ЗП-5.
     
  5. Dan

    Dan Гик

    вот я вообщем написал новый скетч, самый простой, на мой взгляд, на нем должна воспроизводится нота бас-бочки. На деле получается каша:

    Код (C++):
    #include <MIDI.h>

    MIDI_CREATE_DEFAULT_INSTANCE();


    int KICK = A0;
    int KICK_VAL = 0;
    int KICK_THRESHOLD = 1000;

    int velocity = 0;

    byte KICK_DRUM = 36;

    void setup() {

    MIDI.begin();
    pinMode(KICK, INPUT);

    }

        void loop()
     
        {
     
        KICK_VAL = analogRead(KICK);
            if(KICK_VAL > KICK_THRESHOLD)
            {
                            delay(10000);
                velocity = KICK_VAL;
                MIDI.sendNoteOn(KICK_DRUM, velocity, 1);
                delay(10000);
            }
            if(KICK_VAL < KICK_THRESHOLD)
            {
                velocity = 0;
                MIDI.sendNoteOff(KICK_DRUM, velocity, 1);
                delay(1000);
            }
     
        }
    Приложенный файл переименуйте в pizeo.mp3. Это, наверное, нарушение правил форума, но по-другому никак не передать пример звука.
     

    Вложения:

    • piezo.ino
      Размер файла:
      365,4 КБ
      Просмотров:
      437
  6. Onkel

    Onkel Гуру

    а это что тут делает?Это же задержка 10 секунд!
    Кстати, а что у вас на пк, что за софт играет по полученным по vcp миди командам?
     
  7. Dan

    Dan Гик

    Такую задержку я специально поставил, чтобы проверить будет ли она вообще, но как оказалось ее нет(
    Использую Fl studio 12, в ней пользуюсь vst-плагином addictive drums, с которого, собственно, и звук
     
  8. mcureenab

    mcureenab Гуру

    Этот delay(10000); для того чтобы у ноты было время звучать. Первый delay вообще не нужен. Но тут реально как то странно звучит. Должна быть пауза 10 сек. + 1 сек после отключения ноты.
    Скетч то загрузился?
    Попробуйте ноту попроще или другую ноту, чтобы убедиться, что играет новый скетч, а не старый.
     
  9. Dan

    Dan Гик

    пробую вот. нашел ОООООЧЕНЬ СТРАШНУЮ ОШИБКУ - была выбрана Ардуино Уно, а у меня Мега.
    Но проблему это не решило, терь звук даж пропал вовсе, но скетч выполняется, задержка есть. Сижу... разбираюсь...
     
  10. mcureenab

    mcureenab Гуру

    Может очень тихо получается? Замени
    velocity = KICK_VAL;
    на
    velocity = 120;
     
  11. Dan

    Dan Гик

    вот я тоже к чему то из той же оперы склоняюсь, только мне кажца это порог срабатывания большой слишком выставлен
     
  12. Dan

    Dan Гик

    вот вообще что пишет мне прога, которая принимает сообщения миди:
     

    Вложения:

    • 2.png
      2.png
      Размер файла:
      37,2 КБ
      Просмотров:
      517
  13. Dan

    Dan Гик

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

    вот последний вариант скетча и пример звука (переименовать в piezo2.mp3):
    Код (C++):
    #include <MIDI.h>

    MIDI_CREATE_DEFAULT_INSTANCE();


    int KICK = A0;
    int KICK_VAL = 0;
    int KICK_THRESHOLD = 300;

    int velocity = 0;

    byte KICK_DRUM = 36;

    void setup() {

    MIDI.begin();
    Serial.begin(115200);
    pinMode(KICK, INPUT);

    }

        void loop()
       
        {
       
        KICK_VAL = analogRead(KICK);
            if(KICK_VAL > KICK_THRESHOLD)
            {
                velocity = KICK_VAL;
                            if(velocity > 127)
                            {
                              velocity = 127;
                MIDI.sendNoteOn(KICK_DRUM, velocity, 1);
    //                        delay(1000);
                            MIDI.sendNoteOff(KICK_DRUM, 0, 1);
                            }
               
            }
    //        if(KICK_VAL < KICK_THRESHOLD)
    //        {
    //            velocity = 0;
    //            MIDI.sendNoteOff(KICK_DRUM, velocity, 1);
    //          
    //        }
       
        }
     

    Вложения:

    • piezo2.ino
      Размер файла:
      287,8 КБ
      Просмотров:
      431
  14. mcureenab

    mcureenab Гуру

    KICK_VAL может достигать 1023 . Нужно нормировать до 127

    velocity = KICK_VAL * 127 / 1023;

    И проверка
    if(velocity >127)
    становится ненужной.
     
  15. Dan

    Dan Гик

    на сегодня, я думаю, достаточно
    Это на всех выводах А0, А1, ... до 1023?
     
  16. mcureenab

    mcureenab Гуру

    Да.
    https://www.arduino.cc/en/Reference/AnalogRead
    Один из входов Ax на время замера подключаются к одному АЦП. Один АЦП обслуживает несколько входов. В каждый момент времени к АЦП может быть подключен только один вход Ax.
    Так что входов Ax может быть много, а АЦП только один или (если не ошибаюсь) на Меге их два.
     
  17. Dan

    Dan Гик

    Понятно, спасибо. Кстати Serial.begin() все-таки нужна оказалась
     
  18. Dan

    Dan Гик

    всем привет.
    mcureenab, спасибо, воспользовался Вашей формулой для датчика, еще немного поколдовал со скетчем. теперь звук не зашкаливает, но осталась самая важная проблема - датчик вместо одного звука воспроизводит серию
    аудиофайл прилагается.
    я, думаю, что здесь уже нужно разбираться со временем звучания ноты. либо порогом срабатывания ноты.
     

    Вложения:

    • piezo3.ino
      Размер файла:
      421 КБ
      Просмотров:
      394
  19. Dan

    Dan Гик

    Всем привет! С Новым годом, ребят)

    Все бьюсь над кодом, вообщем, как я понял, мне осталось исключить дребезг пьезодатчика при ударе.
    Я стучу по нему, допустим, один раз с одной силой, а он мне выдает кучу значений с другой силой. На фото куча значений, всего было 3 удара по датчику, но 3-е значение вообще неадекватное.

    Вот скетч:
    Код (C++):
    #include <MIDI.h>

    MIDI_CREATE_DEFAULT_INSTANCE();


    int KICK = A0;
    int KICK_VAL = 0;
    int KICK_THRESHOLD = 10;

    long previousMillis = 0;

    int velocity = 0;
    int t = 0;
    int t_note = 0;

    byte KICK_DRUM = 38;

    void setup() {

    MIDI.begin();
    Serial.begin(115200);
    pinMode(KICK, INPUT);

    }

        void loop()
     
        {
     
        KICK_VAL = analogRead(KICK);
            if(KICK_VAL > KICK_THRESHOLD)
            {
                        velocity = (KICK_VAL * 127)/1023;
                        t_note = (velocity*(0.6*velocity));
                        if(millis() - previousMillis > 500)
                        {
                          previousMillis = millis();
                       
                            MIDI.sendNoteOn(KICK_DRUM, velocity, 1);
                delay(t_note);
                MIDI.sendNoteOff(KICK_DRUM, 0, 1);
                 
                        }
                      else
                      {
                          MIDI.sendNoteOff(KICK_DRUM, 0, 1);
                          delay(5);
                      }  
            }
    }
    P.S. Последнее значение на фото - это третья цифра "1" и все, что после нее написано (это третий удар по датчику).
     

    Вложения:

    • 3.png
      3.png
      Размер файла:
      30,6 КБ
      Просмотров:
      851
  20. mcureenab

    mcureenab Гуру

    Замер напряжения нужно синхронизировать с ударом. Иначе замер будет происходить в произвольные момент времени, когда напряжение может быть совсем не максимальным.
    В цепь датчика после шунтирующего мегаомного резистора нужно последовательно включить диод шоттки, чтобы на встроенном в АЦП конденсаторе суммировать положительную полуволну. Точнее получить её пиковое значение.

    A0 тоже нужно замкнуть на GND через резистор, чтобы упомянутый выше встроенный в АЦП конденсатор после удара мог разрядиться. От сопротивления этого резистора будет зависеть с одной стороны время хранения пикового напряжения на датчике, с другой стороны время восстановления.

    Делать два замера. Первый проверять на превышение порога KICK_THRESHOLD. Если порог превышен, через паузу делать второй замер и большее значение использовать для расчета ноты.

    После ноты в цикле делать замеры до тех пор, пока напряжение не упадет ниже порога KICK_THRESHOLD*0.8. Коэффициент 0.8 подобрать экспериментально, для стабильной работы.

    Послеэтого возобновляем обычную работу.