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

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

부품 및 소모품

Arduino 101 × 1개
$4 Pololu 전압 레귤레이터 × 1개
3x AA 배터리 홀더 (스위치 포함) × 1개
AA 배터리 × 1세트 (3개 필요, 종류 무관)
M 배럴 잭 어댑터 × 1개 ($1.95, 전원 연결/분리 용이)
F 배럴 잭 어댑터 × 1개 ($1.95, 전원 연결/분리 용이)
어드레서블 LED 스트립 (NeoPixel 호환, 60픽셀) × 1개
스포츠 테이프 × 1개 (천 테이프 종류 무관, 전자기기 고정 및 그립용)
고무줄 × 1세트 (테이핑 전 부품 임시 고정용)
지팡이 (빗자루대, 스프링클러 파이프, 천연 지팡이 등) × 1개

앱 및 온라인 서비스

프로젝트 소개

이 프로젝트는 Arduino 101, 배터리, LED 스트립을 사용해 제스처로 제어하는 마법사의 지팡이를 만듭니다. 지팡이를 3가지 제스처로 움직여 3가지 다른 조명 "주문"을 소환할 수 있습니다.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

기술

코드는 Arduino 101의 관성 측정 장치(IMU)로 G-포스를 읽지만 패턴 매칭 엔진(PME)은 사용하지 않습니다(PME 예제는 Kitty Yeung의 PME 프로젝트 참조). 대신 X, Y, Z 방향의 급격한 충격을 세고, 짧은 시간 내 특정 조합이 나오면 주문을 소환합니다.

주문 시전

빠른 수직 탭 2번으로 주문을 시작한 뒤, 지팡이를 앞으로 날카롭게 움직이거나 좌우로 기울이거나 세 번째 수직 탭으로 3가지 주문 중 하나를 선택하고, 마지막 탭으로 주문을 시전합니다.

시각적 피드백

제스처 진행 단계를 알 수 있도록 LED 스트립으로 시각적 피드백을 제공합니다. 처음 더블 탭 시 흰색 빠른 점멸로 주문 시작을 알립니다. 각 단계마다 시각적 피드백으로 어떤 주문이 선택될지 알 수 있습니다.

주문 시전 상세

Arduino 101이 사용자를 향하게 지팡이를 잡으세요. 먼저 지팡이를 땅에 가볍게 두 번 탭하거나 공중에서 빠르게 수직으로 두 번 펄스하세요. 흰색 플래시가 보이면 지팡이를 앞으로/뒤로 날카롭게 움직여 주문 1 선택, 좌우로 기울여 주문 2 선택, 세 번째 수직 움직임으로 주문 3 선택. 주문 선택 시 불빛이 고정되면 초록(주문 1), 파랑(주문 2), 빨강(주문 3)으로 빛납니다. 불빛이 고정되면 마지막 수직 탭으로 주문 소환. 선택된 색상으로 반짝이며 점멸합니다.

제스처는 시간 제한이 있습니다! 각 단계 사이 1초 이내에 다음 동작을 해야 하거나 주문이 리셋됩니다. 실수하거나 잘못 선택해도 1초만 기다리면 다시 시작할 수 있습니다. 정확한 주문 소환은 약간의 연습이 필요하지만, 그냥 들고 다닐 때 실수로 주문이 발동되지 않는 장점이 있습니다.

전자회로 제작

기본적으로 Arduino 101, 배터리, NeoPixel LED 스트립만 있으면 됩니다.

전원 구성 방법은 여러 가지입니다. 가장 빠른 건 9V 배터리로 Arduino 101에서 직접 LED 구동이지만 배터리 수명이 매우 짧습니다. LiPo 배터리로 전력/무게 최적화한 "프로" 빌드도 가능하지만 안전한 충전 방법이 필요합니다. 제게 배터리 수명과 단순성의 좋은 균형은 3개 AA 배터리와 $4 전압 레귤레이터입니다. 이 구성은 섀도우 극장과 만화경 인피니티 미러 프로젝트와 동일합니다.

1단계

LED 스트립 끝단 하니스를 약 1cm 남기고 자른 후 선 끝을 스트립하세요.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등
DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

2단계

전압 레귤레이터에 동봉된 구부러진 헤더 핀을 분리해 그린/옐로 와이어 끝에 두 개 납땜하세요. 이렇게 하면 Arduino 101 핀에 쉽게 꽂을 수 있습니다.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

3단계

