손바닥컴퓨터들2014.04.18 00:25

아두이노 혁명과 함께  많은 분들이  아두이노의 가능성을 좀더 넓히려는 시도를 하게되었습니다.

그 노력중의 하나가  USB Host 기능을 추가하여  PC와 같이  USB 마우스나  키보드 등의 USB 기기를 연결하여 작동할수 있도록 하는것이었습니다.   이를 지원하는 USB Host Shield 제품이 만들어졌으며, 이를 지원하는 공개 라이브러리가 발전되기 시작하였습니다.   


이후 구글은 Google IO 2011 행사에서 아두이노와 안드로이드기기의 연결을 지원해주는 Open ADK 를 공개하여 안드로이드 스마트폰 기기를 다양한 외부 기기(아두이노 연계)와 연동할 수 있는 가능성을 열어 줬습니다.  이때 모태가 된 기술이 바로 아두이노의 USB Host 연동 라이브러리입니다.


이후 공식 아두이노팀은 아두이노에 USB Host Shield 기능을 기본으로 내장한 Arduino ADK 제품을 발표하였습니다.

이를 통해 UNO 보드에 별도의 USB Host Shield 를 장착해야하는 불편이 없어졌으며,  ADK 보드를 사용하여 좀더 편리하게  공개된 라이브러리를 활용하여  USB 마우스나 키보드, 일부 Bluetooth Dongle 등과 연동하는 작품 제작이 가능해졌습니다.


한마디로 무궁무진한 가능성을 보유한 아두이노 ADK 보드입니다.


하지만  많은 분들에겐 왠지  어렵고  가까이하기엔 뭔 ADK 보드이며,

자칫 잘못하면 1주일을 헤매도 뭘 어떻게 사용해야하는지 답이 안나오는 ADK 보드이기도 합니다.


저 또한 많은 것을 알지는 못하지만,  직접 테스트해본 결과 아두이노에 대해 어느정도 경험이 있으신 분들이라면 많이 어렵지 않게 기본적인 사용이 가능한것으로 판단되어  미루고 미뤄왔던 ADK 보드의 기초 사용법을 적어봅니다. 


자,  시작해보십니다.


Mega ADK 보들 사용을 하시려면 일단  아래의 공식 제품소개 페이지를 참고하시면됩니다.

http://arduino.cc/en/Main/ArduinoBoardMegaADK?from=Main.ArduinoBoardADK


하지만 장황하고 혼돈되어 뭘 봐야할지 모르겠습니다.


2011년 처음 ADK보드가 나왔을때는 google ADK 공식 페이지에서  관련 SDK 와 함께 아두이노 예제소스가 제공되었습니다.

하지만  최근에 일반 USB_HOST_SHIELD 라이브러리가 보강되어  ADK보드에서도 조금만 손보면 간단히 사용 가능하게 되었으며, 구글 IO Open ADK 관련 페이지를 참고할 필요가 없게 되었습니다. 아래의 사이트에서 해당 파일을 다운로드하시면  필요한 라이브러리와 예제소스를 한번에 받으실 수 있습니다.


https://github.com/felis/USB_Host_Shield_2.0



1. 라이브러리와 예제소스가 포함된 파일을 다운로드 하세요


위 사이트에서 아래 파일을 받으시면 됩니다.

https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip



2. 라이브러리 설치 및 정상 설치 여부 확인


자, 이제 라이브러리부터 설치하기위해 다운로드한 파일을 압축해제합니다.

압축해제된 파일이 폴더에 들어있는데요


보통 USB_Host_Shield_2.0-master 라는 폴더명으로 압축이 풀리게됩니다.

아마도 대부분 이 폴더속에 동일명으로 또 하나의 폴더가 보일겁니다.


그 폴더 속에  *.h 파일과  *.cpp 파일이 보이고  examples라는 디렉토리가 보일겁니다.

이 폴더가 바로 라이브러리 폴더입니다.

이 폴더의 명칭을  USB_Host_Shield_2로 변경하시기 바랍니다. 

(현재의 제목으로는 특수문자가 포함되어 있어 라이브러리 설치시 오류가 발생합니다.)



이제 아두이노 SW를 엽니다.

현재 가장 기본으로 사용되는 아두이노 SW 1.0.5 버전을 기준으로 소개해드리겠습니다.

1.0버전 이전에는 직접 설치할 라이브러리 폴더를 아두이노 라이브러리 폴더에 복사해 넣었었는데요

최근 SW 에서는 라이브러리 설치를 위해 파일 복사를 할 필요가 없고,


메뉴에서 스케치 > 라이브러리 가져오기... >  위에서 폴더명을 변경해둔 "USB_Host_Shield_2" 폴더를 선택을 해주시면 자동 설치됩니다.


이후에 꼭 SW를 재 시작해주셔야합니다.

재시작 이후, 정상 설치 여부는 예제가 등록되었는지 확인하면됩니다.


메뉴에서 파일 > 예제 > USB_HOST_SHIELD_2 라는 폴더가 보이면 일단 설치완료입니다.



3. 라이브러리 및 예제사용을 위한 안내문 읽기


그리고 아래의 페이지에 있는 안내문을 꼭! 꼭! 꼭! 읽어보시기 바랍니다.

http://felis.github.io/USB_Host_Shield_2.0/


대부분의 공개 라이브러리나 예제소스들은 다운로드페이지나  소스코드 폴더에 

날좀 보셔(README)정보를 함께 제공합니다만,,,,

많은분들이 제작자가 힘들고도 친절하게 적어놓은 사용 안내문을 잘 살피지 않는것 같습니다.

하지만, 종종  "날좀 보셔" 를 안보실 경우  낭패를 보시게 되므로 꼭 읽어보시기 바랍니다.


즉, 위 라이브러리는  여러종류의 보드나 제품들에서도 사용할 수 있기때문에  사용자의 환경에 따라 수정이 필요한경우가 있으며, 이에 대한 정보를 README 에 안내하게되므로  꼭 참고하셔야합니다.


