메뉴 전체보기

회원메뉴

스마트 Coop 2.0 > 게시판

본문 바로가기

쇼핑몰 검색

NO. 3347
제목 : 스마트 Coop 2.0
2026-09-23 14:00

소개: 스마트 Coop 2.0


소개: 스마트 Coop 2.0


소개: 스마트 Coop 2.0


스마트 Coop 2.0은 원래의 자동화된 닭장 시스템의 업그레이드 버전입니다. 첫 번째 버전은 문 제어 및 급여와 같은 기본 닭장 작업을 성공적으로 자동화했습니다. 그러나 우리는 신뢰성을 개선하고, 더 나은 모니터링을 추가하며, 다른 사람들이 프로젝트를 쉽게 복제할 수 있도록 전자 장치를 단순화하여 아이디어를 더 발전시키고자 했습니다.

이번 새로운 버전에서는 시스템을 더 모듈화하고 조립하기 쉽게 만들며, 닭장 안팎에서 일어나는 일에 대한 더 나은 통찰력을 제공할 수 있도록 집중했습니다. 자동화, 컴퓨터 비전 및 IoT 연결을 결합함으로써, 스마트 Coop 2.0은 뒷마당 가금류 관리를 더 스마트하고, 안전하며, 편리하게 만드는 것을 목표로 합니다.




STEP 1. 스마트 Coop 2.0의 새로운 기능은 무엇인가요?


  1. 신뢰성을 높이고 전력 소비를 줄이도록 DC 모터와 리미트 스위치를 사용해 재설계한 도어 개폐 메커니즘
  2. 사료를 더 정밀하게 분배하기 위해 스테퍼 모터를 사용하는 개선된 급이 시스템
  3. 포식자 탐지와 알 모니터링을 위한 듀얼 웹캠 모니터링 시스템
  4. 우리 주변의 포식자 소리를 식별하기 위한 마이크 기반 소리 감지
  5. 우리 내부의 쾌적한 온도를 유지하기 위한 난방 전구가 있는 온도 제어 시스템.
  6. 더 쉽게 모니터링하고 제어할 수 있도록 Arduino IoT Cloud와 통합
  7. 더 깔끔한 배선과 안정적인 전자 장치 통합을 위한 맞춤 설계 PCB
  8. 쉽게 복제하고 맞춤 설정할 수 있도록 아크릴 패널을 적용한 모듈형 3D 프린팅 기계 구조.




STEP 2. 디자인


263e38d7-dd86-4fc9-a018-60e592d0b755.jpg

스마트 Coop 2.0은 SolidWorks에서 설계된 모듈형 기계 구조를 특징으로 하며, 3D 프린팅에 최적화되어 있습니다. 전체 Coop은 표준 프린터 빌드 볼륨에 맞도록 네 개의 섹션으로 나뉘어 있습니다. 이 섹션들은 강철 막대를 사용하여 조립되며, 구조의 강도를 제공하고 적절한 정렬을 유지합니다.

대부분의 구조 부품은 3D 프린트되어 디자인을 쉽게 재현하고 사용자 맞춤화할 수 있습니다. 전면 및 후면 패널은 아크릴 시트로 만들어졌으며, 전면 패널은 더 깔끔한 외관을 위해 색상이 입혀져 있고, 후면 패널은 Coop 내부를 볼 수 있도록 투명합니다.

디자인 전반에 걸쳐 나사산 인서트가 사용되며, 거의 90%의 구성 요소가 이를 통해 장착됩니다. 이는 기계적 강도를 향상시키고 부품을 조립, 제거 또는 교체할 수 있게 하여 인쇄된 구성 요소를 손상시키지 않습니다.




STEP 3. 주 컨트롤러 – 아두이노 UNO Q


ae182aa4-e177-4299-bcf5-74c737ac9ce3.jpg

Arduino UNO Q는 Smart Coop 2.0의 주요 컨트롤러 역할을 하며, 시스템의 모든 핵심 기능을 조정합니다. 이 장치는 센서를 관리하고, 문과 급이 메커니즘을 위한 모터를 제어하며, 우리 내부의 다양한 모듈 간의 통신을 처리합니다.

컨트롤러는 또한 USB 허브를 통해 웹캠과 마이크와 인터페이스하여 포식자 감지, 알 모니터링 및 소리 기반 감지를 가능하게 합니다. 또한, 난방 시스템을 제어하고 환경 조건을 모니터링하여 닭들이 편안한 환경을 유지할 수 있도록 합니다.

Arduino UNO Q를 중앙 컨트롤러로 사용하면 시스템이 간단하고 신뢰할 수 있으며 다른 사람들이 복제하기 쉬우면서도 고급 자동화 및 모니터링 기능을 지원합니다.

Arduino UNO Q를 처음 사용할 때, 보드는 USB-C 케이블을 사용하여 컴퓨터에 연결됩니다. 그런 다음 Arduino IDE를 설치하여 코드를 작성하고 보드에 업로드할 수 있도록 합니다. 필요한 보드 지원 패키지와 드라이버를 설치한 후, IDE에서 올바른 보드와 직렬 포트를 선택합니다.

설정이 완료되면 간단한 테스트 프로그램을 업로드하여 보드가 올바르게 작동하는지 확인할 수 있습니다.





STEP 4. 문 메커니즘 설계


262fcfbd-bf1f-499d-ad68-28193d1a897f.png

c05d63a4-fdac-41e2-aefb-dc4d9a042827.png

스마트 쿠프 2.0의 도어 메커니즘은 이전 버전과 동일한 핵심 디자인을 따르며, 신뢰성과 제어성을 향상시키기 위한 몇 가지 개선이 이루어졌습니다. 이 시스템은 최대 6.5 kg·cm의 토크(235 N·cm 정지)를 제공할 수 있는 저전력 DC 기어 모터(100 RPM, 12V 권장)를 사용하여 도어를 신뢰성 있게 여는 데 충분합니다. 모터는 부하 하에서 최대 900 mA를 소모하여 전체 전력 소비를 낮추면서도 적절한 힘을 제공합니다.

b2a977f8-8e8b-4f02-b3c8-d63c8b58135a.jpg

모터를 구동하기 위해 L298 대신 BTS7960 모터 드라이버가 사용되며, 이는 효율성과 전류 처리 능력이 크게 향상되었습니다. BTS7960은 고전류 부하(최대 43A 피크)를 지원하며, 약 5.5V에서 27V의 전압 범위 내에서 작동하고, 과전류, 과열 및 저전압 보호와 같은 내장 보호 기능을 포함하여 작동 중 시스템을 더욱 견고하게 만듭니다.

8318d580-5509-45cc-9aa7-45e43a709017.jpg

또한, 두 개의 리미트 스위치가 도어의 완전 개방 및 완전 폐쇄 위치를 정의하는 데 사용됩니다. 이 스위치는 컨트롤러에 정밀한 피드백을 제공하여 정확한 이동을 보장하고 과도한 이동을 방지합니다.

aeaa6346-4a74-4ab5-bab5-165ac98e9c6b.jpg

추가 개선 사항으로는 벨트 장력 조절 메커니즘이 있어 사용자가 필요에 따라 벨트 장력을 조정할 수 있습니다. 이는 시간이 지남에 따라 부드러운 도어 작동을 유지하고 유지 관리를 용이하게 합니다.

44d7cef8-8771-4129-9b81-ae2acbeb118c.png




STEP 5. 비전 및 오디오 모니터링 시스템


스마트 Coop 2.0은 웹캠과 마이크를 사용하여 닭장을 모니터링하고 잠재적인 위협을 감지합니다. 이전의 HuskyLens 센서 대신, 새로운 디자인은 더 나은 이미지 품질과 넓은 시야를 제공하는 Logitech 1080p 웹캠을 사용합니다. 하나의 카메라는 닭장의 앞쪽에 장착되어 주변을 모니터링하고 잠재적인 포식자를 감지하며, 다른 카메라는 닭장 내부에 배치되어 둥지 영역을 관찰하고 알을 감지합니다.

