Arduino MEGA สร้าง MIDI Controller ควบคุม Software ระบบภาพ vMIX

ก่อนอื่นเรามาดูภาพรวมของระบบกันก่อนครับ (พอดีช่วงนี้ผมมีเวลาครับ จึงอยากทำตัวให้มีประโยชน์กับผู้อื่นบ้าง)


Diagram การต่อสาย




CODE

#define USE_ROTARY_ENCODER
#include <MIDI_Controller.h> // Include the library


#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();  //ตั้งค่า MIDI Libraly


//--- ปุ่มกด หลายตัว  ---------------------------------------------------------------------------

int mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //เก็บค่าสถานะปุ่มกดแต่ละตำแหน่งเอาไว้


//---------------------------------------------------------------------------------------------------------------------


//-------------- Rotary Encoder  ใช้ library  MIDI_Controller.h ---------------------------------------------------------
//Rotary Encoder #1
const uint8_t Channel = 1;       // MIDI channel 1
const uint8_t Controller = 0x14; // MIDI Control Change controller number
const int speedMultiply = 1;     // No change in speed of the encoder (number of steps is multiplied by 1)

//Rotary Encoder #2
const uint8_t Channel2 = 2;       // MIDI channel 1
const uint8_t Controller2 = 0x15; // MIDI Control Change controller number
const int speedMultiply2 = 1;     // No change in speed of the encoder (number of steps is multiplied by 1)




// Create a new instance of the class 'RotaryEncoder', called 'enc', on pin 2 and 3, controller number 0x14, on channel1,
// no change in speed (speed is multiplied by 1), it's used as a jog wheel, and the sign mode is set to two's complement.
//TWOS_COMPLEMENT, BINARY_OFFSET or SIGN_MAGNITUDE
//RotaryEncoder encoder(26, 27, Controller, Channel, speedMultiply, JOG, TWOS_COMPLEMENT);


//RotaryEncoder encoder(26, 27, Controller, Channel, speedMultiply, JOG and NORMAL_ENCODER,TWOS_COMPLEMENT&SIGN_MAGNITUDE);
//หลังจากใส่คาปาซิเตอร์  0.1 ไมโครฟารัดลงไปใน Rotary Encoder แล้วถ้าเลือกแบบนี้จังหวะการหมุนในการเลือกภาพเลื่อนไป 1 ช่องเท่ากับเลื่อน 2 ภาพ


//RotaryEncoder encoder(26, 27, Controller, Channel, speedMultiply,  NORMAL_ENCODER, TWOS_COMPLEMENT);
//RotaryEncoder encoder(26, 27, Controller, Channel, speedMultiply,  NORMAL_ENCODER, SIGN_MAGNITUDE)
//หลังจากใส่คาปาซิเตอร์  0.1 ไมโครฟารัดลงไปใน Rotary Encoder แล้วถ้าเลือกแบบนี้จังหวะการหมุนในการเลือกภาพเลื่อนไป 2 ช่องเท่ากับเลื่อน 1 ภาพ



//Rotary Encoder #1
RotaryEncoder encoder(26, 27, Controller, Channel, speedMultiply, NORMAL_ENCODER, TWOS_COMPLEMENT&SIGN_MAGNITUDE);
//หลังจากใส่คาปาซิเตอร์  0.1 ไมโครฟารัดลงไปใน Rotary Encoder แล้วถ้าเลือกแบบนี้จังหวะการหมุนในการเลือกภาพเลื่อนไป 2 ช่องเท่ากับเลื่อน 1 ภาพ
//ให้เข้าไปแก้จำนวนPluse ของ NORMAL_ENCODER จาก 4 Pluse  ต่อ 1 คลิกเป็น 2 Pluse ต่อ 1 คลิก ของไฟล์ RotaryEncoder.h
//ที่อยู่ C:\Users\PUYIOT\Documents\Arduino\libraries\MIDI_controller-master\src\MIDI_Outputs
// จากนั้นให้เปิดปิดโค้ชใหม่เพื่อล้างค่าและรับค่าการเปลี่ยนแปลงของ Pluse ที่เราเปลี่ยนใหม่ด้วย


//Rotary Encoder #2
RotaryEncoder encoder2(37, 38, Controller2, Channel2, speedMultiply2, NORMAL_ENCODER, TWOS_COMPLEMENT&SIGN_MAGNITUDE);
//หลังจากใส่คาปาซิเตอร์  0.1 ไมโครฟารัดลงไปใน Rotary Encoder แล้วถ้าเลือกแบบนี้จังหวะการหมุนในการเลือกภาพเลื่อนไป 2 ช่องเท่ากับเลื่อน 1 ภาพ
//ให้เข้าไปแก้จำนวนPluse ของ NORMAL_ENCODER จาก 4 Pluse  ต่อ 1 คลิกเป็น 2 Pluse ต่อ 1 คลิก ของไฟล์ RotaryEncoder.h
//ที่อยู่ C:\Users\PUYIOT\Documents\Arduino\libraries\MIDI_controller-master\src\MIDI_Outputs
// จากนั้นให้เปิดปิดโค้ชใหม่เพื่อล้างค่าและรับค่าการเปลี่ยนแปลงของ Pluse ที่เราเปลี่ยนใหม่ด้วย


;


//--- ปุ่ม potentiometer1 slide  ตัวที่ 1  ---------------------------------------------------------------------------
int val = 0;
int lastVal = 0;
Analog potentiometer1(A0, MIDI_CC::Channel_Volume, 1);

//---------------------------------------------------------------------------------------------------------------------


Analog potentiometer2(A1, MIDI_CC::Channel_Volume, 7);
Analog potentiometer3(A2, MIDI_CC::Channel_Volume, 8);
Analog potentiometer4(A3, MIDI_CC::Channel_Volume, 9);
Analog potentiometer5(A4, MIDI_CC::Channel_Volume, 10);