실제로,   Mega ADK 보드의 경우, 위 힌트글을 안보시고  아두이노 1.0.5에서 사용하시면  작동이 안되게됩니다.

안타까운건 이경우도  컴파일 및 업로드는 정상적으로 된다는 것입니다.


하지만 정상 작동이 안되게되고, 며칠을 고민해도 작동이 안되게됩니다.

그리곤 결국 보드 고장을 의심하시고,  구매처에 반품을 요청하게 됩니다. 

(정말 가슴 아픈 상황입니다 ^^;;)


해당 안내글을 참고하시면,  Mega ADK보드를 아두이노 SW 1.0.5 버전에서 사용하실경우

라이브러리 폴더에 있는 settings.h 파일에서 Mega ADK 관련 define문을 수정해야 함을 알수 있습니다.


4.  자신의 환경에 맞게 라이브러리 수정하기


아두이노 라이브러리 폴더에 설치된 해당 라이브러리 폴더속에 있는 settings.h 파일을 수정합니다.

(주의.  최초에 다운로드 한 라이브러리파일속에 있는 파일을 수정하는것이 아닙니다.)


아두이노 라이브러리 폴더의 위치는  메뉴에서 파일 > 환경설정 >"스케치북 위치" 를 보시면 됩니다.

윈도우 탐색기로 해당폴더를 찾으셔서 그속에 있는 Arduino 폴더내에 Libraries 폴더가 있습니다.

이곳에 USB_Host_Shield_2 폴더가 있으며 그 안에서 settings.h  파일을 열어서 아래의 항목을 수정해주시면 됩니다.

(단, 아두이노 Due 등의 보드 지원을 위한 아두이노 SW 1.5.5 이상을 사용시엔 수정을 안해도 된다고 안내되어있습니다.)


/* Set this to 1 if you are using an Arduino Mega ADK board with MAX3421e built-in */


아래의 문장을

#define USE_UHS_MEGA_ADK 0 // If you are using Arduino 1.5.5 or newer there is no need to do this manually


아래와 같이 숫자 0만 1로 변경하시면됩니다.

#define USE_UHS_MEGA_ADK 1 // If you are using Arduino 1.5.5 or newer there is no need to do this manually


10분도 안걸리는 참 간단한 작업이지만, 이 작업을 안하시면  며칠을 노력하셔도 제대로 작동이 안됩니다.


자, 이제  본격적으로 테스트를 해봅시다.  



1부.  ADK보드에 USB 마우스 키보드를 연결하여 테스트 해보기



자, 이제 대부분 이미 보유하고 계신 장비로도 쉽게 테스트가 가능한 예제를 실행해보겠습니다.

가령 아래의 예제들은 대부분의 USB 마우스나 USB 키보드로 테스트 가능합니다.


파일 > 예제 > HID > USBHID_desc     (USB 기기 디스크립션 확인 예제, 일반 마우스로도 테스트 가능)

파일 > 예제 > HID > USBHIDBootMouse (USB 마우스 예제)  

파일 > 예제 > HID > USBHIDBootKbd   (USB 키보드 예제)


일단,  Mouse 예제를 해보겠습니다.


1. 예제 불러오고 컴파일 및 업로딩


파일 > 예제 > HID > USBHIDBootMouse 예제를 컴파일하시고  업로드 하시면 됩니다. 

컴파일중 오류가 난다면  라이브러리를 잘못 설치하셨거나,

기존에 설치하셨던 라이브러리와 충돌하는경우로 여겨집니다.


2. 시리얼 모니터창 열고 세팅하기


정상 컴파일 및 업로딩이 되셨다면, 시리얼 모니터창을 열어주고 통신속도를 115200으로 맞춥니다.

컴파일 및 업로딩을 위한 보드설정, 통신포트설정 등에 대해 모르실 경우 아두이노 기초실습을 먼저해주시기 바랍니다.


3. 초기 메시지 확인

모니터창에   Start 라는 메시지가 뜹니다.  ADK 보드가  준비가 되었으니  USB 기기를 연결해도 좋다는 신호입니다.


4. USB 기기 연결


자 이제  ADK 보드의 USB Host 포트에  USB 마우스를 단자를 삽입합니다.


이후, 마우스를 움직이거나  버튼을 누르면 대응되는 정보값이 문자로 표기됩니다. (와우~ 활용도가 매우 높은 예제입니다!)

키보드 예제도 마찬가지 방법으로 시도해보시기 바랍니다.



ADK 보드에 USB 마우스를 연결하여  마우스 드래그 및 버튼 눌림 정보를 확인할 수 있습니다.



우측의 모니터창을 보시면  좌표이동 상태와  버튼 눌림 정보가 보입니다.



 HID_Desc 예제의 경우도  연결된 기기의 상태정보를 보여줍니다. 

가령 USB 마우스를 연결할경우 위와 같은 정보를 출력합니다.


이밖에도 다양한 예제가 있습니다만,  해당 예제들은 부가 장비가 필요하거나 좀더 난해하므로  여러분이 직접 공부하셔서 도전해보시기 바랍니다. 


2부.  Open ADK 보드와 안드로이드 폰의 연동 테스트해보기 

 

시작하기 전에,

Open ADK는 일부 안드로이드 스마트폰에서만 지원되므로 호환되지 않는 스마트폰에서는 테스트가 불가합니다.

저는 Nexus 5 (안드로이드의 최신 레퍼런스 폰)로 테스트 해봤습니다.  참고로, ADK가 지원되지 않는 폰의 경우도 기기 인식 및 앱설치까지는 가능할 수 있지만, 실제로 앱을 구동할때 오류가 발생되고 멈추게됩니다.  


이제는 Open ADK 예제 중  별도의 부품이 필요없는 가장 단순한 LED 켜고 끄기 예제를 해보겠습니다.

즉, ADK 보드에 기본장착된 LED를  안드로이드폰에서 실행되는 앱을 통해 켜고 끄는 예제입니다.



1. 예제 컴파일 및 업로딩


아래의 예제를 선택 후 컴파일 및 업로딩 합니다.

파일 > 예제 > USB_HOST_SHIELD_2 > ADK > ArduinoBlinkLED  