857b012c-540f-4b76-bda8-e0776b7fdf54.jpg

카메라와 함께 소리 기반 포식자 감지를 위한 마이크도 포함되어 있습니다. 마이크는 시스템이 짖는 소리, 으르렁거리는 소리 또는 포식자의 존재를 나타낼 수 있는 다른 동물 소리와 같은 의심스러운 소리를 식별할 수 있도록 합니다.

6b9b4a0c-1e5c-4a11-b4e3-c2b55a4f3b68.jpg

Arduino UNO Q는 USB-C 포트가 하나만 있기 때문에, 두 개의 웹캠과 마이크는 USB 허브를 통해 연결되어 여러 주변 장치가 동시에 컨트롤러와 인터페이스할 수 있도록 합니다. 이 설정은 시스템이 시각적 및 음향 모니터링을 결합하여 감지 및 전반적인 닭장 안전성을 향상시킬 수 있게 합니다.

698bd928-8418-469e-96d8-6b73f5cb8a90.jpg

비전 작업을 위해 우리는 포식자 감지 및 알 감지를 수행하기 위해 YOLOv8 모델을 훈련시켰습니다. 여기에는 뱀, 여우, 유기견과 같은 일반적인 포식자의 이미지 데이터셋을 수집하고 레이블을 붙이는 작업이 포함되었으며, 둥지 영역 내의 알 이미지도 포함되었습니다. 데이터셋은 주석 도구를 사용하여 레이블을 붙이고 준비한 후, Ultralytics YOLOv8 프레임워크를 사용하여 훈련되었습니다. 훈련 후, 모델은 시스템에서 효율적으로 실행될 수 있도록 ONNX 형식으로 내보내졌습니다.

소리 기반 감지를 위해 시스템은 TensorFlow의 사전 훈련된 오디오 분류 모델인 YAMNet을 사용합니다. YAMNet은 동물의 호출을 포함한 다양한 환경 소리를 인식할 수 있습니다. 마이크로폰으로 캡처된 오디오를 처리함으로써, 모델은 포식자 관련 소리를 식별하고 시각 기반 감지와 함께 경고를 트리거할 수 있습니다.

컴퓨터 비전과 오디오 기반 기계 학습을 결합함으로써, 스마트 Coop 2.0은 시각적 및 음향 신호를 모니터링하여 보다 신뢰할 수 있고 지능적인 닭장 모니터링 시스템을 제공합니다.




STEP 6. 포식자 및 알 탐지를 위한 비전 ML 모델


스마트 Coop은 두 개의 AI 모델을 동시에 실행합니다. 하나는 둥지 상자를 감시하고 알을 세며, 다른 하나는 우리 주변을 모니터링하고 포식자가 나타나는 순간 경고를 발생시킵니다. 두 모델은 동일한 신경망 아키텍처를 기반으로 하며, 완전히 다른 작업을 위해 완전히 다른 데이터셋으로 훈련되고, Arduino Uno Q에 함께 배포됩니다.

비전 모델 아키텍처

두 모델 모두 Ultralytics YOLOv8-Nano 를 사용합니다. 이는 이미지를 한 번 처리하고 모든 탐지를 단일 전방 패스에서 출력하는 단일 단계, 앵커 없는 객체 탐지기입니다.

1. 백본 은 이미지를 읽고 세 가지 스케일에서 특징 표현을 구축합니다: 작은 물체인 알을 위한 세밀한 공간 세부 정보를 유지하는 40×40 그리드, 중간 크기 물체를 위한 20×20 그리드, 그리고 큰 동물을 위한 넓은 장면 맥락을 포착하는 10×10 그리드입니다.

2. 은 이러한 세 가지 스케일을 위에서 아래로, 그 다음 아래에서 위로 결합하여 모든 스케일이 다른 스케일의 맥락의 이점을 갖도록 합니다.

3. 탐지 헤드 는 각 결합된 스케일에 부착되어 모든 공간 위치에 대한 경계 상자 좌표와 클래스 점수를 예측합니다. 320×320 입력의 경우, 세 개의 헤드가 함께 8400개의 후보 위치를 평가합니다.

원시 출력 텐서는 [1, 4+nc, 8400] 이며, 여기서 nc 는 클래스의 수입니다 - 알 탐지 모델의 경우 [1, 5, 8400] 이고, 포식자 탐지 모델의 경우 [1, 14, 8400] 입니다. 비최대 억제(NMS) 단계가 중첩된 예측을 필터링하여 각 물체에 대해 가장 높은 신뢰도의 상자만 유지합니다.

두 모델 모두 COCO 사전 훈련된 가중치에서 시작합니다. 백본은 이미 80개 카테고리의 118,000개 이미지에서 의미 있는 시각적 특징을 추출하는 방법을 알고 있습니다 — 우리는 그 기존 지식을 재사용하고 있으며, 처음부터 구축하는 것이 아닙니다. 이것이 두 모델이 상대적으로 짧은 훈련 시간에 좋은 성능을 달성하는 이유입니다. 네트워크는 320만 개의 매개변수를 가지고 있으며, ~4.1 GFLOPs에서 320×320 프레임을 처리하고, ~12 MB ONNX 파일(또는 INT8 양자화 시 ~3.5 MB)로 내보냅니다.




STEP 7. 계란 탐지 모델


달걀 모델은 카메라 프레임을 스캔하고, 찾은 모든 달걀 주위에 바운딩 박스를 그린 다음 개수를 보고합니다. 이 개수는 로깅, 표시 또는 수거 알림 작동을 위해 STM32 측으로 전달됩니다. 하나의 클래스, 즉 달걀만 감지하므로 모든 감지는 이진값입니다. 달걀 또는 아무것도 없음 .

데이터셋

데이터셋은 Roboflow Universe에서 가져왔습니다. 이 데이터셋은 실제 환경의 다양한 조건을 폭넓게 포함합니다. 흰 달걀과 갈색 달걀, 둥지 상자 안에 놓인 달걀, 닭장 바닥에 흩어져 있는 달걀, 한 개의 달걀과 한 무더기의 달걀, 가까이에서 촬영한 달걀과 뒤에 닭이 보이는 프레임 속 작은 달걀을 볼 수 있습니다. 이러한 다양성은 의도적인 것입니다. 학습 이미지가 다양할수록 특정 닭장의 모습이 어느 날 어떻게 달라지더라도 모델이 더 잘 대응할 수 있습니다.

다운로드한 후 데이터셋은 세 개의 분할로 구성됩니다. 학습 세트는 모델이 실제로 학습하는 데 사용됩니다. 검증 세트는 학습 중 모델이 한 번도 보지 못한 이미지에 얼마나 잘 일반화되는지 확인하는 데 사용되며, 이를 바탕으로 조기 중단이 이루어집니다. 테스트 세트는 완전히 따로 보관하며, 마지막에 최종 모델을 전혀 보지 못한 데이터로 평가할 때만 사용합니다.

라벨은 YOLO 형식으로 저장됩니다. 각 이미지에는 해당하는 .txt 각 줄이 달걀 하나를 설명하는 파일:

클래스 인덱스는 항상 0(달걀)이며, 모든 좌표는 이미지 크기를 기준으로 0에서 1 사이로 정규화됩니다.

증강

데이터 세트의 규모가 매우 큰 것이 아니라 중간 정도이므로, 증강 파이프라인은 학습 중 모델이 충분히 다양한 변형을 접할 수 있도록 많은 역할을 해야 합니다. 이러한 변환은 실시간으로 적용되며, 실제 이미지 파일을 변경하지 않습니다. 대신 각 학습 에폭마다 수정된 버전을 생성합니다.

