일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 우분투
- PYTHON
- LLM
- 강화 학습
- TRANSFORMER
- AI 기술
- Stable Diffusion
- ubuntu
- 이미지 생성
- tts
- LORA
- OpenCV
- AI
- OpenAI
- 오픈AI
- 메타
- 일론 머스크
- 티스토리챌린지
- 오픈소스
- 확산 모델
- 시간적 일관성
- 가상환경
- ChatGPT
- 인공지능
- 딥러닝
- 생성형 AI
- 트랜스포머
- 다국어 지원
- 오블완
- 아두이노
- Today
- Total
AI 탐구노트
DIY로 물고기 먹이 급여기 만들어보기 본문
장기간 집을 비울 일이 있을 때, 어항에 있는 물고기를 돌봐줄 수 없게 되어 문제가 됩니다. 사실 그런 이유로 오랜 기간 집을 비우질 못하는 경우도 있죠. 예전에 사료 급식기를 구입해서 자동화를 했다고 생각했었는데 사실 당시는 실패했었고 (구피를 위한 먹이 급여기였는데 오작동이 있어서 물고기들이 상당기간 굶을 뻔 했습니다 ^^;) 이번에는 딸랑 가오피 비파 1마리만 있는 상태여서 한번에 아주 조금씩 정해진 양을 주는 것이 아닌 기존 급여기는 사용할 수가 없게 되었습니다. 그렇다고 다른 것을 구입하기도 그렇고 해서... 가지고 있는 기기를 이용해서 이번만 쓸 요량으로 만들기로 했습니다.
1.물고기 먹이 급여기의 요구사항
제가 필요한 요건은 다음과 같았습니다.
- 원격지에서 필요할 때 구동시킬 수 있어야 합니다.
예전 실패 사유는 설정한 타이머에 맞춰 진행되어야 하는 것이 제대로 되지 않았기 때문이라 저는 제가 원하는 시점에 주는 것이 맞다고 판단했습니다. - 소량의 먹이만 급여할 수 있어야 합니다.
가오리 비파는 원래 물때나 이끼 등을 먹는 청소물고기로도 알려져 있습니다. 먹이를 많이 주면 문제가 되기 때문에 적은 양을 그것도 며칠에 한번씩 줄 수 있어야 합니다.
2.제작 원칙
- 집을 장기간 비우는 일이 자주 있을 일은 아닌 것 같아서 굳이 비싸게 하는 것은 지양
- 구현 난이도가 높으면 안 됨 -> 해 본 것을 이용할 것
- 가성비 우선 -> 집에 있는 것을 최대한 활용해서 비용을 최소화
3.물고기 먹이 자동 급여기 조사
위와 같이 원칙을 세우고 나서 시중에 판매되는 것들은 어떤 것이 있고 어떤 방식인지 대충 조사해 봤습니다. 역시 많더군요.... 아래 사진 가운데 가운데 것이 기존 구매했었던 방식과 유사해 보이네요.
처음에는 윗 사진 가운데 2번째 방식을 구현해 보려고 했는데 구조가 복잡해지는 문제가 있었습니다. 그래서, 3번째 방식을 하기로 했죠. 이 원리를 이용해서 직접 DIY로 만든 사람이 있을 것 같았고 3D 프린트로 제작한 사례를 찾을 수 있었습니다.
Make An Arduino Based Automatic Fish Feeder - The DIY Life
A DIY Arduino automatic fish feeder to measure out exact quantities of food for your fish and allows you to vary the amount and type of food per serving.
www.the-diy-life.com
여러개의 구분된 먹이칸이 회전하면서 아랫쪽에 뚫린 구멍을 통해 급여가 되는 방식이었는데 나름 깔끔해 보이고 제작도 간단해 보였습니다. 다만, 처음 세운 가성비 원칙에 따라 3D 프린팅 대신 종이와 약간의 스티로폼을 사용했죠. 재활용 쓰레기 중에는 이것 외에는 딱히 맞는 소재가 없었답니다. (작은 폼보드 하나 사는게 제일 좋은 선택이지만 있는 걸 활용하려다보니... ^^;)
4.하드웨어 구성
먹이 급여기 구현에는 다음의 2가지 하드웨어가 사용되었습니다.
- NodeMCU V3 Lolin 보드 (ESP8266 기반)
한 5년 전쯤에 구입해서 안 쓰고 있던 것인데, 이 녀석은 서보모터 돌리는 용도와 웹서버로 원격에서 커맨드 수신하는 용도로 사용합니다. - S90 서보모터
예전 안면 트래킹 터렛 테스트 할 때 사용했던 것을 이용합니다.
5.소프트웨어 구성
1) 아두이노 IDE 설정
NodeMCU V3 Lolin 보드 (아두이노 우노보드가 아니라 중국산 호환보드)를 아두이노 IDE에서 사용하기 위해서는 CH340 또는 CH341 driver 설치가 필요합니다. 제 경우엔 이미 설치되어 있어서 넘어 갔습니다. (설치 프로그램은 OS 별로 제공되므로 링크의 설명을 따릅니다. 정상적으로 설치되면 NodeMCU 보드를 USB로 연결 시 '/dev/ttyUSB0' 가 잡힙니다.
아두이노 IDE를 실행하고 다음과 같이 설정하면 일단 준비는 끝납니다.
- Borad Type : NodeMCU 1.0 (ESP-12E Module), port : /dev/ttyUSB0, upload speed : '9600' (권장) 으로 설정합니다.
2) 아두이노 코드
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Servo.h>
// WiFi AP 정보
const char* ssid = "AP_addr";
const char* password = "AP_pass";
ESP8266WebServer server(80);
Servo servo;
// 서보모터 핀 설정
const int servoPin = D1; // D1 핀에 서보 연결
// 서보모터 동작 설정
const float rotationTimePerDegree = 0.002; // 서보모터가 1도 회전하는 시간(초) (예: 60도/0.12초 = 0.002초)
int currentAngle = 0; // 현재 각도 저장
void handleServo() {
Serial.println("\n[in]request");
// 새로운 각도 계산
int targetAngle = currentAngle + 120;
// 회전 방향 및 시간 계산
int direction = (targetAngle > currentAngle) ? 180 : 0; // 시계 방향(180) 또는 반시계 방향(0)
int rotationAngle = abs(targetAngle - currentAngle);
float rotationTime = rotationAngle * rotationTimePerDegree * 1000; // 회전 시간(ms)
// 서보모터 회전
servo.write(direction); // 방향 설정
delay(rotationTime); // 회전 시간 대기
servo.write(90); // 정지
// 현재 각도 업데이트
currentAngle = targetAngle;
// 결과 응답 전송
String response = "{\"status\":\"success\",\"currentAngle\":" + String(currentAngle) + "}";
server.send(200, "application/json", response);
Serial.println(response);
Serial.println("\n[out]response");
}
void setup() {
// 시리얼 초기화
Serial.begin(9600);
delay(10);
// 서보모터 초기화
servo.attach(servoPin);
servo.write(90); // 초기화: 정지 상태
// WiFi 연결
Serial.println("Connecting to WiFi...");
WiFi.mode(WIFI_STA); // 스테이션 모드 설정
WiFi.begin(ssid, password);
// WiFi 연결 상태 확인
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
// IP 주소 출력
IPAddress IP = WiFi.localIP();
Serial.print("Server is running at: http://");
Serial.println(IP);
// 핸들러 설정
server.on("/servo", HTTP_GET, handleServo);
// 서버 시작
server.begin();
Serial.println("HTTP server started.");
}
void loop() {
// 서버 처리
server.handleClient();
}
시행착오
처음에는 S90 서보모터 스탠다드 타입 (180도용)을 썼습니다. 각도를 바로 지정할 수 있기 때문에 조금 더 편했죠. 그랬는데 180도가 넘어가는 경우는 처리할 수가 없다는 것이 문제가 되더군요. 대략 45도 간격으로 8등분을 해 둔 상태였는데 4회만 돌게 되면 먹이 주는 것은 고작 4차례 밖에 할 수 없는 겁니다. 장기로 집을 비울 경우, 대략 8~10 회 정도는 필요로 할텐데 아무래도 부족해 보였습니다.
그래서, S90 360도 타입으로 변경하기로 했습니다. 정확한 각도를 담보할 수는 없지만 그래도 조정을 해나가면 근접하게는 할 수 있겠다 싶어서였죠. 다만, S90 서보모터 360도 타입으로는 속도와 시간만 컨트롤 가능하기 때문에 이를 반영해야 했습니다.
6.결과물 및 정리
최종 결과물은 다음과 같습니다.
흠... 종이도 아래 위가 중심도 안 맞고 크기도 다르고... 결과적으로 허접한데... 그래도 동작은 잘 됩니다. 거기에서 위안을 얻습니다. ^^; USB 전원만 연결하면 집안 AP에 접속해서 외부 수신을 받을 수 있도록 되어 있습니다. 게다가 원격지에서는 스마트폰 브라우저에서 URL 호출 한번 하면 1회 회전이 되니 사용하는 것도 어렵지 않구요.
다만, 워낙 작게 만들다보니 먹이를 아주 작게 부숴서 줘야 하는데 급여기의 아랫판과 위 회전판 사이의 간격이 완전 일치하지는 않아서 약간씩 끼일 우려가 있을 것 같아 혹시나 하는 생각에 걱정이 되긴 합니다. 다만 몇 차례 동작 시키고 말 것이라 괜찮지 않을까.... 그리고 하나 더 보안을 고려치 않고 만든 것이라는 단점도 있긴 합니다.
하지만, 주변에 있는 것을 이용해 얼렁뚱땅 만들어놓고 동작하는 것을 보니 뿌듯합니다. 이런 맛에 Maker가 되는 것이겠죠? 올해 Maker Fair는 언제 어디서 하려나 한번 알아봐야겠습니다.
'DIY 테스트' 카테고리의 다른 글
CCTV 영상에서의 대기자 수 및 대기 시간 측정 (0) | 2025.01.19 |
---|---|
MeloTTS : CPU로도 실시간 음성합성을 지원하는 경량 TTS 모델 (1) | 2025.01.18 |
Pygame을 이용한 Spaceship 게임 만들어보기 (0) | 2025.01.11 |
OpenCV로 문서 스캐너 만들어 보기 (1) | 2025.01.10 |
직소퍼즐, 집중과 휴식이 함께 할 수 있는 게임 (0) | 2025.01.08 |