2. 스마트폰 연결

자, 이제 Nexus 5 폰이 연결된 USB 케이블을 USB Host 포트에 삽입합니다.


호환되는 기기이고 특별히 해당 기능을 막아두지 않았다면

아래와 같은 Open ADK 연결 안내문이 뜨게되며,  해당 기기와 연동에 필요한 안드로이드 앱이 필요하다는 안내와 함께, 해당 사이트에서 다운로드 할지 여부를 확인하게 됩니다.  


ADK 보드를 연결하면  엑세서리로 인식되며 연동될 앱이 없을경우 다운로드 할 수 있도록 안내해줍니다.  보기를 누르고 다운로드를 하시면됩니다.



3. 관련 앱의 다운로드




다운로드 확인 하시고,




다운로드가 완료되면  실행시켜줍니다.



4. 앱의 설치 실행



특별한 권한이 필요없는 안전한 앱입니다.  설치해줍니다.




5. 앱 사용 허용


해당 기기가 연결되때마다 이 앱을 사용할것인지 확인해줍니다.  이후 해당 기기가 연결될 때마다 해당 앱이 자동으로 실행되게 됩니다.  최초 앱 설치 후엔 자동 인식을 위해 ADK보드를 재 장착해야할 수 도 있습니다.




6. 앱의 테스트


앱이 시작되면 아래와 같이 단순한 버튼이 뜨며, 그하단에 Connected 라는 메시지가 보입니다.



버튼을 눌러주시면,  ADK 보드에 내장된 LED 가 켜지는 것을 확인할 수 있습니다. (초록색 원)






이상으로 기본적인  ADK 보드 사용안내를 마칩니다.  예제를 참고하셔서 멋진 응용작품 만드시기 바랍니다!


테스트에 사용된 제품들은 아래와 같습니다.


1부 준비물

1. 아두이노 ADK 보드 (제품 구입처 링크)

2. ADK 보드 프로그래밍 용 USB 케이블 ( 제품 구입처 링크)

3. USB 마우스 또는 USB키보드 ( 대부분 보유중이신 제품 활용 가능)


2부 준비물

Open ADK 가 지원되는 안드로이드 폰과 micro USB 케이블 

( 갤럭시 S2,  Nexus 5 등 일부 기기만 지원되며, 대부분의 다른 안드로이드 기기는 지원되지 않습니다.) 




저작자 표시 비영리 변경 금지
신고
Posted by 로보밥 로보밥

댓글을 달아 주세요

  1. 아두보거스

    안드로이폰 중 일부기기만 지원되는 특별한 이유가 있나요?

    저는 베가 레이서 쓰고 있는데,
    잘 안되네요.

    디버깅 모드가 됬다가 연결이 끊어졌다가 반복입니다.

    해결책이 없을까요?

    2014.05.03 00:15 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • ADK 지원은 구글에서 권장하는 사항일뿐 실제 적용 여부는 스마트폰 제조사가 결정하게됩니다. 제조사 입장에선 아직 별 이득이 없으니 지원하지않는 상황인것 같습니다.

      2014.05.16 02:34 신고 [ ADDR : EDIT/ DEL ]
  2. 아두이노초보

    노트2인데 되나요 지금 그림과 같이 했는데 스마트폰에서 충전만 되지 usb연결되었다는 표시가 안뜨네요..노트2가 문제가 아니라면 보드에 있는 max3421에 문제가 있는건가요?

    2014.05.22 15:56 신고 [ ADDR : EDIT/ DEL : REPLY ]
  3. 강철민

    아두이노 adk 제품도 레오나르도 처럼 주변기기(마우스, 키보드)로 인식하는 건가요??

    2014.09.22 06:34 신고 [ ADDR : EDIT/ DEL : REPLY ]
  4. 볼레로

    안녕하세요.

    Arduino Mega ADK R3 보드를 구매하였는데요.

    아무리해도 마우스가 붙지를 않네요.
    settings.h 에서

    #define USE_UHS_MEGA_ADK 1

    로 바꾸어도 안되고,

    #define ENABLE_UHS_DEBUGGING 1
    을 해도 안되네요.

    보드는 잡히고 blink 예제같은 것도 되는데, 마우스 끼우면 광마우스의 전원도 들어가지 않습니다.

    혹시 뭘 더 봐야 할까요?

    감사합니다.

    2014.12.22 23:02 신고 [ ADDR : EDIT/ DEL : REPLY ]

본 글을 통해 최근 동영상을 통해 알려드렸던 DIY 전자악기 만드는 법을 안내해 드리고자 합니다.

하드웨어 제작은  반제품의 쉴드를 아두이노에 결합하고 스위치를 몇개 장착하는게 전부이므로 매우 쉽습니다.  하지만 프로그래밍을 통해 제어를 하려면 MIDI 프로토콜을 이해해야 하는데 인터넷에 공개된 관련 글을 봐도 곧바로 이해하고 활용하기 쉽지 않았습니다.  결국, 정확한 신호 파악을위해 직접 마스터 키보드를 구입하여;;  건반을 누를때, 뗄때, 악기가 변경될때, 기타 콘트롤시 어떤 MIDI 신호가 출력되는지 분석을 한 후에야 대충 이해가 가더군요,,  하지만 많은 분들이 그럴 여유가 없으시죠;;;

우선은 이미 제조사에서 일련의 내장된 악기음을 순서대로 반복해주는 정도의 예제가 있으므로 참고가 되실 겁니다.
하지만, 위 소스만으로는 응용이 어려우신 분들도 많으시므로 실제 스위치(건반대응)로 연결하여 기초적인 악기를 구현한 예제(연결방법 + 소스코드)를 소개드리오니 참고하시기 바랍니다.  여러분의 좀더 멋진 DIY 악기 개발에 작으나마 도움이 되었으면 합니다

추가사항.  현재 화면상의 소스코드는 Sketch 0022 버전에서 테스트된 소스입니다.  최신 아두이노 개발환경(Arduino 1.0)용 소스코드도 첨부파일에 링크되어있으니 참고하시기 바랍니다.  첨부된 파일2개는 동일한 기능 두가지 버전입니다.)