hsv_h=0.015, # hue shift ±1.5% — handles variation across egg colours (white/brown/green)
hsv_s=0.7, # saturation ±70% — handles different lighting conditions throughout the day
hsv_v=0.4, # brightness ±40% — heat lamp at night vs. daylight vs. overcast
degrees=15, # rotation ±15° — eggs roll and sit at angles in nesting material
translate=0.1, # position shift ±10%
scale=0.5, # scale ±50% — eggs at different distances from the camera
fliplr=0.5, # 50% horizontal flip — eggs look the same mirrored
flipud=0.0, # no vertical flip — eggs don't appear upside down in a nesting box
mosaic=1.0, # mosaic always on — tiles 4 images per sample (most impactful augmentation)
mixup=0.0, # disabled — single class, no inter-class boundaries to learn

다음 HSV 색상 지터 는 이 특정 사용 사례에서 가장 중요한 증강 기법 중 하나입니다. 모든 학습 이미지에서 색조는 최대 1.5%, 채도는 최대 70%, 밝기는 최대 40%까지 무작위로 변경합니다. 축사 환경에서 이것이 중요한 이유는 하루 중 시간대와 계절에 따라 조명 조건이 크게 변하기 때문입니다. 같은 산란 상자도 밤의 백열식 열 램프 아래, 이른 아침의 자연광 아래, 축사 창문을 통해 들어오는 오후의 직사광선 아래에서 완전히 다르게 보입니다. 게다가 달걀 자체도 품종에 따라 새하얀색부터 짙은 갈색, 옅은 녹색까지 색상이 다양합니다. 색상 지터를 강하게 적용하지 않으면 모델은 학습 이미지에 나타난 조건에서만 달걀을 인식하도록 학습하게 되며, 조명이 바뀌는 순간 제대로 대응하지 못할 것입니다.

최대 ±15도의 회전 은 달걀이 프레임 안에서 항상 완벽하게 똑바로 놓여 있지는 않다는 현실을 반영합니다. 달걀은 굴러가기도 하고, 둥지 재료 위에서 비스듬히 놓이기도 하며, 카메라 각도에 따라 기울어져 보일 수도 있습니다.

±50%의 스케일 변동 은 카메라로부터 서로 다른 거리에 있는 알을 시뮬레이션합니다. 이는 알이 프레임 내 정확히 어느 위치에 놓이느냐에 따라 겉보기 크기가 달라질 수 있는 높이에 카메라가 설치된 경우에 유용합니다.

50% 확률의 수평 뒤집기 를 적용합니다. 알은 양쪽에서 보아도 동일하게 보이므로 거울상 이미지를 추가해 유효 데이터 세트 크기를 두 배로 늘리는 데 비용이 들지 않습니다. 수직 뒤집기는 의도적으로 비활성화했습니다. 둥지 상자 안의 알은 거꾸로 보이지 않으며, 수직으로 뒤집은 이미지를 포함하면 물리적으로 불가능한 상황을 모델에 학습시키게 됩니다.

모자이크 증강 은 이 파이프라인에서 가장 영향력이 큰 증강이므로 특별한 주의가 필요합니다. 모자이크를 항상 활성화하면 모든 학습 샘플은 실제로 서로 다른 네 이미지가 하나의 프레임으로 이어 붙은 합성 이미지가 되며, 각 이미지는 한 사분면을 차지합니다. 모델은 각 사분면에서 동시에 알을 검출해야 하므로, 이미지 경계 근처의 객체 검출, 일부가 잘린 객체 검출, 한 프레임 내 여러 객체 처리 방법을 한 번에 학습합니다. 이 정도 규모의 데이터 세트에서는 모자이크를 통해 모델이 에포크마다 접하는 고유한 학습 상황의 수가 사실상 네 배가 됩니다.

모자이크는 학습의 마지막 10개 에포크 동안 close_mosaic=10 설정을 통해 비활성화됩니다. 이는 의도적인 미세 조정 단계입니다. 모델이 증강 데이터를 통해 핵심 작업을 학습한 후에는 마지막 에포크를 깨끗하고 자연스러운 이미지로 학습하는 것이 도움이 됩니다. 이렇게 하면 최종 검증 지표가 작지만 일관되게 향상되는 경우가 많습니다.

학습 구성

from ultralytics import YOLO
model = YOLO('yolov8n.pt') # start from COCO pre-trained weights
model.train(
data = 'egg_detection_model/dataset/data.yaml',
epochs = 30, # full run — early stopping has patience=20
imgsz = 320,
batch = 16,
device = 'cuda', # or 'mps' / 'cpu'
optimizer= 'AdamW', # faster convergence than SGD on short runs
lr0 = 0.001, # initial learning rate
lrf = 0.01, # final lr = lr0 * lrf → decays to 0.00001
momentum = 0.937,
weight_decay = 0.0005,
warmup_epochs = 3,
warmup_momentum= 0.8,
warmup_bias_lr = 0.1,
patience = 20, # stop if val mAP50 doesn't improve for 20 epochs
cache = True, # keep decoded images in RAM speeds up next epochs
project = 'egg_detection_model',
name = 'yolov8n_eggs',
hsv_h=0.015, hsv_s=0.7, hsv_v=0.4,
degrees=15, translate=0.1, scale=0.5,
fliplr=0.5, flipud=0.0, mosaic=1.0, mixup=0.0,
save=True, save_period=10, plots=True, verbose=True,
)

다음으로 AdamW SGD 보다 사용합니다. 30에포크라는 예산에서는 AdamW가 더 빠르고 예측 가능하게 수렴하기 때문입니다. AdamW는 그래디언트 이력에 기반해 각 매개변수에 고유한 적응형 학습률을 제공하므로, 서로 다른 속도로 학습되는 계층 전반에서 학습을 안정화합니다. patience=20은 일시적인 정체 구간을 견디면서도 학습을 너무 일찍 중단하지 않기에 충분히 여유 있는 값입니다. cache=True는 첫 번째 에포크 이후 디코딩된 이미지를 RAM에 유지하여 이후 에포크에서 디스크 I/O를 제거합니다.

손실은 CIoU 박스 회귀(7.5), 이진 교차 엔트로피 분류(0.5—단일 클래스는 분류가 간단하므로 낮은 값), 그리고 분포 초점 손실(1.5)의 가중합입니다. 분포 초점 손실은 경계의 불확실성을 하나의 점이 아닌 분포로 모델링하여, 알과 둥지 재료 사이의 모호한 경계를 처리하는 데 도움을 줍니다.

학습 결과

학습은 전체 30개 에포크 동안 진행되었습니다. 최상의 체크포인트는 22번째 에포크입니다:

| Metric | Value |
|-----------|-------|
| mAP@50 | 0.965 |
| mAP@50-95 | 0.699 |
| Precision | 0.887 |
| Recall | 0.956 |

학습 손실과 검증 손실은 전체 과정에서 서로 밀접하게 추이를 보였으며(30번째 에포크에서 train 1.014, val 1.009), 이는 모델이 과적합 없이 잘 일반화되었음을 확인해 줍니다. 10번째 에포크에는 mAP@50이 이미 0.957에 도달했으며, COCO 사전 학습으로 강력한 출발점을 확보했음을 보여 줍니다.




STEP 8. 포식자 탐지 모델


포식자 모델은 우리 주변의 위협을 식별하고 단순히 무언가가 있다는 것이 아니라 어떤 종을 발견했는지를 보고합니다. 밖에 있는 여우는 기록된 경고를 요구하며, 우리 안에 있는 뱀은 즉각적인 경고를 요구합니다.

모델은 10종의 종을 감지합니다:

