[잼머 제어하기] 스위치를 이용해 트럼펫 움직이기 1

리틀 잼머 프로 2013. 2. 13. 12:40

* 주의사항 : 이후에 이야기하는 부분들은 정확히 검증된 내용이 아니며, 틀릴 수도 있습니다. 또한, 내용이 정확하더라도 계측이나 개조 과정에서 실수로 인한 역전압이나 과전압, 과전류 등으로 인해 잼머가 손상될 수 있습니다. 그냥 재미로 봐주셨으면 합니다.


--------------------

< 트럼펫 정보 >

갈색(이하 갈) : GND

흰색+갈색(이하 흰갈) : 스피커 검정색

녹색(이하 녹) : 발 (대략 1.65V)

흰색+파란색(이하 흰파) : 사용 안함

파란색(이하 파) : 팔 (대략3.3V)

흰색+녹색(이하 흰녹) : 허리 (대략3.3V)

주황색(이하 주) : 스피커 흰색

흰색+주황색(이하 흰주) : 상시전원 (대략 6V)

--------------------


 이전 글에서 이야기한 C블럭을 간단하게 만들어 보겠습니다. 2개의 스위치가 각각 허리와 팔의 움직임을 담당하도록 하겠습니다.


 우선, 완성된 모습을 보겠습니다. 움직임만 있으며, 소리는 없습니다.


http://youtu.be/1c1OAy7IIow



 전체 모습입니다.



A블럭 : 잼머 본체

B블럭 : 잼머 연주자 (여기서는 트럼펫)

C블럭 : 컨트롤러



 우선, A블럭(본체)에서 나오는 랜 선은 다음 사진과 같이 GND(갈)와 6V(흰주)만 남기고 잘라내야 합니다.






 다음은, C블럭을 좀 더 세분화 하겠습니다.


C-1 : 아두이노

C-2 : 입력 회로

C-3 : 출력 회로




 C블럭을 회로도로 나타내 보겠습니다.






 실제 선 연결은 다음과 같이 합니다.



 그럼, 세분화된 블럭을 살펴보겠습니다.


1. C-1 : 아두이노


 오픈 하드웨어인 아두이노는 여러 가지 버전이 있습니다. 비공식 버전이나 특정 기능만 지원하는 아두이노들은 가격이 좀 더 저렴합니다. 저는 아두이노 공식 보드인 아두이노 UNO R3과 아두이노 Mega 2560(안드로이드 ADK 개발용 버전)을 사용하고 있습니다.

 UNO R3는 32KB의 플래쉬 메모리, 14개의 디지털 I/O 핀, 6개의 아날로그 입력 핀을 가지고 있습니다. 아날로그도 입출력이 되므로 총 20개의 입출력 핀을 가지고 있다고 보시면 됩니다. 이 중, 다른 기능을 사용할 경우, 몇 개는 사용 못합니다.


 잼머가 3개에서 4개의 입력(허리, 팔, 발 등)을 가지므로, 전체를 가동한다면 핀이 약간 모자를 수도 있습니다. 가수나 혼 섹션 등을 연결해야 한다면 모자를 수도 있겠지요. 하지만, 발은 안움직인다거나 추가 연결을 안하고 기본셋만 제어한다면 UNO보드로도 가능할 수 있습니다. 


 Mega 2560(안드로이드 ADK 개발용 버전)은 256KB의 플래쉬 메모리를 가지고 있습니다. UNO의 8배 크기죠. 이 플래쉬 메모리에 프로그래밍한 소스를 올려줍니다. 혹시 제어를 위한 소스코드가 길어지면 UNO의 메모리에는 올리지 못할 수도 있습니다. 디지털 입출력 핀은 54개이고, 아날로그 입력은 16개를 가지고 있습니다. 총 70개의 입출력 핀이 사용 가능합니다.


 Mega 2560에 안드로이드 ADK를 사용 가능하게 한 버전이 있습니다. 안드로이드를 연결하여 아두이노를 제어하도록 하는 것입니다, 안드로이드로 연결할 예정이 없다면 그냥 Mega 2560을 선택하셔도 됩니다.


 표준보드의 또 하나의 장점은, 피시와의 연결이 쉽도록 USB포트를 제공합니다. 이를 통해 아두이노 보드는 피시와 시리얼로 통신합니다. 피시에서 프로그래밍을 하고 이를 컴파일 후에 아두이노에 업로드 하는데, 이를 위해 아두이노와 피시가 통신을 해야 합니다. 표준보드는 그냥 USB 케이블만 연결하면 간단히 됩니다. 표준이 아닌 보드들은 이 통신쪽 모듈을 따로 달아야 할 수도 있습니다.


 이번 글에서는 아두이노 UNO R3 보드를 이용했습니다. Mega 2560을 이용해도 똑같이 동작합니다. ^^


 우선, 아두이노의 기초에 대한 내용입니다. 다음 링크의 글을 보시면, 아두이노를 다루는 법이 나와 있습니다. 


