DIY модули на Arduino

Kokarev Maxim

Rawker
13 Май 2007
5.853
5.280
113
44
Барнаул
recording-studio.ru
В теме про дешёвые diy киты я кидал запрос про модули, которых не существует. Пришлось делать самому :) Надеюсь, это даст старт новому обсуждению и интересным проектам, поскольку возможности Ардуины безграничны.

Началось с того, что мне потребовался CV для Minilogue - простые LFO и S&H. Как оказалось, заводских компактных модулей не существует - они все под рэки, да под кейсы. Громоздкие, да ещё и с сетевым питанием...
Погуглив разные diy решения, я собрал компактный CV модуль с usb питанием, но при этом выходом вплоть до +-15в и выше! За основу была взята Arduino ESP - WROOM - 32 с двумя встроенными dac на борту. К сожалению, они только 8 битные*, но иного под руками не оказалось. С выхода ардуины сигнал идёт на буфер со смещением для симметрии и усилителем на микросхемах 074 и 072. Ну и самое волшебство - питание аналоговой части сделано на модифицированном блоке MT3608, который я превратил в двуполярный. Таким образом, питаясь от простого однополярного usb 5в можно шевелить CV со значительно бОльшим размахом, да ещё и в обе стороны. Меня прям распирает от гордости за это решение, хахаха. Если кто-то возьмётся за серийное производство подобных супер компактных решений по аналогии с pocket operator, он войдёт в историю :)

В качестве программной части я использовал библиотеку controlVoltage. Код сделан на основе примеров автора библиотеки и выглядит вот так:

C:
#include <controlVoltage.h>

const int potPin1 = 36; // pin3
const int potPin2 = 39; // pin4

controlVoltage chan1 = controlVoltage(); //quantized CV
LFO lfo1 = LFO(TRI, 32, 255); //waveform, freq (Hz), amplitude

const byte dac1 = 25;
const byte dac2 = 26;

void setup(){
  Serial.begin(115200);  // initialize serial interface for print()

  chan1.bitDepth( 8 );
  lfo1.bitDepth( 8 );
}

uint16_t getAnalogValue(const uint8_t AAnalogPin) { //average value, pot anti-drift function
   uint16_t result = 0;
   for (uint8_t i=0; i<16; i++) result+=analogRead(AAnalogPin);
   return ((result) >> 4);
}

void loop(){

  chan1.loop();
  lfo1.loop();

  // Reading and mapping potentiometer value
  int potValue1 = map(getAnalogValue(potPin1), 0, 4095, 80, 1000); // return 0-100
  int potValue2 = map(getAnalogValue(potPin2), 0, 4095, 2, 100); // return 0-100

  //write random value to chan1 CV
  //and LFO to lfo1

  static uint32_t controlTimer = 0;
  float interval = pow(potValue1, 2)/2000;
  if(millis()-controlTimer>interval){
    controlTimer=millis();
    randomSeed(analogRead(15));
    chan1.cv(random(255));
  }

  static uint32_t controlTimer2 = 0;
  int interval2 = 100;
  if(millis()-controlTimer2>interval2){
    controlTimer2=millis();

    if(1){
      //here we will change the frequency of our LFO
        float freq = pow(potValue2, 1.5)/20;
        lfo1.freq( freq );
    }

    if(1){
      //here we will change the shape of our waveforms
      static int state = 4;
      if(state == 0) lfo1.waveform = TRI;
      else if(state == 1) lfo1.waveform = RAMP;
      else if(state == 2) lfo1.waveform = SAW;
      else if(state == 3) lfo1.waveform = SQUARE;
      else if(state == 4) lfo1.waveform = SINE;

      if( state >= 5 ) state = 0;
    }

  }

  //monitor output at signal rate
  static uint32_t signalTimer = 0;
  int signalInterval = 1;
  if(millis()-signalTimer >= signalInterval){
    uint16_t cvVal = chan1.get();
    uint16_t lfoVal = lfo1.get();

    dacWrite(DAC1, cvVal );
    dacWrite(DAC2, lfoVal );
 
    signalTimer = millis();
    Serial.print("quant:");
    Serial.print( cvVal);
    Serial.print(",");
    Serial.print("env:");
    Serial.println( lfoVal );
  }
}

