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

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

  1. Dan

    Dan Гик

    хорошо, спасибо. Кстати попробовал еще побольше ЗП-4, который без встроенного генератора, работает лучше: когда отпускаешь резко палец от датчика, он не колеблется и не воспроизводит звуки
     
  2. sslobodyan

    sslobodyan Гик

    Ну и славненько. Ждем отчет о готовой установке :)
     
  3. sslobodyan

    sslobodyan Гик

    Может, поможет :) Сделал многоканальный скетч. Для МЕГИ можете брать все 16 каналов. Осталось сделать запись/чтение конфигурации в ЕПРОМ, экранчик с кнопочками для настройки параметров. Отказался от ноте_офф - и так работает.
    Код (C++):
    /*

      MIDI ударная установка
     
      sslobodyan@ya.ru 2017
     
    */


    #define LED 13

    #define PIEZ_CNT 16 // количество датчиков
    #define DRUM_CHANNEL 9

    #define ANOTHER_MUTE_PIN_
    #define SHOW_

    // пороговый уровень датчика
    int kick_treshold[PIEZ_CNT]={50,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150};

    // время на остановку колебаний
    long kick_mute_time[PIEZ_CNT]={60000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000};

    // ноты на каналах
    byte kick_note[PIEZ_CNT]={35,36,37,38,39,40,40,40,40,40,40,40,40,40,40,40};

    // канал молчит
    bool mute[PIEZ_CNT]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

    // ножка датчика
    const uint8_t kick_pin[PIEZ_CNT]={A0,A1,A2,A3,A4,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1};

    #ifdef ANOTHER_MUTE_PIN
      const uint8_t stop_pin[PIEZ_CNT]={A0,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1,A1};
    #endif

    int kick_val[PIEZ_CNT]; // предыдущее значение датчика
    int velocity;

    uint32_t tm[PIEZ_CNT], tm_led;
    byte cnt=0, piez_idx=0;

    void noteOn(int chan, int note, int velocity) {
        Serial.write( (0x90 | chan) );
        Serial.write(note);
        Serial.write(velocity);
    }

    void noteOff(int chan, int note, int velocity) {
        Serial.write( (0x80 | chan) );
        Serial.write(note);
        Serial.write(velocity);
    }

    void channelVolume(int chan, int velocity) {
        Serial.write( (0xb0 | chan) );
        Serial.write( 0x07 );
        Serial.write(velocity);
    }

    void channelPan(int chan, int pan) {
        Serial.write( (0xb0 | chan) );
        Serial.write( 0x0a );
        Serial.write(pan);
    }

    void channelBank(int chan, int dat) {
        Serial.write( (0xB0 | chan) );
        Serial.write( 0x00 );
        Serial.write( dat );
    }

    void channelInstrum(int chan, int dat) {
        Serial.write( (0xC0 | chan) );
        Serial.write( dat );
    }

    void setup() {
      //Serial.begin(115200); // эмулятор МИДИ на компе
      Serial.begin(31250); // реальный МИДИ
     
      pinMode(LED, OUTPUT);
      digitalWrite(LED, LOW);
      for (byte i=0; i<PIEZ_CNT; i++) {
        digitalWrite(kick_pin[i], LOW);
        pinMode(kick_pin[i], INPUT);
    #ifdef ANOTHER_MUTE_PIN  
        digitalWrite(stop_pin[i], LOW);
        pinMode(stop_pin[i], INPUT);  
    #endif  
      }
     
      channelBank(1, 0);
      channelInstrum(1, DRUM_CHANNEL);
      channelVolume(1, 70);

      // делитель 16 - частота опроса 1МГц разрешение 8 бит
      ADCSRA |= (1 << ADPS2);                     //Биту ADPS2 присваиваем единицу
      ADCSRA &= ~ ((1 << ADPS1) | (1 << ADPS0));  //Битам ADPS1 и ADPS0 присваиваем нули
    }


    void loop(){

        if(piez_idx>0) piez_idx--; else piez_idx=PIEZ_CNT-1; // выбор следующего датчика
     
        int adc = analogRead(kick_pin[piez_idx]);
       
        if (adc > kick_treshold[piez_idx]) {
          if ( tm[piez_idx] == 0 ){
            tm[piez_idx] = micros() + 2000;
            kick_val[piez_idx] = 0;
            digitalWrite(LED, HIGH);
            tm_led = millis()+10;
          }
        }

        if (tm_led > 0) {
          if (millis() > tm_led) {
            tm_led = 0;
            digitalWrite(LED, LOW);
          }
        }
           
        if ( tm[piez_idx] > 0 ) {  
          if ( micros() > tm[piez_idx] ) {
            if ( mute[piez_idx] ) {
              mute[piez_idx] = false;
              velocity = map(kick_val[piez_idx], kick_treshold[piez_idx], 1023, 1, 127);
              if (velocity > 127) velocity = 127;
              noteOn(DRUM_CHANNEL, kick_note[piez_idx], velocity); // играем ноту
              tm[piez_idx] += kick_mute_time[piez_idx];
              #ifdef ANOTHER_MUTE_PIN
                pinMode(stop_pin[piez_idx], OUTPUT); // разряжаем кондер  
              #else
                pinMode(kick_pin[piez_idx], OUTPUT); // разряжаем кондер  
              #endif
              #ifdef SHOW
                cnt++;
                velocity = kick_val[piez_idx];
                Serial.print("IDX="); Serial.print(piez_idx);
                Serial.print(" Vel="); Serial.print(velocity);
                Serial.print(" cnt="); Serial.println(cnt);
              #endif
            }
          }
          if ( kick_val[piez_idx] < adc ) {
            kick_val[piez_idx] = adc; // ищем максимум сигнала от датчика
          }
          if ( micros() >  tm[piez_idx] ) {
            // закончили сканирование одного удара
            tm[piez_idx] = 0;
            mute[piez_idx] = true;
            // отключаем разрядку кондера
            #ifdef ANOTHER_MUTE_PIN
              pinMode(stop_pin[piez_idx], INPUT);
            #else
              pinMode(kick_pin[piez_idx], INPUT);  
            #endif      
          }
        }

    }
     
    pk_vital нравится это.
  4. Dan

    Dan Гик

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

    mcureenab Гуру

    Поработайте над механикой. Пьезоэлемент дает более чем достаточное напряжение для непосредственных измерений.
    Посмотрите в статье как деформируется мембрана в режиме звонка. Нужно приложить силу от пэда так, чтобы получить нечто похожее.
    Мембрану нужно не просто двигать на подвесе, а изгибать.
    Еще бывают датчики со сдвоенной мембраной которые работают в противофазе.
     
  6. Dan

    Dan Гик

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

    mcureenab Гуру

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

    [​IMG]
     
  8. sslobodyan

    sslobodyan Гик

    Еще про двухзоновое подключение.
    Вот рекомендации как подпаять.
    trigger_connection.jpg
    Как видим, на оба пьеза подключены "зеркально". Это для уменьшения влияния одной зоны на другую?

    И еще цитата:
    The use of the schottky diode BAT85 is VERY important, as the circuit doesn't work correctly without it (actually, it will work, but with much less sensitivity).
    То есть диод там обязательно Шоттки (я так и советовал) BAT85, никаких 1N4148, иначе схема будет работать плохо, очень тихо.
     
    Последнее редактирование: 22 янв 2017
    pk_vital нравится это.
  9. Dan

    Dan Гик

    Диод надо будет попробовать, но мне осталось с пэдом разобраться, как лучше крепить датчик, может придется реально листовое железо использовать
     
  10. Onkel

    Onkel Гуру

    Откуда берется NoteOn понятно, а остальные миди команды что инициирует? Так вроде из пьезо сигнала кроме Note On и длительности и взять нечего, что Pan и другие команды генерит?
     
  11. Onkel

    Onkel Гуру

  12. Dan

    Dan Гик

    Посмотрел я схему, тут уже ее кусок выкладывали ранее, но там питание от 8 вольт идет. Я сначала попробую с диодом Шоттки, хотя у меня не BAT85, но тем не менее, а затем уже буду исходя из этого либо задумываться о механической части, либо об усилителе пьезы.
     
  13. sslobodyan

    sslobodyan Гик

    Там вроде по названию должно быть понятно, кто в теме МИДИ :) Двумя словами: назначение интструмента в канал, панорама, громкость канала. В принципе, это все "рюшечки", секвенсор сам может добавить эти команды. Но у меня нет семплера и секвенсора, комп генерит с огромной задержкой, так что применяю микрушку для звуковоспроизведения и сам задаю эти параметры.
     
  14. pk_vital

    pk_vital Нерд

    Салют! пробывал прошивать по разному... в общем лучший скетч у sslobodyan ! Эксперементировали с барабаньщиком напару, ну в общем система такая: пьезо(6) мегаомник(6) паралельно - arduino uno - usb - win7- midi yoki-V2D midi conv - FL11. сочитание пьезо-фоам не дает динамики, тоесть максимальная чувствительность сразу получается... наклеили на пьезу конус, на пробу, из пенополистерола( упакковочный материал) так сразу чувствительность появилась. В общем самая элементарная схема и скетч от тов sslobodyan вполне рабочие. а дальше дело рук))
     
  15. Dan

    Dan Гик

    Сейчас попробовал через диод Шоттки, который советовали, результат порадовал, но пьезу нужно крепить к чему то твердому и тонкому, как говорили выше. Либо к металлической пластине, либо к очень плотной пластмассовой пластине. Прикрепил для экспериментв датчик к дискете, оно конечно прикольно, но по краям когда стучишь, дискета от палки хорошо депфирует и датчик, соответственно, выдает не ту силу удара
     
  16. mcureenab

    mcureenab Гуру

    Не крепить, а приклеить намертво.
     
  17. Dan

    Dan Гик

    ну я приклеил через двусторонний скотч, просто пластина должна быть, как я понял, как бы "одним целым с датчиком" и тогда результат будет ожидаемый
     
  18. mcureenab

    mcureenab Гуру

  19. Onkel

    Onkel Гуру

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

    sslobodyan Гик

    Нет, вы не правы. Панорама и громкость одного определенного канала. Обычно ударные работают все вместе на одном канале, как правило 10 (или от ноля - 9 ). Семплы ударных записывают в стерео так, что они уже виртуально расположены как на акустике, поэтому панорамировать каждый ударный инструмент нет смысла. Хотя теоретически можно каждый датчик повесить на свой канал (которых в МИДИ 16), ну и определить ему громкость, панораму и другие параметры, в зависимости от "звуковоспроизводителя".