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

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

  1. mcureenab

    mcureenab Гуру

    Тут видно что сигнал постепенно затухает от 310 до 226 и далее.
    [​IMG]
    правда строчка выводится примерно каждую мс и 80 мс не поместилось на экране
     
  2. Dan

    Dan Гик

    да, вот такая штука с каждым ударом
     
  3. mcureenab

    mcureenab Гуру

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

    mcureenab Гуру

    Кажется понял. Скетч заточен работать с датчиком без диода. А у вас наверное диод и конденсатор есть в цепи
     
  5. mcureenab

    mcureenab Гуру

    После первой полуволны значение уходит в 0. Запускается таймера релаксации и потом датчик замыкается накоротко на 2 мс.
     
  6. Dan

    Dan Гик

    Есть, не знаю нужен ли он или нет на самом деле
     
  7. mcureenab

    mcureenab Гуру

    Ну с диодом видно, что уровень сигнала падает медленно и скетч уверенно его ловит. Даже несколько датчиков можно обслужить с небольшой погрешностью. Но по этой же причине код срабатывающий когда сигнал выше порога выполняется многократно. Код надо поменять и будет все пучком.
     
  8. mcureenab

    mcureenab Гуру

    Код (C++):

    // VeRsIoN mcureen 2017.01.19 08:28
    #define LED 13

    uint16_t kick_treshold=200; // пороговый уровень датчика
    uint16_t kick_val=0; // предыдущее значение датчика
    const uint8_t kick_pin=A0;

    int tmp;
    void setup() {
      Serial.begin(115200);
      Serial.println("MIDI Drumer TEST");
      pinMode(kick_pin, OUTPUT);
      digitalWrite(kick_pin, LOW);
      pinMode(LED, OUTPUT);
      digitalWrite(LED, LOW);
      pinMode(kick_pin, INPUT);
    }


    uint32_t tm=0, t_null=0;
    byte cnt=0;

    void loop(){
        kick_val = analogRead(kick_pin);
        if (kick_val > kick_treshold) {
          if (tm==0) tm=micros(); // Ловим время удара
          if (t_null==0) { // Запускаем таймер релаксации
            t_null=micros();
          }
          digitalWrite(LED, HIGH);
          Serial.print(kick_val); Serial.print(" "); Serial.println( (micros()-tm) );
        }
        {
          if (t_null>0) {
            if ( (micros()-t_null) > 80000 ) {
              if (tm>0) {
                cnt+=1;
                pinMode(kick_pin, OUTPUT); delay(2); // Сбрасываем заряд конденсатора.
                Serial.print(cnt);Serial.println(" ========"); // В это время конденсатор еще разряжается
                pinMode(kick_pin, INPUT);
              }
              tm=0;
              t_null=0;
            }
          }
          digitalWrite(LED, LOW);
        }
    }
     
  9. mcureenab

    mcureenab Гуру

    Пометил скетч
    // VeRsIoN mcureen 2017.01.19 08:28
    сделаете свою версию, поменяйте в ней метку, чтобы удобнее ссылаться было.

    он все еще будет выдавать много строчек на удар, но не дольше 80 мс. Разберетесь с этим кодом двинем дальше.
     
  10. Dan

    Dan Гик

    Ну примерно понятно, что пока время релаксации больше 80мс, то нота отыгрывает. Но я ставил эту величину и 200мс и 8мс, но результат был примерно одинаковый. Ваш скетч я еще не пробовал, седня вечером прогоню, посмотрю что да как
     
  11. mcureenab

    mcureenab Гуру

    В предыдущем скетче кусок кода отвечающий за релаксацию по сути бесполезен. Он срабатывает только когда напряжение уже само опустилось ниже порога. Потом ждет 80 мс, добивает напряжение до 0 и выводит =======. И в то же время скетч готов принять новый удар (но при ударе таймер не сбросит).

    В скетче // VeRsIoN mcureen 2017.01.19 08:28 таймер релаксации запускается сразу и напряжение он должен сбросить именно через 80 мс после удара.
     
  12. Dan

    Dan Гик

    Понятно, нужно попробовать
     
  13. sslobodyan

    sslobodyan Гик

    Да, стоило мне отлучиться, как вы тут без меня кучу постов наваяли :) Ув. ТС, а то, что написано MIDI Drumer TEST да еще и большими буквами - вас не смутило? Видимо я плохо объясняю. Скетч ТЕСТ написан только для того, что бы выставить уровень порога (трешолд), отсеяв помехи. Еще он показывает длительность колебаний датчика. Смотрим в мониторе в последней строке ПЕРЕД ======== и видим сколько времени в мкс прошло с первого превышения порога. Все, на этом задача тестового скетча закончилась и дальше мучить его бесполезно. Определили порог - прописывайте его в ОСНОВНОМ скетче, который БЕЗ ТЕСТ. Запускайте на готовом пэде и изменением муте_тайм добейтесь пропадания двойных нот (начните с 20 и увеличивайте по 10, но если получите 100 и более - проблемы с датчиком, нужен демпфер). ВСЕ.
    Блин, у меня все прекрасно играет с одним резистором и пьезом без диода и конденсатора, громкость адекватна удару (небольшое несоответствие бывает, но ведь мы не роботы и ударить с одинаковой силой тоже не можем, да и ритм "очеловечивается"). Если хотите получить максимальную точность по силе удара, то надо городить входной фильтр с диодом, конденсатором и резистором. Или еще круче drum_analog.png с регулятором "громкости" датчика. Только я бы в нем уменьшил С31 до 10 нан чтобы отфильтровать сетевую наводку.
    PS Забыл, что у вас есть диод и конденсатор. Если идут двойные ноты, то значит конденсатор не успевает разрядиться после первой ноты. Уменьшайте его раз в 5 и снова пробуйте. Хотя, если будуте использовать мой скетч, то там принудительно во время муте_тайм ножку ставим на вывод 0 для разрядки емкости. Можете попробовать без диода и кондера, только пьез с параллельным резистором - у меня так работает.
     
    Последнее редактирование: 19 янв 2017
  14. Dan

    Dan Гик

    Я думал в отладочном скетче нужно подбирать параметры трешолда и муте_тайм, чтобы там вообще только одна строка была перед ========. Короче эксперименты форева
     
  15. sslobodyan

    sslobodyan Гик

    Вот легенький удар по пьезу со стороны подложки, когда подложка присоединена к земле. Только пьез, даже без резисторов.
    piez.png
    Если подцепиться наоборот, то осциллограмма будет зеркальной и первый самый большой пик мы пропустим (диод не даст). Так что абы как паять нельзя.
     
  16. Dan

    Dan Гик

    ну я также и припаял, диск побольше - к земле, меньший - к А0. Только сейчас руки добираются до эксперимента
    А это кстати у вас пьезо без резисторов, но последовптельно с диодом?
     
    Последнее редактирование: 21 янв 2017
  17. Dan

    Dan Гик

    попробовал я скетч, вообще получилось все с параметрами как то так:
    Код (C++):
    uint16_t kick_sample_time=2; // время звучания семпла
    uint16_t kick_treshold=5; // пороговый уровень датчика
    uint16_t kick_mute_time=20;
    еще буду разбираться с ними. как работет датчик мне нравится, но единственное только, что тихо, это нормально?
    пробовал 2 датчика: ЗП_4 и ЗП-25
     
  18. sslobodyan

    sslobodyan Гик

    А какое максимальное значение в тестовом скетче в самой левой колонке?
     
  19. Dan

    Dan Гик

    699
     
  20. sslobodyan

    sslobodyan Гик

    тогда в формулу громкости вместо 1023 ставьте 700 где map(...... )