반응형

 

 

 

아두이노(Arduino)로 프로젝트를 진행하면서 다수의 저전력 센서나 모듈을 사용하다 보면 입력(input) 또는 출력(output) 단자(Pin)가 생각보다 부족하다는 것을 느낄 때가 많습니다. 아두이노 또는 컨트롤러(controller)를 여러 개 사용해서 해결할 수도 있지만 상황에 따라 비효율적일 수 있고 같은 센서를 여러 개 사용할 경우 딱 Pin 수만 더 많았으면... 하는 생각을 하게 됩니다. 이런 경우 사용하는 모듈이 멀티플렉서(Multiplexer, MUX)입니다.

 

'멀티플렉서(Multiplexer) 또는 MUX는 여러 아날로그 또는 디지털 입력 신호 중 하나를 선택하여 선택된 입력을 하나의 라인에 전달하는 장치이다.'라고 위키백과에 정의되어 있는데 이런 기능을 이용하여 controller의 단자를 확장해주는 역할을 할 수 있습니다. 

 

오늘은 아두이노에서 쉽게 사용할 수 있는 멀티플렉서를 소개하고 사용방법에 대해 알아보겠습니다.


1. 멀티플렉서(Multiplexer) CD74HC4067 모듈

 

Arduino Multiplexer CD74HC4067

 아두이노에서 많이 사용하는 멀티플렉서 모듈로 CD74HC4067입니다. C0~C15까지 총 16개까지 확장 가능한 모듈로 시중에서 쉽게 구할 수 있고 사용하기에도 어렵지 않은 것 같습니다.

 

Pin 코드를 설명하면 C0~C15는 입력 또는 출력할 센서 또는 모듈을 연결하는 확장 Pin이며, SIG은 받은 신호를 아두이노에 보내는 연결 Pin입니다. 그리고 S0~S3로 아두이노에서 신호를 보내 CD74HC4067 모듈을 컨트롤합니다.

 

간단한 동작 원리는 앞서 위키백과에 나온 멀티플렉서의 정의대로 여러 아날로그 또는 디지털 입력 신호(C0~C15) 중 하나를 선택하여 선택된 입력을 하나의 라인(SIG->아두이노)에 전달하는데.. 즉 C0~C15에 연결된 센서로 입력되는 데이터들을 하나씩 SIG를 통해 아두이노로 보내는 방식입니다. 이런 전달 방식이기 때문에 동시에 센서 데이터가 입력되는 것이 아니고 아주 짧지만 수 m초(설정 가능) 정도 간격으로 C0부터 C15까지 돌아가면서 데이터를 읽어 들입니다.

 

처음 보시면 이해가 안 가실 수도 있는데 사실 이해 안 하셔도 전혀 문제없습니다 ㅎㅎ 아마 뒤에서 코드를 보시면 이해하기 더 쉬울 거라 생각됩니다. ^^

 

 

 


 

2. 멀티플렉서 CD74HC4067 배선

 

앞서 CD74HC4067 Pin 코드 설명에서 보았듯이 C0~C15는 사용할 센서를 연결하고, S0~S1을 아두이노에서 신호를 보낼 디지털 Pin 8, 9, 10, 11과 차례로 연결합니다(프로그램에서 조정 가능). 저는 아날로그 센서를 사용하여 시험할 예정이라 SIG pin은 아날로그 Pin 0과 연결하는데, 아마 사용하시는 센서에 따라 디지털 신호를 받으시려면 디지털 Pin과 연결하면 됩니다. 마지막으로 VCC와 GND는 각각 아두이노의 5V, GND에 연결합니다. 

 

아두이노(Arduino) 멀티플렉서(multiplexer, MUX) CD74HC4067 모듈 연결

 


 

▼ 같은 제품 구매하시려면 아래 링크!! ▼

 

CD74HC4067 16채널 멀티플렉서 아날로그/디지털 MUX <아두이노 멀티플렉서> : 스토어플랜트

[스토어플랜트] 안녕하세요 스토어플랜트입니다.

smartstore.naver.com

 

 

3. 멀티플렉서 CD74HC4067 프로그램 코딩

 

스케치로 아래와 같이 프로그램을 코딩하여 아두이노에 업로드합니다.

//Mux control pins
int s0 = 8;
int s1 = 9;
int s2 = 10;
int s3 = 11;

//Mux in “SIG” pin
int SIG_pin = 0;

void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);

digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);

Serial.begin(9600);
}

