Очень сильно "шумят" мультиплексоры 4051
- Войдите на сайт для отправки комментариев
Ср, 11/03/2015 - 07:35
На базе Mega 2560 r3 собрал эту схему. В будущем мне нужно будет увеличить количество аналоговых каналов до 64, т.е. всего 8 мультиплексоров и 64 пиезо датчика. Но даже эта схема даёт просто ОГРОМНОЕ количество шумов. Подключил к компьютеру через кабель USB-MIDI. В итоге при срабатывании одного пьезо датчика срабатывает от 3 до 5-6 барабанов. Тема не новая, но вразумительного ответа в сети на форумах я не нашел. Подскажите, как можно решить эту проблему - может есть варианты с другими мультиплексорами?

Casdob, а как вы сделали вывод, что виноваты мультиплексоры, а не программа например? Как вы различаете в программе уровень сигнала, например уровнь шума от разговора, или удар по барабану?
Предварительно собрал 2-3 схемы просто на аналоговых выходах, без участия в них мультиплексоров. В тех случаях проблем было гараздо меньше и были решены путём небольшого корректирования кода и за счёт простой замены проводов ведущих к датчикам:) В этом случае, к сожаление, ничего придумать пока не могу. Тема не новая и в англоязычных форумах поднималась, но ничего подчерпнуть я в них не смог. Резисторы на 1 мОм. Вот сам код.
unsigned char PadNote[16] = {47,18,32,38,43,13,45,17,21,36,0,44,0,19,0,21}; unsigned char status; int PadCutOff[16] = {100,100,100,200,100,100,100,100,100,350,100,350,100,100,100,100}; int MaxPlayTime[16] = {25,25,25,25,25,25,25,25,25,40,25,40,25,25,25,25}; #define midichannel 0; boolean activePad[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int PinPlayTime[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; boolean VelocityFlag = true; int analogPin[2] = {A0,A1}; int pin = 0; int hitavg = 0; int pad = 0; int r0 = 0; int r1 = 0; int r2 = 0; int count = 0; int multiplex1[8]; int multiplex2[8]; //******************************************************************************************************************* // Setup //******************************************************************************************************************* void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); Serial.begin(115200); // connect to the serial port 115200 } //******************************************************************************************************************* // Main Program //******************************************************************************************************************* void loop(){ readSensors(0); readSensors(1); checkSensors(0); checkSensors(1); } void readSensors (int analogPin) { for(count=0; count <= 7; count++) { r2 = bitRead(count,0); r1 = bitRead(count,1); r0 = bitRead(count,2); digitalWrite(2, r0); digitalWrite(3, r1); digitalWrite(4, r2); if(analogPin==0) { multiplex1[count] = analogRead(analogPin); } else if(analogPin==1) { multiplex2[count] = analogRead(analogPin); } } } void checkSensors (int analogPin) { for(int pin=0; pin <=7; pin++) { if(analogPin==0) { hitavg = multiplex1[pin]; pad=pin; } else if(analogPin==1) { hitavg = multiplex2[pin]; pad=pin+8; } if((hitavg > PadCutOff[pad])) { if((activePad[pad] == false)) { if(VelocityFlag == false) { hitavg = (hitavg / 8) -1; } else { hitavg = 127; } MIDI_TX(144,PadNote[pad],hitavg); PinPlayTime[pad] = 0; activePad[pad] = true; } else { PinPlayTime[pad] = PinPlayTime[pad] + 1; } } else if((activePad[pad] == true)) { PinPlayTime[pad] = PinPlayTime[pad] + 1; if(PinPlayTime[pad] > MaxPlayTime[pad]) { activePad[pad] = false; MIDI_TX(128,PadNote[pad],0); } } } } void MIDI_TX(unsigned char MESSAGE, unsigned char PITCH, unsigned char VELOCITY) { status = MESSAGE + midichannel; Serial.write(status); Serial.write(PITCH); Serial.write(VELOCITY); }Casdob, Для начала перевставьте код , что б по всем правилам местного этикета http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Ну а по сути -нужно эксперементировать, искать слабое звено. Попробовать увеличить значение cutoff, что б отсекать больше шума. Попробовать не переключать аналоговый вход на ардуино (т.е. фактически с одним мультиплексором) сохранится ли глюк? Попробовать сделать отладочный скетч, не выводить в миди, а выводить результаты чтения всех каналов на дисплей.
Лично я бы ещё ушёл от всех ардуиновских функций (bitread, digitalWrite, analogRead), это всё выполняется не быстро. Пока вы ударите по барабану, и дойдёт очередь прочесть с него сигнал может пройти слишком много времени, и от сигнала останется лишь хвостик. Особенно эту актуально в случае ещё большего увеличения числа каналов.
Значение cutoff точно не поможет, т.к. пробовал в первую очередь. Да, порог срабатывания заметно увеличивается, но после отработки удара "прилетает" тоже количество барабанов.
Так что пока буду пробывать по пунктам то, что предлагаете вы.
Привет, я не очень разбираюсь в коде. Но большой проблемы не составит попробовать вариан такой..
Serial.begin(115200); поменять наSerial.begin(9600);Сделать такие монипуляции:Скачать виртуальный MIDI http://www.tobias-erichsen.de/software/rtpmidi.htmlНа него накидываем последовательный мост http://projectgus.github.io/hairless-midiserial/
Подключить через USB!!! По этому и
Serial.begin(9600);Настроить rtpMIDI как написано в первой ссылке и подключить порт Hairless MIDI
Нуу и пробуйте юзать через какой VST Plugin
Вопрос к Cosdob. У меня таже проблема. Хотелось бы узнать получилось ли у вас её решить
На базе Mega 2560 r3 собрал эту схему. В будущем мне нужно будет увеличить количество аналоговых каналов до 64, т.е. всего 8 мультиплексоров и 64 пиезо датчика. Но даже эта схема даёт просто ОГРОМНОЕ количество шумов. Подключил к компьютеру через кабель USB-MIDI. В итоге при срабатывании одного пьезо датчика срабатывает от 3 до 5-6 барабанов. Тема не новая, но вразумительного ответа в сети на форумах я не нашел. Подскажите, как можно решить эту проблему - может есть варианты с другими мультиплексорами?
Автор ,приветствую ,мне помогло поставить стабилитрон на выходе мультиплектора, т.е. от аналогового входа к земле, после этого все прекратилось и начало выдавать строго по одной ноте, может кому то пригодится)
Много работаю с АЦП. Для АЦП с мультиплексорами хорошо известен эффект сохранения заряда на входной емкости АЦП. Эффект проявляется при наличии высокоомных выходных сопротивлений источников сигнала. При этом импульс на одном входе пролазит на несколько следующих с последовательным уменьшением амплитуды. Для борьбы с этим эффектом либо используем промежуточные усилители с низким входным сопротивлением, либо используем только нечётные входы - все чётные закорачиваем на массу для снятия заряда. Вот и предлагаю все четные входы мультиплексоров закоротить на массу. Если эффект нескольких нот исчезнет - то ваша проблема в высоком выходном сопротивлении датчиков.
тема старая. от ТС и след простыл.
на схеме не понять номиналы, да и стабилитроны на 4,7в там должны быть и последовательно с пьезами резистор ом на 100 . и параллельно со стабилитронами конденсаторы около 0,1-1нФ .
была подобная конитель с мультиплексорами, проблема в сильном входном сигнале - превышающим питающее мультиплексоров.
но лучше добавить RC вильтр между пьезой и мультиплексором. Ето сгладит сильные всплески от пьезо (помните пьезо зажигалки - там вообще тысячи вольт на выходе) , да и стабилитрон успеет сработать.
Столкнулся с той же проблемой
RC фильтры между пьезами и входами мультиплексора убирают лишние сигналы, но конденсаторы дают большую задержку.
Автор ,приветствую ,мне помогло поставить стабилитрон на выходе мультиплектора, т.е. от аналогового входа к земле, после этого все прекратилось и начало выдавать строго по одной ноте, может кому то пригодится)
можно подробнее, какой стабилитрон нужно ставить?
на схеме у ТС стоят диоды BAT85
HELP! Этот человек оказался прав
Много работаю с АЦП. Для АЦП с мультиплексорами хорошо известен эффект сохранения заряда на входной емкости АЦП. Эффект проявляется при наличии высокоомных выходных сопротивлений источников сигнала. При этом импульс на одном входе пролазит на несколько следующих с последовательным уменьшением амплитуды. Для борьбы с этим эффектом либо используем промежуточные усилители с низким входным сопротивлением, либо используем только нечётные входы - все чётные закорачиваем на массу для снятия заряда. Вот и предлагаю все четные входы мультиплексоров закоротить на массу. Если эффект нескольких нот исчезнет - то ваша проблема в высоком выходном сопротивлении датчиков.
если подключать пьезы на входы через 1 а остальные на за землю, эффект пропадает.
Неужели использовать 8 канальный мультиплексор на 4 входа? Может есть варианты?
Не обязательно перебирать каналы последовательно. Одну ногу заземляем, оставшиеся 7 - используем. Если 1 - земля, то перебор по правилу: 2, 1, 3, 1, 4, 1...и никаких стабилитронов. Код поправить придётся.