Здравствуйте уважаемые форумчане! Имею ардуино нано, 8 потенциометров, мультиплексор 4051. Я навыков работы с ардуиной не имею. Потенциометры подключил через мультиплексор, все работает. Но вот только не могу заставить слать сигнал в миди формате. Внятных инструкций не нашел. По этой нструкции почему то не получается завести даже без мультиплексора http://cxem.net/arduino/arduino18.php. Помогите пожалуйста кодом или инфой! upd. Прошу админов простить за размещение не в том разделе и переместить по возможности.
К сожалению телепаты уже в отпуске, поэтому сейчас никто не сможет разгадать ваши фразы: Внятного описания вашей проблемы не нашел.
Читал подобное, проблем с подключением и считыванием нет. Вот к примеру, немного дополнил и проверил предложенный Вами код. Код (Text): #define ANALOG_PIN 0 int r0 = 0; //value of select pin at the 4051 (s0) int r1 = 0; //value of select pin at the 4051 (s1) int r2 = 0; //value of select pin at the 4051 (s2) int count = 0; //which y pin we are selecting byte val; void setup(){ Serial.begin(57600); pinMode(2, OUTPUT); // s0 pinMode(3, OUTPUT); // s1 pinMode(4, OUTPUT); // s2 } void loop () { for (count=0; count<=7; count++) { // select the bit r0 = bitRead(count,0); // use this with arduino 0013 (and newer versions) r1 = bitRead(count,1); // use this with arduino 0013 (and newer versions) r2 = bitRead(count,2); // use this with arduino 0013 (and newer versions) //r0 = count & 0x01; // old version of setting the bits //r1 = (count>>1) & 0x01; // old version of setting the bits //r2 = (count>>2) & 0x01; // old version of setting the bits digitalWrite(2, r0); digitalWrite(3, r1); digitalWrite(4, r2); //Either read or write the multiplexed pin here val = analogRead(ANALOG_PIN) / 8; Serial.print(val); Serial.print(" | "); } Serial.println(); delay(500); }
Получается, что по логике этой http://cxem.net/arduino/arduino18.php статьи, должно выйти так: Код (Text): #define ANALOG_PIN 0 int r0 = 0; //value of select pin at the 4051 (s0) int r1 = 0; //value of select pin at the 4051 (s1) int r2 = 0; //value of select pin at the 4051 (s2) int count = 0; //which y pin we are selecting byte val = 0; void setup(){ Serial.begin(57600); pinMode(2, OUTPUT); // s0 pinMode(3, OUTPUT); // s1 pinMode(4, OUTPUT); // s2 } void loop () { for (count=0; count<=7; count++) { // select the bit r0 = bitRead(count,0); // use this with arduino 0013 (and newer versions) r1 = bitRead(count,1); // use this with arduino 0013 (and newer versions) r2 = bitRead(count,2); // use this with arduino 0013 (and newer versions) //r0 = count & 0x01; // old version of setting the bits //r1 = (count>>1) & 0x01; // old version of setting the bits //r2 = (count>>2) & 0x01; // old version of setting the bits digitalWrite(2, r0); digitalWrite(3, r1); digitalWrite(4, r2); //Either read or write the multiplexed pin here val = analogRead(ANALOG_PIN) / 8; Serial.print(0xB0 + count); Serial.print(1); Serial.print(val); } delay(500); } Но софт, который переводит сигнал в миди, вообще ничего не понимает .
Вроде разобрался, ребятцы!!! В статье был код с дескриптором BYTE, а он не поддерживается. И я его просто удалил, а надо было Serial.print(0xB0 + count, BYTE); поменять на Serial.write(0xB0 + count);
Подскажите пожалуйста, как сделать так, чтобы данные передавались только при изменении параметров (тобишь при прокручивании потенциометров), а не постоянно?
Добавьте переменные в которые будет писаться старые значения параметров. И условие, если новое значение равно старому - ничего не делается, иначе передается новое значение и оно же записывается в старое.
Сейчас имею такой код. Код (Text): #define ANALOG_PIN 0 int r0 = 0; //value of select pin at the 4051 (s0) int r1 = 0; //value of select pin at the 4051 (s1) int r2 = 0; //value of select pin at the 4051 (s2) int count = 0; //which y pin we are selecting byte val; byte val_2; void setup(){ Serial.begin(115200); pinMode(2, OUTPUT); // s0 pinMode(3, OUTPUT); // s1 pinMode(4, OUTPUT); // s2 } void loop () { for (count=0; count<=7; count++) { // select the bit r0 = bitRead(count,0); // use this with arduino 0013 (and newer versions) r1 = bitRead(count,1); // use this with arduino 0013 (and newer versions) r2 = bitRead(count,2); // use this with arduino 0013 (and newer versions) //r0 = count & 0x01; // old version of setting the bits //r1 = (count>>1) & 0x01; // old version of setting the bits //r2 = (count>>2) & 0x01; // old version of setting the bits digitalWrite(2, r0); digitalWrite(3, r1); digitalWrite(4, r2); //Either read or write the multiplexed pin here val = analogRead(ANALOG_PIN) / 8; // от 0 до 127 для velocity val_2 = 127 - val; // убрал инверсию для MIDI сигнала Serial.write(0xB0); Serial.write(1 + count); Serial.write(val_2); delay(4); // не меньше 4 - не выдерживает LoopBe } }
Мне нужно посылать данные: Код (Text): Serial.write(0xB0); //- не меняется, передает ноту Serial.write(1 + count); // передает канал ноты, от 1 до 8 Serial.write(val_2); // передает значение громкости ноты И вот эти три строки мне нужно передавать, для изменения значения. Мне нужно, чтобы они реагировали на изменения параметра "val"
Ну тогда все просто. В верху добавляем Код (Text): byte val_old; Внизу изменяем: Код (Text): if (val != val_old) { // добавляем эту строку Serial.write(0xB0); //- не меняется, передает ноту Serial.write(1 + count); // передает канал ноты, от 1 до 8 Serial.write(val_2); // передает значение громкости ноты val_old = val; } // Добавляем эту строку
Я тоже такое пытался добавлять, но загвоздка в том, что данные перестают передаваться только при val_2 = 0