.  -로보밥-




준비물

하드웨어 준비

1. 재적층 가능 해더셋을 MIDI 악기쉴드에 납땜합니다. 여분의 헤더핀들을 아두이노에 결합 후 재적층 가능 헤더셋을 뒤집어 꽂은 상태로 납땜을 하면 수직(90도)상태로 납땜하기 용이해 집니다.

2. 아래의 이미지를 참고하셔서 MIDI 악기 쉴드에 아래와 같은 방식으로 스위치를 장착합니다. 버튼 3개만 보이지만 나머지 버튼들도 동일한 방법으로 연결하면 됩니다.  어떤 핀에 연결해야하는지는 소스코드에 나오는 버튼별 핀번호 정의부분을 보시면 됩니다.  싱겁게도 회로 연결 작업은 이것으로 끝입니다. ( 아직 MIDI쉴드를 아두이노에 장착하지 마세요!)



아두이노 프로그래밍 준비작업

1. 아두이노에 내장된 기존 프로그램이 장착된 하드웨어와 맞지 않는 경우에 대비하기위해 첫프로그래밍시엔 쉴드를 제거한 상태에서 프로그래밍(업로딩) 하실 것을 권장드립니다.

2. 컴파일전에 NewSoftSerial 라이브러리를 설치 하셔야합니다. 아두이노 프로그래밍 방법 및 라이브러리 설치방법등을 모르시는 분들은 아두이노 해당 기초 학습을 완료 후 시도하시기 바랍니다.

3. 소스코드를 웹화면에서 복사하여 사용시 일부 문자가 누락되는 경우가 있습니다. 하단에 링크된 첨부파일(MusicArtRobot.pde)을 다운로드 받으셔서 사용하실것을 권장드립니다.


DIY 전자 악기 ( Music Art Robot )소스코드


/*
 Music Art Robot v0.1(2012.Feb.4)
 ---------------------------------------------------------
 아두이노 + MIDI악기쉴드 이용한 DIY 건반악기 예제소스
 ---------------------------------------------------------
 http://ArtRobot.co.kr 
 http://RoboBob.co.kr
 재배포시, 위 URL 유지부탁드리고요, 자유롭게 사용해주세요!
 ---------------------------------------------------------
 
 아두이노 D3,D4핀은 MIDI악기쉴드 제어용이므로 다른용도로 사용하지 마세요
 아두이노 D3핀을 통해 MIDI악기쉴드에 MIDI신호를 전송합니다.(NewSerailSoft 라이브러리 필요함)
 D2핀도 SoftSerial 수신용으로 선언은됐지만, 재세팅하고 버튼 입력용으로 사용됩니다.

 버튼1 ~ 8 : 도/레/미/파/솔/라/시/도  임의 note(음계)로 변경하시면 됩니다.
 버튼9: 다른 악기 선택(현재 악기번호 + 1)  0~127
 버튼10: 다른 악기 선택(현재 악기번호 - 1)  0~127
 버튼11: 악기를 드럼셋으로 설정.
 버튼12: defaultPatch 에 정의된 악기로 변경

 외부스위치 연결방법:
 버튼의 양쪽선 중 한쪽은 아두이노 해당 핀에 연결하고, 나머지 한쪽은 GND에 공통 연결하면 끝.
 
 참고사항, 전원을 켠 후 소리가 나지않을 경우 리셋버튼을 눌러서 초기화 해주면 작동됩니다.


 MIDI악기쉴드에 대한 아래의 영문정보도 참고하세요.
 
 This code works with the VS1053 Breakout Board and controls the VS1053 in what is called Real Time MIDI mode.
 To get the VS1053 into RT MIDI mode, power up the VS1053 breakout board with GPIO0 tied low, GPIO1 tied high.
 
 I use the NewSoftSerial library to send out the MIDI serial at 31250bps. This allows me to print regular messages
 for debugging to the terminal window. This helped me out a ton.
 
 5V : VS1053 VCC
 GND : VS1053 GND
 D3 (SoftSerial TX) : VS1053 RX
 D4 : VS1053 RESET
 
 Attach a headphone breakout board to the VS1053:
 VS1053 LEFT : TSH
 VS1053 RIGHT : RSH
 VS1053 GBUF : GND
 
 When in the drum bank (0x78), there are not different instruments, only different notes.
 To play the different sounds, select an instrument # like 5, then play notes 27 to 87.
 
 To play "Sticks" (31):
 talkMIDI(0xB0, 0, 0x78); //Bank select: drums
 talkMIDI(0xC0, 5, 0); //Set instrument number
 //Play note on channel 1 (0x90), some note value (note), middle velocity (60):
 noteOn(0, 31, 60);
 
 */
 
#include <NewSoftSerial.h>
#define btn1  11    // 버튼1의 아두이노 핀번호 정의
#define btn2  10    // 버튼2의 아두이노 핀번호 정의
#define btn3  9        // 버튼3의 아두이노 핀번호 정의
#define btn4  8        // 버튼4의 아두이노 핀번호 정의
#define btn5  7        // 버튼5의 아두이노 핀번호 정의
#define btn6  6        // 버튼6의 아두이노 핀번호 정의
#define btn7  5   // 버튼7의 아두이노 핀번호 정의
// 3:midi rx , 4:midi reset  아두이노 핀 3번 4번은 이미 사용중
#define btn8  2   // 버튼8의 아두이노 핀번호 정의
                  //(SoftSerial에서 Rx핀으로 선언되지만 재 세팅 후 버튼용으로 사용)
#define btn9 A5   // 버튼9의 아두이노 핀번호 정의
#define btn10 A4  // 버튼10의 아두이노 핀번호 정의
#define btn11 A3  // 버튼11의 아두이노 핀번호 정의
#define btn12 A2  // 버튼12의 아두이노 핀번호 정의

#define defaultPatch 15 //악기 초기화 버튼 설정 악기번호

NewSoftSerial mySerial(2, 3); //SW시리얼핀 정의 D3이 MIDI신호 전송용,  D2는 미사용