void loop(){

//Loop through and read all 16 values
//Reports back Value at channel 6 is: 346
for(int i = 0; i < 16; i ++){ 
  Serial.print("Value at channel "); 
  Serial.print(i); Serial.print(": "); 
  Serial.println(readMux(i)); 
  delay(1000); 
  } 
  }
  
  int readMux(int channel)  { 
  int controlPin[] = {s0, s1, s2, s3}; 
  int muxChannel[16][4]={ {0,0,0,0},  
  {1,0,0,0}, //channel 1 
  {0,1,0,0}, //channel 2 
  {1,1,0,0}, //channel 3 
  {0,0,1,0}, //channel 4 
  {1,0,1,0}, //channel 5 
  {0,1,1,0}, //channel 6 
  {1,1,1,0}, //channel 7 
  {0,0,0,1}, //channel 8 
  {1,0,0,1}, //channel 9 
  {0,1,0,1}, //channel 10 
  {1,1,0,1}, //channel 11 
  {0,0,1,1}, //channel 12 
  {1,0,1,1}, //channel 13 
  {0,1,1,1}, //channel 14 
  {1,1,1,1} //channel 15 
  }; 
  //loop through the 4 sig 
  for(int i = 0; i < 4; i ++){ 
    digitalWrite(controlPin[i], muxChannel[channel][i]); 
    } 
    //read the value at the SIG pin 
    int val = analogRead(SIG_pin); //return the value 
    return val; 
    } 

 

 

 

프로그램을 간단하게 설명하면 CD74HC4067를 컨트롤하는 S0~S3과 연결된 Pin 8, 9, 10, 11을 pinMode 명령어로 Output 상태로 만듭니다. 그리고 digitalWrite 명령어로 초기 값을 Low로 설정하는데 이때 Low =0, High = 1을 의미합니다.

 

아두이노에서 S0, S1, S2, S3에 신호를 Low(0)과 High(1)로 주면서 Channel 번호를 2진법에 의해 설정됩니다. 예를 들어 Channel 0 = {0, 0, 0, 0} : 2진법으로 0이 됩니다.

Channel 1 = {1, 0, 0, 0} : 2^0에 해당하는 자리에 High(1)로 신호를 주어 1을 표시합니다.

Channel 2 = {0, 1, 0, 0} : 2^1에 해당하는 자리에 High(1)로 신호를 주어 2를 표시합니다.

Channel 3 = {1, 1, 0, 0} : 2^0과 2^1에 해당하는 자리에 High(1)씩 신호를 주어 총 합 3이 되어 3을 표시합니다.

....

Channel 15 = {1, 1, 1, 1} : 1+2+4+8 = 15 표시

 

이런 식으로 각 채널을 표시하고, 이 채널을 For 반복 구문을 통해 하나씩 읽는 로직입니다. 생각보다 가.. 간단하죠?;;;

 

 pinMode 명령어나, digitalWrite 명령어가 자주 나오는데 아두이노에서는 많이 사용하는 명령어라 혹시 처음 접하시면 아래 링크 참조하시면 도움될 듯합니다.

 

아두이노(Arduino) 프로그램 코딩 초급 (pinMode, digitalWrite, if 명령어)

지난 시간 스케치로 프로그램을 코딩할 때 자주 사용되는 꼭 필요한 명령어 몇 가지를 알아보았습니다. IT 비전공자가 프로그램 언어를 기본부터 완전히 이해하면서 배우는 것은 쉬운 일은 아닙니다. 그렇기 때문..

it-g-house.tistory.com

 


 

4. 데이터 확인

 

아두이노와 멀티플렉서 및 사용한 센서들을 연결한 후 스케치를 통해 프로그램을 업로드합니다. 멀티플렉서에 연결된 센서들은 따로 전원이 들어가야 하는 점 확인하세요^^

프로그램 업로드 후 시리얼모니터(Serial Monitor)를 실행하면 아래와 같이 channel 0부터 channel 15까지 연결된 센서의 데이터를 출력합니다. 프로그램에서 delay(1000)로 1초 간격으로 channel 값이 순차적으로 표시되는데 delay를 조절하면 더 짧은 간격으로도 표시 가능합니다.

 

아두이노(Arduino) 멀티플렉서(Multiplexer, MUX) CD74HC4067 모듈 사용하기: 데이터 출력

 

 

 


여기까지 아두이노(Arduino)의 입출력 단자(Input&output pin)를 확장할 수 있는 멀티플렉서(Multiplexer, MUX) CD74HC4067 모듈에 대해 알아보고 사용방법을 알아보았습니다.

 

멀티플렉서를 사용하여 센서의 입력 데이터뿐만 아니라 릴레이(Relay) 같은 스위치나 외부기기를 여러 개 사용할 때도 활용 가능합니다. 기회가 되면 릴레이 16개를 확장해서 활용하는 예시를 포스팅하도록 하겠습니다.

 

오늘도 긴 글 읽어주셔서 감사합니다. 궁금하신 내용 있으면 언제든지 댓글로 남겨주세요^^

 

 

 

 

반응형

+ Recent posts