Приспичило мне тремоло.
Да не простое - а чтобы с тап-темпо, и чтобы можно было еще что-то типа "slow attack" делать по нажатию на кнопку...
А значит, если мы хотим этим как-то управлять - то управляющая часть должна быть цифровой. Так что те, кто не любят устройств с цифровым управлением - могут дальше не читать. Те, у кого опыта не хватает для паяния смд-компонентов - тоже можно дальше не читать...
Поковырявшись в загашнике нашел пару платок Arduino Nano - которые я когда-то давно покупал, какие-то заюзал, а какие-то так и лежат без дела. Ну значит управлять этим всем будет ардуина. Правда понимаю я что ардуина на это дело - как-то дофига, но другого контроллера под рукой не оказалось, а покупать контрололер, программатор и прочее - как то лень было. Решил собирать из того что есть. Из плюсов ардуины - не требуется ничего кроме кабеля USB, чтобы заливать в нее код, который легко и понятно пишется в соответсвующем ардуиновском IDE. Его, а так же все остальное - легко скачать с официального сайта ардуины, ну и возможность работать от любого напряжения входного - в диапазоне 6-18в.
Поскольку ардуинки у меня китайские (по 10 баксов за кулек), они требуют своего китайского драйвера для прошивания, что в принципе тоже легко гуглится.
Кому интересно - ссыль на ардуину -
http://www.ebay.com/itm/5PCS-Mini-USB-CH340G-Nano-V3-0-5V-16M-ATmega328P-Micro-Controller-Board-Arduino-/171981943640?hash=item280aec3358:g:dEYAAOSwo6lWMJo7 - 10 баксов, за 5 штук.
Тремолировать будем оптикой. Точнее на фоторезитор будет светить светодиод. Фоторезисторов в закромах тоже нашелся пакет целый, с диодами тож недостатка не испытываю.
фоторезистор обычный, самый простой.

Диод показывать не буду - все знают. )
Нужна аналоговая часть. Ничо лучше, чем собрать 2 каскада (усилительный и повторительный) на паре транзисторов - я быстро не придумал. КОнечно было бы лучше сдвоенный операционник - места меньше, стабильнее, удобнее - но оставим это на будущее. Аналоговая часть схемы ниже:

Все достаточно просто. Вначале идет усилительный каскад, с которого сигнал поступает на потенциометр Blend. Регулятор Blend вместе с фоторезистором составляют делитель напряжения. Когда положение движка потенциометра "вверху" - то у нас отсутсвует какое либо влияние вибрации на звук, когда внизу - то мы полностью зависим от состояния фоторезистора - когда он освещен его сопротивление близко к нулю, а когда он затемнен - составляет несколько сотен килоом. Кроме того - время срабатывание фоторезистора намного быстрее, чем время его "остывания".
После чего сигнал поступает на истоковый повторитель, и отправляется на регулятор громкости. Потенциометра, устанавливающего время вибрации тремоло - нет. Может не всем это понравится, но мне он оказался не нужным.
Плата:
analog_part.zip (54.61 КБ - загружено 47 раз.)
Много SMD компонентов (все, кроме пары конденсаторов, светодиода, и фоторезистора). задача была впихнуть все под ардуину, так что место экономилось.
Цифровая часть.
Основной задачей оказалось написать программный код так, чтобы у нас плавно зажигался и затухал диодик, а по двум нажатиям на соответсвующую кнопку - менялся его интервал.
светодиод подключен к третей цифровой ноге ардуины (PWM вывод), функция светодиода продублированна на 11 ногу ардуины, с которой просто проводоком кидаем светодиод на землю - будет дублирующий, который выведем на корпус.
Кнопка посажена на аналоговый вход А4 (удобство платы). Еще добавил одну кнопку (вывод ардуины №8), которая меняла режим работы - в режиме А - диодик мигает и делает тремоло, а в режиме Б - звук плавно нарастает при нажатии на кнопку тап-темпо, и затихает когда кнопку отпускаешь. что-то вроде Slow attack. К ней нужно подвести проводком 5в (обозначено на плате белым). Обе кнопки обычные, без фиксации, нормально-разомкнутые. кнопка включения-выключения эффекта - обычная, 9 контактная. Распаивается так же, как и в любых других педалях.
А когда код был написан и залит на ардуинку - вылезла проблема - несмотря на то, что цифровая и аналоговая часть имеют общими только землю - PWM выход ощутимо шумит в звуковой тракт, т.к. его частота работы по умолчанию была около 500гц. Сначала возился и пробовал разделить земли, разделить схему и тп... после чего забил, и аппаратно увеличил частоту выхода до 31кгц.
После тестов, могу сказать что девайс получился весьма функциональный. Кнопка Тап-темпо работает адекватно (2 последовательных нажатия). Со старта педальки тремоло тоже работает, согласно установленному дефолтному значению переменной. В положении бленда на "чистый" (движок вверху, по схеме) - педаль можно использовать как простейший преамп.
Код программы под спойлером
int button_flag = 0;
unsigned long interval = 1000;
unsigned long time_counter = 0;
int led = 3; // the PWM pin the LED is attached to
float brightness = 0;
int timeless = 0;
int fade;
int main_flag = 0;
// the setup routine runs once when you press reset:
void setup() {
TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz
pinMode(led, OUTPUT);
pinMode(11, OUTPUT);
pinMode(A4,INPUT);
pinMode( 8, INPUT);
pinMode(10, INPUT);
pinMode(6,OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(6, LOW);
if(digitalRead( 8 )==HIGH && main_flag == 0){
main_flag = 1;
}
if(digitalRead( 8 )==LOW && main_flag == 1){
button_one();
}
if(digitalRead( 8 )==HIGH && main_flag == 1){
main_flag = 0;
}
if(digitalRead( 8 )==LOW && main_flag == 0){
button_work();
led_fade();
}
}
void led_fade(){
brightness = 12+12*sin(2*3.1415/interval*millis()); //при необходимости увеличить цифры "12" в 2, 4 раза, если светодиод мигает слишком слабо.
brightness = byte(brightness);
analogWrite(led, brightness);
analogWrite(11, 2*brightness);
}
void button_work(){
if (digitalRead(A4) == HIGH && button_flag ==0) {
time_counter = millis();
button_flag = 1;
delay(10);
}
if (digitalRead(A4) == LOW && button_flag == 1){
button_flag = 2;
}
if (digitalRead(A4) == HIGH && button_flag ==2) {
unsigned long current_millis = millis();
interval = current_millis - time_counter;
button_flag = 3;
delay(10);
}
if (digitalRead(A4) == LOW && button_flag == 3){
button_flag = 0;
}
}
void button_one(){
if (digitalRead(A4) == HIGH){
for (int brightness = 0 ; brightness <= 255; brightness += 5) {
// sets the value (range from 0 to 255):
analogWrite(led, brightness);
// wait some time to see the dimming effect
delay(50);
}
}
else{analogWrite(led, 0);}
}
Ардуиновский проект с кодом:
Tremolo_v0.1.ino.zip (0.84 КБ - загружено 54 раз.)
Фото всего будет чуть позже. Если есть какие-то вопросы - с радостью отвечу.