byte note = 0; //The MIDI연주될 note(음계)
byte resetMIDI = 4; // VS1053 Reset용 핀
byte ledPin = 13; //MIDI 트래픽 표시용 LED
 
boolean bs1 = false;  // 버튼1의 현재상태(눌림 or 안눌림)
boolean bs2 = false;  // 이하, 위와 유사
boolean bs3 = false;
boolean bs4 = false;
boolean bs5 = false;
boolean bs6 = false;
boolean bs7 = false;
boolean bs8 = false;
boolean bs9 = false;
boolean bs10 = false;
boolean bs11 = false;
boolean bs12 = false;

boolean br1;  // 버튼1 상태 확인용 입력값 임시저장용
boolean br2;  // 이하, 위와 유사
boolean br3;
boolean br4;
boolean br5;
boolean br6;
boolean br7;
boolean br8;
boolean br9;
boolean br10;
boolean br11;
boolean br12;

int patch = 0; //악기 대응, 연주될 악기 종류 (0~127: 기본 128 가지 선택가능)

int bn1 = 60; //버튼1의  note(음계)  가령 "도"  0~127까지 지정가능 (정확한 음계 설정은 MIDI관련정보참고)
int bn2 = 62; //버튼2의  note(음계)  가령 "레"
int bn3 = 64; //버튼3의  note(음계)  가령 "미"
int bn4 = 65; //버튼4의  note(음계)  가령 "파"
int bn5 = 67; //버튼5의  note(음계)  가령 "솔"
int bn6 = 69; //버튼6의  note(음계)  가령 "라"
int bn7 = 71; //버튼7의  note(음계)  가령 "시"
int bn8 = 72; //버튼8의  note(음계)  가령 "도~"

byte byteData;

void setup() {
  Serial.begin(31250);

  //Setup soft serial for MIDI control
  mySerial.begin(31250);
//  mySerial2.begin(57600);
 
  //Reset the VS1053
  pinMode(resetMIDI, OUTPUT);
  digitalWrite(resetMIDI, LOW);
  delay(100);
  digitalWrite(resetMIDI, HIGH);
  delay(100);
 
  pinMode( btn1, INPUT);      // 버튼1 입력용 핀모드를  입력모드로 전환
  digitalWrite( btn1, HIGH);  // 내부 PullUp 설정, 스위치의 나머지 한선은 GND에 물리면 됩니다.(초간단)

  pinMode( btn2, INPUT);      // 이하, 위와 유사
  digitalWrite( btn2, HIGH);
 
  pinMode( btn3, INPUT);
  digitalWrite( btn3, HIGH);
  pinMode( btn4, INPUT);
  digitalWrite( btn4, HIGH);
  pinMode( btn5, INPUT);
  digitalWrite( btn5, HIGH);
  pinMode( btn6, INPUT);
  digitalWrite( btn6, HIGH);
  pinMode( btn7, INPUT);
  digitalWrite( btn7, HIGH);
  pinMode( btn8, INPUT);
  digitalWrite( btn8, HIGH);
 
  pinMode( btn9, INPUT);
  digitalWrite( btn9, HIGH);
  pinMode( btn10, INPUT);
  digitalWrite( btn10, HIGH);
  pinMode( btn11, INPUT);
  digitalWrite( btn11, HIGH); 
  pinMode( btn12, INPUT);
  digitalWrite( btn12, HIGH); 

}

void loop() {
    br1 = digitalRead(btn1);
    br2 = digitalRead(btn2);
    br3 = digitalRead(btn3);
    br4 = digitalRead(btn4);
    br5 = digitalRead(btn5);
    br6 = digitalRead(btn6);
    br7 = digitalRead(btn7);
    br8 = digitalRead(btn8);
    br9 = digitalRead(btn9);
    br10 = digitalRead(btn10);
    br11 = digitalRead(btn11);
    br12 = digitalRead(btn12);   
   
   if( !bs1 && !br1 ){
     noteOn(0, bn1,100);
     bs1 = true;
   }else if(bs1 && br1){
     noteOff(0, bn1,0);  
     bs1 = false;
   }
   if( !bs2 && !br2 ){
     noteOn(0, bn2,100);
     bs2 = true;
   }else if(bs2 && br2){
     noteOff(0, bn2,0);  

     bs2 = false;
   }  
   if( !bs3 && !br3 ){
     noteOn(0, bn3,100);
     bs3 = true;
   }else if(bs3 && br3){
     noteOff(0, bn3,0);  
     bs3 = false;
   }
   if( !bs4 && !br4 ){
     noteOn(0, bn4,100);
     bs4 = true;
   }else if(bs4 && br4){
     noteOff(0, bn4,0);  
     bs4 = false;
   }
   if( !bs5 && !br5 ){
     noteOn(0, bn5,100);
     bs5 = true;
   }else if(bs5 && br5){
     noteOff(0, bn5,0);  
     bs5 = false;
   }  
   if( !bs6 && !br6 ){
     noteOn(0, bn6,100);
     bs6 = true;
   }else if(bs6 && br6){
     noteOff(0, bn6,0);  
     bs6 = false;
   }  
  
   if( !bs7 && !br7 ){
     noteOn(0, bn7,100);
     bs7 = true;
   }else if(bs7 && br7){
     noteOff(0, bn7,0);  
     bs7 = false;
   }  
   if( !bs8 && !br8 ){
     noteOn(0, bn8,100);
     bs8 = true;
   }else if(bs8 && br8){
     noteOff(0, bn8,0);  
     bs8 = false;
   }  
  
   if( !bs9 && !br9 ){ //patch up (max:127)
     patch++;
     if(patch >127) patch = 0;
     talkMIDI(0xc0, patch, 0);    
     bs9 = true;
   }else if(bs9 && br9){
     bs9 = false;
   }  
   if( !bs10 && !br10 ){ //patch down (min:0)
     patch--;
     if(patch < 0) patch = 127;
     talkMIDI(0xc0, patch, 0);      
     bs10 = true;
   }else if(bs10 && br10){
     bs10 = false;
   }  
  
   if( !bs11 && !br11 ){
     //bank 0x78(drum)
     talkMIDI(0xb0, 0, 0x78);
     talkMIDI(0xb0,20, 0);
     talkMIDI(0xc0, patch, 0);    
     bs11 = true;
   }else if(bs11 && br11){
     bs11 = false;
   }  
  
   if( !bs12 && !br12 ){
     //bank MSB 0, default instruments
     patch = defaultPatch;
     talkMIDI(0xb0, 0, 0);
     talkMIDI(0xb0,20, 0);
     talkMIDI(0xc0, patch, 0);      
     bs12 = true;
   }else if(bs12 && br12){
     bs12 = false;
   }  
           

  //*************** MIDI LOOPBACK ******************//
  if(Serial.available() > 0)
  {
    byteData =  Serial.read();
    mySerial.print(byteData, BYTE);
  } 
    

}

