기후와 생태계 건강을 측정하는 한 방법은 동물 개체군의 크기와 다양성을 관찰하는 것입니다. 1987년부터 매겨 겨울마다 코넬 조류학 연구소는 Project FeederWatch라는 대규모 시민 과학 프로젝트를 진행합니다: 겨울철 새 모이통 방문 조류 종과 개체 수를 조사해 분포와 개체수 변화를 추적합니다.
첫 참여 해에 메이킹/해킹 취미와 자연 관찰, FeederWatch 참여를 결합해 아두이노 101로 조류 모이통을 스마트하게 만들기로 했습니다. 아두이노 101은 아두이노 IDE의 간편함, 내장 BLE, 풍부한 센서/브레이크아웃 보드 지원으로 이 프로젝트에 이상적입니다. Cloudinary, PubNub 같은 IoT 기술로 환경 모니터링의 미래를 재발명해보았습니다!
프로젝트 개요
아두이노 101 임베디드 모이통이 핵심입니다. 구성:
Sharp 적외선 거리 센서 2개로 양쪽 횃대(나무 막대)에 앉은 새 감지
FSR(압력 감지 저항)로 모이통 내 남은 모이 양 측정
Adafruit Si7021 온습도 센서 (I2C)로 기상 데이터 수집
아두이노 101을 BLE 퍼리퍼럴로 설정해 센서 데이터를 BLE 센트럴(인텔 에디슨)로 전송
전원: AA 배터리 4개, 모든 부품 커스텀 3D 프린트 인클로저에 수납
인텔 에디슨 (아두이노 브레이크아웃 보드)이 BLE 센트럴 겸 인터넷 게이트웨이 역할:
로지텍 C270 USB 웹캠 연결, BLE 알림(새 감지) 수신 시 사진 촬영
사진을 브레이크아웃 보드 SD 카드에 로컬 저장
인텔 에디슨 WiFi로 인터넷 연결 → PubNub로 실시간 데이터 스트리밍, Cloudinary로 이미지 클라우드 저장/변환
모이통 본체는 빈 소다병과 나무 막대로 만들어 마당 기둥에 걸었습니다.
프로젝트 제작
아두이노 101 임베디드 모이통
야외 설치라 내구성, 무선 실시간 전송 필요. 거리가 몇 피트라 내장 BLE 활용.
회로는 프리칭 다이어그램 참고하되, 겪은 난제들 중심으로 설명:
난제 1: 야외에서 새 감지 – 요소에 밀봉되면서 새만 감지, 나뭇가지 등 노이즈 배제 필요. PIR 센서는 범위가 너무 넓음. Pololu Sharp GP2Y0D815Z0F 디지털 거리 센서(15cm 감지)로 해결. 플라스틱 병 안에서도 작동 확인.
난제 2: 두 개 센서 동시 작동 안 됨 – 한 개는 잘 되는데 두 개 연결하면 둘 다 안 됨. 제품 FAQ 확인: "전원 공급 문제로 간헐적 오동작 가능. 센서 근처에 10µF 이상 커패시터 추가 권장." → 각 센서에 47µF 전해 커패시터 추가하고 둘 다 5V 핀에서 직접 전원 공급하니 해결.
난제 3: 모이 양 자동 측정 – FSR로 모이 무게 변화 감지. 초기엔 손가락 압력엔 반응하나 모이 양 변화엔 둔감. 전압 분압기의 고정 저항값 낮추고, 파스칼 원리 응용: FSR 전체 면적이 아닌 중앙 작은 돌기점에 모이 무게가 집중되게 플랫폼 설계해 감도 대폭 향상.
나머지는 단순: Si7021을 I2C(3.3V)에 연결, IR/FSR 센서를 퍼마-프로토 보드에 납땜해 아두이노 101 아래 양면 테이프로 부착. 전체 패키지를 소다병 모이통 안에 넣어 영하, 안개, 눈(가짜 블리자드 '스텔라')에도 생존.
아두이노 101 스케치 핵심
센서 모니터링 → BLE로 데이터 전송. BLE는 바이트 배열로 전송하므로 float/int를 공용체(union)로 바이트 배열과 메모리 공유해 변환:
union { float t; unsigned char bytes[4]; } tempData;
union { float h; unsigned char bytes[4]; } humidityData;
union { int f; unsigned char bytes[2]; } feedData;
delay() 사용 안 함(프로세서 정지, BLE 알림 간섭). 대신 Bill Earl(Adafruit) 튜토리얼 방식: 디바이스 객체에 폴링 간격 설정, Update() 함수에서 시간 경과 시만 센서 읽기, loop()에서 반복 호출로 멀티태스킹 흉내.
void Update() {
currentPerchMillis = millis();
if ((currentPerchMillis - previousPerchMillis) > perchInterval) {
previousPerchMillis = currentPerchMillis;
currentLeftPerch = digitalRead(LEFT_PERCH);
currentRightPerch = digitalRead(RIGHT_PERCH);
if ((currentLeftPerch == 0) && (previousLeftPerch == 1)) {
perchCharacteristic.setValue(1); // BLE 알림
Serial.println("LEFT PERCH ACTIVITY");
previousLeftPerch = 0;
}
// ... 우측 횃대 동일 처리
}
// 온습도, FSR 등 다른 센서도 각자 간격으로 폴링
}
void loop() {
blePeripheral.poll();
birdFeeder.Update();
}
인텔 에디슨 & 아두이노 브레이크아웃 보드
에디슨 설정은 Vincent Wong의 "Intel Edison and Intel XDK IoT Edition 101" 튜토리얼 추천. Intel XDK IoT 에디션으로 명령줄 조작, JavaScript/Node로 PubNub, noble.js, Cloudinary 등 강력한 API 활용.
로지텍 C270은 UVC 호환. Yocto 리눅스에서 uvcvideo 모듈 필요. 다음 단계로 설정:
vi /etc/opkg/base-feeds.conf // 리포지토리 추가
opkg update
opkg install kernel-module-uvcvideo
ls -l /dev/video* // /dev/video0 확인
opkg install fswebcam // cronie 불필요 (센서 트리거 시 호출)
fswebcam -r 1280x720 --jpeg 100 -D 3 -S 13 "test.jpg" // 테스트
마이크로 USB/USB 포트 스위치를 USB 포트 쪽으로, 외장 전원(Adafruit 1448) 연결 필요. SD 카드 마운트 확인(cd /media/sdcard; ls), 블루투스 언블록(rfkill unblock bluetooth), bluetoothctl → scan on으로 아두이노 101 BLE 기기 확인.
Intel XDK에서 BLESCAN 예제 프로젝트 열고 index.js를 우리 코드(GitHub 참조)로 교체 후 업로드/실행. 아두이노 101 켜져 있으면 연결 성공 로그 확인 가능.
코드 상세: 에디슨 측 (Node.js)
noble.js용 BLE 서비스/캐릭터리스틱 UUID (대시 없음!):
var LOCAL_NAME = 'bird';
var SERVICE_UUID = '917649a0d98e11e59eec0002a5d5c51b';
var PERCH_UUID = '917649a1d98e11e59eec0002a5d5c51b';
var TEMPERATURE_UUID = '917649a2d98e11e59eec0002a5d5c51b';
var HUMIDITY_UUID = '917649a3d98e11e59eec0002a5d5c51b';
var FEED_UUID = '917649a4d98e11e59eec0002a5d5c51b';
noble.on('discover')로 주변 기기 스캔 → 'bird' 이름 매칭 → 연결 → 서비스/캐릭터리스틱 발견 → characteristic.notify(true)로 알림 활성화 → characteristic.on('data', ...)로 데이터 수신 (구버전 noble은 'read' 이벤트였음, 주의).
transformRawData(uuid, data) 함수에서 캐릭터리스틱별 처리:
횃대 활동(PERCH_UUID) → child_process.execFile('fswebcam', ...)로 사진 촬영 → 로컬 저장 → Cloudinary 업로드 → URL 배열 저장
온도/습도/모이 양 → PubNub으로 실시간 스트리밍 (JSON 페이로드에 최신 이미지 URL 3개 포함)
PubNub: 실시간 데이터 스트리밍 네트워크. 인터넷만 있으면 전 세계 어디서든 데이터 수신. 별도 서버 불필요. Cloudinary: 이미지 업로드/저장/변환 API 매우 간편, 지원도 훌륭.
<script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.5.0.js"></script>
<script src="https://pubnub.github.io/eon/v/eon/1.0.0/eon.js"></script>
var pubnub = new PubNub({ subscribeKey: "your_subscribe_key" });
pubnub.subscribe({channels: ['feederView']});
pubnub.addListener({
message: function(m) {
var msg = m.message, idx = msg.imageIndex;
if (msg.latestView) document.getElementById("myImage"+idx).src = msg.latestView;
// Eon.js로 게이지 업데이트 등
}
});
모이통 및 인클로저 제작
2L 소다병으로 모이통 제작: 11cm 높이로 자르고, 바닥 쪽에 3cm 구멍 내 나무 막대(횃대) 관통. 전자부품 패키지 넣어 크기 확인 후 상단부에 철사(30cm)로 걸이 만들고, 네 면에 서로 다른 높이의 구멍 4개 뚫어 다양한 크기 새 유입 및 모이 냄새 확산. 상하 결합 후 마스킹 테이프로 고정(센서 가리지 않게). 깔때기로 모이 채워 밖에 걸고 새 기다리기.
전자부품 인클로저: 병 지름(약 105mm) 기준 설계. 아두이노+브레드보드 2개 수납, 손잡이 달린 상단 커버, 배터리 팩 수납 하단부(필라멘트 절약 설계), FSR 감도 향상용 압력 플레이트 등 3D 프린트. 모두 나사로 조립해 컴팩트한 패키지 완성.
테스트 및 배포
배포 전 체계적 테스트: BLE 연결(nRF Master Control App으로 1차 확인, 에디슨으로 2차 확인), 배터리 저하 시 BLE부터 끊김 확인. FSR 캘리브레이션: 돌기점 플랫폼으로 선형 구간 확보, Eon.js 게이지 min/max/색상 범위 조정.
배포 갤러리
새들이 모이통 발견하면 몇 시간 만에 수천 장 JPEG 생성! Cloudinary 대시보드나 SD 카드에서 확인.
Seeed Grove 키트로 개선
Seeed Grove 베이스 실드 전원부로 Sharp IR 센서 2개 커패시터 없이도 안정 작동. 배선 대폭 단순화. 표준 Grove IR 센서는 핀아웃 달라 솔리드 와이어로 GND/Vin/SIG 연결해 호환.
Project FeederWatch 연계 및 결론
FeederWatch는 2일 연속 관찰 중 동시 최대 개체 수 보고 방식이라 우리 횃대 카운트와 직접 매칭은 안 되나, 환경 파라미터 자동 측정과 모이 소비량 자동화, 사진 자료로 희귀 조류 기록 등에 부합. PubNub 실시간 스트리밍으로 전 세계 버드워처/교실과 데이터 공유 가능. 향후 PubNub Clarifai 블록으로 이미지 자동 조류 종 분류, Cloudinary 블록으로 날씨 보정, 추가 Grove 센서 확장 등 기대.
메이커로서 새들 실시간 관찰하고 수천 장 사진 중 보물 찾기처럼 확인하는 재미, 모이 감소 그래프 보는 재미, 아두이노/에디슨/그로브/PubNub/Cloudinary/3D프린팅 모든 기술이 어우러지는 멋진 도전이었습니다. 여러분도 FeederWatch 참여해보시길 – 결국 이건 새들을 위한 것!