
본문 계속 1/1
STEP 10. 고통 감지를 위한 오디오 ML 모델
오디오 모델은 USB 마이크를 통해 지속적으로 닭장을 듣고 각 3초 창을 고통 신호 또는 정상적인 닭 소리로 분류합니다. 닭이 경계할 때 — 포식자 접근, 갑작스러운 침입, 신체적 스트레스 — 그들은 정상적인 발음과 음향적으로 구분되는 독특한 경고 신호를 생성합니다. 이 모델은 그 신호를 감지하고 카메라가 위협을 볼 수 없을 때도 경고를 발생시킵니다: 밤에, 벽을 통해, 또는 무리가 프레임에서 벗어났을 때.
모델은 어떤 포식자가 있는지를 식별하지 않습니다. 그것은 무리가 고통받고 있다는 것을 감지합니다 — 이것이 운영적으로 관련된 신호입니다.
주요 결과: val_auc=0.9843, 테스트 정확도 94%, F1=0.9486, 임계값 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에서):
수탉 울음소리 (클래스 96)는 점수 > 0.35에서 하드 차단됩니다. 임계값은 경고 신호(울음소리와 스펙트럴 에너지를 공유하는)가 차단되지 않도록 충분히 높게 설정되어 있으며, 확실한 울음소리는 여전히 거부됩니다 — CNN은 수탉의 울음소리에 대해 훈련되지 않았으며 잘못된 긍정을 발생시킬 것입니다.
게이트가 클립을 차단하면 (window_score < 0.05), 클립은 폐기되고 롤링 투표 창은 지워지지 않습니다 - 고통 이벤트 중 짧은 비닭 소리는 누적된 증거를 재설정해서는 안 됩니다.
2단계 - 멜-CNN
de Carvalho Soster et al. 2025의 아키텍처로, ChickenLanguageDataset에서 훈련되었습니다. 입력은 스펙트럴 게이팅된 클립의 로그-멜 스펙트로그램입니다.
전처리 체인:
CNN 레이어 스택 (11 Conv2D 블록, 유효 패딩, ELU + 배치 정규화, MaxPool 없음):
롤링 투표 : 마지막 2개의 CNN 출력이 평균화됩니다. `avg ≥ 0.72`이고 두 슬롯이 모두 채워지면 경고가 발생합니다.
데이터셋
레이블 매핑
고통 세트는 작습니다 (~50초의 원시 오디오). 각 원시 클립은 1초 간격으로 3초 세그먼트로 나뉩니다. 불균형을 보상하기 위해 증강은 비대칭적입니다.
훈련
모델은 이전 단계에서 추출된 증강된 멜 스펙트로그램에 대해 엔드 투 엔드로 훈련됩니다. 사전 훈련된 가중치는 사용되지 않으며, CNN은 ChickenLanguageDataset에서 처음부터 학습합니다.
최적화기: lr=1e-3에서 Adam. 계란/포식자 모델보다 더 높은 초기 학습률(AdamW를 1e-4로 사용하는 모델)에 적합합니다. 멜-CNN은 더 얕고 입력 공간이 이미 멜 스펙트로그램 변환으로 잘 구조화되어 있기 때문입니다. ReduceLROnPlateau 콜백은 검증 손실이 정체될 때 학습률을 절반으로 줄여 훈련 중 자동으로 낮춥니다.
손실 — 이진 교차 엔트로피 대신 초점 손실:
초점 손실은 모델이 높은 신뢰도로 올바르게 분류하는 쉬운 예제를 낮추고, 결정 경계 근처의 모호한 사례에 그래디언트 신호를 집중시킵니다. 작고 불균형한 데이터셋(고통은 비대칭 증강 후에도 소수 클래스임)에서는 초점 손실이 표준 BCE보다 일관되게 우수한 성능을 보입니다. 클래스 가중치는 사용되지 않으며, 초점 손실이 불균형을 직접 처리합니다.
조기 중단 모니터링 `val_auc` (val_loss 아님): AUC는 임계값에 독립적입니다 — 이는 결정 경계가 어디에 위치하든 상관없이 모델이 고통 클립을 정상 클립보다 더 잘 순위 매기는 능력을 측정합니다. 이는 훈련 후 검증 세트에서 배포 임계값이 별도로 조정되기 때문에 중요합니다; 훈련 중 AUC를 최적화하면 조정할 수 있는 최상의 원시 분리 가능성을 제공합니다.
분할: 70% 훈련 / 15% 검증 / 15% 테스트, 레이블에 따라 계층화됨. 분할은 누수를 방지하기 위해 증강 전에 수행됩니다 — 훈련 클립의 증강 버전은 검증 또는 테스트에 나타나지 않습니다.
임계값 조정: 훈련 후, 노트북은 검증 세트에서 0.10–0.90의 임계값을 스캔하고 F1을 최대화하는 값을 선택합니다. inference.py에서 인쇄된 best_thresh를 사용하세요 — 0.5가 아닙니다. 최적의 값은 일반적으로 0.5 이상에 위치하는데, 이는 α=0.25인 포컬 손실이 고통 예측에 대해 모델을 보수적으로 편향시키기 때문에, 임계값을 단순한 0.5에서 낮춰야 재현율을 회복할 수 있습니다.
훈련 결과:
TFLite 내보내기 — 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 대시보드는 다음 두 가지를 제공합니다:
- 텔레메트리 업링크 — 실시간 온도, 습도, 계란 개수, 포식자 경보, 문 상태.
- 명령 다운링크 — 브라우저나 Arduino IoT Remote 앱을 사용해 어디서든 문, 히터, 급식기의 재정의 스위치를 조작할 수 있습니다.
두 흐름 모두 Uno Q의 Linux 측에 있는 동일한 Cloud Brick 컨테이너를 통해 실행됩니다. 먼저 Arduino Uno Q를 클라우드에 연결해 보겠습니다.
UNO Q 등록
UNO Q는 ESP32 및 Nano ESP32 보드에 사용되는 것과 동일한 범주인 수동 장치로 Arduino Cloud에 등록됩니다. 이 단계가 가장 중요한 이유는 Cloud Brick에 필요한 자격 증명을 생성하기 때문입니다.
다음 단계를 따르세요
- 다음으로 이동합니다: https://cloud.arduino.cc → Devices 탭.
- Add Device를 클릭합니다.

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

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


