Arduino, мультиплексор и MIDI

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем RealDob, 10 июн 2015.

  1. RealDob

    RealDob Нуб

    Здравствуйте уважаемые форумчане! Имею ардуино нано, 8 потенциометров, мультиплексор 4051. Я навыков работы с ардуиной не имею. Потенциометры подключил через мультиплексор, все работает. Но вот только не могу заставить слать сигнал в миди формате. Внятных инструкций не нашел. По этой нструкции почему то не получается завести даже без мультиплексора http://cxem.net/arduino/arduino18.php. Помогите пожалуйста кодом или инфой!
    upd. Прошу админов простить за размещение не в том разделе и переместить по возможности.
     
  2. Vad33

    Vad33 Капитан-оригинал

    К сожалению телепаты уже в отпуске, поэтому сейчас никто не сможет разгадать ваши фразы:
    Внятного описания вашей проблемы не нашел.
     
  3. atompost

    atompost Гик

    Давайте будем посмотреть вашу схему :cool:

    На всякий случай, вот здесь читали?
     
    Последнее редактирование: 10 июн 2015
  4. RealDob

    RealDob Нуб

    Читал подобное, проблем с подключением и считыванием нет.
    Вот к примеру, немного дополнил и проверил предложенный Вами код.
    Код (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);
     }  
     
     
  5. RealDob

    RealDob Нуб

    Получается, что по логике этой 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);
    }  
    Но софт, который переводит сигнал в миди, вообще ничего не понимает .
     
  6. RealDob

    RealDob Нуб

    Вроде разобрался, ребятцы!!! В статье был код с дескриптором BYTE, а он не поддерживается. И я его просто удалил, а надо было Serial.print(0xB0 + count, BYTE); поменять на Serial.write(0xB0 + count);
     
  7. RealDob

    RealDob Нуб

    Подскажите пожалуйста, как сделать так, чтобы данные передавались только при изменении параметров (тобишь при прокручивании потенциометров), а не постоянно?
     
  8. Vad33

    Vad33 Капитан-оригинал

    Добавьте переменные в которые будет писаться старые значения параметров.
    И условие, если новое значение равно старому - ничего не делается,
    иначе передается новое значение и оно же записывается в старое.
     
  9. RealDob

    RealDob Нуб

    можете помочь? у меня не получается.
     
  10. RealDob

    RealDob Нуб

    Сейчас имею такой код.
    Код (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
      }


    }  
     
    Последнее редактирование: 11 июн 2015
  11. Vad33

    Vad33 Капитан-оригинал

    Уточните какие данные меняются и нужно контролировать и
    какие не передавать?
     
    Последнее редактирование: 11 июн 2015
  12. RealDob

    RealDob Нуб

    Мне нужно посылать данные:
    Код (Text):
            Serial.write(0xB0); //- не меняется, передает ноту
            Serial.write(1 + count); // передает канал ноты, от 1 до 8
            Serial.write(val_2); // передает значение громкости ноты
         
    И вот эти три строки мне нужно передавать, для изменения значения.
    Мне нужно, чтобы они реагировали на изменения параметра "val"
     
  13. Vad33

    Vad33 Капитан-оригинал

    Ну тогда все просто.

    В верху добавляем
    Код (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; }    // Добавляем эту строку
     
    acos нравится это.
  14. RealDob

    RealDob Нуб

    Я тоже такое пытался добавлять, но загвоздка в том, что данные перестают передаваться только при val_2 = 0
     
  15. Vad33

    Vad33 Капитан-оригинал

    Значит они(данные) все время меняются.
     
  16. otis

    otis Гик

    Почитай так же описание протокола МИДИ. И главное кто кого у тебя в сети слушает.