레드 와이어를 전압 레귤레이터 VIN 단자에 납땜하고, GND와 VOUT 핀에 직각 헤더 두 개를 사진과 같이 납땜하세요.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

4단계

배럴 잭 어댑터 연결. 배터리 케이스 선 끝을 스트립한 후 수컷 배럴 잭 단자에 장착하고 드라이버로 조이세요. 빨강은 (+), 검정은 (-) 단자.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

암컷 배럴 잭 어댑터를 LED 스트립 시작 부분의 느슨한 선에 연결. 옐로우는 (-), 레드는 (+) 단자.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

5단계

하니스를 Arduino 101에 연결. 그린 와이어 → PIN 6, 옐로우 와이어 → #13 근처 GND 핀. 전압 레귤레이터의 두 헤더 핀으로 GND → GND, VOUT → Arduino 101 "VIN" 핀. 절대 반대로 꽂지 마세요! 역연결 시 냄새와 연기가 나며 손상됩니다. 경험담입니다.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등
DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

예제 코드 업로드

1단계

배터리 팩을 끈 상태에서 USB 케이블로 Arduino 101을 컴퓨터에 연결하고 Arduino IDE로 예제 코드 업로드.

Arduino 101 프로그래밍이 처음이라면 여기 훌륭한 지침 참조: https://www.arduino.cc/en/Guide/Arduino101

코드 업로드 성공 후 USB 분리, 배터리 팩 켜고 USB 포트가 아래, 핀이 사용자 쪽을 향하게 하여 주문 제스처 테스트. 수직으로 4번 움직여 레드 주문 호출 테스트.

코드 설명: (예제 코드 그대로 사용하려면 '지팡이 제작'으로 건너뛰세요)

예제 코드는 Arduino 101의 충격 감지 기능으로 충격을 세며, 새 충격이 없는 짧은 시간 후 충격 카운트를 리셋하는 타이머를 실행합니다. 타이머 만료 전 올바른 조합을 맞추면 "주문" 함수가 호출됩니다.

땅에 단단히 탭하면 초기 충격과 지팡이 진동으로 인한 여러 "노이즈" 충격이 함께 감지되므로, loop의 첫 코드는 각 충격 묶음에서 주요 충격을 찾아 수직, 좌우, 전후로 단순 분류합니다. "gesture" 변수로 각 주요 충동 보관: 1 = 수직 충동, 2 = 전후 충동, 3 = 좌우 충동.

조합 추적을 위해 "switch" 문 사용, 제스처가 누적됨에 따라 이동. "다음 충동이 좌우면 2단계로, 타이머 만료면 0으로 돌아가라" 같은 식의 '모험 선택' 책과 유사합니다.

주문:

각 주문이 수행하는 동작을 쉽게 변경할 수 있습니다. 현재는 극장 추격 예제 코드를 다른 색상으로 실행합니다. 쉽게 추가/색상 변경/자체 조명 함수 작성 가능. theaterChase 함수의 첫 3개 변수는 빨강, 초록, 파랑 값, 마지막 숫자는 속도(숫자 클수록 느림).

/////////////////////////////////////////////////주문//////////////////////
void tapspell() {
  // 빨강 극장 조명
  theaterChase(strip.Color(127, 20, 0), 20);
  theaterChase(strip.Color(127, 20, 50), 55);
  strip.show();
}
void leftspell() {
  theaterChase(strip.Color(0, 0, 100), 20);
  theaterChase(strip.Color(0, 30, 120), 75);
  strip.show();
}
void forwardspell() {
  theaterChase(strip.Color(0, 127, 0), 30);
  theaterChase(strip.Color(0, 127, 90), 55);
  strip.show();
}

지팡이 제작

창의력을 발휘할 여지가 많습니다! 기본 기술 빌드에 집중하지만 독특한 지팡이를 만드세요. 툴, 티슈 페이퍼, 플라스틱 병 등 LED 확산 재료로 매우 멋진 조명 효과를 낼 수 있습니다!

1단계: 등산 스틱/지팡이 찾기

빗자루대, 스프링클러 파이프, 천연 나뭇가지 등 사용 가능. 마이클스 공예품 매장에서도 좋은 것 판매 (스틱 코너에 있음). 전자부품 작업용 깔끔한 영역을 위해 스포츠 테이프로 구간 감싸기 (선택사항).

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등
DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

고무줄 몇 개를 지팡이에 걸어 부품 부착을 쉽게 만드세요.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