CLASS_NAMES = [
'Bobcat', # 0
'Cougar', # 1
'Coyote', # 2
'Fox', # 3
'Opossums', # 4
'Raccoon', # 5
'Rodent', # 6
'Skunk', # 7
'Snake', # 8
'Weasel', # 9
]

이 문제는 알 감지보다 훨씬 더 어렵습니다. 시각적으로 유사한 10개의 클래스, 통제되지 않은 야외 환경, 가변 조명, 복잡한 배경, 부분적인 가림, 그리고 어떤 자세로든 나타나는 동물들. 코요테와 여우는 신체 비율을 공유합니다. 족제비와 큰 설치류는 320×320에서 실루엣이 거의 동일합니다. 뱀은 표준 네 발 실루엣을 완전히 깨뜨립니다.

데이터셋

포식자 데이터셋은 준비 단계가 필요하며, 이를 다시 구축할 경우 반복해야 합니다. 우리는 19개의 클래스가 포함된 Poultry-and-Predators-Detection 이라는 대규모 데이터셋에서 시작했습니다 - 농장 동물(닭, 오리, 칠면조, 에뮤, 타조, 메추라기, 메추리 등)과 우리가 필요한 포식자의 혼합입니다. 19개 클래스 모두에 대한 훈련은 모델 용량을 관련 없는 가금류 인식에 낭비하고, 닭과 여우가 함께 나타나는 프레임에서 혼란을 초래할 위험이 있습니다.

증강

포식자 모델의 증강 전략은 대부분의 면에서 알 모델과 유사하지만 두 가지 의미 있는 차이가 있습니다.

Mixup 증강 은 0.1의 확률로 활성화되며, 이는 알 모델에서는 완전히 비활성화되었습니다. Mixup은 두 개의 훈련 이미지를 가져와 무작위 혼합 비율로 혼합하여 레이블을 비례적으로 결합합니다. 결과는 약간 투명한 이중 노출입니다 — 두 이미지의 일부가 겹쳐 보입니다. 알 탐지기와 같은 단일 클래스 모델에서는 mixup이 큰 가치를 추가하지 않습니다. 여러 클래스가 시각적으로 유사한 10개 클래스 모델에서는 mixup이 모델이 과신하지 않고 보정된 불확실한 예측을 생성하도록 강제하는 정규화 효과를 제공합니다. 코요테 이미지가 여우 이미지와 혼합될 때, 모델은 두 가지가 관련 있지만 구별된다는 것을 학습하여 추론 시 더 잘 보정된 신뢰 점수를 제공합니다.

회전 은 알 모델의 ±15도에 비해 ±10도로 줄어듭니다. 알은 둥지 상자에서 거의 모든 각도로 놓일 수 있지만, 포식자는 중력에 의해 제한됩니다 - 그들은 똑바로 걷거나(또는 수평으로 기어가며) 카메라의 시야 방향에 대해 가파른 각도로 나타나는 경우가 드뭅니다. 훈련 중 너무 많은 회전을 허용하면 모델이 비현실적인 방향에서 동물을 기대하도록 가르칠 수 있으며, 이는 실제 프레임에서 성능에 실제로 해를 끼칠 수 있습니다.

훈련 구성

포식자 모델은 100 에포크 동안 훈련되었으며, 이는 알 모델보다 세 배 이상 긴 시간입니다. 이는 임의적이지 않습니다. 10개의 시각적으로 유사한 동물 종을 구별하려면 모델이 단일 타원형 객체 클래스를 인식하는 것보다 훨씬 미세한 구별 기능을 학습해야 합니다. 백본은 코요테와 여우를 구별하기 위해 더 풍부한 내부 표현을 개발해야 하며, 이는 더 많은 반복이 필요합니다.

from ultralytics import YOLO
model = YOLO('yolov8n.pt')
model.train(
data = 'predator_detection_model/dataset/data.yaml',
epochs = 100, # 알을 기반으로 한 모델보다 3배 더 긴 훈련 — 10개의 클래스는 더 많은 반복이 필요함
imgsz = 320,
batch = 16,
device = 'cuda',
optimizer= 'AdamW',
lr0 = 0.001,
lrf = 0.01,
momentum = 0.937,
weight_decay = 0.0005,
warmup_epochs = 3,
warmup_momentum= 0.8,
warmup_bias_lr = 0.1,
patience = 30, # 더 넓은 윈도우 — 10개 클래스 모델은 개선되기 전에 더 오랜 시간 동안 정체됨
cache = True,
augment = True,
project = 'runs',
name = 'predator',
# 데이터 증강
hsv_h=0.015, hsv_s=0.7, hsv_v=0.4,
degrees=10, translate=0.1, scale=0.5,
fliplr=0.5, flipud=0.0, mosaic=1.0, mixup=0.1,
save=True, save_period=10, plots=True, verbose=True,
)

옵티마이저는 또한 AdamW 이며 lr0=0.001 로 알 모델과 일치합니다. 그러나 조기 중단을 위한 인내는 20이 아닌 30 에포크로 설정되어 있습니다. 10개의 클래스를 가진 경우, 훈련은 모델이 특징 표현을 재구성하는 동안 더 나은 성능으로 돌파하기 전에 오랜 시간 동안 정체될 수 있습니다. 20의 인내는 이러한 정체 중 하나에서 훈련이 조기에 종료될 위험이 있습니다.




STEP 9. 비전 모델 훈련하기


관련 노트를 열고 셀을 순서대로 실행하세요.

환경 설정

훈련은 Arduino Uno Q가 아닌 적절한 머신에서 수행하는 것이 좋습니다. NVIDIA GPU가 장착된 머신이 가장 빠른 결과를 제공합니다 — 중급 GPU에서 계란 모델은 약 30–40분, 포식자 모델은 약 2시간이 소요됩니다. Apple Silicon (mps)도 Ultralytics에서 잘 지원됩니다. CPU만 사용할 경우 계란 모델은 몇 시간이 걸리고 포식자 모델은 하루 대부분이 소요될 것으로 예상됩니다.

각 노트북의 첫 번째 셀은 모든 종속성을 설치합니다:

pip install ultralytics onnx onnxruntime onnxslim

구성하기 전에 사용 가능한 컴퓨트 장치를 확인하세요:

import torch
print('CUDA 사용 가능:', torch.cuda.is_available()) # NVIDIA GPU
print('MPS 사용 가능:', torch.backends.mps.is_available()) # Apple Silicon
# 구성 셀에서 DEVICE = 'cuda' | 'mps' | 'cpu' 설정

data.yaml의 잘못된 경로는 훈련 시작 시 "데이터셋을 찾을 수 없음" 오류의 가장 일반적인 원인입니다. 훈련 셀을 실행하기 전에 확인하세요.

사전 훈련된 가중치로 시작하기

두 노트북 모두 모델을 다음과 같이 초기화합니다:

model = YOLO('yolov8n.pt')
# Ultralytics는 첫 사용 시 yolov8n.pt를 자동으로 다운로드합니다 (~6 MB)

무작위 가중치를 생성하는 YAML 구성 파일에서 초기화하여 이 단계를 건너뛰지 마세요. COCO 사전 훈련된 가중치와 무작위 가중치 간의 수렴 속도와 최종 정확도의 차이는 상당합니다.

훈련 중 주의할 점

콘솔 출력에서 가장 중요한 숫자는 검증 열의 `mAP50(B)`입니다:

Epoch GPU_mem box_loss cls_loss dfl_loss mAP50(B) mAP50-95(B)
1/30 0.00G 1.345 1.563 1.206 0.864 0.517
5/30 0.00G 1.170 0.820 1.123 0.936 0.648
10/30 0.00G 1.147 0.748 1.122 0.957 0.663
22/30 0.00G 1.063 0.636 1.090 0.965 ← 최고
30/30 0.00G 1.014 0.583 1.058 0.960

