Очень сильно "шумят" мультиплексоры 4051

Casdob
Offline
Зарегистрирован: 28.02.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Casdob, а как вы сделали вывод, что виноваты мультиплексоры, а не программа например? Как вы различаете в программе уровень сигнала, например уровнь шума от разговора, или удар по барабану?

Casdob
Offline
Зарегистрирован: 28.02.2015

Предварительно собрал 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);
}

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Casdob, Для начала перевставьте код , что б по всем правилам местного этикета http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

Ну а по сути -нужно эксперементировать, искать слабое звено. Попробовать увеличить значение cutoff, что б отсекать больше шума. Попробовать не переключать аналоговый вход на ардуино (т.е. фактически с одним мультиплексором) сохранится ли глюк? Попробовать сделать отладочный скетч, не выводить в миди, а выводить результаты чтения всех каналов на дисплей.

Лично я бы ещё ушёл от всех ардуиновских функций (bitread, digitalWrite, analogRead), это всё выполняется не быстро. Пока вы ударите по барабану, и дойдёт очередь прочесть с него сигнал может пройти слишком много времени, и от сигнала останется лишь хвостик. Особенно эту актуально в случае ещё большего увеличения числа каналов.

Casdob
Offline
Зарегистрирован: 28.02.2015

Значение cutoff точно не поможет, т.к. пробовал в первую очередь. Да, порог срабатывания заметно увеличивается, но после отработки удара "прилетает" тоже количество барабанов.

Так что пока буду пробывать по пунктам то, что предлагаете вы.

milkos
Offline
Зарегистрирован: 05.03.2016

Привет, я не очень разбираюсь в коде. Но большой проблемы не составит попробовать вариан такой..

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

djoshev
Offline
Зарегистрирован: 09.03.2016

Вопрос к Cosdob.   У меня таже проблема. Хотелось бы узнать получилось ли у вас её решить

 

Ilya3Run13
Offline
Зарегистрирован: 23.10.2013

Casdob пишет:

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

 

Автор ,приветствую ,мне помогло поставить стабилитрон на выходе мультиплектора, т.е. от аналогового входа к земле, после этого все прекратилось и начало выдавать строго по одной ноте, может кому то пригодится)

nik182
Offline
Зарегистрирован: 04.05.2015

Много работаю с АЦП. Для АЦП с мультиплексорами хорошо известен эффект сохранения заряда на входной емкости АЦП. Эффект проявляется при наличии высокоомных выходных сопротивлений источников сигнала. При этом импульс на одном входе пролазит на несколько следующих с последовательным уменьшением амплитуды. Для борьбы с этим эффектом либо используем промежуточные усилители с низким входным сопротивлением, либо используем только нечётные входы - все чётные закорачиваем на массу для снятия заряда. Вот и предлагаю все четные входы мультиплексоров закоротить на массу. Если эффект нескольких нот исчезнет - то ваша проблема в высоком выходном сопротивлении датчиков. 

slider
Offline
Зарегистрирован: 17.06.2014

тема старая. от ТС и след простыл.

на схеме не понять номиналы, да и стабилитроны на 4,7в там должны быть и последовательно с пьезами резистор ом на 100 . и параллельно со стабилитронами конденсаторы  около 0,1-1нФ .

была подобная конитель с мультиплексорами, проблема в сильном входном сигнале - превышающим питающее мультиплексоров. 

но лучше добавить RC вильтр  между пьезой и мультиплексором. Ето сгладит сильные всплески от пьезо  (помните пьезо зажигалки - там вообще тысячи вольт на выходе) , да и стабилитрон успеет сработать.

 

whyyy
Offline
Зарегистрирован: 26.10.2017

Столкнулся с той же проблемой

RC фильтры между пьезами и входами мультиплексора убирают лишние сигналы, но конденсаторы дают большую задержку.

 

Ilya3Run13 пишет:

Автор ,приветствую ,мне помогло поставить стабилитрон на выходе мультиплектора, т.е. от аналогового входа к земле, после этого все прекратилось и начало выдавать строго по одной ноте, может кому то пригодится)

можно подробнее, какой стабилитрон нужно ставить? 

на схеме у ТС стоят диоды BAT85

whyyy
Offline
Зарегистрирован: 26.10.2017

HELP! Этот человек оказался прав

nik182 пишет:

Много работаю с АЦП. Для АЦП с мультиплексорами хорошо известен эффект сохранения заряда на входной емкости АЦП. Эффект проявляется при наличии высокоомных выходных сопротивлений источников сигнала. При этом импульс на одном входе пролазит на несколько следующих с последовательным уменьшением амплитуды. Для борьбы с этим эффектом либо используем промежуточные усилители с низким входным сопротивлением, либо используем только нечётные входы - все чётные закорачиваем на массу для снятия заряда. Вот и предлагаю все четные входы мультиплексоров закоротить на массу. Если эффект нескольких нот исчезнет - то ваша проблема в высоком выходном сопротивлении датчиков. 

если подключать пьезы на входы через 1 а остальные на за землю, эффект пропадает.

Неужели использовать 8 канальный мультиплексор на 4 входа? Может есть варианты?

SvkMaster
Offline
Зарегистрирован: 24.11.2017

Не обязательно перебирать каналы последовательно. Одну ногу заземляем, оставшиеся 7 - используем. Если 1 - земля, то перебор по правилу: 2, 1, 3, 1, 4, 1...и никаких стабилитронов. Код поправить придётся.