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

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

  1. mcureenab

    mcureenab Гуру

    Задержка между обработкой ударов. 3мс скетч игнорирует удары.

    4кГц собственная частота колебаний датчика. Резонанс у него на этой частоте. А фильтр по сути никто не проверял. В идеале схема должна давать крутой монотонный рост и монотонный спад совпадающий по времени с затуханием колебаний. Откуда в этом фильтре возникает задержка я не понимаю. Это же не RC фильтр. Если, не считать за сопротивление диод. Диод тут может заваривать фронт. Поэтому желательно использовать диод Шоттки.

    В идеале было бы хорошо ловить сигнал без фильтра, но производительности Ардуино не хватит.
     
  2. mcureenab

    mcureenab Гуру

    Ну вот что то у него не получается эти параметры подобрать. Даже проверка, что датчик успокоился не стабильно работает. Похоже фильтр плохо настроен.

    Промежуточные удары можно ловить если фильтр дает монотонный спад и удар достаточно сильный.
     
    sslobodyan нравится это.
  3. sslobodyan

    sslobodyan Гик

    Да я уже сам с нетерпением жду результатов. А то придется бросать все и искать в ящике оставшиеся датчики :) Когда-то сам горел идеей барабанной установки :)
    Так, специально загрузил Аудасити и посмотрел на форму семпла KICK. Вот кусочек, весь семпл звучит около 1.3 секунды. kick.png Как видим, основной звук звучит около 80мс, потом идет сильно затухающий хвост. Что и требовалось доказать. Значит, ноте_офф должен отсылаться не быстрее чем через 70мс, иначе барабан будет только икать :) Мой алгоритм теперь требует доработки - введение еще одного времени для отсылки ноте_офф. Ща подумаем :)
     
    Последнее редактирование: 13 янв 2017
  4. sslobodyan

    sslobodyan Гик

    Так, тема перестает быть скучной :)
    Не получив проверки предыдущего решения :) даю новую вводную.
    Код (C++):

    uint32_t kick_note_off=0; // счетчик времени звучания семпла
    uint16_t kick_sample_time=1300; // время звучания семпла
    uint16_t kick_treshold=10; // пороговый уровень датчика
    uint16_t kick_gist=2; // гистерезис датчика (неопределенная зона)
    uint16_t kick_val=0; // предыдущее значение датчика
    uint8_t kick_note_number=38; // номер ноты в GeneralMIDI
    bool kick_can_sound=false; // признак, что можно играть ноту (начался подъем на датчике)
    const uint8_t kick_pin=A0;

    int tmp;

    void loop()   {

      if (kick_note_off > 0) { // здесь проверяем время звучания семпла и выключаем ноту
        if (millis() > kick_note_off) { // нота уже должна отзвучать
          kick_note_off=0;
          MIDI.sendNoteOff(kick_note_number, 0, 1);
        }
      }

      tmp = analogRead(kick_pin);
      if (tmp > (kick_treshold + kick_gist)) { // уровень превышает порог+гистерезис
          if (tmp < (kick_val - kick_gist)) { // датчик пошел на спад - пик уже получен
            if ( kick_can_sound ) {
              uint8_t velocity = (uint32_t) (kick_val * 127) / 50; // 50 подобрать
              MIDI.sendNoteOn(kick_note_number, velocity, 1); // играем ноту
              kick_note_off = millis() + kick_sample_time; // ставим таймер на время звучания семпла
              kick_can_sound = false; // запрещаем следующие sendNoteOn до нового подъема и спада
            }
            kick_val = tmp; // запоминаем для поиска следующего возможного подъема
          }
          else { // сигнал сенсора растет
            kick_val = tmp; // запоминаем текущее значение для сравнения со следующим
            kick_can_sound = true; // разрешаем играть ноту как только пойдет спад
          }
      } else if (tmp < (kick_treshold - kick_gist)) { // уровень ниже порога-гистерезис
        kick_val=0; // готовы к следующему удару
      }
    }
    Здесь я ухожу вообще от контроля времени колебаний датчика. Контролируем только подъемы и спады. Находим подъем - готовимся к пику. Как только прошли пик (пошли на спад) - включаем ноту. Выключаем ноту через заданный заранее интервал времени в милисекундах (каждый инструмент играет со своей длительностью).
    Алгоритм легко переделывается под набор датчиков, разрешает быстрые дроби даже если датчик еще выше порога.
    Но это пока все в теории. Ждем ТС с результатами проверки :)
     
  5. Dan

    Dan Гик

    Не получилось у меня, к сожалению, вчера опробовать скетч, а тут такие дебаты пошли)седня постараюсь успеть с экспериментами
     
  6. Dan

    Dan Гик

    вообщем наконец-то сегодня я добрался до эксперимента, попробовал последний написанный скетч и вот что скажу. Уже нету случайного дребезга на датчике, но работает он по-прежнему не так. То понос, то золотуха как говорится...
    Во-первых, я могу ударить два раза быстро по датчику (сымитировать дробь), но будет лишь один удар.
    Во-вторых, когда я делаю сильный удар, то он выдает 10-20 рандомных значений, не всегда зависящих от силы удара.
    А сам сигнал я записал в FL Studio и выглядит примерно так как на картинке.
     

    Вложения:

    • 6.png
      6.png
      Размер файла:
      149,4 КБ
      Просмотров:
      471
  7. Dan

    Dan Гик

  8. mcureenab

    mcureenab Гуру

    Это сигнал от чего? От датчика с шунтирующим резистором?
    Нужно посмотреть сигнал с полной схемы с диодом и сглаживающим фильтром.
    В общем видно, что огибающая у него не монотонная. Видимо палец не идеальный инструмент.

    Вместо 2 можно большее значение подобрать, чтобы игнорировать небольшие локальные спады.

    Код (C++):
    uint16_t kick_gist=2; // гистерезис датчика (неопределенная зона)
     
  9. mcureenab

    mcureenab Гуру

    1. Можно уточнить сколько ударов в минуту или секунду?
    2. Один удар выдает 10-20 срабатываний?
    3. В FL Studio диаграмма около 300 мс длится? Значит в скетче нужно задержку настроить.
     
  10. mcureenab

    mcureenab Гуру

    Заделайте отверстие на датчике. Оно вместе с воздушной камерой отвечает за резонанс.
     
  11. mcureenab

    mcureenab Гуру

    Все по схеме с указанными номиналами? Диод тоже есть?
     
  12. Dan

    Dan Гик

    На фото запись звукового сигнала с датчика.
    Удар пальцем делаю один, а отображается несколько показаний величины удара датчика.
    В FL Studio отображается время сигнала 376 мс, схема сделана в точности такая же как на фото
     
  13. Dan

    Dan Гик

    Датчик вряд ли нуждается в доп отверстии, как мне кажется
     
  14. sslobodyan

    sslobodyan Гик

    А можно фотку как у вас что подключено? Сильно как-то не совпадает запись сигнала с тем, что должно быть на входе атмелки. Должен быть одиночный горб после удара, без 40-килогерцовой пилы. Если килогерцы лезут (как на скриншоте из флстудио), значит не работает рц-цепочка. Желательно еще поставить один резистор около килоома между R2 и С1 на вашей схеме (разорвать верхнее соединение и впаять туда резистор)
     
  15. rkit

    rkit Гуру

    На схеме нету rc-цепочки, если что.
     
  16. sslobodyan

    sslobodyan Гик

    Ну почему нету? Конденсатор на 100 нан есть, а диод имеет активное сопротивление - вот и цепочка. Просто частота среза может быть выше 4 килогерц. Поэтому и предлагаю килоомчик добавить. Получим частоту среза около 1.5 килогерца и наша пила станет красивым горбиком
     
  17. Dan

    Dan Гик

    фотки подключения не грузятся, попробую попозже еще или завтра. ошибку загрузки пишет
     
  18. mcureenab

    mcureenab Гуру

    Это зачем? Он только заввлит фронт. Сглаживающего фильтра должно быть достаточно. Но на графике не видно, чтобы он работал.
    Большие волны на графике это примерно 230Гц. А высокочастотный сигнал не разобрать, сливается все.
     
  19. Dan

    Dan Гик

     

    Вложения:

    • 7.jpg
      7.jpg
      Размер файла:
      2 МБ
      Просмотров:
      435
    • 8.jpg
      8.jpg
      Размер файла:
      1,9 МБ
      Просмотров:
      413
  20. Dan

    Dan Гик

    вот фотки подключения
     

    Вложения:

    • 7.jpg
      7.jpg
      Размер файла:
      2 МБ
      Просмотров:
      372
    • 8.jpg
      8.jpg
      Размер файла:
      1,9 МБ
      Просмотров:
      421