계란 모델의 경우, mAP50 은 처음 5–7 에포크 내에 0.90을 넘어야 합니다. 포식자 모델의 경우, 처음 20–30 에포크 동안 0.60대에 머무는 것이 정상입니다 — 이는 일반적입니다. 포식자 모델은 클래스 간 구분이 뚜렷해지기 전에 더 긴 정체기를 겪습니다.

훈련 후 저장되는 내용

egg_detection_model/yolov8n_eggs/
├── weights/
│ ├── best.pt ← 최고 검증 mAP50 — 내보내기 시 사용
│ └── last.pt ← 마지막 에포크 — 최고일 보장은 없음
├── results.csv ← 에포크별 메트릭
├── results.png ← 훈련 곡선
├── confusion_matrix.png
├── PR_curve.png
└── F1_curve.png

항상 best.pt 를 내보내기에 사용하세요. best.pt는 훈련 중 검증 mAP50이 향상될 때마다 업데이트됩니다.

최고 체크포인트 검증하기

각 노트북의 검증 셀은 이를 자동으로 실행합니다. 또한 독립적으로 실행할 수도 있습니다:

from ultralytics import YOLO
model = YOLO('egg_detection_model/yolov8n_eggs/weights/best.pt')
metrics = model.val()
print(f'mAP@50 : {metrics.box.map50:.3f}')
print(f'mAP@50-95 : {metrics.box.map:.3f}')
print(f'Precision : {metrics.box.mp:.3f}')
print(f'Recall : {metrics.box.mr:.3f}')
# 포식자 모델 전용 — 약한 클래스를 찾기 위해 클래스별 AP 확인
CLASS_NAMES = ['Bobcat','Cougar','Coyote','Fox','Opossums',
'Raccoon','Rodent','Skunk','Snake','Weasel']
for name, ap in zip(CLASS_NAMES, metrics.box.ap50):
flag = ' ← 더 많은 데이터가 필요함' if ap < 0.50 else ''
print(f' {name:12s}: {ap:.3f}{flag}')

0.50 AP@50 이하의 모든 포식자 클래스는 다음 배포 전에 해당 클래스에 대한 더 많은 타겟 이미지를 수집하라는 신호로 간주해야 합니다.

ONNX로 내보내기

모델 훈련 후 모델은 .pt 파일에 저장되며, 이를 로드하려면 PyTorch가 필요합니다. Arduino Uno Q에서는 더 가볍고 프레임워크에 독립적인 것을 원합니다. ONNX — Open Neural Network Exchange -는 네트워크 그래프를 표준화된 방식으로 설명하는 하드웨어 중립 형식입니다.

우리는 OpenCV의 cv2.dnn 모듈이 ONNX 파일을 cv2.dnn.readNetFromONNX로 직접 로드하기 때문에 ONNX를 사용합니다. 보드에서의 유일한 소프트웨어 의존성은 OpenCV입니다 - PyTorch, TensorFlow, 별도의 런타임이 필요 없습니다. OpenCV는 이미 카메라 캡처 및 이미지 처리를 위해 존재하므로 추론은 본질적으로 무료로 제공됩니다.

각 노트북의 내보내기 셀은 다음과 같이 실행됩니다:

from ultralytics import YOLO
# 알 모델
model = YOLO('egg_detection_model/yolov8n_eggs/weights/best.pt')
model.export(
format = 'onnx',
imgsz = 320, # 훈련 중 사용된 해상도와 일치해야 함
opset = 12, # cv2.dnn은 opset 12까지 지원 — 13 이상을 사용하면 실패함
simplify= True, # 중복 연산을 융합하여 파일 크기를 줄이고 정확도 변화 없음
dynamic = False,# batch=1 고정 — cv2.dnn은 동적 배치 축을 지원하지 않음
)
# 출력: egg_detection_model/yolov8n_eggs/weights/best.onnx
# 포식자 모델
model = YOLO('predator_detection_model/predator/weights/best.pt')
model.export(format='onnx', imgsz=320, opset=12, simplify=True, dynamic=False)
# 출력: predator_detection_model/predator/weights/best.onnx

본문이 길어 아래 덧글 1개로 계속됩니다.


원문: https://www.instructables.com/Smart-Coop-20/

좋아요 0
게시판

본문 계속 1/1




STEP 10. 고통 감지를 위한 오디오 ML 모델


오디오 모델은 USB 마이크를 통해 지속적으로 닭장을 듣고 각 3초 창을 고통 신호 또는 정상적인 닭 소리로 분류합니다. 닭이 경계할 때 — 포식자 접근, 갑작스러운 침입, 신체적 스트레스 — 그들은 정상적인 발음과 음향적으로 구분되는 독특한 경고 신호를 생성합니다. 이 모델은 그 신호를 감지하고 카메라가 위협을 볼 수 없을 때도 경고를 발생시킵니다: 밤에, 벽을 통해, 또는 무리가 프레임에서 벗어났을 때.

모델은 어떤 포식자가 있는지를 식별하지 않습니다. 그것은 무리가 고통받고 있다는 것을 감지합니다 — 이것이 운영적으로 관련된 신호입니다.

주요 결과: val_auc=0.9843, 테스트 정확도 94%, F1=0.9486, 임계값 0.72

arecord 44.1 kHz
↓ resample_poly → 16 kHz, normalise
[1단계] YAMNet — AudioSet 클래스 점수기
닭/새 점수 > 0.05?
아니오 → 로그 "건너뜀 — 닭이 아님", 클립 폐기
예 ↓
[2단계] 스펙트럴 게이팅 → 로그-멜 (297 × 64) → 멜-CNN
고통 확률 → 롤링 투표 창 (2 클립)
평균 ≥ 0.72이고 창이 가득 차면 → 고통 경고

두 단계인 이유: 멜-CNN만으로는 인간의 말, 박수, 또는 쾅 소리를 거부할 수 없습니다 - 그것은 오직 닭 오디오로만 훈련되었습니다. YAMNet은 521 AudioSet 클래스에서 사전 훈련되어 CNN이 실행되기 전에 비닭 소리를 필터링하여 거의 제로의 계산 비용(~19 ms per window)으로 우연한 소리에서 잘못된 긍정을 제거합니다.

3초 클립인 이유: 알 노래 ("buck-buck-BAWK", 산란 후 발음)는 약 2–3초에 걸쳐 있습니다. 1초 클립에서는 고에너지 "BAWK" 구성 요소만으로도 CNN에 고통으로 보입니다. 3초에서는 전체 리드믹 패턴이 보이고 모델이 알 노래를 정상으로 올바르게 분류할 수 있습니다. 경고 신호도 이점이 있습니다 — 그들의 빠른 스타카토 반복은 더 긴 창에서 고립된 놀람과 더 구별됩니다.

1단계 - YAMNet 게이트

YAMNet (구글, AudioSet 사전 훈련, 521 클래스)는 각 3초 클립의 최대 두 개의 0.975초 창에서 실행되며 닭 관련 AudioSet 클래스에 대해 점수를 매깁니다. 클래스 점수만 사용됩니다 — 1024차원 임베딩은 사용되지 않습니다.

관련 클래스 인덱스 (yamnet_class_map.csv에서):

| 그룹 | 인덱스 | 가중치 |
|-------|---------|--------|
| 닭 / 꼬꼬 | 94, 95 | 1.0× |
| 새 / 새 발음 | 106, 107 | 0.6× |
| 가축 / 동물 | 81, 67 | 0.3× |
| 수탉 울음소리 (차단) | 96 | > 0.35에서 하드 차단 |

