Часто такое бывает, из-за импульса в сети питания, либо из-за разницы межблочных потенциалов – устройства выгорают в пепел. Произошла переполюсовка, либо живность завелась в устройствах, и закоротило всё внутри. Сейчас мы рассмотрим как раз такой вариант, когда у вас по тем или иным причинам сгорел контроллер, в данном случае, на примере примочки Mooer TheWahter. Не расстраивайтесь, помогу вам написать свою прошивку.
Как устроена педаль внутри, с точки зрения блочной схемы?
На удивление всё элементарно просто:
- В основе – эффект по схеме CryBaby на потенциометре в качестве элемента сдвигающий огибающую фильтра;
- Вместо обычного потенциометра фильтра применен цифровой потенциометр с управлением по 3 проводам SPI;
- Резистивные сенсоры 3шт в качестве контроля нажатия и переключение режимов;
- Истинный байпас для обхода эффектов на основе биполярного мини-реле типа DPDT;
- Блок гашения сигнала на массу – на оптроне;
- Блок индикации работы на светодиодах.

Интересная особенность работы примочки на заводской прошивке.
Исследования показали, что во время переключения мини-реле, устройство ловит громкий щелчок. Производители, видимо, отчаялись и ввели в схему модуль гашения звука на оптроне. После посылки сигнала на включение/выключение эффекта, на короткий промежуток времени глушится выходной сигнал впринципе. Но этого промежутка достаточно, чтобы отбить всё желание пользоваться педалью. Поэтому, забегая вперед дам совет, что если этот блок вообще не задействовать в работе, – и щелчок получается приемлемый (при игре вообще не слышно), и педаль становится очень прыткой.
Нелинейность оптического датчика вау-эффекта.
Оптический датчик кулисы вау-педали – имеет самые нехорошие показатели линейности для работы. Поэтому после декодировки я использовал логарифмические функции для того, чтобы максимально выровнять характеристику нажатия педали и сделать её похожей на оригинальную CryBaby.
О программировании
В ARM (советую писать прошивку в HALL) в отличие от AVR всё очень просто. Потому что всё готово и уже написано за вас. Останется только подключить необходимые библиотеки и вызвать соответствующие функции.

Об опросе датчиков нажатия AD1 AD2 AD3
При игре на заводской прошивке, случайно в процессе игры можно переключить режим педали, который назад вернуть крайне трудно. Поэтому советую делать только один режим работы педали. Тот, который вас лучше всего устраивает.
Например, я сделал так: когда ставим ногу – эффект включается. Убираем ногу – эффект отключается. Просто и понятно. И никакой ошибки не произойдет никогда.
Чтобы легко было работать, и не опрашивать постоянно АЦП, лучше сделать чтение сразу в память при помощи DMA. Таким образом у нас будет массив с датчиками, со значением которых можно уже работать.
ADC_Val[0] в моем случае это датчик засветки вау-педали,
ADC_Val[2] – это сенсор включения/отключения педали.
Есть ещё другие сенсоры, которые различают нажатие только на верхнюю часть педали, либо только на нижнюю, но в силу избыточности мне это не понадобилось.
Фрагмент кода, который симулирует фирменный запуск педали, как у заводской прошивки (мигает светодиод при включении единоразово и ждёт игры):
set_relay_on(0);
HAL_Delay(300);
set_relay_on(1);
HAL_Delay(300);
set_relay_on(0);Следующий фрагмент кода, отвечающий за включение-выключение эффекта:
if(ADC_Val[2]>1200){ // вкл вау-педаль
set_relay_on(1);
}if(ADC_Val[2]<500){ // откл вау-педаль
set_relay_on(0);
}Функция, которая включает и отключает реле:
void set_relay_on(bool stat){
if(relaystate!=stat){
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, (GPIO_PinState)stat); //запаливаем лампочки
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, (GPIO_PinState)stat); //даем напряжение на первую ногу
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, (GPIO_PinState)!stat); //убираем напряжение с другой ноги
relaystate = stat;
}
}Подсказка: далее необходимо это значение подкорректировать с точки зрения линейности функции. Впринципе, если этого не делать – работать тоже будет.
В связи с тем, что микросхема электронного потенциометра – 255 ступенчатая, то ее максимальное значение будет 255. Им и нужно ограничить нашу переменную:
if(adc>255){adc=255;}Далее незамедлительно отправляем данные прямо в электронный потенциометр:
SPI_SendData(adc1);Функция отправки данных по SPI:

void SPI_SendData(uint8_t data){
if(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_READY){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
uint8_t td = 0x11;
HAL_SPI_Transmit(&hspi1, &td, 1, 100); while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY);
HAL_SPI_Transmit(&hspi1, &data, 1, 100); while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}
}

Компилируем, заливаем в контроллер, тестируем. Естественно, для профессионального использования нужны музыканты-тестировщики, которые много лет работают с педалью. Именно они вам дадут правильную информацию о том, как нужно настроить или правильные ли вы установили параметры для комфортной игры.
Внимание! Всё знать нереально. Если в статье присутствуют неточности, просьба написать об этом. Всё будет исправлено в кратчайшие сроки с выражением наших благодарностей.
Комментарии ()