//Send a MIDI note-on message.  Like pressing a piano key
//channel ranges from 0-15
void noteOn(byte channel, byte note, byte attack_velocity) {
  talkMIDI( (0x90 | channel), note, attack_velocity);
}

//Send a MIDI note-off message.  Like releasing a piano key
void noteOff(byte channel, byte note, byte release_velocity) {
  talkMIDI( (0x80 | channel), note, release_velocity);
}

//Plays a MIDI note. Doesn't check to see that cmd is greater than 127, or that data values are less than 127
void talkMIDI(byte cmd, byte data1, byte data2) {
  digitalWrite(ledPin, HIGH);
  mySerial.print(cmd, BYTE);
  mySerial.print(data1, BYTE);

  //Some commands only have one data byte. All cmds less than 0xBn have 2 data bytes
  //(sort of: http://253.ccarh.org/handout/midiprotocol/)
  if( (cmd & 0xF0) <= 0xB0)
    mySerial.print(data2, BYTE);

  digitalWrite(ledPin, LOW);
}





소스코드 파일 다운로드:
(순서대로 스케치 구버전용 pde 파일, 아두이노 1.0 포팅된 ino 소스)

MusicArtRobot.pde

MusicArtRobot10.ino



후기
MIDI 용어문제:  관련 용어 파악이 어려운것 같습니다. 가령 악기와 대응되는 용어만 instrument, patch, program 이 있네요.

아두이노 1.0용 소스 추가 안내. 2012년 5월 30일
많은분들이 Arduino 1.0 스케치용으로 포팅된 소스를 요청하셨는데요  변환된 파일을 이제야 올려드렸습니다. 2번째 첨부파일을 참고하시기 바랍니다.  바뀐것이라곤   NewSoftSerial.h 대신  기본제공되는 시리얼 라이브러리를 사용하기위해  SoftwareSerial.h 헤더선언을 변경한것과   Serial.print( val, BYTE)  함수를  Serial.write( val ) 로 변경한것 뿐입니다.  어렵지 않으니 직접 한번 수정(포팅)해보시고 성취감을 맛보시는것도 좋으실 것 같습니다.


관련자료 링크
http://www.midi.org/aboutmidi/tutorials.php (해당페이지에 pdf 문서 추천)
http://253.ccarh.org/handout/midiprotocol/



저작자 표시 비영리 변경 금지
신고
Posted by 로보밥 로보밥