//************void setup   ******************
//*******************************************
void setup()

{


  Serial.begin(9600);
  MIDI.begin(MIDI_CHANNEL_OMNI);//ให้ Libraly MIDI เริ่มต้นทำงาน

  //กำหนดขาที่ใช้งานให้เป็นแบบ input pull up โดยใช้ R pull up ภายใน  arduino
  pinMode(2, INPUT_PULLUP ) ;
  pinMode(3, INPUT_PULLUP ) ;
  pinMode(4, INPUT_PULLUP ) ;
  pinMode(5, INPUT_PULLUP ) ;
  pinMode(6, INPUT_PULLUP ) ;
  pinMode(7, INPUT_PULLUP ) ;
  pinMode(8, INPUT_PULLUP ) ;
  pinMode(9, INPUT_PULLUP ) ;
  pinMode(10, INPUT_PULLUP ) ;
  pinMode(11, INPUT_PULLUP ) ;
  pinMode(12, INPUT_PULLUP ) ;
  pinMode(13, INPUT_PULLUP ) ;
  pinMode(14, INPUT_PULLUP ) ;
  pinMode(15, INPUT_PULLUP ) ;
  pinMode(16, INPUT_PULLUP ) ;
  pinMode(17, INPUT_PULLUP ) ;

  pinMode(18, INPUT_PULLUP ) ;
  pinMode(19, INPUT_PULLUP ) ;
  pinMode(20, INPUT_PULLUP ) ;
  pinMode(21, INPUT_PULLUP ) ;
  pinMode(22, INPUT_PULLUP ) ;
  pinMode(23, INPUT_PULLUP ) ;
  pinMode(24, INPUT_PULLUP ) ;
  pinMode(25, INPUT_PULLUP ) ;
  pinMode(28, INPUT_PULLUP ) ;
  pinMode(31, INPUT_PULLUP ) ;
  pinMode(29, INPUT_PULLUP ) ;//ปุ่มกด Encoder#1


  pinMode(30, INPUT_PULLUP ) ;//LOOP IN
  pinMode(32, INPUT_PULLUP ) ;//LOOP OUT
  pinMode(33, INPUT_PULLUP ) ;//PLAY/ II
  pinMode(34, INPUT_PULLUP ) ;//Reset/Play
  pinMode(35, INPUT_PULLUP ) ;//Reset/Stop
  pinMode(36, INPUT_PULLUP ) ;//ปุ่มกด Encoder#2


  pinMode(39, INPUT_PULLUP ) ;//Transition  Effect 1
  pinMode(40, INPUT_PULLUP ) ;//Transition  Effect 1
  pinMode(41, INPUT_PULLUP ) ;//Transition  Effect 1
  pinMode(42, INPUT_PULLUP ) ;//Transition  Effect 1
 // pinMode(43, INPUT_PULLUP ) ;//SET FADE




  pinMode(44, INPUT_PULLUP ) ;//SCREEN ON
  pinMode(45, INPUT_PULLUP ) ;//SCREEN OFF
  pinMode(46, INPUT_PULLUP ) ;//PLAY/ II
  pinMode(47, INPUT_PULLUP ) ;//Reset/Play
  pinMode(48, INPUT_PULLUP ) ;//Reset/Stop



}

//************ จบ void setup   **************


//************void loop   ********************************************************************************************
//********************************************************************************************************************
void loop() {

 MIDI.read();


  //------------------  สวิสทซ์ ปุ่มกด  16 ตัว แสดง ON OFF ใน โปรแกรม MIDI  -------------------------------------------------
  //อ่านปุ่มทุกปุ่มออกมา
  int sensorVal[] = {
    !digitalRead(2), !digitalRead(3),
    !digitalRead(4), !digitalRead(5),
    !digitalRead(6), !digitalRead(7),
    !digitalRead(8), !digitalRead(9),
    !digitalRead(10), !digitalRead(11),
    !digitalRead(12), !digitalRead(13),
    !digitalRead(14), !digitalRead(15),
    !digitalRead(16), !digitalRead(17),

    !digitalRead(18), !digitalRead(19),
    !digitalRead(20), !digitalRead(21),
    !digitalRead(22), !digitalRead(23),
    !digitalRead(24), !digitalRead(25),
    !digitalRead(28), !digitalRead(31),
    !digitalRead(29),

    !digitalRead(30), !digitalRead(32),
    !digitalRead(33), !digitalRead(34),
    !digitalRead(35), !digitalRead(36),


    !digitalRead(39), !digitalRead(40),
    !digitalRead(41), !digitalRead(42),
    


    !digitalRead(44), !digitalRead(45),
    !digitalRead(46), !digitalRead(47),
    !digitalRead(48)


  };

  //ถ้าสถานะปุ่มมีการเปลี่ยนแปลง
  for (int j = 0; j < 42; j++) {
    if (sensorVal[j]  != mem[j]) {
      mem[j] = sensorVal[j];
      // จะมีการส่ง MIDI Even ออกไป
      if (mem[j]) {
        MIDI.sendNoteOn(j + 51, 64, 1);
      } else {
        MIDI.sendNoteOff(j + 1, 64, 1);

      }
    }


    MIDI_Controller.refresh(); //ฟังก์ชันของ Rotary Encoder


  }

  //---------------------------------------------------------------------------------------------------------------------


}

//************************************************ จบ void loop   ********************************************************
//************************************************************************************************************************

ผมอธิบายไม่เก่งนะครับ แต่อยากจะนำเสนอให้ทุกท่านที่ สนใจ ได้ดูรายละเอียดกัน

1 Like
free
hit counter