산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

상자 안의 괴물

구성품 및 소모품

나무 상자/상자
× 1
Arduino UNO
× 1
Adafruit 웨이브 실드
× 1
SainSmart 4채널 릴레이 모듈
× 1
유리창 와이퍼 모터
× 1
빨간 LED 크리스마스 조명(100)
× 1
연기 기계
× 1
파워 앰프/스피커
× 1

이 프로젝트 정보

*** 버전 4로 업데이트됨 ***

나는 최근에 이 프로젝트의 Arduino 코드를 다시 작성했습니다. 변경 사항을 요약하면 다음과 같습니다.

<울>
  • 메인 루프는 이제 상태 머신으로 구현됩니다.
  • 현재 모든 시간은 이벤트 시간 대 현재 시간 평가를 기반으로 합니다.
  • - 타이밍은 더 이상 프레임에 종속되지 않습니다.

    - 메인 루프에서 delay() 제거 허용

    - Arduino IDE에 연결할 때 '포트 사용 중' 문제 제거

    <울>
  • 현재 일반적으로 닫힘 연결 대신 일반적으로 열림을 사용하는 릴레이 *** 릴레이 연결 업데이트!!! ***
  • 동작 감지 LED 추가
  • 깨우기 LED 추가
  • 일시 중지된 LED 추가
  • 제거된 작업 트리거 스위치
  • Red Lights &Smoke에 시간을 추가하는 기능 추가
  • - 이러한 효과가 뚜껑 바운서보다 약간 더 오래 실행되도록 합니다.

    <울>
  • 댓글이 많이 추가됨
  • 여기 github에서 최신 코드를 모두 찾을 수 있습니다.

    상자 속의 괴물

    저는 할로윈 소품을 좋아하고 Monster in the Box에 대해 보고 읽었습니다. 작년에 빌드하고 내가 직접 빌드해야 한다고 결정했습니다. 아이디어는 매우 간단합니다. 어떤 유형의 컨테이너에 탈출 직전의 위험한 괴물이 들어 있다는 환상을 만드는 것입니다. 움직임, 소리, 빛, 연기는 물론 놀라움의 조합으로 환상을 만들 수 있습니다.

    상자에 무엇이 들어있나요?!?!

    크고 무서운 것을 담을 수 있을 만큼 충분히 큰 상자가 필요합니다. 또한 상자가 오래되고 잘 닳았으며 괴물을 막을 수 있을 만큼만 튼튼해 보이는 경우 환상을 더합니다. 처음에는 중고품 매장과 온라인에서 쇼핑을 했지만 마음에 드는 것이 없었기 때문에 직접 만들었습니다. 별로 어렵지 않았습니다.

    저는 Home Depot에서 15개의 6ft 소나무 울타리 피켓을 사용하여 약 3ft x 2.5ft x 2.5ft 크기의 상자를 만들었습니다. 나는 테이블 톱으로 모든 보드를 길이에 맞게 자르고 공압식 18 게이지 브래드 네일러를 사용하여 상자를 조립했습니다. 이것은 잘 작동하는 것처럼 보였지만 나중에 나는 브래드가 상자를 두드리는 소리와 튀는 소리로 인해 상자를 함께 고정할 만큼 충분히 강하지 않다는 것을 깨달았습니다. 상자를 강화하기 위해 나중에 1인치 마른 벽에서 나온 나사로 나사를 조였습니다(안쪽에서 바깥쪽으로 보이지 않도록).

    일단 건축되면 나는 홍차, 식초 및 강철 울을 사용하는 과정으로 나무를 숙성시켰습니다. 그런 다음 온라인 및/또는 제작 및 인쇄한 스텐실과 라벨로 장식했습니다.

    브레인쩝쩝!!!

    소품에는 "잠자기" 및 "깨어 있음"의 2가지 작동 상태가 있습니다. 잠자는 동안 상자는 비교적 조용하고 코골이와 가벼운 으르렁 거리는 소리만 냅니다. 괴물은 트릭 오어 트릿이 모션 센서를 작동시키면 깨어납니다. 몬스터가 깨어나면 몬스터가 포효하고 연기를 내뿜으며 뚜껑을 튕기며 상자 내부가 붉게 빛납니다.

    이 소품의 동작을 조정하기 위해 WaveShield 및 Relay Module과 함께 Arduino Uno를 사용했습니다. WaveShield는 잠자는 소리와 포효하는 소리의 작은 모음으로 로드됩니다. PIR 모션 센서는 "수면" 모드와 "깨어난" 모드 사이에서 상자를 전환하기 위해 Arduino에 입력을 제공했습니다. 깨어 있는 동안 Arduino는 릴레이 채널을 활성화하여 뚜껑 모터, 빨간불, 연기 발생기를 실행합니다. WaveShield에서 소리를 재생합니다. 내가 추가한 또 다른 기능은 일시 중지 버튼입니다. 덕분에 어린 아이들이 올 때 괴물을 일시적으로 침묵시킬 수 있었습니다.

    별거 아니야!

    뚜껑 리프터는 뚜껑을 빠르게 올렸다 내렸다 하여 몬스터가 탈출하려는 것처럼 쾅하고 튕기게 하는 장치입니다. 이 작업을 수행할 수 있는 여러 가지 방법이 있습니다. 가장 널리 사용되는 방법은 공압 액추에이터와 회전 캠입니다. 전자 제어식 공압식 액추에이터를 사용하면 뚜껑을 훨씬 더 무작위로 움직일 수 있다고 생각하지만 회전 캠이 더 간단하고 저렴한 옵션인 것 같아서 선택했습니다.

    나는 중고 자동차 앞유리 와이퍼 모터를 지역 폐품 야적장에서 $15에 삽니다. 좀 웃겼어요. 나는 들어가서 모터를 요청했다. 카운터 뒤의 아저씨는 내가 "나는 상관없어"라고 말하자 "제차와 모델을 물어봐"라고 물었고 고개를 약간 옆으로 기울이더니 옆눈을 살짝 주었다. 내가 무엇을 하는지 설명하자 그는 하나 만들고 싶어했습니다 :)

    제조사/모델에 관계없이 이 모터는 12볼트에서 작동하고 합리적인 속도로 회전하며 큰 토크를 제공합니다. 완벽합니다! 메모. 하나를 얻을 때 오래된 와이어 하네스가 있는지 확인하면 와이어를 연결하기가 훨씬 쉬워집니다. 또한 크랭크 암과 오프셋 포스트가 있는지 확인하십시오. 메인 모터 포스트가 유일한 물리적 연결이라면 캠이 미끄러질 수 있습니다.

    상자 내부 어딘가에 모터를 장착하십시오. 나는 한쪽 벽에 내 것을 붙였다. 큰 회전 캠이 연결되어 있고 상자에 넣을 모든 항목, 특히 전선에서 자유롭게 회전할 수 있어야 함을 기억하십시오. 이러한 모터 작업에 대한 몇 가지 유용한 자습서가 YouTube에 있습니다.

    1/2 합판 나무 조각에서 12인치 직경의 캠을 자릅니다. 먼저 완벽한 원을 자릅니다. 나는 그것을 모터에 장착하고 이것을 사용하여 상자에 필요한 모터 높이를 결정했습니다. 나는 뚜껑을 약 2인치 정도만 들어 올리기를 원했습니다. 이 피팅을 수행한 후 직쏘를 사용하여 무작위로 '이빨'을 캠에 절단하여 무작위 폭과 깊이로 유지하기 위해 최선을 다했습니다.

    마지막으로 2개의 금속 L 브래킷, 1인치 나일론 스페이서 및 캐리지 볼트를 사용하여 덮개 아래쪽에 롤러를 장착했습니다. 롤러는 캠의 톱니를 따라 움직이도록 캠 바로 위에 위치합니다.

    ATX 전원 공급 장치의 12볼트 레일을 사용하여 Arduino가 제어하는 ​​릴레이를 통해 모터에 전원을 공급했습니다. 예, 모든 것을 정렬하려면 약간의 시행착오가 필요합니다. 롤러의 위치를 ​​한 두 번 다시 조정한 후... 확인 세 번... 모든 것이 정렬되고 뚜껑이 계획대로 튀기 시작했습니다!

    불의 숨결:연기와 빛

    나는 연기 효과를 위해 저렴한 400와트 연기 발생기를 사용했습니다. 기본적으로 이것은 무선으로 제어되었습니다. Arduino로 제어하기 위해 수신기를 열고 두 개의 리드선을 트리거 버튼 패드에 납땜했습니다. 이것은 내가 Arduino 제어 릴레이 채널에 연결된 라인을 제공했습니다. 몇 개의 YouTube 동영상을 보고 배운 간단한 해킹이었습니다. 나는 또한 연기가 뚜껑 바로 아래에서 물줄기로 나오도록 지시하기 위해 오래된 진공 청소기 호스를 추가했습니다. 시각적 효과가 마음에 들었고 상자 안에 있는 전자 제품의 증기 응결을 줄이는 데 도움이 되었습니다.

    조명의 경우 경량 연장 코드를 간단히 자르고 릴레이 채널을 통해 배선했습니다. 여기에 연결된 100개의 빨간색 LED 조명 스트링은 Arduino에 의해 켜고 끌 수 있습니다.

    외부 목소리 사용

    WaveShield에는 1/8인치 헤드폰 잭 및 출력과 직접 연결을 위한 2개의 i/o 핀이 있습니다. 1/8인치 패치 코드를 사용하여 연습실에서 빌린 30와트 베이스 기타 앰프에 연결했습니다. PC 스피커를 포함하여 모든 증폭 스피커가 작동합니다. 하지만 견고한 로우엔드를 사용하는 것은 확실히 플러스입니다.

    연결하기

    나는 할로윈 상점에서 플라스틱 사슬을 구입하고 자물쇠를 3D로 인쇄했습니다. 이것들을 상자에 감싸면 환상의 깊이와 느낌이 더해지죠.

    할로윈!!!

    상자를 마당에 놓고 근처 수풀에 모션 센서를 숨깁니다. 긴 스피커 선을 사용하여 센서를 연결하여 누군가가 상자에 가까이(약 5피트) 접근하면 괴물이 깨어나는 위치를 실험해 볼 수 있었습니다.

    저녁이 어두워지면서 상자 외부의 모든 세부 사항을 보기가 어려워지고 있음을 깨달았습니다. 결국 나는 스트로브 투광 조명으로 조명을 비췄고 그 효과에 매우 만족했습니다.

    속임수를 쓰는 사람들이 차도를 걸어오면서 으르렁거리는 상자를 발견했습니다. 일부는 호기심을 가지고 다른 일부는 실제로 그것을 무서워했습니다. 그들이 다가오자 괴물이 살아나기 위해 포효하자 그들은 일어나서 비명을 지르며 박수를 치기까지 했습니다. 대히트였습니다.

    개선 사항

    나는 수풀 속에 내 모션 센서를 숨길 방법을 찾는 데 지쳤기 때문에 플라스틱 쥐의 뱃속에 뜨거운 접착제를 붙여 차도를 따라 또는 근처 수풀 아래 어딘가에 놓을 수 있었습니다. 또한 상자 뒷면에 RJ11 전화 잭을 설치하여 이전에 사용하던 두 가닥의 스피커 선보다 훨씬 좋은 50피트 전화 코드를 사용하여 쥐의 움직임 센서를 연결할 수 있습니다.

    새 판에 스위치와 일부 표시기 LED도 추가했음을 알 수 있습니다. 스위치는 전원을 끄지 않고 상자의 모든 기능을 일시 중지합니다. 내 주요 킬 스위치는 내부에 있는 전원 스트립이며 액세스하기가 번거롭고 이 외부 스위치의 신호 전압(5v)만 사용합니다. 이 스위치는 할로윈 밤에 내부를 들여다보고 싶어 하는 어린 트릭-오어-트리트(trick-or-treaters)와 다른 사람들을 위해 괴물을 멈추게 하는 데 유용합니다.

    오! 나는 효과를 위해 상자 위에 플라스틱 사슬을 걸고 때때로 다루기 어려울 수 있습니다. 특히 저녁에 상자에 들어가야 하는 경우. 이것을 더 쉽게 하기 위해 나는 체인 끝에 검은색 스프링 카라비너를 묶었습니다. 이렇게 하면 상자의 아래쪽 모서리에 나사로 고정한 구멍의 끝 부분을 빠르게 풀거나 걸 수 있습니다. 첨단 기술은 아니지만 매우 유용합니다.

    미래

    앞으로 추가하고 싶은 몇 가지 사항이 있습니다. R/C 제어를 통해 멀리서 몬스터를 일시 중지하거나 트리거할 수 있습니다. 또한 Arduino가 덮개가 열리거나 닫힐 때를 '알' 수 있도록 덮개 리프터에 몇 가지 유형의 피드백을 추가할 것입니다. 여러 번 리프터는 사이클의 높은 지점에서 멈춰 다음 웨이크 사이클까지 상자의 '내장'을 볼 수 있게 했습니다. 마지막으로 외부 조명/스트로브를 Arduino에 연결하여 프로그램 및/또는 R/C 포브에서 제어할 수 있도록 합니다.

    GitHub 저장소

    GitHub

    에서 최신 코드와 배선 다이어그램을 찾을 수 있습니다. <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Monster In A Box 스케치
  • MonsterSounds.h
  • MonsterSounds.ino
  • Monster In A Box 스케치C/C++
    /*Wave Shield 핀 사용:2, 3, 4, 5, 10, 11, 12 &13핀 13, 12, 11은 항상 SD 카드에서 사용됩니다(고속 SPI가 있는 유일한 핀입니다. 상호 작용). 그런 다음 DAC 및 SD 카드와 통신하는 데 사용되는 5개의 다른 핀이 있지만 모든 arduino 핀에 연결하도록 설정할 수 있습니다. 그러나 기본적으로 라이브러리는 핀 10(SD 카드용)과 핀 2, 3, 4 및 5를 DAC용으로 사용하도록 구성되어 있습니다. 이 핀을 변경하려면 라이브러리를 수정해야 합니다. 핀은 arduino 핀이 아닌 '하드웨어' 핀 이름(예:PORTD 등)으로 참조됩니다. 즉, 핀 6, 7, 8, 9 및 6개의 아날로그 입력 핀(디지털 i/o 핀 14-20이라고도 함)을 사용할 수 있습니다.https://learn.adafruit.com/adafruit-wave-shield-audio- shield-for-arduino/faq*/#include "MonsterSounds.h#define RESERVED_00 0 // 직렬 RX용 예약#define RESERVED_01 1 // 직렬 TX용 예약#define RESERVED_02 2 // Wave Shield용 예약#define RESERVED_03 3 // Wave Shield용 예약#define RESERVED_04 4 // Wave Shield용 예약#define RESERVED_05 5 // Wave Shield용 예약#define FOG_MACHINE 6 // Arduino의 디지털 핀을 릴레이 모듈에 연결#define RED_LEDS 7 // 디지털 핀 연결 Arduino에서 릴레이 모듈#define LID_BOUNCER 8 // Arduino의 디지털 핀을 릴레이 모듈에 연결#define RESERVED_09 9 // Arduino의 디지털 핀을 릴레이 모듈에 연결#define RESERVED_10 10 // Wave Shield용으로 예약됨#define RESERVED_11 11 //용으로 예약됨 Wave Shield#define RESERVED_12 12 // Wave Shield용으로 예약됨#define RESERVED_13 13 // Wave Shield용으로 예약됨#define PIR_SENSOR A 0 // PIR Input#define MOTION_LED A1 // LED:움직임 감지 시 켜짐(일시 중지/수면/웨이크 상태 무관)#define PAUSED_LED A2 // LED:시스템 일시 중지 시 켜짐#define READY_LED A3 // LED:켜짐 몬스터가 READY_TO_WAKE 상태에 있을 때#define PAUSE_BUTTON A4 // 일시 중지 스위치 입력#define DEBUG_BUTTON A5 // 디버그 스위치 입력// 효과 타이머 설정 - in Seconds (EDIT THESE)#define WAKE_DELAY 30 // '깨우기' 사이의 최소 시간 발생 시간(초)#define WAKE_DELAY_DEBUG 10 // DEGUB 스위치가 작동할 때 WAKE_DELAY 재정의#define SLEEP_SOUND_DELAY 1 // 다음 '수면' 사운드를 발생시키려는 시도 사이의 대기 시간(초)#define WAKE_MIN 3 // '깨어난' 시간의 최소 양 in Seconds#define WAKE_MAX 5 // 최대 'wake' 시간(초)#define RED_LIGHT_EXTRA_TIME 1 // 원하는 경우 빨간색 표시등이 뚜껑 바운서보다 조금 더 오래 작동하도록 허용#define SMOKE_EXTRA_TIME 2 // 연기가 실행되도록 허용 원하는 경우 뚜껑 바운서보다 약간 더 깁니다. // 효과 타이머 설정 - 밀리 초 (DO NOT EDIT이) #DEFINE WAKE_DELAY_MILLIS WAKE_DELAY 1000 #이 WAKE_DELAY_DEBUG_MILLIS WAKE_DELAY_DEBUG * 1000 #을 정의 * SLEEP_SOUND_DELAY_MILLIS SLEEP_SOUND_DELAY * 1000 #DEFINE WAKE_MIN_MILLIS WAKE_MIN * 1000 #이 WAKE_MAX_MILLIS WAKE_MAX * 1000 #이 RED_LIGHT_EXTRA_TIME_MILLIS RED_LIGHT_EXTRA_TIME * 1000 #을 정의 정의 정의 SMOKE_EXTRA_TIME_MILLIS을 정의 SMOKE_EXTRA_TIME * 1000MonsterSounds 소리;정적 unsigned long timeSinceLastSnore=0;static unsigned long wakeAllowedTimer =0;static unsigned long lidBounceTimer =0;static unsigned long lidBounceDuration =0;static unsigned long smokeTimer =0;static unsignation redLightTimer =0;static unsigned long redLightDuration =0;enum States { STATE_INITIALIZE, // setup()을 실행하고 처음으로 loop()로 들어가는 동안에만 STATE_PAUSED, // 모든 소리와 효과 끄기 STATE_SLEEPING, // 효과 없음, 잠자는 소리 , 각성 트리거 STATE_READY_TO_WAKE 허용하지 않음, // 아니요 효과, 잠자는 소리, 깨어나도록 트리거 STATE_AWAKE}; // 효과 및 몬스터 깨우기 소리 발생 State =STATE_INITIALIZE;void setup() { // 직렬 통신 초기화:Serial.begin(9600); // 모든 릴레이 핀 설정 pinMode(LID_BOUNCER, OUTPUT); 핀모드(RED_LEDS, 출력); 핀모드(FOG_MACHINE, 출력); 핀모드(PAUSED_LED, 출력); 핀모드(모션_LED, 출력); 핀모드(READY_LED, 출력); // 모든 효과를 강제로 끕니다. stopAllEffects(); 핀모드(PIR_SENSOR, 입력); 핀모드(PAUSE_BUTTON, INPUT_PULLUP); 핀모드(DEBUG_BUTTON, INPUT_PULLUP); 소리.초기화(); // 몬스터 사운드 sound.playSystemReady(); 지연(1000); 직렬.println(); Serial.print("*** 시스템 준비 ***"); 직렬.println(); }/* * 참고:모든 버튼은 풀업을 사용하므로 LOW는 버튼이 눌려 있음을 의미합니다. * 풀업은 스위치 논리가 반전되었음을 의미합니다. * 열리면 HIGH, 누르고 있으면 LOW가 됩니다. * * PIR 모션 센서는 이런 식으로 동작하지 않습니다.*//* * 주 처리 루프 * - 몬스터의 상태 머신을 관리합니다. */void loop() { boolean pauseSwitchClosed =digitalRead(PAUSE_BUTTON) ==LOW; 부울 모션 감지 =digitalRead(PIR_SENSOR) ==HIGH; digitalWrite(MOTION_LED, digitalRead(PIR_SENSOR)); 스위치(상태) { 케이스 STATE_INITIALIZE:if (pauseSwitchClosed) { goToPause(); } else { goToSleep(); } 부서지다; 케이스 STATE_PAUSED:if (!pauseSwitchClosed) { goToSleep(); digitalWrite(PAUSED_LED, LOW); } else { digitalWrite(PAUSED_LED, HIGH); } 부서지다; 케이스 STATE_SLEEPING:if (pauseSwitchClosed) { goToPause(); } else if ( isAllowedToWake() ) { goToReadyToWake(); } else { processSleeping(); } 부서지다; 케이스 STATE_READY_TO_WAKE:if (pauseSwitchClosed) { goToPause(); digitalWrite(READY_LED, LOW); } else if (motionDetected) { goToAwake(); digitalWrite(READY_LED, LOW); } else { processSleeping(); } 부서지다; 케이스 STATE_AWAKE:if (pauseSwitchClosed){ ​​goToPause(); } else if ( processAwakeAnimation() ) { goToSleep(); } // processAwakeAnimation()은 모든 애니메이션이 완료되면 true를 반환합니다. break; 기본값:Serial.println("알 수 없는 상태"); 부서지다; // 절대 여기로 오면 안 됩니다. } }/* * 일시 중지 상태로의 전환 */inline void goToPause() { Serial.println("PAUSED"); 상태 =STATE_PAUSED; stopAllEffects(); sound.stopAll();}/* * 절전 상태로 전환 */inline void goToSleep() { Serial.println("GOING TO SLEEP"); 상태 =STATE_SLEEPING; wakeAllowedTimer =millis();}/* * 깨어날 준비 상태로의 전환 * 이것은 수면 상태의 특별한 경우입니다. */inline void goToReadyToWake() { Serial.println("READY TO WAKE"); 상태 =STATE_READY_TO_WAKE; }/* * 각성 상태로의 전환 * - 몬스터를 깨우고 효과 및 사운드 처리 */inline void goToAwake() { Serial.println("AWAKE"); 상태 =STATE_AWAKE; wakeMonster();}/* * SLEEP 활동 주기 처리 * - 수면 소리 실행 * - 수면 타이머 업데이트 */inline void processSleeping() { if ((millis() - timeSinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS) { sound.playSnore( ); timeSinceLastSnore =밀리(); }}/* * 이 시간에 몬스터가 깨어날 수 있는지 결정합니다. * - 디버그 스위치를 확인하십시오. 닫혀 있으면 더 짧은 Wake Allowed Timer를 사용합니다. * - 몬스터는 깨어나기 전에 미리 정의된 최소 시간 동안 잠자기 상태여야 합니다. * - 깨어날 준비가 되면 LED에 불이 켜집니다. */inline boolean isAllowedToWake( ) { 부울 isDebug =digitalRead(DEBUG_BUTTON) ==낮음; unsigned long requiredDelay =WAKE_DELAY_MILLIS; if ( isDebug ) { requiredDelay =WAKE_DELAY_DEBUG_MILLIS; } 부울 isAllowed =(millis() - wakeAllowedTimer )> requiredDelay; if (isAllowed) { digitalWrite(READY_LED, HIGH); } return isAllowed;}/* * Wake Monster * Awake 애니메이션 시작 * Awake 사운드 재생 * * AWAKE 상태를 시작하려면 이것을 한 번 호출하십시오. */void wakeMonster() { int activityDuration =random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // 몬스터가 얼마나 오래 활성 상태인지입니다. Serial.print(" wake duration:"); Serial.print(활동 기간); Serial.println("ms"); 바운스 리드(활동 기간); flashRedLight(활동 기간 + RED_LIGHT_EXTRA_TIME_MILLIS); activateSmoke(activityDuration + SMOKE_EXTRA_TIME_MILLIS); sound.playRoar();} /* * AWAKE 애니메이션의 진행 상황을 관리합니다. * AWAKE 상태에서 이것을 EVERY CYCLE이라고 합니다. * 모든 애니메이션이 완료되면 TRUE를 반환합니다. */boolean processAwakeAnimation(){ printTimersToLog(); 부울 완료1 =거짓; 부울 done2 ​​=거짓; 부울 done3 =거짓; if (millis() - lidBounceTimer> lidBounceDuration) { bounceLid(0); 완료1 =참; } if (millis() - redLightTimer> redLightDuration ) { flashRedLight(0); 완료2 =사실; } if (millis() - smokeTimer> smokeDuration ) { activateSmoke(0); 완료3 =참; } return done1 &&done2 ​​&&done3;}/* * 효과 관리:상자 뚜껑 바운스 * - diration은 효과가 실행되어야 하는 시간(밀리초)입니다. * - 지속 시간이 0이면 효과가 중지되어야 함을 의미합니다. */inline void bounceLid(unsigned 긴 기간){ if (지속 시간 <=0) { energizeRelay(LID_BOUNCER); 뚜껑 바운스 지속 시간 =0; } else { // 뚜껑 바운싱 시작 de_energizeRelay(LID_BOUNCER); 리드바운스 타이머 =밀리(); lidBounceDuration =지속 시간; }}/* * Manage Effect:Flash Red Lights * - diration은 효과가 실행되어야 하는 밀리초 수입니다. * - duration 0은 효과가 중지되어야 함을 의미합니다. */inline void flashRedLight(unsigned long duration){ if (duration <=0) { 에너지화 릴레이(RED_LEDS); redLightDuration =0; } else { // 깜박이는 조명 시작 de_energizeRelay(RED_LEDS); redLightTimer =밀리(); redLightDuration =지속 시간; } }/* * 효과 시작/중지:연기 활성화 * - 지속 시간은 효과가 실행되어야 하는 시간(밀리초)입니다. * - 지속 시간이 0이면 효과가 중지되어야 함을 의미합니다. */ inline void activateSmoke(unsigned long duration) { // ' 연기 버튼을 누르십시오. // 지속 시간은 기계가 작업에 응답하는 데 필요한 고정 시간이어야 합니다. // 지속 시간 이후 중지되도록 시간 제한을 설정합니다. if (duration <=0) { energizeRelay(FOG_MACHINE); 연기 지속 시간 =0; } else { // 깜박이는 조명 시작 de_energizeRelay(FOG_MACHINE); 연기 타이머 =밀리(); smokeDuration =지속 시간; } }/* * 모든 효과 중지 * - 이것은 효과적으로 몬스터를 끕니다. */inline void stopAllEffects(){ bounceLid(0); 플래시레드라이트(0); activateSmoke(0);}/* * Awake Animation 타이머를 초당 한 번씩 로그에 인쇄합니다. */inline void printTimersToLog() { static unsigned long timeofLastTimerLog =0; if (millis() - timeofLastTimerLog>=1000) { Serial.print(" 덮개:"); Serial.print( (millis()-lidBounceTimer)> lidBounceDuration ? 0 :(lidBounceDuration -(millis()-lidBounceTimer) ) ); Serial.print(" 표시등:"); Serial.print( (millis()-redLightTimer)> redLightDuration ? 0 :(redLightDuration -(millis()-redLightTimer) ) ); Serial.print("연기:"); Serial.println( (millis()-smokeTimer)> smokeDuration ? 0 :(smokeDuration -(millis()-smokeTimer) ) ); timeofLastTimerLog =밀리(); }}/* * 릴레이 활성화 * 평상시 열림(NO) 터미널을 OPEN으로 설정 * 평상시 닫힘은 닫힘 */ inline void energizeRelay(int channel) { digitalWrite(channel, HIGH); }/* * De-Energize Relay * NO(Normally Open) 터미널을 CLOSED로 설정합니다. * 일반적으로 닫힘은 OPEN이 됩니다. */ inline void de_energizeRelay(int channel) { digitalWrite(channel, LOW); }
    MonsterSounds.hC/C++
    몬스터 사운드 라이브러리용 Arduino 헤더
    /* ARDUINO 핀에 대한 참고 사항 * 핀 13, 12, 11은 항상 SD 카드에서 사용됩니다(고속 SPI 인터페이스가 있는 유일한 핀임). * 그런 다음 DAC 및 SD 카드와 통신하는 데 사용되는 5개의 다른 핀이 있지만 모든 arduino 핀에 연결하도록 설정할 수 있습니다. * 그러나 기본적으로 라이브러리는 핀 10(SD 카드용)과 핀 2, 3, 4, 5를 DAC로 사용하도록 구성되어 있습니다. * 이 핀을 변경하려면 라이브러리를 수정해야 합니다. 핀은 arduino 핀이 아닌 '하드웨어' 핀 이름(예:PORTD 등)으로 참조됩니다. * 즉, 핀 6, 7, 8, 9 및 6개의 아날로그 입력 핀(디지털 I/O 핀 14-20이라고도 함)을 사용할 수 있습니다. * */ #include #include #include #include  static const char roar0[] ="ROAR0000.wav"; 정적 const char roar1[] ="ROAR0001.wav"; 정적 const char roar2[] ="ROAR0002.wav"; 정적 const char * const roarSounds[] ={roar0, roar1, roar2}; 정적 const char sleep0[] ="SNORE000.wav"; 정적 const char sleep1[] ="SNORE001.wav"; 정적 const char sleep2[] ="SNORE002.wav"; 정적 const char * const sleepSounds[] ={sleep0, sleep1, sleep2}; int 이전RoarSound =-1; class MonsterSounds { 개인:SdReader 카드; // 이 객체는 카드 FatVolume vol에 대한 정보를 담고 있습니다. // 이것은 카드 FatReader 루트의 파티션에 대한 정보를 보유합니다. // 이것은 볼륨 루트 디렉토리 FatReader 파일에 대한 정보를 보유합니다. // 이 개체는 구문 WaveHC 웨이브에 대한 WAV 파일을 나타냅니다. // 단일 웨이브 객체 -- 한 번에 하나의 사운드만 재생됩니다. void playfile(char *name); 공개:무효 initialize(); 무효 playSystemReady(); 무효 playRoar(); 무효 playSnore(); 무효 stopAll();};
    MonsterSounds.inoC/C++
    몬스터 사운드 라이브러리용 Arduino 코드
    /* ARDUINO 핀에 대한 참고 사항 * 핀 13, 12, 11은 항상 SD 카드에서 사용됩니다(고속 SPI 인터페이스가 있는 유일한 핀임). * 그런 다음 DAC 및 SD 카드와 통신하는 데 사용되는 5개의 다른 핀이 있지만 모든 arduino 핀에 연결하도록 설정할 수 있습니다. * 그러나 기본적으로 라이브러리는 핀 10(SD 카드용)과 핀 2, 3, 4, 5를 DAC로 사용하도록 구성되어 있습니다. * 이 핀을 변경하려면 라이브러리를 수정해야 합니다. 핀은 arduino 핀이 아닌 '하드웨어' 핀 이름(예:PORTD 등)으로 참조됩니다. * 즉, 핀 6, 7, 8, 9 및 6개의 아날로그 입력 핀(디지털 I/O 핀 14-20이라고도 함)을 사용할 수 있습니다. * */ void MonsterSounds::initialize(){ Serial.println("사운드 초기화 중..."); if(!card.init()) Serial.println(F("카드 초기화 실패!")); if(!vol.init(card)) Serial.println(F("파티션이 없습니다!")); if(!root.openRoot(vol)) Serial.println(F("디렉터리를 열 수 없습니다")); Serial.println(F("찾은 파일:")); root.ls(); randomSeed(analogRead(0));}무효 MonsterSounds::playSystemReady(){ this->playfile("WELCOME0.WAV");}무효 MonsterSounds::playRoar(){ int index =random(3); // 0, 1, 2 while (index ==previousRoarSound) { index =random(3); } 이전RoarSound =인덱스; this->playfile(roarSounds[index]);}void MonsterSounds::playSnore(){ if (!wave.isplaying) // 코 고는 소리로 기존 소리를 방해하지 않음 { int index =random(3); // 0, 1, 2 this->playfile(sleepSounds[index]); }} MonsterSounds::stopAll(){ wave.stop(); // 현재 재생 중인 WAV 중지}// --------------------------------------- ----------------------------// playfile() // WAV 파일을 열고 재생 시작// ------ -------------------------------------------------- ----------- MonsterSounds::playfile(char *name) { PgmPrint("재생 중인 사운드:"); Serial.println(이름); if (wave.isplaying) {// 이미 무언가를 재생하고 있으므로 중지하십시오! 웨이브.스톱(); // 중지 } if (!file.open(root, name)) { PgmPrintln("파일을 찾을 수 없음 "); 반품; } if (!wave.create(file)) { PgmPrintln("유효한 WAV가 아닙니다"); 반품; } // 플레이할 시간입니다! wave.play();}

    맞춤형 부품 및 인클로저

    Monstersounds_7vLZD3NU4t.zip

    회로도


    제조공정

    1. EEG 기계
    2. 주스 상자
    3. 자판기
    4. 기계 교환
    5. 재봉틀
    6. 팬티 스타킹
    7. 집에서 DIY 숙제 작성 기계 만들기
    8. Giftduino - 완벽한 Arduino 선물 상자
    9. ARDUINO를 사용하는 초음파 부상 기계
    10. Arduino + ESP Weather Box