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

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

  1. mcureenab

    mcureenab Гуру

    On/Off не проблема сделать. Пик поймать надо. Выпрямитель и сглаживающий фильтр из острого пика делает плато. Так надёжнее в момент замера получить значение близкое к максимальному.

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

    mcureenab Гуру

    Со сглаживающим фильтром после удара можно не ждать когда сигнал уверенно пойдет на спад. Можно просто прекратить измерения через несколько мс после появления сигнала. Так мы получим стабильное время отклика на удар.
     
  3. Dan

    Dan Гик

    Я еще подумал, что может для определения пика ввести доп переменную, к примеру, t. И когда пик получен, то t равна 1. Если удар с датчика превышает порог срабатывания и t=1, то нота отыгрывает, если нет, то, соответственно не проигрывает. Так не получится?
     
  4. mcureenab

    mcureenab Гуру

    Так можно сделать, если от этого код станет более понятным.

    Боюсь, со всеми тонкостями код слишком сложным для понимания и обсуждения станет.

    В пору варианты использования расписать. И конечный автомат спроектировать.

    Есть смысл разместить проект на GitHub, чтобы обсуждаемая версия прошивки под рукой была.
     
  5. Dan

    Dan Гик

    Я просто сомневаюсь, что все, кто самостоятельно делали барабаны, делали дополнительно еще какие то сложные схемы
     
  6. Dan

    Dan Гик

    Вот я накидал как я себе представляю. Пока не пробовал, чисто прикинул теоретически
    Код (C++):
    void loop() {


        kick_val = analogRead(kick_pin); // считываем сигнал с A0
        if(kick_val > threshold)    // если этот сигнал выше порога срабатывания,
            pick = kick_val;    // то определяем его как пик
            t = t++;        // и начинаем считать пики
            if(pick > analogRead(kick_pin) && pick > threshold && t = 1) // если пик > сигнала с A0 и пик > порога срабатывания и получен первый пик
                {
                    velocity = pick;                // скорость срабатывания = величина пика
                    MIDI.sentNoteOn(kick_drum, velocity, 1);    // отыгрываем ноту
                    t = t--;                    // возвращемся к начальному пиковому значению
                    time_off = pick--;                // уменьшаем время сигнала с А0
                }
            else                                // В ПРОТИВНОМ СЛУЧАЕ
                {
                    kick_val = 0;                    // сигнал с А0 = 0
                    velocity = 0;                    // величина удара = 0
                    MIDI.sentNoteOff(kick_drum, velocity, 1);    // глушим ноту
                    t = 0;                        // пиков нет
                    time_off = 0;                    // время сигнала с А0 = 0
                }
            if(pick > analogRead(kick_pin) && pick > threshold && t = 2)    // если пик > сигнала с A0 и пик > порога срабатывания и получили второй пик
                {
                    kick_val = 0;                    // сигнал с А0 = 0
                    velocity = 0;                    // величина удара = 0
                    MIDI.sentNoteOff(kick_drum, velocity, 1);    // глушим ноту
                    t = 0;                        // пиков нет
                    time_off = 0;                    // время сигнала с А0 = 0
                }
    }
     
  7. sslobodyan

    sslobodyan Гик

    Этот код не будет работать. Можете проверять.
     
  8. mcureenab

    mcureenab Гуру

    Вопрос в том, насколько быстро, точно и стабильно работают их изделия.
    Вы ведь не сняли осциллограмму с датчика с помощью ардуины. Приходится гадать.

    Вот простой расчет. На частоте 4кГц длительность полупериода равна 125мкс. функция analogRead выполняется 100мкс. Если первый семпл получен в начале импульса, второй в лучшем случае снимет напряжение ближе к завершению импульса. Это sin(pi/125*100) = 0.59. Те получится менее 60% от максимального уровня сигнала. А если к сигналу помешаны гармоники, то погрешность будет еще больше. Из-за квантования времени сэмплы могут попадать на пик импульса, так что одинаковые удары могут давать 40% разброс.
    Так что некоторая обвязка датчику нужна.
     
  9. sslobodyan

    sslobodyan Гик

    По поводу пика. Мой код ловит пик. Я специально показал вам отладочную версию, чтобы было понятно как оно работает. В других самодельных установках я не видел сложных входных цепей, но вы можете самостоятельно поставить любые фильтры - код будет работать. Без фильтров проблема в том, что нужен периодический опрос с очень коротким интервалом - около 0.01мс и меньше. И отслеживать не один порт, ведь датчиков больше десятка будет. Если после перехода порога акцентировано ждать пик этого датчика, то пропустим пики на других датчиках. Впрочем, тут каждый сам себе мастер. Но я уже не теоретик и четко знаю на сколько разный сигнал можно получить в зависимости от того куда и как ударить.
     
  10. sslobodyan

    sslobodyan Гик

    Считывать аналоговый сигнал можно гораздо быстрее 100мкс. И кмк для ударных разброс в 10-20% на слух практически не заметно. Городить фильтры на каждый датчик надо после попыток отладки готового пэда.
     
  11. Dan

    Dan Гик

    Самодельный пэд есть, осталось еще датчик нормальный найти. Но датчик ведь должен и без пэда нормально работать, разве нет? Если я сильно стучу пальцем по нему, а сигнал то слабый, то сильный, то приклею я его к пэду с тыльной стороны и картина вряд ли будет лучше, если вообще не хуже
     
  12. mcureenab

    mcureenab Гуру

    Можно, но функция analogRead делает это 100мкс. С низким разрешением АЦП теоретически можно до 13мкс ужаться. Не уверен что пара деталей в цепи датчика стоит усилий по низкоуровневому программированию АЦП.
    С пэдом ситуация может еще измениться. На колебания датчика наложаться колебания пэда. И все по новому кругу пойдет.
     
  13. mcureenab

    mcureenab Гуру

    Если на замер будет 15мкс уходить, получим 6% коридор. Но не больше 4х датчиков удасться обслуживать при 4кГц колебаниях.
     
  14. sslobodyan

    sslobodyan Гик

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

    mcureenab Гуру

    Для хранения сигнала пока скетч опрашивает разные датчики как уже говорили можно использовать пиковый детектор со сбросом. В общем что на схеме и видим http://forum.amperka.ru/attachments/06-27-25-midi_16drums_ct-gif.7377/. Тут в принципе можно 6 датчиков обслужить.

    Тут http://stu.alnam.ru/book_ane-71 левая схема с ключом SW1 на "Рис. 11.13. Пиковый детектор со сбросом" более динамичная должна быть. Конденсатор можно меньшей ёмкости взять - не 100нФ, а 10нФ. С ней нельзя ловить спад. Но можно после первого превышения порога подождать несколько мс, потом считать заведомо максимальное значение и сбросить его.
    С Ардуиной эту схему нужно изменить, поскольку ключ находится внутри МК, а резистора 47 Ом за ним нет. Из схемы убираем ключ SW1, а резистор 47 Ом ставим последовательно между конденсатором и Uвых. Uвых. подключаем к A0 Ардуино.

    Управление ключом:
    Код (C++):
    void setup() {
    ...
      pinMode(kick_pin, INPUT); // Можно не писать, оно и так INPUT
      digitalWrite(kick_pin, LOW); // OUTPUT состояние LOW хранится в регистре независимо от Mode.
    ...
    }

    void loop(){
    ...
            pinMode(kick_pin, OUTPUT); // Сброс детектора и датчика
    ... // Через время ~ 50 мс (определяется механическими колебаниями датчика)
            pinMode(kick_pin, INPUT); // Восстановление работы детектора
    ...
    }
     
    Для защиты от перегрузки высоким напряжением (20 Вольт) резистор 47 Ом заменим на 15 кОм. (http://www.scienceprog.com/using-current-limiting-resistors-on-avr-io-pins/). Что с конденсатором 10нФ даст нам постоянную времени 0.00015 сек. И 1 мс чтобы сбросить более 99% напряжения с конденсатора. На измерения этот резистор практически не повлияет.

    Первое превышение порога можно определять с низким разрешением АЦП, чтобы не тратить зря время, а пиковое значение забирать уже с высоким разрешением - долго, но точно. В прочем за 1 мс функцией analogRead можно спокойно опросить 10 датчиков.
     
    Последнее редактирование: 16 янв 2017
  16. mcureenab

    mcureenab Гуру

    Клей теперь служит диэлектриком, а пластина с проводом обкладкой конденсатора, который включен последовательно с пьезоэлементом. Через конденсатор переменный ток проходит, но видно емкости этого спонтанного конденсатора не хватает для полноценной раскачки остальной цепи. Вместо синуса короткие импульсы идут.
     
    sslobodyan нравится это.
  17. sslobodyan

    sslobodyan Гик

    Мне кажется, что конденсатор там нужен еще меньше - порядка 5 нан. На входе АЦП стоит холд-конденсатор в 15 пик. Как раз хватит емкости чтобы зарядить холд и сильно не разрядиться. А если брать порядка 100 нан как на схеме, то датчик не успевает его зарядить. И впараллель с ним резистор на 1 мегаом сам разрядит кондер. Только диод обязательно Шоттки. Вот в аттаче пример как оно будет откликаться.

    Игры с изменением разрешения не нужны. Надо сразу переходить на 8-битное преобразование с делителем 16 (1 Мгц частота преобразований). Я думаю, что отличить даже 32 громкости удара барабана очень трудно, так что 8 бит за глаза. А так, пускай с учетом переключений каналов, получим около 300Ксемплов\сек, что для 32 каналов будет 10Ксемплов\сек на канал или 0.1мс. Считается, что задержка мене 5мс на слух не ощущается, так что должны уложиться и в два-три опроса, и в передачу ноты по МИДИ.
     

    Вложения:

    • kick.png
      kick.png
      Размер файла:
      10,7 КБ
      Просмотров:
      733
  18. mcureenab

    mcureenab Гуру

    Судя по даташиту 300кSPS весьма "оптимистичная" оценка.
    32 канала на Arduino UNO нет физически. И в общем нет нужды столько семплов на канал бомбить. Один семпл фиксирует превышение порога на канале (10.0+m). Второй семпл делаем с такой задержкой, чтобы он попал на плато осциллограммы (например через 1мс - 11.0m)
    [​IMG]
     
  19. sslobodyan

    sslobodyan Гик

    Осмелюсь поспорить - там написано что при максимальном разрешении. Я же говорю о 8 битах, это намного быстрее.

    Естественно нету, так мы же должны мультиплексоры использовать. И с вашим алгоритмом я не согласен. Здесь на картинке не реальный сигнал, а смоделированный чисто для просмотра как работает пик-детектор. Реальный сигнал будет куда прикольнее и вот там таки надо будет попробовать что лучше - замер через нужный интервал либо после уравнивания напряжения либо начала его спада. Очень даже возможно, что вы правы и надо это делать через интервал, но рассудит только практика.
    Вот еще продолжал анализировать в протеусе. Резистор в 1М можно совсем убрать - я на схеме заменил его на 10М. А разряжать конденсатор переключением входа на выход. Надо всего то 250наносекунд, то есть 4 такта процессора. Я думаю, что такой задержкой можно пренебречь . Диод D2 это условный для имитации работы порта на вход-выход, резистор R2 нужен дабы не сжечь порт током разряда кондера. Емкость конденсатора тоже уменьшил на порядок. Итого в рабочей схеме останутся D1, C1 и R2. kick.png
     
  20. Dan

    Dan Гик

    Мультиплексоры... а не далековато ли заходим, господа?)я думаю мега что то в силах сделать и без них