댓글을 달아 주세요

  1. Mr.kim

    매번 상세 설명 감사드리며 새로운 아이디어 창작에 많은 도움이 되고 있습니다^^
    질문 한가지 하겠습니다.
    NewSoftSerial 라이브러리를 설치 후 예제소스 오픈 및 컴파일 실행하면 이런 메세지가 뜹니다.
    As of Arduino 1.0, the 'BYTE' keyword is no longer supported.
    Please use Serial.write() instead.

    아직 프로그래밍은 문외한이라 잘모르겠네요.
    아두이노 프로그램 설치 후 COM포트설정 및 제품선택은 했구요...
    실습예제로 LED 점멸확인은 해봤습니다.
    공개 해 주신 MusicArtbot.ped(소스코드파일)을 수정을 해야되나요?!
    답변 부탁드리겠습니다^^

    2012.02.07 15:46 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 안녕하세요~
      제경우 아두이노 개발환경을 구형(스케치 022)으로 사용하고있어서 최근 Arduino 1.0개발환경에서 일부 변경된 구문과 맞지 않는것 같습니다. 일단은 구버젼의 스케치를 사용하시거나 새버전에 맞도록 수정하셔서 사용하셔야하겠네요..
      참고링크:http://blog.makezine.com/2011/12/01/arduino-1-0-is-out-heres-what-you-need-to-know/

      당장은 아니지만 저도 Arduino1.0용으로 소스를 수정하면 추가 등록하도록 하겠습니다. 알려주셔서 감사합니다. ^^

      2012.02.07 18:05 신고 [ ADDR : EDIT/ DEL ]
  2. dafwefew

    Arduino 1.0 버전으로 소스코드파일좀 알려주실수있나요?

    2012.05.27 11:25 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 아두이노1.0에서 사용가능한 포팅된 소스코드를 첨부파일에 링크해드렸습니다. 참고하시기 바랍니다.

      2012.05.30 17:07 신고 [ ADDR : EDIT/ DEL ]
  3. 코마린

    안녕하세요 저도 동영상처럼 VS1053을 가지고 미디음을 출력하려고 합니다. 데이터시트를 보니까 기본 내장된 미디음이 있는것 같은데 미디음에 대한 설명이 별로 없는것 같네요. 동영상에서 출력하는 미디음이 vs1053에서 제공하는 것을 그대로 출력하신것인지 아니면 미디음 데이터를 vs1053으로 전송해서 음을 출력하신 것인지 궁금합니다.

    2012.10.09 08:35 신고 [ ADDR : EDIT/ DEL : REPLY ]
  4. 양창원

    저기 버튼이 뭐가 몇번인지 알수있을까요?? 키트랑 연결하려니까 선이잘안보여서 ㅠ.ㅠ
    제가완전초보라서 사진보고 연결중이거든요

    2013.05.16 16:30 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 스위치의 2개선 중 하나는 해당 아두이노 핀에, 나머지 하나는 GND에 연결하시면됩니다. 모든 버튼이 동일합니다. 기능별 사용되는 아두이노 핀번호는 소스코드에 나와있습니다.

      2013.05.23 09:42 신고 [ ADDR : EDIT/ DEL ]
  5. 피아노

    주파수를 127까지 제한 되어 있는데 여기서 더 올리지 못하나요 ?

    2013.11.08 09:34 신고 [ ADDR : EDIT/ DEL : REPLY ]
  6. creasento

    음계는 1음계가 끝인가요? 다른 피아노처럼 여러 음계는 어떻게 하나요?

    2014.02.09 20:41 신고 [ ADDR : EDIT/ DEL : REPLY ]
  7. 레이저하프

    로보밥님,, 소스코드는 잘 보았습니다. 오래된 글인데
    저는 지금 레이저를 이용해 Cds 수광소자에서 아날로그값을 받아들이고
    손으로 가리키어 빛을 막았을때 midi악기쉴드로 소리가 나는 작품을 만드려하고있습니다.
    이 소스코드는 boolean 이라고 0,1인 디지털로 값을 받아들이는데
    레이저 하프 같은 경우에는 센서값의 조건이 만족하면 (아날로그값) 그것을 미디악기쉴드에서
    소리가 나오도록 하고 싶습니다..~~~ 코드를 짜야하는데 너무어렵습니다~~
    어떻게 하면 좋을지 조언이나 코드 어떻게 해야할지 조언 구합니다. .ㅠㅠㅠㅠㅠㅠㅠ~~

    2014.05.01 15:22 신고 [ ADDR : EDIT/ DEL : REPLY ]
  8. creasento

    질문 드립니다. 제가 악기를 휴대가능하게 배터리를 연결하여 사용하려고 하는데 그럴 경우 그냥 배터리만 연결해주면 되는 건가요? 배터리를 연결할 경우 배터리 연결부분은 어디인가요?

    2014.08.01 14:52 신고 [ ADDR : EDIT/ DEL : REPLY ]
  9. 성병규

    아두이노 피아노를 만드는중인대 브래드보드와 아두이노를 연결할때 회로를 잘모르겠습니다
    운영자님은 어떻게 만드셨는지 궁금합니다 답변해주실수 있으시다면 답변 남겨주십시오

    2014.11.18 15:10 신고 [ ADDR : EDIT/ DEL : REPLY ]
  10. 성병규

    아두이노 피아노를 만드는중인대 브래드보드와 아두이노를 연결할때 회로를 잘모르겠습니다
    운영자님은 어떻게 만드셨는지 궁금합니다 답변해주실수 있으시다면 답변 남겨주십시오

    2014.11.18 15:10 신고 [ ADDR : EDIT/ DEL : REPLY ]
  11. electronic

    만드신 피아노 잘보았습니다^^
    저는 이것을 pic로 만들어 보고자 합니다.
    vs1053칩을 사서 아두이노로 테스트까지 완료하였는데,
    pic로 만드려니 vs1053에대한 이해도도부족하고 영어실력이 부족하여 데이트시트를 읽어보아도 잘 모르겠습니다
    그리고 vs1053칩으로 midi를 출력한 자료는 구하기가 쉽지않아서 헤매고 있는 중입니다 ㅜㅜ
    시간이 되신다면 소스작성과 관련된 팁에 대한 답변부탁드립니다ㅜㅜ
    이메일도 남기겠습니다 wlgusl077@naver.com

    2014.11.18 22:45 신고 [ ADDR : EDIT/ DEL : REPLY ]

손바닥컴퓨터들2011.12.23 01:40
공식 아두이노의 최신 표준보드 UNO의 R3버전이 나왔습니다.(2011년 12월)

보통 UNO 하면 마이크로콘트롤러 칩 타입에따라 SMD타입과 DIP타입 두 가지가 있었지만, 이제 형제가 더 많아졌네요, 아직 R3버전의 SMD타입은 공개되지 않은것 같으므로 현재 아래와 같은 3종류의 UNO가 있습니다.
UNO R2 DIP형
UNO R2 SMD형
UNO R3 DIP형


[]R2와 R3의 차이점 요약
일단, R2나 R3나 주 마이크로콘트롤러는 ATMega328 칩을 사용하므로
프로그래밍 가능용량이나 제어핀의 개수와 사용방법이 모두 동일합니다.
다만, USB 인터페이스칩이 변경되었고 헤더핀의 개수가 3개 추가되었습니다.
그렇다고 기본성능이 업그레이드 된것도 아니어서 기존 R2와 동일하게 사용하시면 됩니다.


[]변경된것
1.USB 인터페이스칩이 atmega8u2에서 atmega16u2로 변경됨:
단, (주콘트롤러칩은 R2와 동일하므로) 이것이 아두이노 프로그래밍 가능용량의 증가를 의미하지는 않습니다.
단, USB제어칩을 개조하여 사용할 경우 유용할수있음.

2. 노출 헤더 구멍이 3+1개 추가됨:
AREF핀옆에 I2C 헤더소켓 2구가 추가되었음.
단, 여분의 i2c핀이 새로 추가된것이 아니고 기존의 i2c핀(Analog 4번 5번)에 중복 연결된것입니다.
(차후 Mega시리즈 같은 다른 아두이노 보드와의 쉴드 호환성을 위한 고려로 여겨짐)
더불어 IOREF 노출 헤더소켓 1구가 Reset핀 옆에 추가되었습니다.
(이는 쉴드에서 보드의 작동전원을 파악하는 용도로 사용될 것으로 여겨짐)
물론 이핀도 power pin의 노출 헤더출구 1개가 추가된 것일뿐 없던 제어핀이 새로추가된것은 아닙니다.
나머지 1 구는 미사용 예비용이라네요;;