GATE_THRESHOLD = 0.05 # 매우 관대함 — 명백한 비닭만 차단
chicken_score = float(scores[[94, 95]].max())
bird_score = float(scores[[106, 107]].max()) * 0.6
animal_score = float(scores[[81, 67]].max()) * 0.3
window_score = max(chicken_score, bird_score, animal_score)

수탉 울음소리 (클래스 96)는 점수 > 0.35에서 하드 차단됩니다. 임계값은 경고 신호(울음소리와 스펙트럴 에너지를 공유하는)가 차단되지 않도록 충분히 높게 설정되어 있으며, 확실한 울음소리는 여전히 거부됩니다 — CNN은 수탉의 울음소리에 대해 훈련되지 않았으며 잘못된 긍정을 발생시킬 것입니다.

게이트가 클립을 차단하면 (window_score < 0.05), 클립은 폐기되고 롤링 투표 창은 지워지지 않습니다 - 고통 이벤트 중 짧은 비닭 소리는 누적된 증거를 재설정해서는 안 됩니다.

2단계 - 멜-CNN

de Carvalho Soster et al. 2025의 아키텍처로, ChickenLanguageDataset에서 훈련되었습니다. 입력은 스펙트럴 게이팅된 클립의 로그-멜 스펙트로그램입니다.

SR = 16000
N_MELS = 64
N_FFT = 512
HOP_LENGTH = 160
FMIN, FMAX = 50, 8000
N_FRAMES = 297 # (48000 − 512) // 160 + 1
TARGET_LEN = 48000 # 16 kHz에서 3초

전처리 체인:

# 1. 스펙트럼 게이팅 — 비정상 노이즈 감소, 완전 억제
denoised = nr.reduce_noise(y=wav, sr=SR, stationary=False, prop_decrease=1.0)
denoised /= np.abs(denoised).max() # 게이팅 후 재정규화
# 2. 로그 멜 스펙트로그램
mel = librosa.feature.melspectrogram(
y=denoised, sr=SR, n_fft=512, hop_length=160,
n_mels=64, fmin=50, fmax=8000, window='hann'
)
mel_db = librosa.power_to_db(mel, ref=np.max).T[:297]
# 3. [-1, 1]로 정규화
mel_db = 2.0 * (mel_db - mel_db.min()) / (mel_db.max() - mel_db.min()) - 1.0
# CNN에 공급되는 형태: (1, 297, 64, 1)

CNN 레이어 스택 (11 Conv2D 블록, 유효 패딩, ELU + 배치 정규화, MaxPool 없음):

| 레이어 | 필터 | 커널 | 스트라이드 | 출력 (시간 × 주파수) |
|-------|---------|--------|--------|----------------------|
| Conv2D 1 | 64 | 3×3 | 1×1 | 295 × 62 |
| Conv2D 2 | 64 | 3×3 | 1×1 | 293 × 60 |
| Conv2D 3 | 96 | 4×4 | 2×2 | 145 × 29 |
| Conv2D 4 | 96 | 3×3 | 1×1 | 143 × 27 |
| Conv2D 5 | 128 | 5×3 | 3×2 | 47 × 13 |
| Conv2D 6 | 128 | 3×3 | 1×1 | 45 × 11 |
| Conv2D 7 | 128 | 4×3 | 2×2 | 21 × 5 |
| Conv2D 8 | 128 | 3×3 | 1×1 | 19 × 3 |
| Conv2D 9 | 128 | 3×3 | 1×1 | 17 × 1 ← 주파수 축이 축소됨 |
| Conv2D 10 | 128 | 3×1 | 2×1 | 8 × 1 |
| Conv2D 11 | 128 | 4×1 | 1×1 | 5 × 1 |
| Flatten | — | — | — | 640 특성 |
| Dropout(0.3) + Dense(1, sigmoid) | — | — | — | P(고통) |

롤링 투표 : 마지막 2개의 CNN 출력이 평균화됩니다. `avg ≥ 0.72`이고 두 슬롯이 모두 채워지면 경고가 발생합니다.

데이터셋

출처: ChickenLanguageDataset

레이블 매핑