2단계: USB 포트가 아래향하게 Arduino 101을 지팡이에 배치

고무줄로 Arduino 101 고정.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

3단계: 양끝에 고무줄 도움으로 LED 감기

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등
DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

4단계: 스포츠 테이프로 Arduino 101과 배터리 팩 고정

배터리 팩의 켜기/끄기 스위치 접근 가능하게 남겨두세요. 흔들림/탭에 견디게 단단히 고정하지만 배터리 교체 가능해야 합니다.

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등
DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

5단계: LED 조명 확산 및 장식

DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등
DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등
DIY 마법사 지팡이 키트 – Arduino 101, LED 스트립, 전압 레귤레이터 등

코드

마법사 지팡이 예제 코드 (Arduino)

X, Y, Z축 충동 카운트, 특정 조합으로 "주문"(조명 디스플레이) 소환

/* Copyright (c) 2016 Intel Corporation. All rights reserved.
   라이선스 공지는 파일 끝 참조. */
/* Arduino 101 "Wizard's Walking Staff"
   Adafruit Neopixel 라이브러리 사용. 설치 지침: https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-installation
   최신 Intel Curie Core 설치 필요. 자세한 정보: https://www.arduino.cc/en/Guide/Arduino101 */
#include "CurieIMU.h"
#include <Adafruit_NeoPixel.h>
#define PIN 6  // NeoPixels 연결 핀?
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); // 스트립 60픽셀
int tr = 0, tg = 0, tb = 0; // 색상 타겟/현재값 (스무딩용)
int r = 0, g = 0, b = 0;
long int globaltimer = 0; // 제스처 대 시간 추적 타이머
long int gesturetimer = 0;
long int ledtimer = 0;
int fade = 10; // 조명 페이드 속도 (스무딩용)
int tap = 0; // 수직 충동 카운터
int lr = 0; // 좌우 충동 카운터
int fb = 0; // 전후 충동 카운터
int gesture = 0; // 1=수직, 2=전후, 3=좌우
int state = 0; // switch case용, 연속 동작 단계 추적

void setup() {
  globaltimer = millis();
  gesturetimer = millis();
  ledtimer = millis();
  CurieIMU.begin();
  CurieIMU.attachInterrupt(eventCallback);
  CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 1500); // 1.5g = 1500 mg
  CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 50); // 인터럽트 호출용 스파이크 지속시간(ms)
  CurieIMU.interrupts(CURIE_IMU_SHOCK);
  strip.begin();
  strip.show();
}

void loop() {
  // 기본 필터 - IMU가 반동/반작용으로 다중 충격 감지. 각 제스처의 주요 충격 포착 시도.
  if (millis() - globaltimer > 170) {
    // 각 충격의 주요 축 찾기. tap, 좌우, 전후 움직임 합 비교해 가장 큰 것 선택.
    if ((tap > lr) && (tap > fb)) {
      gesture = 1; tap = 0; lr = 0; fb = 0;
    } else if ((lr > fb) && (lr > tap)) {
      gesture = 2; tap = 0; lr = 0; fb = 0;
    } else if ((fb > lr) || (fb > tap)) {
      gesture = 3; tap = 0; lr = 0; fb = 0;
    }
  }
  // 1초 타임아웃 리셋
  if (millis() - globaltimer > 1000) {
    globaltimer = millis() - 170; tr = 0; tg = 0; tb = 0; state = 0;
  }
  if (millis() - gesturetimer > 1000) {
    gesturetimer = millis() - 350; tr = 0; tg = 0; tb = 0; state = 0;
  }
  // 제스처 추적 상태 머신
  switch (state) {
    case 0: { // 제스처 없음. 탭 대기. 있으면 case 1로.
      if (millis() - gesturetimer > 350) {
        if (gesture == 1) { state = 1; gesture = 0; gesturetimer = millis(); }
      } break;
    }
    case 1: { // 탭 1회 기록. 2번째 탭이면 빠른 플래시 후 case 2로.
      if (millis() - gesturetimer > 350) {
        if (gesture == 1) { r=10;g=10;b=10; state = 2; gesture = 0; gesturetimer = millis(); }
      } break;
    }
    case 2: { // 탭 2회 기록. 분기점: 다음 제스처에 따라 3가지 주문 분기.
      if (millis() - gesturetimer > 350) {
        if (gesture == 1) { state = 3; gesture = 0; gesturetimer = millis(); } // 탭 → 주문 3
        if (gesture == 2) { state = 4; gesture = 0; gesturetimer = millis(); } // 좌우 → 주문 2
        if (gesture == 3) { state = 5; gesture = 0; gesturetimer = millis(); } // 전후 → 주문 1
      } break;
    }
    case 3: { // 탭 3회 → 탭 주문. 빨강 점등 후 마지막 탭 대기.
      tr = 20; tg = 0; tb = 0; globaltimer = millis()-250;
      if (millis() - gesturetimer > 350) {
        if (gesture == 1) { state = 0; tapspell(); }
      } break;
    }
    case 4: { // 탭 2회 + 좌우 → 좌우 주문. 파랑 점등 후 마지막 탭 대기.
      tr = 0; tg = 0; tb = 20; globaltimer = millis()-250;
      if (millis() - gesturetimer > 350) {
        if (gesture == 1) { state = 0; leftspell(); }
      } break;
    }
    case 5: { // 탭 2회 + 전후 → 전후 주문. 초록 점등 후 마지막 탭 대기.
      tr = 0; tg = 20; tb = 0; globaltimer = millis()-250;
      if (millis() - gesturetimer > 350) {
        if (gesture == 1) { state = 0; forwardspell(); }
      } break;
    }
    default: break;
  }
  // LED 스무딩 업데이트 (delay 없이 주기적 실행)
  if (millis()-ledtimer > fade) {
    if (tr > r + 1) r++; if (tg > g + 1) g++; if (tb > b + 1) b++;
    if (tr < r) r--; if (tg < g) g--; if (tb < b) b--;
    for (int i = 0; i < strip.numPixels(); i++) strip.setPixelColor(i, r, g, b);
    strip.show(); ledtimer = millis();
  }
}

