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

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

  1. rkit

    rkit Гуру

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

    mcureenab Гуру

    И не надо. Резистор только статику сбрасывает - заряд который может накопится на обкладках пьезоэлемента и подвинуть напряжение нуля.
    Напряжение которое образуется в результате колебаний должно уходить на АЦП.
     
  3. mcureenab

    mcureenab Гуру

    Да. Я думал об этом. Замыкание контура должно сильно ускорить затухание колебаний, если не брать в расчет индуктивность. Но пока вроде проблемы нет. Посмотрим.
     
  4. rkit

    rkit Гуру

    Так напряжение переменное. И только положительная часть его проходит сквозь диод. А отрицательная остается. А значит следующий положительный полупериод почти весь уйдет на погашение оставшегося отрицательного заряда.
    Без диода пьезо деформировался - выделил заряд. Вернулся в исходное состояние - всосал такой же заряд. Продолжил деформацию за точку покоя - выделил отрицательный заряд.
    А с диодом ему всасывать нечего, положительный заряд заперт. А значит копится отрицательный.
     
  5. mcureenab

    mcureenab Гуру

    Понятно. В принципе и хрен с ним, с этим отрицательным зарядом. Быстрее положительные полуволны в 0 уйдут. А заряд потом стечет постепенно.
     
  6. Dan

    Dan Гик

    Попробовал я вчера схемку эту с одним диодом, ниче особо не понял, вроде по стабильнее стало, а вроде и нет. При слабом ударе выдает как нужно одну ноту, при сильном, видимо, из за того, что вибрация датчика не сразу затухает, датчик успевает выдать 3-4 ноты одновременно. Теперь надо как то поймать первую ноту и игнорить остальные воспроизводящиеся при сильном ударе. И кстати как бы сильно я не стучал, громкость ноты все же до максимума очень сильно не достает
     
  7. mcureenab

    mcureenab Гуру

    1. Скетч посмотреть надо.
    2. Это естественно, что датчик использует не весь диапазон от 0 до 5 вольт. Какое максимальное значение возвращает analogRead?
     
    Последнее редактирование: 9 янв 2017
  8. Dan

    Dan Гик

    Скетч позже выложу, написал я его кое-как, чтобы что-то было более менее
     
  9. mcureenab

    mcureenab Гуру

    Чтобы использовать весь диапазон velocity, дели не на 1023 а на меньший коэффициент.
    Код (C++):
    velocity = (KICK_VAL * 127)/1023; // вместо 1023 подбери меньшее число чтобы расширить диапазон velocity
    if(127<velocity) { velocity = 127; } // и ограничь velocity если датчик случайно зашкалит
    Еще нужно определить правильную полярность подключения датчика. Первая полуволна после удара должна выдавать на диод и далее на пин A0 положительное напряжение.
     
  10. rkit

    rkit Гуру

    Это не обязательно. Отрицательная полуволна сдвига не вносит, только положительная
     
  11. mcureenab

    mcureenab Гуру

    Дело еще в том, что вторая полуволна скорее всего будет меньше первой, третья меньше второй и так далее по убывающей до нуля. Нужно поймать самую сильную полуволну.
    И задержка сигнала тоже ни к чему. Там, сям время потеряли и звук ноты начнет заметно отставать от удара.
     
  12. rkit

    rkit Гуру

    Не, это уже мелочи. Разница в 1% и задержка в пару мкс
     
  13. Dan

    Dan Гик

    не успел я скетч выложить, уже новые советы) благодарю)

    вообщем скетч вот такой (уже с учетом последних советов):
    Код (C++):
    #include <MIDI.h>

    MIDI_CREATE_DEFAULT_INSTANCE();


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

    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) / 50;
                        // t_note = (velocity*(0.6*velocity)); пока закомментил
                        if(millis() - previousMillis > 50)
                        {
                          if(velocity > 127)
                          {
                            velocity = 127;
                          }
                            previousMillis = millis();
                       
                            MIDI.sendNoteOn(KICK_DRUM, velocity, 1);
                            delay(10);
                MIDI.sendNoteOff(KICK_DRUM, 0, 1);
                           
                           
                   
                        }
                         
            }
    }
    картина уже практически прояснилась. Теперь на каждый удар пальцем отдельно звучащая нота, но иногда при тихом ударе звучит громкая нота, то есть небольшой дребезг все-таки остался. я вот думаю, а что если мне резистор, скажем, на 100кОм закинуть от "-" пьезодатчика на землю? или это все таки проще диодом на землю решить, как писал выше rkit?

    P.S. Вот картинка моих результатов ударов-щелбанов по датчику:
     

    Вложения:

    • 5.png
      5.png
      Размер файла:
      36,5 КБ
      Просмотров:
      669
  14. sslobodyan

    sslobodyan Гик

    Дам ТС идею. Есть прекрасные модульки на VS1053. Их полно на ебеях и алиэкспрессах где-то баксов за 7-10. Правда, платки надо чуть дорабатывать - не подпаяны нужные ножки (точно уже не помню какие именно - надо смотреть даташит, давно с ним работал). Зато этот чипик принимает на уарт вход полноценный миди-поток (тот, что вы шлете в комп) и выдает на аудиовыход достаточно сносный готовый звук. Поддерживает дженерал миди, т.е. все ваши барабаны и другие перкуссии там есть. Для автономной барабанной установки начального уровня самое то, кмк.
     
  15. Dan

    Dan Гик

    а физический MIDI-разъем нужен? я просто вскользь слыхал об UART'е, не знаком с ними. Там просто этот уарт вход соединяется с нужным ардуиновским a0...a15?
     
  16. sslobodyan

    sslobodyan Гик

    Мне кажется, что у вас немного неправильный алгоритм. Смотрите, вот вы засекли превышение порога, выдали ноте_он, затем ждете 10мс и глушите ноту. У вас реально инструмент не сможет звучать более 10мс, либо невозможно будет выбить быструю дробь если этот интервал увеличить.
    Я бы делал так. Завел массив времени звучания каждого канала(инструмента). Завел массив времени начала удара для каждого канала. А в лупе после считывание АЦП каждого канала принимал бы решение. Если АЦП больше порога и время начала этого канала равно 0, то ноте_он и запоминаем время начала в массив. При следующих итерациях цикла смотрим если для канала прошло время от начала больше чем заданное в первом массиве время звучания инструмента, то посылаем ноте_офф и сбрасываем время начала в 0. Т.е. ваша задача как можно чаще опрашивать каналы АЦП и находить первый импульс от датчика, запоминать его время а потом контролировать, что инструмент "отзвучал" свое время и слать команду заглушить ноту. Обратите внимание, что заданное время звучания каждого инструмента вы выбираете сами, но оно должно быть не меньше чем колеблется датчик, иначе будут ложные повторные ноты.
     
  17. sslobodyan

    sslobodyan Гик

    Не обязательно, у вас будет автономная установка, без компьютера - только нужен усилок с колонками. Естественно, можете продублировать миди-поток на разъем и подключать к нему секвенсор либо комп.
     
  18. Dan

    Dan Гик

    да, наверное это будет правильнее, но это для меня достаточно сложно написать, я попробую, конечно, хотя бы начать, там будет проще
    а задержку 10 мс я сделал специально такую маленькую, так как для дроби реально большая задержка только помешает
     
  19. Dan

    Dan Гик

    аа, понятно, но мне бы хотелось пока что обойтись силами и возможностями ардуино)
     
  20. sslobodyan

    sslobodyan Гик

    Так вам ничего изменять то и не надо будет в вашем скетче. Просто ногу ТХ ардуины завести на ногу RX VS1053 и на выходе для наушников получите нормальный звук. Но моем модуле просто эта нога RX не была распаяна (могу ошибаться, но кажется там еще одну ногу надо было переключить, которая выводила чип в режим потокового миди - надо смотреть даташит)