Схема цифровой части типичная для проектов на Ардуино: переменные резисторы 10к включены между + и - 3.3в. Движки резисторов идут к контактам 36 и 39 (как видно из кода), а выходы с dac - это контакты 25 и 26.
Я не рисовал полную схему, потому что проект простой. С макетного бутерброда я его на коленке перепаял на макетную плату.

С выхода платы ESP сигнал идёт на буфер и усилитель со смещением по постоянному току. Смещение нужно для того, чтобы получить симметричную волну.

Схема аналоговой части есть в онлайн симуляторе, по ссылке можно посмотреть номиналы и покрутить регулировки: https://tinyurl.com/26g8p3jb

246927


Переменный резистор сверху регулирует уровень выхода. Переменный резистор слева - регулировка симметрии на выходе. Оба этих резистора - точные многооборотники, которые размещены на плате. Резистор справа на 10к - пот громкости lfo. Он размещён на передней панели.
Поскольку у меня два lfo, эта часть схемы собрана два раза. Итого, 6 операционных усилителей в двух корпусах: 1 микросхема tl074 и одна tl072. Стабилитроны на 5.1в, предохраняют выход от перенапряжения, если что-то пойдёт не так.

Питание - модифицированный MT3608, к которому добавлен блок, формирующий отрицательное напряжение. Обведён красным. В моих тестах 14в (+-7в) оказалось оптимальным напряжением, чтобы получить p-p 10в без искажений. Я использовал буквально первые попавшиеся диоды Шоттки - это не критично.
Модуль питается от 5в пина Ардуины.

246928



Проектировкой монтажа я не занимался, было лениво. Получилось не очень красиво - но кому не всё равно, что там внутри этой коробки? :D

246929



Ну и внешний вид на столе, чтоб оценить компактность, из-за которой всё затевалось :)

246930



Если интересен бюджет:
Модуль Ардуино ESP32 - 460р
Корпус - 360р
Макетная плата - 370р
Модуль питания MT3608 - 208р
Потенциометры и разъёмы ~ 500р
Остальные детали ~ 500р (вся мелочёвка у меня уже была)
Итого: 2 398р, если брать быстро с Озона или Чип-Дипа, или 1 199р, если всё заказывать с Али экспресса.


*чем плох 8 битный модуль? Посмотрите на осциллограмму. На медленной lfo эта ступенька слышна. Для моего lo-fi модуля это не проблема, но если нужно что-то более чистое и точное, лучше рассмотреть ардуино с 12 битным цап, встроенным или внешним, не важно.

246932



Полезные ссылки:
Видосы с канала автора библиотеки controlVoltage
Большой канал с кучей модулей и схем на ардуино: https://www.youtube.com/@HAGIWO/videos


Звуковые тесты, куда ж без них :)
Правда, я не знаю, как lfo красиво протестировать, попробовал приблизиться к уровню -Julian-.
Первый файл в тесте - вся суть. Буквально wow & flutter в коробке :) Для сравнения есть повтор без модуляции.





 

Вложения

  • 1715361172076.png
    1715361172076.png
    110,2 KB · Просмотры: 31
  • Full test.mp3
    Full test.mp3
    184,3 KB · Просмотры: 284
  • LFO Sin.mp3
    LFO Sin.mp3
    142,3 KB · Просмотры: 284
  • S&H.mp3
    S&H.mp3
    654 KB · Просмотры: 284
Последнее редактирование:
питание аналоговой части сделано на модифицированном блоке MT3608, который я превратил в двуполярный.
класс! возьмем на заметку!

На медленной lfo эта ступенька слышна.
можно в значительной степени фильтрануть, поставив небольшой кондер на выход, как всегда и делали.
 
  • Like
Реакции: Kokarev Maxim
можно в значительной степени фильтрануть, поставив небольшой кондер на выход, как всегда и делали.
Да, это самое очевидное и я сразу это закладывал в схему - на чёрной аналоговой схеме есть конденсатор 1нф на входе. Но на практике это не сработало. Я пробовал разные номиналы, но на слух всё равно отмечал эту ступеньку. Возможно, ошибся где-то. Хз.
 

Сейчас просматривают