// 충격 감지 시 인터럽트로 loop 중단
static void eventCallback(void) {
  if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK)) {
    if (CurieIMU.shockDetected(X_AXIS, POSITIVE)) { tap++; globaltimer = millis(); }
    if (CurieIMU.shockDetected(X_AXIS, NEGATIVE)) { tap++; globaltimer = millis(); }
    if (CurieIMU.shockDetected(Y_AXIS, POSITIVE)) { lr++; globaltimer = millis(); }
    if (CurieIMU.shockDetected(Y_AXIS, NEGATIVE)) { lr++; globaltimer = millis(); }
    if (CurieIMU.shockDetected(Z_AXIS, POSITIVE)) { fb++; globaltimer = millis(); }
    if (CurieIMU.shockDetected(Z_AXIS, NEGATIVE)) { fb++; globaltimer = millis(); }
  }
}

// 주문 조명 함수들
void tapspell() {
  theaterChase(strip.Color(127, 20, 0), 20);
  theaterChase(strip.Color(127, 20, 50), 55);
  strip.show();
}
void leftspell() {
  theaterChase(strip.Color(0, 0, 100), 20);
  theaterChase(strip.Color(0, 30, 120), 75);
  strip.show();
}
void forwardspell() {
  theaterChase(strip.Color(0, 127, 0), 30);
  theaterChase(strip.Color(0, 127, 90), 55);
  strip.show();
}
// 극장 추격 조명 (Adafruit Neopixel Strandtest 예제에서)
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) {
    for (int q = 0; q < 3; q++) {
      for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) strip.setPixelColor(i + q, c);
      strip.show(); delay(wait);
      for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) strip.setPixelColor(i + q, 0);
    }
  }
}
/* GNU LGPL 라이선스 - 상세 내용은 원문 참조 */

제조공정

  1. AC 전기장 검출: 정전 용량성 결합과 차폐 실습 가이드
  2. 저항 회로에서 전력 소모 계산하기
  3. 적층 제조 후처리 보호를 위한 7가지 검증된 팁
  4. 식용 색소: 생생한 색조가 식욕과 프레젠테이션을 높이는 법
  5. 작동하는 IoT 비즈니스 모델 구축 및 검증법 - 실용 가이드
  6. 라즈베리파이용 DIY 구글 보이스 HAT 만들기
  7. 라즈베리 파이와 아두이노로 로봇 만들기: 단계별 통합 가이드
  8. 유리 섬유 생산 공정 완벽 가이드
  9. 제조업의 날: 귀사에 맞는 날짜를 선택해 제조업의 우수성을 기념하세요
  10. SolidWorks에서 프로그레시브 컷어웨이 애니메이션 만들기 - 단계별 튜토리얼