- 이제 Arduino Cloud에서 자격 증명을 생성합니다:
- Device ID — UUID와 같은 공개 식별자입니다.
- Secret Key — 인증 토큰입니다.
대화 상자를 닫기 전에 Download PDF를 클릭합니다. Secret Key는 정확히 한 번만 표시되며 복구할 수 없습니다. 분실한 경우 유일한 해결 방법은 장치를 삭제하고 다시 등록하는 것이며, 이렇게 하면 이전 자격 증명이 사용되던 모든 곳에서 무효화됩니다.
이 단계가 끝나면 장치가 Devices 목록에 OFFLINE으로 표시됩니다. UNO Q의 Cloud Brick이 일치하는 자격 증명을 제시할 때까지 오프라인 상태로 유지됩니다.
Thing 및 변수 생성
Thing은 장치를 이름이 지정된 클라우드 변수 집합에 연결하는 논리적 컨테이너입니다. 각 변수에는 유형, 권한, 업데이트 정책이 있으며, 이러한 요소가 대시보드에 표시할 수 있는 항목과 장치가 해당 변수로 수행할 수 있는 작업을 정의합니다.
Thing 생성
- Arduino Cloud → Things 탭 → Create Thing으로 이동합니다.

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

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


- 클라우드 변수 추가

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


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

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



- Gauge / Value — 현재 측정값
- Chart — 시계열 기록(숫자 변수에 자동으로 추가됨)
- Switch / Push Button — 액추에이터를 구동하는 Read & Write 변수용
- Messenger — 자유 형식 문자열 업데이트용으로, 디버그 및 상태 표시에 적합
각 위젯에서 Link Variable을 클릭하고 Thing을 선택한 다음 변수를 선택합니다. Save를 클릭합니다.

장치가 연결되어 게시하기 전까지 위젯은 유휴 상태로 있으며 — 또는 0을 표시합니다. 걱정하지 마세요. 이 단계에서는 정상입니다.
STEP 17. SMS 알림을 위한 Twilio
우리는 긴급한 일이 발생했을 때(포식자 감지) 협동조합에서 귀하의 전화로 SMS 알림을 보내기 위해 Twilio를 사용하고 있습니다 - 대시보드를 지켜보는 대신 즉시 알림을 받게 됩니다.
우리 프로젝트를 위해 Twilio를 설정하는 방법은 다음과 같습니다:
1. https://www.twilio.com에서 Twilio 계정을 만드세요 (시작할 때는 체험판으로 충분합니다).
2. 전화번호를 구매하세요 (또는 무료 체험 번호를 사용하세요 — 체험 계정은 확인된 번호로만 SMS를 보낼 수 있으므로, 먼저 전화번호 → 확인된 발신자 ID에서 본인의 전화를 확인하세요).
3. Twilio 콘솔 대시보드에서 다음을 복사하세요:
- 계정 SID — AC…로 시작합니다.
- 인증 토큰 — 클릭하여 표시
- Twilio 전화번호 — E.164 형식, 예: +15551234567

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

스마트 Coop 2.0은 자동화, 전자기기, AI를 결합하여 더 스마트하고 신뢰할 수 있는 닭장 시스템을 만듭니다. 기계 설계를 개선하고, 맞춤형 PCB로 전자기기를 단순화하며, 비전 및 오디오 기반 모니터링을 추가함으로써 시스템은 강력하면서도 복제하기 쉬워집니다.
모듈형 설계는 다양한 요구에 따라 조립, 유지 관리 및 사용자 정의를 쉽게 합니다. 자동화된 문 제어, 정밀한 급이, 환경 모니터링 및 지능형 감지와 같은 기능을 통해 이 시스템은 수작업 노력을 줄이면서 안전성과 효율성을 향상시킵니다.
전반적으로, 스마트 Coop 2.0은 실용적인 IoT 및 AI 솔루션이 일상적인 문제에 어떻게 적용될 수 있는지를 보여주며, 가금류 관리의 편리함과 접근성을 높입니다.