http://robobob.co.kr/51


 링크의 내용처럼 피시와 연결 후 프로그램 업로드가 가능하다면, 첨부한 소스를 아두이노에 업로드 시켜주세요.


 첨부한 소스의 내용은 다음과 같습니다.



TrumpetSample01.ino


    

-------------------

/*

  TrumpetSample01

 */


#define  IN01       9    // 입력1로 사용할 핀 번호

#define  IN02       8    // 입력2로 사용할 핀 번호


#define  OUT01      7    // 출력1로 사용할 핀 번호

#define  OUT02      6    // 출력2로 사용할 핀 번호


// 현재 입력 상태

boolean  gInStateCur01 = false;

boolean  gInStateCur02 = false;


// 이전 입력 상태

boolean  gInStateLast01 = false;

boolean  gInStateLast02 = false;


// 처음 초기화

void setup() {               


  pinMode( IN01, INPUT);      // 9번 핀을 입력모드로 전환

  pinMode( IN02, INPUT);      // 8번 핀을 입력모드로 전환

  digitalWrite( IN01, HIGH ); // 9번 핀에서 기본으로 5V가 나오게 설정한다.

  digitalWrite( IN02, HIGH);  // 8번 핀에서 기본으로 5V가 나오게 설정한다.


  pinMode(OUT01, OUTPUT);     // 7번 핀을 출력모드로 설정

  pinMode(OUT02, OUTPUT);     // 6번 핀을 출력모드로 설정

  digitalWrite(OUT01, LOW);   // 7번 핀에서 0V가 나오도록 설정

  digitalWrite(OUT02, LOW);   // 6번 핀에서 0V가 나오도록 설정


}


// 계속 호출되는 함수

void loop() {

 

  gInStateCur01 = digitalRead( IN01 );  // 9번 핀을 읽는다. 9번핀에 연결된 스위치가 눌러져 있으면 false, 아니면 true가 반환된다.

  gInStateCur02 = digitalRead( IN02 );  // 8번 핀을 읽는다. 9번핀에 연결된 스위치가 눌러져 있으면 false, 아니면 true가 반환된다.


  // 현재 눌러진 상태이고, 백업된 상태가 안눌러진 상태였다면 지금 누른 것이다. 누른 처리를 한다.

  if( gInStateCur01 == false && gInStateLast01 == true )

  {

    digitalWrite(OUT01, HIGH); // 7번 핀에 5V를 공급한다.

  }

  // 현재 안눌러진 상태이고, 백업된 상태가 눌러진 상태였다면 지금 손을 뗀 것이다.

  else if( gInStateCur01 == true && gInStateLast01 == false )

  {

    digitalWrite(OUT01, LOW); // 7번 핀에서 0V가 나오도록 설정

  }


  // 6번 핀도 같은 방식으로 처리

  if( gInStateCur02 == false && gInStateLast02 == true )

  {

    digitalWrite(OUT02, HIGH);

  }

  else if( gInStateCur02 == true && gInStateLast02 == false )

  {

    digitalWrite(OUT02, LOW);

  }


  // 현재 상태를 백업해둔다.

  gInStateLast01 = gInStateCur01;

  gInStateLast02 = gInStateCur02;


}


-------------------


 아두이노의 디지털 핀은 프로그램으로 제어가 가능합니다. 핀을 입력으로 사용하느냐 출력으로 사용하느냐에 대한 설정, 핀에 전압을 공급하느냐의 여부, 입력으로 설정된 핀에 대한 검사등이 가능합니다.


 수많은 핀들 중에서 9번과 8번핀은 입력으로, 7번과 6번은 출력으로 사용할 것입니다. 다른 핀을 사용해도 되지만, 소스를 바꿔 주셔야 합니다.


 pinMode 함수로 핀을 입력으로 사용할지, 출력으로 사용할지 결정합니다. 입력으로 설정한 핀은 digitalRead 함수를 통해 입력값을 얻어올 수 있습니다. 입력핀에 5V가 들어오면 true, 0V가 들어오면 false를 리턴 받습니다. 입력핀에 5V를 걸어놓고 스위치를 GND와 연결하면, 스위치를 안누를 경우 5V가 들어오므로 true, 스위치를 누르면 GND와 연결되어 0V가 되므로 fale를 리턴받도록 했습니다.


 7번과 6번은 출력핀으로, 스위치가 눌러져 있는 동안 5V를 공급하는 역할을 합니다. 9번에 연결된 스위치를 누르면 7번에 5V가 공급되고, 8번에 연결된 스위치를 누르면 6번에 5V가 공급됩니다. 동시에도 가능합니다. 핀에 5V를 공급하는 함수는 digitalWrite입니다.


 다음 글에서는 C-2, C-3의 회로 구성에 대해 이야기 하겠습니다.


설정

트랙백

댓글