놀라운 점은 한사람 뿐 아니라, 수십명이 손을 잡아서 장거리 회로를 구성해도 작동됩니다. 가장 기초적인 트랜지스터 활용예이면서 제법 재밌는 응용을 할수있는 회로입니다. 아래 회로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 ) 로 변경한것 뿐입니다. 어렵지 않으니 직접 한번 수정(포팅)해보시고 성취감을 맛보시는것도 좋으실 것 같습니다.
다양한 MIDI 작곡 프로그램들에서 MIDI 신호 출력을 지원합니다. PC의 경우 SW적인 음원으로 연주하는것도 가능합니다만, MIDI 신호를 PC 외부에 있는 전용 사운드모듈(악기,음원모듈)로 보내서 연주시킬 수 도 있습니다. MIDI 악기 쉴드로 이 신호를 받아서 연주가 되도록 해봤습니다.
PC용 SW는 MIDI 파일을 단순 연주해주는 Sweet MIDI Player 프로그램을 사용했습니다.
물론 기타 전문가용 MIDI 작곡 프로그램도 마찬가지로 연결해서 사용이 가능합니다. 출력되는 MIDI 신호는 모두 동일합니다.
보통 마스터 키보드는 음원내장이 되지 않아 자체적으로 연주가 불가하고, 외부
사운드 모듈(SW 또는 HW)이 필요합니다. 고가의 사운드카드의 경우엔 모르겠지만 보통의 메인보드 내장형 사운드 카드로 SW 사운드 음원을 대체하여 사용한경우, 키보드로 연주시 엄청난 딜레이가 있네요... 건반을 누르고 소리가 날때까지 수백mSec 지연은 있는것 같습니다. (제경우 연주용으로 사용이 불가한 수준이라고 생각됩니다.)
하지만 MIDI 악기 쉴드에 키보드 MIDI출력 신호를 곧바로 입력시켜 연주를 해본 결과 딜레이를 느낄 수 없었습니다. 고품질의 음원이 필수적이지 않다면 MIDI 악기 쉴드를 외장 악기음원(Sound Module)로 활용하는것도 좋을것 같습니다.
이번엔 기상측정기구와 이더넷 쉴드가 장착된 아두이노(Arduino)로 기상관측 자료를 트위터(Twitter)에 자동으로 올려주는 기특한 녀석을 소개시켜 드리겠습니다. 제법 시스템이라 불릴 만한 구성입니다. 바람의 방향과 속도 및 강수량을 측정할 수 있는 기상관측 기구로 부터 측정된 값을 모니터링하고 이를 곧바로 인터넷을 통해 트위터(twitter)에 올리는 것입니다. 기상 데이타 측정용으로 사용된
가상 관측기기에 대해선 관련글 링크
를 참고하시기 바랍니다.
본 글을 이해하기위해 필요한 사전지식: 기본적인 아두이노 스케치 개발환경 사용법, 라이브러리 설치법, 이더넷쉴드 사용경험, 트위터의 기본적인 이해, 기상관측 기구 센싱방법 등
트위터? 트위터(Twitter)가 뭔지는 저보다 여러분이 더 잘 알고 계실것 같습니다. 제경우 트위터 사용법도 잘 모릅니다만 순서가 뒤바껴서 트위터 포스팅해주는 로봇을 먼저 만들게 되었습니다;;; 이글을 이해하시려면 일단 트위터에 가입하셔서 트위(Tweet) 하나를 올려보시면 됩니다.
아두이노 + 이더넷 쉴드 썰렁한 아두이노(Arduino) 보드에 이더넷 쉴드를 얹으면 인터넷을 통해 전세계와 의사소통이 가능합니다. 더불어 천재적이면서 친절하기까지 하신 분들이 아두이노로 트위터에 메시지를 보내는 예제와 라이브러리를 공개해 주셨으므로 저와 여러분들은 손쉽게 엄청난?;; 시스템 구현을 할 수 있는 상황입니다. 이더넷 쉴드 사용 경험이 없으신 분들은 우선 공개된 정보와 아두이노 스케치IDE에 포한된 기본 예제를 참고하시기 바랍니다.
아두이노 + 이더넷 쉴드의 한계 이더넷 쉴드를 장착하면 아두이노 보드로 정보서비스를 제공해주는 서버 역활을 할 수 있습니다. 외부 접속이 가능한 IP주소를 사용한다면 전세계의 인터넷 접속가능 기기를 통해 정보를 제공받을 수 있습니다. 하지만 동시 접속수 제한이나 퍼포먼스 문제로 원할한 서비스 제공에는 한계가 있습니다. 이때문에 아두이노를 데이타 센싱이 용이한 현장에 설치 후 취합한 데이타를 웹서비스를 담당하는 PC급 서버로 전달하여 제대로된 웹서비스 환경에 응용하는 것이 더 안정적인 방법일 수 있습니다.
이때 손쉽게 사용가능한 서비스가 HTTP Client입니다. 즉, 아두이노는 웹클라이언트로써 웹서버에 필요할 때만 접속하여 데이타를 송/수신 하는 방식입니다. 이더넷 라이브러리와 함께 제공되는 기본예제(WebClient)를 조금만 수정하면 활용이 가능합니다. IP주소로 접속이 가능한 웹서버가 있는경우 추천할만한 방법입니다. 다만 문제는 기본 이더넷 쉴드 라이브러리를 이용한 Web Client 로는 domain name ( http://robobob.co.kr 같은) 을 통한 서버 접속이 안되고 123.123.123.123 같은 숫자형식의 ip를 이용한 접속만 가능하다는 점입니다. 예전에는 ip주로를 통한 접속 주소를 지원하는 웹호스팅 서비스가 있었지만 요즘엔 이를 지원하지 않는곳이 대부분인것 같습니다. 때문에 특정 웹호스팅 서비스나 단독 호스팅서비스를 사용하지 않으면 Web Client 사용한 접속이 불가한 상황입니다. (일반적인 URL 주소를 통한 아두이노의 HTTP Client 접속 방법을 아시는 분은 안내 부탁드립니다.)
트위터 활용 HTTP Client 활용에 문제가 있으나 오히려 더 효과적일 수 있는 데이타 공유 방법이 있으니 바로 트위터입니다. 짧은 단문을 포스팅하면 수많은 팔로워에게 전달되는 효과적인 데이타 공유시스템을 활용하는 것입니다. 게다가 요즘 대세인 스마트폰에서도 손쉽게 접근이 가능한 최신병기입니다. 그런데 방법이 어렵냐고요??? 제가 해보니 생각보다 매우 간단했습니다. 트위터 엡 개발을 위해 API니 뭐니 습득하고 복잡한 절차가 필요한지 알았는데요, 그게 아니고 그냥 사용만 하면 되네요...
별 설명이 필요없습니다만, 정리하자면 아래와 같습니다. 1. 트위터 앱(O Auth)에 접속하여 승인을 해주면 복잡한 문자열로 된 토큰 정보가 생성됩니다. 이 값을 복사하여 잘 보관합니다. 2. 관련 라이브러리들을 설치해줍니다. 두군데 정도 접속하여 파일을 받아서 아두이노 library 폴더에 적절한 이름으로 복사합니다. 3. 예제소스를 실행해봅니다. 위 라이브러리를 제대로 설치하면 스케치 IDE Examples 리스트에 Twitter가 생깁니다. File menu > Examples > Twitter > SimplePost 예제를 선택해줍니다.
이더넷 쉴드 사용시 수정해주는 ip주소와 네트웍정보 몇개만 수정해주시고 추가로 "YOUR-TOKEN-HERE" 부분을 위에서 발급받은 토큰값으로 대체해 주면 준비 끝~ 입니다. 이젠 잘 전송되는지 확인을 위해 시리얼 모니터링 창을 열고 속도(9600)를 맞쳐줍니다.
SimplePost 예제 소스 내용보기
#if defined(ARDUINO) && ARDUINO > 18 // Arduino 0019 or later #include <SPI.h> #endif #include <Ethernet.h> #include <EthernetDNS.h> #include <Twitter.h>
// Ethernet Shield Settings // 쉴드 밑면에 있는 mac 정보를 적어줍니다. 쉴드가 하나인경우 안바꿔도 무방 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// substitute an address on your own network here byte ip[] = { 192, 168, 2, 250 }; //공유기에서 사용되지않는 IP값을 지정
// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/) Twitter twitter("YOUR-TOKEN-HERE"); // 발급받은 토큰값을 이곳에 붙여넣으세요
// Message to post char msg[] = "Hello, World! I'm Arduino!"; // 한글 전송도 가능합니다!
Serial.println("connecting ..."); //부팅시 1회 포스팅 시도합니다. if (twitter.post(msg)) { // Specify &Serial to output received response to Serial. // If no output is required, you can just omit the argument, e.g. // int status = twitter.wait(); int status = twitter.wait(&Serial); if (status == 200) { Serial.println("OK."); } else { Serial.print("failed : code "); Serial.println(status); } } else { Serial.println("connection failed."); } }
void loop() { //아무것도 안합니다. }
SimplePost 예제 소개 예제로 사용된 소스에는 아두이노가 부팅할때마다 1회 포스팅을 하고, 포스팅 될때마다 결과 상태를 시리얼 통신으로 전달해 줍니다. (참고로 시리얼 창 새로 열거나 통신속도를 변경하여도 아두이노가 재부팅이되어 새로 포스팅을 시도합니다.) 결과가 Okay로 뜬다면 잠시 후 여러분의 트위터 페이지에 새 트윗이 올라온것이 보일 겁니다. Okay 외의 오류 메시지를 잘 살펴보시면 디버깅에 도움이 됩니다.
포스팅 시도후 오류메시지가 뜨는 경우가 종종 있는데요 제가 발견한 주요 오류 내용은 아래와 같습니다. 1. 동일한 내용을 중복하여 전송한 경우: 이경우 중복 전송된 값은 무시됩니다. 2. 트윗 작성 한계치 초과 : 시스템 보호를 위해 일정 시간당 한정된 개수의 트윗만 허용됩니다. 이 수량을 초과시 일정기간 동안 트위 작성이 불가하며 일정 시간이 지난뒤에 다시 작성이 가능해집니다. 가령 수십초에 한번씩 계속 트윗을 하신다면 얼마지나지 않아 트윗 등록이 거부될 겁니다. 아래의 예제에서는 1시간에 1회 트윗을 발신하게됩니다.
드디어 트위터 기상로봇
이제 포스팅될 정보를 여러분의 용도에 맞게 잘 구성해주시면 여러분만의 활용도 만빵인 트위터 포스팅 봇이 완성됩니다. 제 경우 이미 소개드렸었던 기상측정기기를 활용하여 1시간마다 기상데이타를 측정하여 전송해주는 예제를 만들어봤습니다. 실제 포스팅된 내용들을 아래의 페이지에서 확인 가능합니다.
한동안 실내 테스트만 하다가 2012년 1월 29일 현재, 옥외 설치하여 운영중입니다. 위 링크에 가보시면 실제 기상자료를 참고하실 수 있습니다. (경기도 수원시 오목천동)
위에서 트윗된 메시지의 포스팅 시간을 보시면 (오차가 1분도 안되네요^^.)1시간 간격으로 전송이 된것을 보실 수 있습니다. 하지만 가끔씩 몇 시간에 한번만 트윗된 것도 보이실 겁니다. 이때는 테스트를 위해 실내에서 측정된 풍량/풍속/강수량 수치의 변화가 없어서 동일한 내용을 반복 포스팅한것으로 인지되어 무시된 경우입니다. (계속 변화하는 시간값이나 랜덤숫자를 함께 전송하시면 이문제가 해결됩니다.)
사진. 기상측정 기구
+
사진. 아두이노로 만든 트위터 포스팅해주는 로봇
사용된 예제 소스 소개 값의 정밀도나 완성도를 무시하고 필요하신 분들에게 참고가 될 수 있도록 예제소스를 공개합니다. 풍향, 풍속, 강수량의 측정치 산정의 기준은 기상측정기기 제조사에서 제공한 데이타 시트를 참고하여 계산된 값입니다. 센서 연결 방법 및 기본 사용법 소개는 관련글 링크에 있는 글을 참고하시기 바랍니다.
/* * 풍향, 풍속, 강수량을 Twitter에 포스팅하는 예제 수정일시: (2011.09.08a) 디버깅 및 기능개선을 위해 수시로 변경될 수 있습니다.
풍향: 포스팅시 1회 계산 (16방위 중 하나로 측정) 풍속: 20ms 주기로 10초간 모니터링 후 풍속계산 강수량: 20ms 주기로 모니터링하여 1시간동안 누적(1시간에 1회 공식 데이타로 사용)
핀연결 풍향계: A0 풍향센서 전선 2개 중 하나는 GND에 나머지선은 A0에 연결 및 10k저항 거쳐 5V에 연결 풍속계: D2 풍속센서 전선 2개 중 하나는 D2에 나머지는 GND 강수계: D3 강수센서 전선 2개 중 하나는 D3에 나머지는 GND
기타 핀 연결 (없어도 무방) D7: 풍속계 상태 LED D8: 강수량계 상태 LED D9: 버튼 ( 버튼을 누르면 10초내로 즉시 포스팅)
// substitute an address on your own network here byte ip[] = { 192, 168, 100, 55 }; //바꿔주세요
// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/) Twitter twitter("발급받으신 토큰값을 적어주세요"); //바꿔주세요
// Message to post char msg[100] = "";
const int windVanePin = A0; // 풍량계 센서 입력핀 int windVaneValue = 0; // float windSpeed = 0; float rainGauge = 0; float windDirection = 0; char windName[4]; // N (North) S South, NS(north south) NNS(north north south) etc
unsigned long windSpeedTimer; int windSpeedState = true; int windSpeedPin = 2; int windSpeedCounter = 0; unsigned long rainGaugeTimer; int rainGaugeState = true; int rainGaugePin = 3; int rainGaugeCounter = 0; int buttonState = true; int buttonPin = 9; int postTrigger = false; int postingCounter = 0;
void postMessage(){ Serial.println("connecting ..."); if (twitter.post(msg)) { // Specify &Serial to output received response to Serial. // If no output is required, you can just omit the argument, e.g. // int status = twitter.wait(); int status = twitter.wait(&Serial); if (status == 200) { Serial.println("OK."); } else { Serial.print("failed : code "); Serial.println(status); } } else { Serial.println("connection failed."); } }
float getWindDirection(void){ // 풍향센서의 출력 전압을 아날로그 센서로 읽어옴 int readValue = analogRead(windVanePin); // ADC입력치를 0~5V 범위로 변환, 데이타시트 값과 대응이 쉽도록. windVaneValue = map(readValue, 0, 1023, 0, 500);
추가사항 (2011.11.29) 아두이노와 이더넷 쉴드를 하나로 결합한 Ethernet Pro 보드로 기상측정 트위터 기능을 구현할 수도 있습니다. 특히 PoE 케이블을 이용하시면 전원과 이더넷케이블을 하나로 줄일 수 있어 더욱편리합니다. 가령 위의 시스템을 아래의 이미지와 같이 간소화 시킬 수 있습니다.
안녕하세요 재밌는 창작재료가 너무 많아 무엇부터 갖고 놀아야 할지 고민이 됩니다. ^^. 즐거운 고민이죠;; 오늘은 기상측정용 기구를 소개해 드리겠습니다.
참고로,
다음글
에서는 기상측정기구와 이더넷 연동되는 아두이노(Arduino)로 기상관측 자료를 트위터(Twitter)에 자동으로 올려주는 기특한 녀석을 소개시켜 드리겠습니다. 제법 시스템이라 불릴 만한 구성입니다. 바람의 방향과 속도 및 강수량을 측정할 수 있는 기상관측 기구로 부터 측정된 값을 모니터링하고 이를 곧바로 이더넷 쉴드가 장착된 아두이노로 트위터(twitter)에 올리는 것입니다.
일단은 기상측정기구에 대해 좀더 알아봅시다!
Weather Meter (기상 관측기구 , Weather Sensor Assembly) 본 장비는 3가지 기상 관측 기초 자료를 측정할 수 있습니다.
1. Rain Gauge (강수량계) 입수되는 수량에 비례하여 스위칭을 해주는 특수 기구를 이용하여 1회 스위치시마다 0.2794mm 의 강수량에 대응되게 됩니다. 물시계 작동원리를 응용한것인데 아이디어가 참 좋네요
사진에는 안나왔네요;; 일단, 동영상을 참고하시길~
2. Anemometer (풍속계) 회전시마다 일정수의 스위칭이 이뤄지며 기준 시간당 스위칭 수를 측정하여 풍속 계산이 가능합니다. 1초 동안 1회 스위칭시 2.4km/h ( 0.6666m/s)의 속력에 대응합니다.
3. Wind Vane ( 풍향계) 바람의 방향을 16방위로 측정 가능한 센서입니다. 내장된 저항들과 회전각에 따라 작동되는 스위치에 의해 내부저항 값이 변화하며, 이 값을 10k옴 저항 한개와 기준전압 5V를 통해 아두이노 아나로그 입력 핀으로 감지하게 됩니다. 회전각에 따른 출력 전압 값은 데이타시트에 나와 있습니다. ( 회로연결법은 매우 간단합니다. 광센서나 온도센서의 저항 변화를 전압변화로 출력해주는 회로와 동일)
그림2. 풍향계 연결법( 5V와 10k저항을 사용하면 아래의 테이블에 있는 전압값이 Output핀에 출력됩니다.)
가령 0도(North,정북)을 향할 경우 내부저항은 약 33k옴이고 이때 10k옴 저항과 5V에 연결시 약 3.84V 가 측정됩니다.
Direction
esistance
Voltage
(Degrees)
(Ohms)
(V=5v, R=10k)
0
33k
3.84v
22.5
6.57k
1.98v
45
8.2k
2.25v
67.5
891
0.41v
90
1k
0.45v
112.5
688
0.32v
135
2.2k
0.90v
157.5
1.41k
0.62v
180
3.9k
1.40v
202.5
3.14k
1.19v
225
16k
3.08v
247.5
14.12k
2.93v
270
120k
4.62v
292.5
42.12k
4.04v
315
64.9k
4.78v(4.34v)
337.5
21.88k
3.43v
테이블1. 회전각/저항/전압 관계
참고. 제 경우 실측결과 315도 경우의 측정전압이 데이타시트와 달랐습니다. 참고하시기 바랍니다.
측정기의 비밀 본 장치를 회전시켜보면 풍향계와 풍속계 모두 매우 매끄럽게 회전됩니다. 센싱을 위해 스위치를 눌러주는 방식이라면 회전을 조금이라도 방해를 하게 될 테지만 이 기구는 그렇지 않습니다. 왜 그런지는 속을 들여다보면 나옵니다. 바로 마그네틱 센서입니다. 초소형 고강도 자석을 회전부에 설치해두고 회전시마다 자력으로 자석스위치를 일시적으로 단락시키는 방식을 사용하네요. 단순하고도 사용하기 편리한 메카니즘입니다.
연결 방법 풍향/풍속/강우량계 모두 각각의 케이블이 있으므로 총 3개의 케이블이 있습니다. 하지만 이중 풍속계 케이블을 풍향계 하단의 단자에 결합하게 되어 있으므로 2개의 케이블만 사용하면 됩니다. 케이블 전선은 일반 전화선과 유사하고 단자는 인터넷 케이블에 사용되는 것과 동일한 RJ45-8pin 단자입니다. 즉, 인터넷 케이블과 결합소켓을 이용하여 원하는 길이로 늘려줄 수 있게됩니다. 이더넷 케이블을 절단하여 라인을 브레드 보드에 결합하면 손쉽게 센서 스위치와 연결할 수 있습니다.(사진참조) 풍향계+풍속계 케이블 한곳에서 4개의 라인, 강수량계 케이블에서 2라인만 뽑아서 사용하면 됩니다.
측정 방법 풍속계와 강수량계는 스위치가 ON되는 횟수를 카운팅하면 되며 아두이노(Arduino)나 MCU를 이용하여 디지탈 입력핀으로 버튼이 눌려진 횟수를 카운팅하는 방법으로 측정이 가능합니다. 단, 스위칭시 노이즈로인해 1회 스위칭이 수~수십회 단락된 것으로 인지되므로 적절한 샘플링 주기(가령 20ms)마다 측정을 하여 스위치의 상태가 변이하는 순간에만 카운팅을 하도록 프로그램해줘야 합니다. 또한 강수량은 일정기간(가령 1시간)동안 그 값을 누적하여 결과로 사용하고, 풍속계도 일정 시간동안의 스위칭 횟수를 카운트하여 속력을 계산할 필요가 있습니다. 풍향 측정시엔 1개의 아날로그 입력핀이 필요하며, if else 구문으로 16 구간의 범위 조건으로 나눠서 각도를 구분해주면 됩니다.
예제 소스 막상 어떻게 측정이 가능한지 궁굼하신 분들을 위해 참고용 소스코드를 함께 수록합니다. 정확성은 보장 못드리지만 참고하시기 바랍니다.
/* 풍향, 풍속, 강수량 측정 예제
풍향: 10초마다 1회 계산 (16방위 중 하나로 측정) 풍속: 20ms 주기로 10초간 모니터링 후 풍속계산 강수량: 20ms 주기로 모니터링하여 1시간동안 누적(1시간에 1회 공식 데이타로 사용)
핀연결 풍향계: A0 풍향센서 전선 2개 중 하나는 GND에 나머지선은 A0에 연결 및 10k저항 거쳐 5V에 연결 풍속계: D2 풍속센서 전선 2개 중 하나는 D2에 나머지는 GND 강수계: D3 강수센서 전선 2개 중 하나는 D3에 나머지는 GND
const int windVanePin = A0; // 아날로그 0번핀에 연결 int winVaneValue = 0; // float windSpeed = 0; float rainGauge = 0; float windDirection = 0; char windName[4]; // N (North) S South, NS(north south) NNS(north north south)
unsigned long windSpeedTimer; int windSpeedState = true; int windSpeedPin = 2; int windSpeedCounter = 0; unsigned long rainGaugeTimer; int rainGaugeState = true; int rainGaugePin = 3; int rainGaugeCounter = 0;
결과 출력예 위 예제의 경우 10초마다 아래와 같은 결과가 PC로 전송됩니다. ArtRobot's Weather Bot said => Wind: N/0.0, 3.83(km/h) Rain 0.0(mm/h). ArtRobot's Weather Bot said => Wind: W/270.0, 4.79(km/h) Rain 0.0(mm/h). ...
아파트 계단이나 현관문에 많이사용되는 모션센서형 전등을 많이 보셨을 겁니다. 사람이 없을때는 미작동 되다가 다가오면 작동되므로 에너지 절약도 되고, 스위치 작동시키는 불편함도 없으므로 실생활에 매우 유용한 자동화 기기입니다.
이때 사용되는 센서가 PIR 근적외선 모션센서인데요 인체에서 방사되는 근적외선의 변화량을 감지하는 PIR센서가 들어있습니다. 아마도 많은 분들이 이를 응용하여 무언가를 만들고 싶어하실겁니다. 저도 마찬가지죠 ^^. 마침 며칠전 대형 할인점에 갔다가 버블건을 보고 좋은 응용예가 생각이 나서 만들어 봤습니다.
버블건의 원리는 모터의 회전시 물펌프로 비누액체를 뿜어올려주면서 동시에 팬으로 바람을 불어 비누방울을 날려주는 것입니다. 헉;;; 이 가격에 이런 기계를 만들어내는 분들에게 감사의 인사를 드리고 싶습니다 ^^.
모터 하나로 물펌프와 송풍용팬을 동시에 작동시키는 구조인데요, 보통 모터를 제어하려면 모터 드라이버를 사용하거나 릴레이를 사용하는게 정석일테지만, 이 버블건은 모터만 켜주면 되는건 아니고 방아쇠와 연결된 핸들이 비누액을 버블홀에 골고루 발라주는 역활을 하므로 반드시 방아쇠를 잡아 당겨줘야하는 구조였습니다.
음,,, 결국 서보모터 하나로 해결이 되었습니다. 그냥 손가락으로 당기듯이 서보모터를 작동시키는 방법입니다. 단, 방아쇠의 스프링 장력이 좀 쌘것같아서 일부를 절단한 상태입니다.
버블건도 전등같이 하루 종일 켜져 있으면 효율적이지 않겠죠?! 항상 켜져있는것보다 사람이 곁에 있을경우에만 작동시킬 수 있으므로 효율적이며, 모르고 다가온 사람에게 놀라움을 선물할 수 도 있게됩니다.
구현TIP PIR 모션센서는 5V~12V에서 작동됩니다만, 9V이상의 전압에서 더 반응성이 좋습니다. 가령, 5V전원으로 사용시 감지된 뒤에 한동안 재 감지가 잘 되지 않는 현상이 있습니다. 9V전원을 사용후 이증상이 없어지는것을 확인했습니다. 즉, 수시로 감지되는 경우 9V이상의 전압으로 작동하시기 바랍니다. 단, 신호출력선은 아두이노에 입력해야 하므로 9V에 연결하시면 안되고 5V전원선과 10K옴 저항으로 연결해주셔야 합니다.
회로 연결 방법
아두이노 스케치 소스 #include <Servo.h>
const int ledPin = 13; const int inputPin = 2; const int posA = 90; const int posB = 60; Servo myservo; unsigned long lastShotTime;
void setup(){ pinMode(ledPin, OUTPUT); pinMode(inputPin, INPUT); myservo.attach(9); // attaches the servo on pin 9 to the servo object lastShotTime = millis(); Serial.begin(9600); }
소스 소개 PIR 센서에서 움직임이 감지되면, 출력선의 전압신호가 High에서 Low로 떨어집니다. 이를 디지탈핀에서 감지하여 서보모터를 회전시켜서 버블건을 작동시키게 됩니다. 지정된 시간(20000ms, 20초)동안 미작동상태에서 작동될 경우, 초기 거품 생성을 위해 3회를 짧게 작동시킨 후 지정된 시간(3000ms, 3초)동안 작동 되도록 프로그램 되었습니다.
재료: 1. 버블건 4,000원 ~ 10,000원 정도 (문방구, 대형할인점) 2. 아두이노(Arduino) 3. PIR 근적외선 모션센서 4. 서보모터 5-1. 휴대형 전원 => 9V 배럴잭 + 9V 건전지 (알카라인 고급형) 5-2. 실내형 전원 => 9V 아답터 전원
( 9V 전지는 알카라인 고급형을 사용하셔야 잘 작동됩니다. 저가 9V 망간전지로는 서보모터 작동이 잘 안되네요)
연결법 안내 사진추가(2012.6.10) 안내해드린 모션센서가 5V에서 작동시엔 감이 너무 느려서 답답하며 9V ~12V 전원을 사용해야 정상 작동이 됩니다. 이때 어떻게 연결을 해야하는지 문의가 많으셨는데요... 늦게나마 아래의 사진을 올려드리오니 참고하시기 바랍니다. 아두이노 전원이 9~12V 정전압 전원인경우 아래 그림과 같이 아두이노에 있는 Vin 단자로부터 전원출력이 가능하므로 편리합니다. 별도의 전원을 사용하실때는 Vcc와 GND에 별도전원을 연결하시고 꼭 아두이노+센서+전원의 GND를 공통 함께 연결해주시기 바랍니다.
아두이노에 WaveShield를 얹히면 음악재생기가 됩니다. 여기에 9V 전지등을 연결해주면 곧바로 휴대형이 되는데요, 무공해 에너지를 사용하면 더욱 좋겠죠?! 그래서 건전지 없이 태양전지를 연결하여 구동해 봤습니다. 쨍쨍 비치는 태양에너지를 쓸모있게 활용하는데 태양전지만한게 없겠죠... 날씨가 좋은경우 그늘에서도 문제없이 구동되네요. 생각과 달리 태양전지는 흐린날에도 약간이지만 전기를 생산합니다. 눈으로 한번 보시죠, 여러분의 창작품에도 응용하시면 좋을것 같습니다.
동영상1.음원은 개구리 우는소리로 넣었습니다. 개구리 우는 소리가 제법 큽니다. 확인을 위해 태양전지를 뒤집자 개구리가 울음을 끄치네요 ^^. 다시 태양을 바라보자 소리를 내기 시작합니다.
동영상2. 이제 제법 여름 기운이 느껴집니다. 너무 덥죠! 그늘에서도 작동하는지 테스트 해봤습니다. 잘~ 나오네요.. 낮잠잘때 배경음으로 딱 좋을것 같습니다. 공원 밴치등에 불필요한 전력없이 태양전지로 작동되는 자연의 소리를 넣어주면 좋을것 같습니다.
동영상3.공원에서 되돌아 오는길에 자전거 뒷자석에 태양전지를 달고, 달려오면서 음악을 감상해 봤습니다. 제법 좋네요 ^^. 건전지 걱정없고, 스위치도 필요없습니다. 실내에 들어오면 자연히 꺼지고요, 밝은 곳으로 이동하면 다시 자동 재생됩니다. 와우~ Wow!!
아두이노로 LED를 제어하여 ON/OFF 제어를 해보신 분들이라면 주변에서 널리 사용되고 있는 가전기기들도 ON/OFF 제어를 해보고 싶은 마음이 드실 겁니다. 이때 사용되는 전자부품으로 릴레이(Relay) 입니다. 보통 릴레이라고 하면 코일이 감겨진 전자석에 제어 전류를 흘려주면 그 자력으로 스위치의 접점부가 ON/OFF 되도록 설계된 기계식 릴레이가 많이 사용되고 있습니다.
사진.코일형 릴레이
조금? 다른 릴레이 SSR
오늘 실험에선 보통의 릴레이와 동일한 기능을 해주지만 좀더 사용하기 쉬운 SSR이라는 재밌는 전자부품을 사용하였습니다. 반도체 기술의 발달로 기계식 코일내장형 릴레이의 기능을 반도체 소자로 대체한 것이 SSR(Solid State Relay; 무접적 반도체 릴레이)입니다. 상대적으로 좀더 비싼편이지만 사용의 편리성과 안정된 성능으로 전기회로에 익숙치 않은분들이 가전기기의 제어용 릴레이로 사용하시기 좋은 부품입니다.
하지만, SSR도 용도별로 수많은 종류의 제품이 있어서 고르기가 쉽지만은 않습니다. 본 글에서는 4~32V의 직류 전원으로 240V 15A 까지의 교류 부하를 제어할 수 있으며, 납땜 작업 없이도 전선을 체결할 수 있는 볼트 결합단자가 제공되고, 보호 커버까지 장착된 SSR 제품을 선정하여 사용하였습니다.
사진. SSR 저전압(4~32V) 직류로 고전압 교류(240VAC) 부하를 제어하는 제품예
시중엔 이 제품보다 저렴한 제품이 많이 있지만, 일단은 사용하기 쉽고 편리한 제품의 사용을 추천드립니다.
SSR 의 특징 .기계식 접점이 없으므로 접촉시 발생되는 노이즈가 없고 내구성이 우수합니다. .제품에 따라 매우 낮은 전압(가령 4~32V 직류)로 제어 할 수 있습니다. .코일형에 비해 상대적으로 매우 작은 전류만 소모합니다. .부하측 회로와 제어회로와의 우수한 절연성
릴레이 구동 회로
기계식 접촉식 릴레이를 사용할 경우 코일에 의한 역기전력이나 구동전류의 고려가 필요해지므로 제어측 회로가 좀더 복잡해집니다. SSR의 경우 보통 입력신호측과 부하측이 전기적으로는 절연되어있고 광신호만 전달되므로 코일에 의한 역기전력이나 부하측과의 전기 절연에대해 고려할 점이 적어 회로가 매우 간단해 집니다. 6V건전지로 구동되는 스위치를 연결하거나 아두이노 같은 마이크로 콘트롤러의 디지탈 출력단자(5V출력)를 그대로 직결할 수 있습니다.
그림1. SSR로 전등 제어하는 초간단 회로도
주의 사항. 본 회로는 저전력 소모용 가전기기나 전등의 제어를 위한 것이며, 고전력 및 코일형 기기를 제어하는 경우 부가적인 안정화 회로가 필요할 수 있으며 고전류 구동시 방열을 위해 SSR의 밑면을 히트싱크(방열판)에 결합하여 사용해야 합니다. 또한, 전원 플러그와 소켓에는 안전을 위해 접지선까지 연결해 주실 것을 당부드립니다.
실험1. 6V건전지와 스위치로 220V 전등 ON/OFF하기
소개해 드렸듯이 입력측에 4~32V의 직류전압을 가하면 릴레이가 연결되고 교류회로가 작동되게 됩니다. 랜턴에 많이 사용되는 6V 건전지로 전등을 제어해 보는 장면입니다. 가장 단순한 회로의 예입니다.
실험2. 아두이노로 220V 전등 ON/OFF 제어하기
아두이노를 통한 제어도 원리상 동일합니다. 아두이노의 디지탈 출력핀에 High를 출력하면, 약 5V 전압이 출력됩니다. 그대로 SSR의 입력측에 연결해주면 LED를 ON/OFF하듯이 220V 전등이 ON/OFF 되게 됩니다.
너무 간단하죠 ^^. 하지만 220V는 간단치 않습니다. 잘못 만지면 크게 다치거나 돌아가실 수 있으니 주의해서 다뤄야합니다. 아래의 구성 예는 참고만 하시고, 스스로 충분히 안전에대한 준비가 되셨을때 스스로 충분히 검증을 하신 후 시도하시기 바랍니다.
주의사항 및 경고. 본 글의 내용은 오류가 있을 수 있으며, 초보자들이 실습을 하기위해 필요한 모든 사전지식을 포함하고 있지 않습니다. 220V 교류 전원을 부주의하게 다루면 크게 다치거나 생명을 잃을 수 있습니다. 적절한 경험과 사전지식을 탐구한 이후에 주의하여 시도하시기 바랍니다. 여러분이 행한 실험에 대하여 저자는 어떠한 책임도 질 수 없습니다.
릴레이로 제어되는 콘센트 플러그 세트 만들기
이하, 위의 동영상에서 사용된 릴레이로 제어되는 콘센트 플러그를 만드는 방법을 소개해 드립니다.
1단계. 기본 재료:
플러그 암수 세트, SSR, 규격에 맞는 압착단자, 교류220V용 케이블(1.5mm 이상)
도구: 니퍼와 플라이어(뺀찌), 드라이버
플러그 부분에 부하선을 결합해 줍니다.
전선이 빠지지 않도록 매듭을 묶어주면 빠지지 않게됩니다. (매듭은 속에있어서 안보여요;;)
전용 압착단자를 이용하면 편리합니다.
플라이어로 꽉 눌러줘야 합니다.
암플러그 쪽에도 전선을 결합니다.
전선빠질 공간을 칼로 깍아냈습니다.
보통 잘라낼 수 있도록 미리 공간이 마련되어 있습니다.
이렇게 연결할까나~
요렇게 연결해 주시면 볼트가 풀려도 전선이 빠져나가는 사고는 미연에 방지할 수 있겠죠?!
회로도 보시면 어떻게 연결되는지 쉽게 아실 수 있으시죠?
건전지로 구동되는 아두이노라도 Okay입니다.
아답터 전원도 물론 좋구요
완성된 상태 여러장면들...
관련 제품 링크 .무접접 반도체 릴레이 SSR .아두이노 Arduino .450/750V 기기배선용 절연선 .전원플러그 220V형 .전원 콘센트 1구형
추가 정보 아트로봇샵에서 취급중인 기계식 릴레이E형 제품의 사용법을 궁굼해하시는 분들이 계셔서 연결 예시 이미지를 추가로 올려봅니다. 예제에서는 12V전원에서 구동되는 모터를 아두이노에서 제어하기 위해서 릴레이E형과 아두이노를 연결한 모습입니다.
추가안내 사항. 2014.8.23일
전기기사님께서 댓글로 알려주신 정보입니다. 제가 예제소개시 사용한 전선의 색상(녹색)이 적절한 선택이 아니었던것 같습니다. 녹색 전선은 전기공사시 접지용도로 사용되어야하는 규칙이 있다고 하네요. 전기배선함이나 전등 스위치 단자를 열어보면 검정색선을 보통 사용하는것을 봤는데 나름대로 규칙이 있는것 같습니다. 이런 사항도 파악하셔서 꼭 지켜주시는것이 좋을것 같습니다. 좋은 정보 알려주신 익명의 전기기사님께 감사드립니다!!!
참고로 저전압을 사용하는 전자회로에서는 검정색은 GND 접지선으로 보통 사용됩니다. 고압을 사용하는 전기선과 서로 많이 다르네요 TT 이와 관련하여 어떤 역사적 스토리가 존재하는지 궁굼해집니다....