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

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

  1. sslobodyan

    sslobodyan Гик

    velocity = (uint32_t) (kick_val * 127) / 10
    Получаем Х*127/10 = 113, что дает Х=113*10/127=8
     
  2. Dan

    Dan Гик

    Ну выходит так, по-другому я не сделаю
     
  3. Dan

    Dan Гик

    Все, понял, забрал слова обратно)
     
  4. sslobodyan

    sslobodyan Гик

    Как так? А подать сигнал на вход звуковой карты и записать как сэмпл?
     
  5. Dan

    Dan Гик

    Ну в принципе можно попробовать, у меня внешняя звуковуха, там тоже внутри может схема быть какая нить мудренее чем в обычных встроенных. Но попытка не пытка, надо будет пробовать этот вариант
     
  6. sslobodyan

    sslobodyan Гик

    Пробовали с порогом 4 и гистерезисом 1 или 2 ?
     
  7. Dan

    Dan Гик

    Пробовал перед тем как Вы мне это посоветовали с порогом 5 и гистерезисом 1. Ноты уже лучше воспроизводятся, но все равно иногда повторяются наподобие как с гистерезисом 0
    Гистерезис 2 был изначально, с ним нужно лупить по датчику, чтобы он хотя бы немного зазвучал
     
  8. sslobodyan

    sslobodyan Гик

    Значит нужен 2
     
  9. sslobodyan

    sslobodyan Гик

    Реально сигнал с ваших датчиков препаскудный. Для полной шкалы в 1023 работать в зоне 8 это почти на уровне шумов и наводок. А резисторы у вас точно 1 мегаом?
     
  10. Dan

    Dan Гик

    Да 2 резистора по 1 мегаому каждый
     
  11. sslobodyan

    sslobodyan Гик

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

    Dan Гик

    Хорошо, спасибо
     
  13. sslobodyan

    sslobodyan Гик

    Чуть погуглил. Вот то, что вам надо http://radiokot.ru/circuit/digital/game/13/ Там показаны усилители пьезиков, наверное не зря.
    Но самое простое, о чем мы все забыли, это референсное напряжение. Блин, мы же меряем относительно 5 вольт! Срочно переходим на 1.1 вольта вот так analogReference(INTERNAL1V1) . И теперь вместо 8 получим около 40, что в разы лучше. Жду результат эксперимента :)
     
    Последнее редактирование: 15 янв 2017
  14. mcureenab

    mcureenab Гуру

    Сам по себе пьезоэлемент выдает напряжение в несколько вольт. Этого достаточно для измерений на Ардуине. При желании её наверное можно даже угробить.
    Но возможность регулировать чувствительность датчика может быть полезной.
    Я не нашел точных данных по емкости пьезоэлемента. В статье http://avrora-binib.ru/stati/pezokeramicheskie_izluchateli_zvuka_zvonki_opoveshchateli/ называют десятки нанофарад. А на схеме фильтр имеет емкость 100нФ. Выходит что для раскачки фильтра нужно очень много времени - десятки периодов колебания датчика. Они затухнут не успев раскачать конденсатор.
    Для начала стоит все же вместо диода сделать истоковый повторитель. Он обеспечит фильтр достаточным током.
     
    sslobodyan нравится это.
  15. sslobodyan

    sslobodyan Гик

    Порылся у себя в хламе и откопал пьезики диаметром 35мм. Чувствительность чумовая. Легкий щелчек ногтем дает на осциллографе до 10 вольт импульс с частотой около 3 килогерц. Без других элементов - только пьез. Почему у ТС такие низкие значения - не пойму.
    И еще идея. Кажется мне, что конденсатор нужен в разы меньшей емкости. Реально схема должна работать как пиковый детектор, значит емкость накопительного (а не фильтрующего) конденсатора должна быть очень маленькой. В таком случае максимум сигнала определяется когда следующее измерение дает то же или меньшее значение. В этот момент определяем громкость и сбрасываем детектор, переводя ножку на выход с низким значением. При этом разряжаем конденсатор пик-детектора и через диод подкорачиваем пьез, заставляя его быстрее остановиться.
     
    mcureenab нравится это.
  16. mcureenab

    mcureenab Гуру

    Может диод неправильно подключен.

    В АЦП есть S/H конденсатор на 15pF. Только не понятно, когда он разряжается. В даташите написано, что для первого замера нужно больше времени чем для последующих для того чтобы зарядить конденсатор до измеряемого напряжения. Что считается первым замером не понятно.

    В принципе, можно просто убрать второй резистор и конденсатор. Диод проводит меаленький ток и в обратном направлении. Если напряжение через диод будет стекать слишком долго, то тогда можно добавить или принудительный сброс в скетч или схему доработать.
     
  17. Dan

    Dan Гик

    Есть у меня еще одно предположение почему такой сигнал. Датчик паял давно. Один провод непосредственно к датчику, а второй - к тонкой пластине, которую приклеил к поверхности датчика. Может из за этого что то неясное и происходит, не знаю.
     

    Вложения:

  18. sslobodyan

    sslobodyan Гик

    Да, пайка не очень. Там ведь пластинка тонюсенькая, не сильно любит перегрев. А что значит приклеил? Сопротивление после этого замеряли?

    Вот вам новый код. Добавил приглушение датчика после сработки и задержку опроса на время затухания. Если и это не заработает, придется увольняться :)

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

    MIDI_CREATE_DEFAULT_INSTANCE();

    uint16_t kick_sample_time=3500; // время звучания семпла
    uint16_t kick_treshold=6; // пороговый уровень датчика
    uint16_t kick_gist=2; // гистерезис датчика (неопределенная зона)
    uint16_t kick_mute_time=2000; // время ожидания успокоения датчика в микросекундах

    uint32_t kick_note_off=0; // счетчик времени звучания семпла
    uint32_t kick_mute=0; // счетчик времени успокоения датчика в микросекундах
    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 setup() {
        MIDI.begin();
        Serial.begin(115200);
        pinMode(kick_pin, INPUT);
    }

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

        if (kick_mute > 0) { // здесь проверяем время затухания датчика
            if (mikros() > kick_mute) { // уже должны затухнуть
                pinMode(kick_pin, INPUT);
                kick_mute = 0;
            }
        }
        else {
            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) / 10; // 50 подобрать
                      MIDI.sendNoteOn(kick_note_number, velocity, 1); // играем ноту
                      kick_note_off = millis() + kick_sample_time; // ставим таймер на время звучания семпла
                      kick_can_sound = false; // запрещаем следующие sendNoteOn до нового подъема и спада
                      kick_mute = micros() + kick_mute_time; // время ожидания успокоения сенсора
                      pinMode(kick_pin, OUTPUT);
                      digitalWrite(kick_pin, LOW); // придавливаем датчик чтобы быстрее успокоился
                    }
                    kick_val = tmp; // запоминаем для поиска следующего возможного подъема
                }
                else { // сигнал сенсора растет
                    kick_val = tmp; // запоминаем текущее значение для сравнения со следующим
                    kick_can_sound = true; // разрешаем играть ноту как только пойдет спад
                }
            }
            else if (tmp < (kick_treshold - kick_gist)) { // уровень ниже порога-гистерезис
                kick_val=0; // готовы к следующему удару
                kick_mute = 0;
            }
        }
    }
     
     
    Последнее редактирование: 15 янв 2017
  19. Dan

    Dan Гик

    нее, какое там сопротивление) я тогда его паял для гитары. Пластину клеем приклеил, моментом вроде)) К гитаре потом на двусторонний скотч и в музыкальный центр. Звук от гитары был, но тихий. А сейчас просто нашел этот датчик и решил попробовать. У нас в городе не продаются особо эти датчики, я не знаю как их по другому припаяешь, там ведь одна поверхность не для пайки. Только если в Китае заказывать
     
  20. sslobodyan

    sslobodyan Гик

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