많은 분들이 안드로이드기기의 무선통신 기능( Bluetooth, Wifi) 을 활용하여 원격 제어되는 자동차나 탱크등을 갖고 싶어 하시는것 같습니다. 이중 소수의 분들이 직접 제작하는경우를 봤습니다만 제작 비용도 만만치 않고 소요시간과 제작을 위해 알아야할 사항도 제법 많은것 같습니다. 특히 하드웨어 개발보다는 소프트웨어 개발에 집중하려는 개발자분들은 무선으로 제어되는 적당한 하드웨어 플랫폼을 찾고 계실겁니다. 저도 마찬가지로 이런 기능을 하는 저렴한 장비를 찾아왔는데요 오늘 소개해드릴 제품이 바로 딱! 그 제품인것 같습니다.
해킹 권장 플랫폼
안을 들여다 보면 ATMega칩을 주제어칩으로 장착하고 있고, 이곳에 모터드라이버 회로와 블루투스(Bluetooth) 모뎀이 장착되어 있는것이 보입니다. 제어보드에는 MCU를 재프로그래밍하려는 해커? 분들을 위해 ISP핀홀도 마련되어 있어서 내장된 프로그램을 직접 원하는데로 바꿔보실 수 있습니다.(차량용 펌웨어 소스코드와 무선 명령어 코드가 공개되어 있습니다.) 또한 전용 안드로이드앱(apk파일)을 동봉된 CDROM에 넣어 주므로 프로그래밍을 전혀 모르시는 분들도 파일메니져를 이용하여 apk 파일을 설치하기만 하면 재밌게 갖고 놀 수 있습니다.
All in One
필요한 액세서리도 모두 포함되어있어서 작동을위해 따로 준비해야할 것은 안드로이드폰(또는 스마트패드) 뿐입니다.
놀라운 점은 한사람 뿐 아니라, 수십명이 손을 잡아서 장거리 회로를 구성해도 작동됩니다. 가장 기초적인 트랜지스터 활용예이면서 제법 재밌는 응용을 할수있는 회로입니다. 아래 회로1 상의 콜렉터(C) 점과 R1사이에 LED를 넣어주면 아두이노 없이도 LED를 On/Off 시켜볼수 있습니다. (단, R1은 330옴으로 변경요함) 아두이노에서 활용하려면 아래와 같이 연결하시면 됩니다.
회로1.이 기본회로입니다.
A와 B점을 양손으로 잡으면 트랜지스터 Base에 전류가 가해져서 C점의 전압이 강하(Low)하게됩니다. A와 B간에 결합이 없어서 트랜지스터의 Base와 Emitter간의 전류가 흐르지 않게되면 C점의 전압은 거의 5V(High)로 유지됩니다.
아날로그입력핀으로 감지하면 이값(전압)의 변화를 확인 가능하며, 디지탈입력으로 감지하면 HIGH / LOW를 구분할 수 있게 됩니다. 회로1에서 R1은 꼭 필요하지만 R2는 A와 B가 쇼트될 가능성이 있어서 보호차원에서 넣은 저항입니다. 쇼트 시킬 일이 없다면 생략해도 됩니다.
트랜지스터는 유사품(범용 NPN형)으로 대체가능합니다.
위 경우엔 2sc1815를 사용한 예입니다.
회로1의 경우 예제소스는 아두이노 스케치에서 기본제공하는 File > Examples > Analog > AnalogInOutSerial 예제를 업로딩 후, 시리얼모니터 창을 열어놓고 A,B점을 양손으로 꽉 잡아보시면 됩니다. 접촉 상태에따라 A0핀으로 입력받는 전압 값의 변화 출력됩니다.
우측의 회로2. 는 저항을 모두 생략한 상태이며 R1을 생략하고 대신 아두이노 내부 풀업저항을 활성화 시킨 상태입니다. 즉, R1 역활을 하는 내부 저항을 활용하는 방법입니다.대부분의 마이크로콘트롤러칩들은 외부저항없이도 프로그램 세팅만으로 내부 풀업저항을 설정할 수 있는 기능이 있습니다.풀업저항 활성화를 위해선 핀모드를 입력모드로 전환 후, 해당핀을 HIGH로 세팅해주면 됩니다. 내부 풀업을 활성화 시키는 코드가 포함된 예제소스는 아래와 같습니다.
// A와 B점을 손으로 잡으면 아두이노 내장 LED가 켜지고 , 놓으면 꺼집니다. void loop() { if( digitalRead(2)){ digitalWrite(ledPin, LOW); }else{ digitalWrite(ledPin, HIGH); } delay(100); }
참고로, 5V 전원을 사용하므로 손으로 잡아도 감전 될 걱정은 안하셔도 됩니다.
활용예. 잘만 활용하면 터치센서 대체용으로 활용 가능합니다. 터치센서는 한극으로 작동 되지만, 러브스위치는 두접점을 동시에 눌러야 작동되는점이 차이점입니다. TR한개만 있으면 되므로 매우 저렴한 방법입니다. 특히 사람의 몸을 통하여 회로가 구성된다는 점이 알쏭 달쏭 요상한 재미를 더해주므로 여러명이서 재밌는 이벤트를 구성할때 활용하면 좋은 소재가 될 수 있습니다.
알림. 위 회로와 소스로 테스트 결과 잘 작동됨을 확인하였습니다. 시간이 늦은 관계로 실제 이미지와 작동영상은 추후에 올리겠습니다.
본 글을 통해 최근 동영상을 통해 알려드렸던 DIY 전자악기 만드는 법을 안내해 드리고자 합니다.
하드웨어 제작은 반제품의 쉴드를 아두이노에 결합하고 스위치를 몇개 장착하는게 전부이므로 매우 쉽습니다. 하지만 프로그래밍을 통해 제어를 하려면 MIDI 프로토콜을 이해해야 하는데 인터넷에 공개된 관련 글을 봐도 곧바로 이해하고 활용하기 쉽지 않았습니다. 결국, 정확한 신호 파악을위해 직접 마스터 키보드를 구입하여;; 건반을 누를때, 뗄때, 악기가 변경될때, 기타 콘트롤시 어떤 MIDI 신호가 출력되는지 분석을 한 후에야 대충 이해가 가더군요,, 하지만 많은 분들이 그럴 여유가 없으시죠;;;
우선은 이미 제조사에서 일련의 내장된 악기음을 순서대로 반복해주는 정도의 예제가 있으므로 참고가 되실 겁니다. 하지만, 위 소스만으로는 응용이 어려우신 분들도 많으시므로 실제 스위치(건반대응)로 연결하여 기초적인 악기를 구현한 예제(연결방법 + 소스코드)를 소개드리오니 참고하시기 바랍니다. 여러분의 좀더 멋진 DIY 악기 개발에 작으나마 도움이 되었으면 합니다
추가사항. 현재 화면상의 소스코드는 Sketch 0022 버전에서 테스트된 소스입니다. 최신 아두이노 개발환경(Arduino 1.0)용 소스코드도 첨부파일에 링크되어있으니 참고하시기 바랍니다. 첨부된 파일2개는 동일한 기능 두가지 버전입니다.)
. -로보밥-
준비물
아두이노 UNO 1개 아두이노 용 USB케이블 MIDI 악기 쉴드 1개 재적측 가능한 헤더셋(아두이노용) 1세트 결합형 브레드보드 중형 4개 스위치 12개 (마이크로 스위치 , 5색칼라버튼) 점퍼케이블 1세트
하드웨어 준비
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 건반악기 예제소스 --------------------------------------------------------- https://robobob.tistory.com/ 재배포시, 위 URL 유지부탁드리고요, 자유롭게 사용해주세요! ---------------------------------------------------------
버튼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.
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는 미사용
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(음계) 가령 "도~"
//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);
후기 MIDI 용어문제: 관련 용어 파악이 어려운것 같습니다. 가령 악기와 대응되는 용어만 instrument, patch, program 이 있네요.
아두이노 1.0용 소스 추가 안내. 2012년 5월 30일 많은분들이 Arduino 1.0 스케치용으로 포팅된 소스를 요청하셨는데요 변환된 파일을 이제야 올려드렸습니다. 2번째 첨부파일을 참고하시기 바랍니다. 바뀐것이라곤 NewSoftSerial.h 대신 기본제공되는 시리얼 라이브러리를 사용하기위해 SoftwareSerial.h 헤더선언을 변경한것과 Serial.print( val, BYTE) 함수를 Serial.write( val ) 로 변경한것 뿐입니다. 어렵지 않으니 직접 한번 수정(포팅)해보시고 성취감을 맛보시는것도 좋으실 것 같습니다.
수개월전 실내 테스트까지만 해왔던 기상측정 트위터 로봇을 중요한 프로젝트에 활용하신다는 분께 양도 후 새로 구하지 못해서 기다려오다 최근 다시 입수하게되었습니다. ^^. 드디어 기다려왔던 실외 설치 후 실제 운영테스트를 해보게되었습니다. 눈도 오고 꽁꽁 얼어붙는 날씨인데도 아직 멀쩡히 작동하고 있습니다. 기존 스토리는 관련글 링크를 참고하시기 바랍니다.
이번엔 실외 설치를 위해 이더넷하우징 케이스에 모든 기능을 넣어버리는 시도를 하였습니다. 아두이노 보드 + 이더넷 쉴드를 이더넷일체형 아두이노보드로 변경한데 이어 관련 부품을 작은 케이스안에 넣고 UTP 케이블 단자만으로 결합이 되도록 구성하였습니다. 어떻게 하는지는 사진을 보시면 참고가 되실 것 같습니다.