[]변경되지 않은것
1. 모든 UNO(R2 R3)는 프로세서 속도 및 기억 용량이 동일합니다.
2. 제어가능한 핀의 개수도 동일합니다.
3. 보드 크기와 모양도 그대로 유지
4. 쉴드호환성 동일( R1 R2용 쉴드를 R3에서도 그대로 호환사용가능)
5. 드라이버도 동일
6. 업로딩속도도 동일 (스케치에서 보드 종류를 UNO로 선택하면됩니다.)

참고원문링크: http://www.ladyada.net/library/arduino/unofaq.html

제품 링크:  아두이노 UNO R3 (아트로봇)

이하 영문 제품자료

Description: This is the new Arduino Uno R3. In addition to all the features of the previous board, the Uno now uses an ATmega16U2 instead of the 8U2 found on the Uno (or the FTDI found on previous generations). This allows for faster transfer rates and more memory. No drivers needed for Linux or Mac (inf file for Windows is needed and included in the Arduino IDE), and the ability to have the Uno show up as a keyboard, mouse, joystick, etc.

The Uno R3 also adds SDA and SCL pins next to the AREF. In addition, there are two new pins placed near the RESET pin. One is the IOREF that allow the shields to adapt to the voltage provided from the board. The other is a not connected and is reserved for future purposes. The Uno R3 works with all existing shields but can adapt to new shields which use these additional pins.

Arduino is an open-source physical computing platform based on a simple i/o board and a development environment that implements the Processing/Wiring language. Arduino can be used to develop stand-alone interactive objects or can be connected to software on your computer (e.g. Flash, Processing, MaxMSP). The open-source IDE can be downloaded for free (currently for Mac OS X, Windows, and Linux).

Features:

  • ATmega328 microcontroller
  • Input voltage - 7-12V
  • 14 Digital I/O Pins (6 PWM outputs)
  • 6 Analog Inputs
  • 32k Flash Memory
  • 16Mhz Clock Speed

Documents:




저작자 표시 비영리 변경 금지
신고
Posted by 로보밥 로보밥

댓글을 달아 주세요


^^. 로보밥 얼뚱연구소에 또하나의 재밌는 제품이 들어왔습니다. 예전부터 이제품 찾는 분들이 많았는데 드디어 입수하게 되었습니다.
 자세한 소개이전에 일단 테스트 영상을 올려봅니다.



Adafruit Industries사의 아두이노용 웨이브 쉴드이며,  직접 납땜하여 조립하는 DIY형 제품입니다.
mp3플레이어의 경우 전용 하드웨어 코덱칩을 사용하곤 하는데요, 요제품은 걍 wav파일을 곧바로 DAC칩으로 재생해버리므로 코덱같은거 없습니다.  단점일수있지만 반대로 장점일 수 도있죠,
low level 의 wav데이타를 곧바로 DA로 변형후 OPamp로 증폭하여 출력합니다.
그리고, 사실 mp3 배우기 전에  wav부터 배우는게 순서가 맞을것 같습니다.
SD메모리 슬롯도 내장하여 용량문제없이 음악재생이 가능하고, SD메모리만 응용할 수도 있습니다.

아래의 예제는 sd메모리에 미리 넣어둔 wav파일 몇개를 지정된 키를 누를때마다 재생하는 예제입니다.
관련예제는 해당제품 안내페이지에서 모두 보실 수 있습니다.
기회가 되면 상세 리뷰도 소개해 드리겠습니다.

참고자료
 . 제품소개 페이지 -아두이노 웨이브 쉴드 (Adafruit Wave Shield for Arduino)
 . 웨이브쉴드 버튼 연동 예제 소개
 . 웨이브쉴드 사용법 소개






PCB와 조립용 부품이 제공되며 직접 납땜으로 완성시키는 DIY형 제품입니다.



저작자 표시 비영리 변경 금지
신고
Posted by 로보밥 로보밥

댓글을 달아 주세요

  1. moonsflow

    저는 이거 살려고 adafruit 에 직접 주문했었는데, 이렇게 국내서도 구매할 수 있다니 반갑네요.

    2011.06.10 10:04 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 로보밥

      안녕하세요~
      좋은물건을 국내에 소개할 수 있게 되어 뿌듯한 마음입니다. 국산형 웨이브 쉴드도 곧 나오면 좋겠고요 ^^.

      2011.06.10 22:27 신고 [ ADDR : EDIT/ DEL ]
  2. brownee

    안녕하세요 지금 이 웨이브 쉴드와 직비를 이용하여 보내는 신호에 따라 소리가 나게하는 로봇을 만들고 있는 학생 입니다.
    우노에 직비E쉴드를 이용하여 직비를 올리면 디지털 IO포트가 0~7까지 사용 을 못합니다. ㅜㅠ 그런데
    LCS, CLK , DI ,LAT가 2 3 4 5 입니다. ㅜㅠ 이것을 8 9 11 12로 바꾸고 라이브러리에서
    WavePinDefs 라는 헤더파일에서 핀을 위와같이 바꾸었습니다.
    현재 SD 카드는 읽히는데 이어폰으로 소리만 나오지 않습니다. ㅠㅠ
    위와같이 핀을 바꾸면 문제가 있나요?

    그리고 우노에 전원을 넣어주는데 쉴드에도 따로 전원이 필요한가요 ??
    정말 몇일째 이 문제로 골골 앓고 있네요 ㅠ 도움 부탁드립니다.

    2012.09.11 19:02 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 위와 같이하시려면 소스코드만 바꾸시면 안되고 하드웨어 핀연결도 바꾸셔야합니다. 그보다는 그냥 XBee 쉴드를 케이블로 연결하시고 하드웨어 Serial핀인 0,1번에 연결하시면 될 것 같습니다.
      참고로, 제품문의는 아트로봇 QnA 게시판을 이용해주셔야 바로 답변이 가능합니다. 현재 블로그는 자주 못들리고 있고 링크등의 관련자료가 부족하여 답변이 어렵습니다.

      2012.09.14 15:19 신고 [ ADDR : EDIT/ DEL ]
  3. bio ablation

    관리자의 승인을 기다리고 있는 댓글입니다

    2015.09.22 16:38 [ ADDR : EDIT/ DEL : REPLY ]