| 레이블 | 폴더 |
|-------|---------|
| distress | aerial_alarm, ground_alarm, ouch |
| normal | eating, greeting, tidbitting_hen, where_is_everyone, disturbed_in_nest_box, `et_us_out, need_nest_box, hungry, noise |

고통 세트는 작습니다 (~50초의 원시 오디오). 각 원시 클립은 1초 간격으로 3초 세그먼트로 나뉩니다. 불균형을 보상하기 위해 증강은 비대칭적입니다.

| 클래스 | 클립당 증강 복사본 | 원시 클립당 총 수 |
|-------|--------------------------|-------------------|
| distress | 12 | 13 |
| normal | 3 | 4 |

훈련

모델은 이전 단계에서 추출된 증강된 멜 스펙트로그램에 대해 엔드 투 엔드로 훈련됩니다. 사전 훈련된 가중치는 사용되지 않으며, CNN은 ChickenLanguageDataset에서 처음부터 학습합니다.

최적화기: lr=1e-3에서 Adam. 계란/포식자 모델보다 더 높은 초기 학습률(AdamW를 1e-4로 사용하는 모델)에 적합합니다. 멜-CNN은 더 얕고 입력 공간이 이미 멜 스펙트로그램 변환으로 잘 구조화되어 있기 때문입니다. ReduceLROnPlateau 콜백은 검증 손실이 정체될 때 학습률을 절반으로 줄여 훈련 중 자동으로 낮춥니다.

손실 — 이진 교차 엔트로피 대신 초점 손실:

FL(p_t) = −α(1 − p_t)^γ · log(p_t) γ=2.0, α=0.25

초점 손실은 모델이 높은 신뢰도로 올바르게 분류하는 쉬운 예제를 낮추고, 결정 경계 근처의 모호한 사례에 그래디언트 신호를 집중시킵니다. 작고 불균형한 데이터셋(고통은 비대칭 증강 후에도 소수 클래스임)에서는 초점 손실이 표준 BCE보다 일관되게 우수한 성능을 보입니다. 클래스 가중치는 사용되지 않으며, 초점 손실이 불균형을 직접 처리합니다.

조기 중단 모니터링 `val_auc` (val_loss 아님): AUC는 임계값에 독립적입니다 — 이는 결정 경계가 어디에 위치하든 상관없이 모델이 고통 클립을 정상 클립보다 더 잘 순위 매기는 능력을 측정합니다. 이는 훈련 후 검증 세트에서 배포 임계값이 별도로 조정되기 때문에 중요합니다; 훈련 중 AUC를 최적화하면 조정할 수 있는 최상의 원시 분리 가능성을 제공합니다.

분할: 70% 훈련 / 15% 검증 / 15% 테스트, 레이블에 따라 계층화됨. 분할은 누수를 방지하기 위해 증강 전에 수행됩니다 — 훈련 클립의 증강 버전은 검증 또는 테스트에 나타나지 않습니다.

model.compile(
optimizer = tf.keras.optimizers.Adam(1e-3),
loss = focal_loss(gamma=2.0, alpha=0.25),
metrics = ['accuracy', AUC(name='auc'), Precision(), Recall()]
)
model.fit(
train_ds,
validation_data = val_ds,
epochs = 80,
callbacks = [
EarlyStopping(monitor='val_auc', patience=12, restore_best_weights=True),
ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-7),
ModelCheckpoint(MODEL_SAVE, monitor='val_auc', save_best_only=True),
]
)

임계값 조정: 훈련 후, 노트북은 검증 세트에서 0.10–0.90의 임계값을 스캔하고 F1을 최대화하는 값을 선택합니다. inference.py에서 인쇄된 best_thresh를 사용하세요 — 0.5가 아닙니다. 최적의 값은 일반적으로 0.5 이상에 위치하는데, 이는 α=0.25인 포컬 손실이 고통 예측에 대해 모델을 보수적으로 편향시키기 때문에, 임계값을 단순한 0.5에서 낮춰야 재현율을 회복할 수 있습니다.

훈련 결과:

Best val_auc : 0.9843
테스트 정확도: 94%
F1 (고통): 0.9486
최고 임계값 (val F1): 0.72  

TFLite 내보내기 — float32 (기본):

conv = tf.lite.TFLiteConverter.from_keras_model(model)
with open('distress_cnn.tflite', 'wb') as f:
f.write(conv.convert())
# 크기: ~4–5 MB float32
INT8 내보내기 (선택 사항) : 노트북의 내보내기 셀에서 EXPORT_INT8 = True로 설정하여 distress_cnn_int8.tflite (~1.18 MB)도 생성합니다. 이 데이터셋에서 정확도 저하는 관찰되지 않았습니다. 디스크나 RAM이 제한된 경우에만 INT8을 사용하세요 — float32가 기본 배포 대상입니다.




STEP 11. 피더 설계





급식기의 기계적 설계는 대부분 변경되지 않았지만, 작동 시스템이 개선되었습니다. 서보 모터 대신, 급식기는 이제 28BYJ 스테퍼 모터를 사용하여 급여 분배 과정을 보다 정밀하게 제어할 수 있습니다. 모터 스텝 수를 제어함으로써, 시스템은 각 급여 주기 동안 방출되는 음식의 양을 조절할 수 있습니다.

스테퍼 모터는 ULN2003 드라이버 모듈을 사용하여 구동되며, 이는 메인 컨트롤러로부터의 제어 신호를 증폭하고 모터 코일을 순차적으로 구동합니다.




STEP 12. 난방 시스템


스마트 Coop 2.0은 추운 조건에서 내부의 안정적인 온도를 유지하기 위해 설계된 통합 난방 시스템을 포함합니다.

코프 내부의 온도는 Arduino UNO Q에 연결된 Thermo Modulino를 사용하여 모니터링됩니다. 이러한 실시간 측정값을 기반으로 컨트롤러는 난방이 필요한 시점을 결정합니다.

난방 요소는 IRLB8721PBF N채널 전력 MOSFET를 통해 제어되며, 이는 UNO Q의 3.3V 로직 레벨과 쉽게 작동합니다. 이는 추가 드라이버 회로 없이 Arduino UNO Q에서 직접 구동할 수 있음을 의미합니다.

시연 목적으로 실제 열을 발생시키지 않는 난방 LED(전구와 같은 표시기)가 사용되며, 테스트 중 난방 시스템을 안전하게 시뮬레이션하기 위해 포함됩니다.

실제 배치에서는 PTC 세라믹 공기 히터와 같은 적절한 난방 솔루션으로 교체할 수 있으며, 이는 더 안전하고 자가 조절 기능을 제공합니다.

참고: 더 높은 와트 수의 히터(PTC 히터와 같은)를 사용할 때 전류 요구 사항이 크게 증가할 수 있습니다. 기존의 벅 컨버터가 이 부하를 처리하지 못할 수 있으므로 전류 용량에 대한 적절한 평가와 전력 단계의 재설계가 필요할 수 있습니다.




STEP 13. 전력 설계





스마트 Coop 2.0 시스템은 단일 12V 10A 전원 공급 장치를 사용하여 전원이 공급됩니다. DC 도어 모터 및 난방 시스템과 같은 고출력 구성 요소는 12V 라인에서 직접 구동됩니다.

저전력 전자 장치의 경우, TPS565201 벅 컨버터가 12V 전원을 안정적인 5V 출력으로 낮춥니다. 이 5V는 USB 여성 모듈을 통해 라우팅된 후 USB 케이블을 통해 USB 허브의 전원 공급 입력으로 연결되어 Arduino UNO Q, 웹캠 및 마이크에 전원을 공급하며, ULN2003 스테퍼 모터 드라이버에도 전원을 공급합니다. 이 컨버터는 높은 효율성(약 85–90%)으로 작동하여 최소한의 열 발생과 다양한 부하에서 안정적인 성능을 보장합니다.

Arduino UNO Q 및 연결된 USB 장치(웹캠 및 마이크)는 전원 공급 라인에 연결된 USB-A 모듈을 사용하여 USB 허브를 통해 전원이 공급됩니다. 이를 통해 여러 주변 장치를 단일 지점에서 전원 공급할 수 있으며, 배선이 깔끔하고 모듈화됩니다.




STEP 14. PCB


신뢰성을 향상시키고 배선 복잡성을 줄이기 위해 EasyEDA를 사용하여 맞춤형 PCB가 설계되었습니다.

PCB는 Arduino UNO Q와 ULN2003 스테퍼 모터 드라이버가 표준 헤더를 사용하여 직접 연결될 수 있도록 설계되어 시스템이 모듈화되고 교체가 용이합니다. BTS7960 모터 드라이버는 외부 모듈로 사용되며 PCB 설계에 포함되지 않습니다. 대신, 남성-남성 점퍼 연결을 사용하여 메인 PCB에 연결되어 설계를 단순화합니다.

메인 PCB와 BTS7960 모듈 모두 전용 PCB 장착판에 장착되어 배선을 정리하고 깔끔하게 유지하는 데 도움을 줍니다.

이 보드는 전원 조절, 커넥터 및 제어 회로를 컴팩트한 레이아웃으로 통합하며, 쉽게 배선할 수 있도록 나사 단자와 헤더를 제공합니다. 견고한 접지면과 정리된 라우팅은 안정성을 향상시키고, 장착 구멍은 전용 장착판에 안전하게 설치할 수 있도록 합니다.

이것은 제작된 PCB입니다.

이것은 완전히 조립된 것입니다.




STEP 15. 조립


전체 본체는 Bambu Lab A1과 PLA를 사용하여 3D 프린팅되어 강도, 비용 및 인쇄 신뢰성의 좋은 균형을 제공합니다.

먼저 문 섹션을 조립했습니다. 재사용 가능한 장착 지점을 만들기 위해 앞부분에 M4 × 6 mm 나사산 인서트를 추가했습니다. 그런 다음 모터 마운트를 설치하고, M4 나사를 사용하여 레일을 고정할 측면 마운트를 설치했습니다. 한계 스위치 마운트와 스위치도 함께 설치했습니다. 문은 리니어 볼 베어링을 삽입하여 준비했으며, 두 개의 문 패널을 레일 위에 놓았습니다. 마지막으로 모터를 연결하고 메커니즘을 완성하기 위해 벨트를 설치했습니다.

그런 다음 앞부분을 뒷부분에 강철 막대를 사용하여 연결했습니다.

그 후 PCB 장착판을 설치했으며, DC 잭을 시작으로 PCB, 모터 드라이버 및 USB 허브를 설치했습니다.

다음으로, 스테퍼 모터와 급지 메커니즘(아르키메데스 나사)을 위치시키고 고정하여 급지 섹션을 조립했습니다.

급지 장치를 조립한 후, 3M 테이프를 사용하여 히팅 LED를 장착했습니다.

그런 다음 앞면과 뒷면 아크릴 패널을 부착하고 웹캠을 장착했습니다.

그런 다음 두 개의 지붕 섹션을 놓아 조립을 완료했습니다.

모든 나사 크기와 배치는 3D 모델을 참조하여 이해할 수 있습니다. 대부분의 마운트는 M4 나사와 나사산 인서트를 사용합니다. 문 메커니즘에는 GT2 타이밍 벨트가 사용되며, 부드러운 움직임을 위해 8 mm 막대에 LM8UU 리니어 볼 베어링이 사용되고, 구조 부품을 결합하고 정렬하기 위해 6 mm 막대가 사용됩니다.




STEP 16. Arduino IoT 클라우드로 대시보드 만들기


Smart Coop은 자율적으로 작동합니다. 새벽이 되면 문이 열리고, 추운 아침에는 히터가 닭장을 데우며, 포식자 감지는 항상 켜져 있습니다. 하지만 자율적으로 작동한다고 해서 상태를 확인할 수 없는 것은 아닙니다. Arduino Cloud 대시보드는 다음 두 가지를 제공합니다:

  1. 텔레메트리 업링크 — 실시간 온도, 습도, 계란 개수, 포식자 경보, 문 상태.
  2. 명령 다운링크 — 브라우저나 Arduino IoT Remote 앱을 사용해 어디서든 문, 히터, 급식기의 재정의 스위치를 조작할 수 있습니다.

두 흐름 모두 Uno Q의 Linux 측에 있는 동일한 Cloud Brick 컨테이너를 통해 실행됩니다. 먼저 Arduino Uno Q를 클라우드에 연결해 보겠습니다.

UNO Q 등록

UNO Q는 ESP32 및 Nano ESP32 보드에 사용되는 것과 동일한 범주인 수동 장치로 Arduino Cloud에 등록됩니다. 이 단계가 가장 중요한 이유는 Cloud Brick에 필요한 자격 증명을 생성하기 때문입니다.

다음 단계를 따르세요

  1. 다음으로 이동합니다: https://cloud.arduino.cc → Devices 탭.
  2. Add Device를 클릭합니다.

  3. Manual device에서 Arduino UNO Q → Continue를 선택합니다.

  4. 장치 이름을 지정합니다(예: UnoQ) → Continue.


  5. 이제 Arduino Cloud에서 자격 증명을 생성합니다:


  1. Device ID — UUID와 같은 공개 식별자입니다.
  2. Secret Key — 인증 토큰입니다.

대화 상자를 닫기 전에 Download PDF를 클릭합니다. Secret Key는 정확히 한 번만 표시되며 복구할 수 없습니다. 분실한 경우 유일한 해결 방법은 장치를 삭제하고 다시 등록하는 것이며, 이렇게 하면 이전 자격 증명이 사용되던 모든 곳에서 무효화됩니다.

이 단계가 끝나면 장치가 Devices 목록에 OFFLINE으로 표시됩니다. UNO Q의 Cloud Brick이 일치하는 자격 증명을 제시할 때까지 오프라인 상태로 유지됩니다.

Thing 및 변수 생성

Thing은 장치를 이름이 지정된 클라우드 변수 집합에 연결하는 논리적 컨테이너입니다. 각 변수에는 유형, 권한, 업데이트 정책이 있으며, 이러한 요소가 대시보드에 표시할 수 있는 항목과 장치가 해당 변수로 수행할 수 있는 작업을 정의합니다.

Thing 생성

  1. Arduino Cloud → Things 탭 → Create Thing으로 이동합니다.

  2. 이름을 지정합니다(예: SmartCoop).

  3. Associated Device에서 Select Device를 클릭하고 등록한 UNO Q를 선택합니다.


  4. 클라우드 변수 추가

  5. 추가하려는 각 변수에 대해 Add Variable을 클릭합니다. 중요한 필드는 다음과 같습니다:


  1. Name: Python에서 참조할 정확한 문자열입니다(cloud["temperature"]). 대소문자를 구분합니다.
  2. Type: 데이터 유형입니다. 가능한 경우 의미 기반 유형(Temperature, Percentage, Velocity)을 사용하세요. 대시보드가 적절한 위젯과 단위를 자동으로 선택합니다. 그 외에는 float, int, bool, String을 사용하세요.
  3. Permission: Read Only = 장치가 게시하고 대시보드가 표시합니다. Read & Write = 대시보드도 장치로 값을 보낼 수 있습니다(액추에이터 및 설정값에 사용).
  4. Update Policy: On change = 값이 변경될 때만 게시합니다(효율적이며 센서에 권장). Periodically = 변경 여부와 관계없이 일정한 간격으로 게시합니다.

대시보드 구축

  1. Dashboard는 시각적 계층입니다. Thing의 변수에 각각 연결된 위젯으로 구성됩니다.
  2. Dashboards 탭 → Build Dashboard를 엽니다.


  3. 이름을 지정합니다(예: Smart Coop - Dashboard).

  4. Add를 클릭하고 위젯 유형을 선택합니다. 유용한 위젯은 다음과 같습니다:



  5. Gauge / Value — 현재 측정값


  1. Chart — 시계열 기록(숫자 변수에 자동으로 추가됨)
  2. Switch / Push Button — 액추에이터를 구동하는 Read & Write 변수용
  3. Messenger — 자유 형식 문자열 업데이트용으로, 디버그 및 상태 표시에 적합

각 위젯에서 Link Variable을 클릭하고 Thing을 선택한 다음 변수를 선택합니다. Save를 클릭합니다.

장치가 연결되어 게시하기 전까지 위젯은 유휴 상태로 있으며 — 또는 0을 표시합니다. 걱정하지 마세요. 이 단계에서는 정상입니다.




STEP 17. SMS 알림을 위한 Twilio


우리는 긴급한 일이 발생했을 때(포식자 감지) 협동조합에서 귀하의 전화로 SMS 알림을 보내기 위해 Twilio를 사용하고 있습니다 - 대시보드를 지켜보는 대신 즉시 알림을 받게 됩니다.

우리 프로젝트를 위해 Twilio를 설정하는 방법은 다음과 같습니다:

1. https://www.twilio.com에서 Twilio 계정을 만드세요 (시작할 때는 체험판으로 충분합니다).

2. 전화번호를 구매하세요 (또는 무료 체험 번호를 사용하세요 — 체험 계정은 확인된 번호로만 SMS를 보낼 수 있으므로, 먼저 전화번호 → 확인된 발신자 ID에서 본인의 전화를 확인하세요).

3. Twilio 콘솔 대시보드에서 다음을 복사하세요:

  1. 계정 SID — AC…로 시작합니다.
  2. 인증 토큰 — 클릭하여 표시
  3. Twilio 전화번호 — E.164 형식, 예: +15551234567

귀하의 지역이 SMS를 지원하는지 확인하세요. Twilio의 지리적 권한 페이지에는 허용된 목적지가 나열되어 있습니다 — 일부 국가는 기본적으로 비활성화되어 있으며 콘솔에서 활성화해야 합니다 (메시징 → 설정 → 지리적 권한).




STEP 18. 결론


스마트 Coop 2.0은 자동화, 전자기기, AI를 결합하여 더 스마트하고 신뢰할 수 있는 닭장 시스템을 만듭니다. 기계 설계를 개선하고, 맞춤형 PCB로 전자기기를 단순화하며, 비전 및 오디오 기반 모니터링을 추가함으로써 시스템은 강력하면서도 복제하기 쉬워집니다.

모듈형 설계는 다양한 요구에 따라 조립, 유지 관리 및 사용자 정의를 쉽게 합니다. 자동화된 문 제어, 정밀한 급이, 환경 모니터링 및 지능형 감지와 같은 기능을 통해 이 시스템은 수작업 노력을 줄이면서 안전성과 효율성을 향상시킵니다.

전반적으로, 스마트 Coop 2.0은 실용적인 IoT 및 AI 솔루션이 일상적인 문제에 어떻게 적용될 수 있는지를 보여주며, 가금류 관리의 편리함과 접근성을 높입니다.

회사명 공방유니언 주소 각 공방 주소 참조
사업자 등록번호 0000 대표 공방유니언 전화 019-60105846 팩스 0000 이메일 gongbangunion@gmail.com
통신판매업신고번호 0000 개인정보관리책임자 공방유니언
Copyright © 2017 공방유니언. All Rights Reserved.