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

Arduinoflake!

구성품 및 소모품

Arduino Nano R3
× 1

이 프로젝트 정보

눈송이는 Arduino Nano 마이크로컨트롤러에 의해 개별적으로 제어될 수 있는 17개의 독립적인 세그먼트로 그룹화된 30개의 LED로 구성됩니다. 각 LED 그룹은 PWM으로 흐리게 처리하여 멋진 애니메이션을 만들 수 있습니다.

도구

납땜 인두, 땜납, 펜치만 있으면 됩니다.

건설

우선 몇 가지 패턴을 선택합니다. 멋지고 심플한 눈송이 결정을 골라서 결정의 핵인 육각형 안에 아두이노 나노가 들어갈 수 있는 크기로 인쇄합니다.

배선 역할도 하는 지지 구조는 주석과 함께 납땜된 0.8mm 황동 막대로 만들어집니다. 나는 총 2m의 막대를 사용했습니다. 왜 자유형인가? 저는 항상 그것을 시도하고 싶었고 그것은 당신의 인내와 기술을 시험하는 것이기 때문입니다.

먼저 단일 막대를 구부려 코어 육각형을 만들고 끝을 함께 납땜했습니다. 육각형의 상단에 6개의 막대를 더 추가하면 접지 배선이 완료되므로 이제 LED의 모든 음극 리드를 납땜하여 눈송이 패턴을 만들어야 합니다. 까다로운 부분은 SMD LED를 추가하는 것이었지만 판지와 양면 테이프로 만든 지그로 스스로를 도왔습니다.

다음으로 코어 구조 아래에 Arduino Nano 마이크로컨트롤러를 추가하여 마이크로컨트롤러 핀을 모든 LED 양극 리드에 연결할 황동 막대 배선의 3개 레이어에 맞도록 충분한 공간을 남겨두었습니다. 이것은 엄청난 인내심이 필요했습니다. 전선 사이의 단락을 방지할 뿐만 아니라 전류 제한 저항을 추가하여 보기 좋게 만들어야 합니다.

리프 LED는 가장 가까운 Arduino의 출력 핀에 각각 별도로 연결됩니다. 분기 LED는 2개로 그룹화되어 PWM 핀에 연결됩니다. 코어 LED도 2개로 그룹화되어 나머지 핀에 연결됩니다. Arduino NANO에는 18개의 출력 핀(A6 및 A7은 입력만 해당)만 있고 터치 센서용으로 1개의 핀이 필요하므로 17개의 핀만 남게 되므로 두 쌍의 코어 LED를 함께 연결하여 4개의 그룹을 만듭니다. 각 핀을 통해 흐르는 전류를 약 8mA로 제한하기 위해 220Ω 저항을 사용하고 있습니다. 즉, ATmega328 칩의 경우 약간 높지만 작동하는 총 240mA입니다. 안전한 최대값은 200mA라고 합니다.

터치 센서

눈송이와 상호 작용할 수 있도록 다른 황동 막대를 추가하여 정전식 터치 센서를 만들었습니다. Paul Stoffregen의 훌륭한 라이브러리와 튜토리얼을 찾았습니다. 터치 센서는 arduinoflake와 상호 작용하는 데 사용됩니다. 애니메이션 변경, 켜기/끄기, 터치 시 반짝임, 이름 지정...

최종 메모

납땜하기 전에 모든 다이오드를 확인하는 것을 잊지 마십시오. 파손되거나 극성이 반대로 연결되면 교체하기가 매우 어렵습니다.

코드

원래 하드웨어 PWM 핀에 연결된 분기 LED만 어둡게 할 수 있을 것이라고 생각했습니다. 그러나 운 좋게도 모든 핀을 하드웨어 PWM인 것처럼 사용할 수 있는 멋진 소프트웨어 PWM 라이브러리가 있습니다. 이 설정은 애니메이션에 대한 무한한 가능성을 만들어냈습니다! 첫 번째 애니메이션 중 일부와 함께 아래에 첨부된 코드를 확인하세요.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • snowflake.ino
  • snowflake.ino아두이노
    소스 코드
    #include "SoftPWM.h#include byte edgeLedPins[] ={13, A4, A5, 2, 8, 12};byte middleLedPins[] ={10, 6, 3, 5, 9, 11}; 바이트 innerLedPins[] ={A2, A3, A1, 4, 7, A1};ADCTouchSensor 터치 센서 =ADCTouchSensor(A0, 1); 무효 설정() { Serial.begin(115200); SoftPWMBegin();}바이트 애니메이션 =0;긴 touchAt =0;void 루프() { 스위치(애니메이션) { 경우 0:_fill(100); 부서지다; 사례 1:shinyAnimation(); //페이딩애니메이션(); 부서지다; 사례 2:circleAnimation(); 부서지다; 사례 3:loopAnimation(); 부서지다; 사례 4:fireworkAnimation(); 불꽃애니메이션(); 불꽃애니메이션(); 불꽃애니메이션(); 불꽃애니메이션(); 불꽃애니메이션(); 애니메이션 ++; 부서지다; 사례 5:스마일애니메이션(); 부서지다; 기본값:애니메이션 =0; 부서지다; } int touchValue =touchSensor.read(); if (touchAt + 2000  1000) { touchAt =millis(); // 터치다운, 콜드다운 타임아웃은 2초입니다. animation ++; _채우기(0); }} 무효 fireworkAnimation() { for (int i =0; i <4; i++) { SoftPWMSet(innerLedPins[i], 100); 지연(100); } SoftPWMSet(innerLedPins[4], 100); for (int i =0, i <6, i++) { SoftPWMSet(middleLedPins[i], 255); } 지연(50); for (int i =0, i <6, i++) { SoftPWMSet(innerLedPins[i], 0); SoftPWMSet(edgeLedPins[i], 255); } 지연(50); for (int i =0, i <6, i++) { SoftPWMSet(middleLedPins[i], 0); } 지연(50); _fill(0);}스마일애니메이션 무효화() { SoftPWMSet(innerLedPins[1], 100); SoftPWMSet(innerLedPins[3], 100); SoftPWMSet(middleLedPins[0], 255); SoftPWMSet(middleLedPins[5], 255); SoftPWMSet(edgeLedPins[2], 255); SoftPWMSet(edgeLedPins[3], 255); 지연(2000); SoftPWMSet(innerLedPins[1], 0); SoftPWMSet(innerLedPins[3], 0); 지연(100); SoftPWMSet(innerLedPins[1], 100); SoftPWMSet(innerLedPins[3], 100); 지연(100); SoftPWMSet(innerLedPins[1], 0); SoftPWMSet(innerLedPins[3], 0); delay(100);}byte circleState[] ={100, 55, 10};byte circleStateAnimation[] ={1, 1, 1};void circleAnimation() { for (int i =0; i <3; i++) { if (circleState[i]>=100) { circleStateAnimation[i] =-1; // 희미한 } else if (circleState[i] <=10) { circleStateAnimation[i] =1; // 밝은 } circleState[i] +=circleStateAnimation[i]; } for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], circleState[0]); SoftPWMSet(middleLedPins[i], circleState[1]); SoftPWMSet(edgeLedPins[i], circleState[2]); } 지연(5);}바이트 waveState[] ={100, 55, 10, 10, 55, 100};바이트 waveStateAnimation[] ={1, 1, 1, -1, -1, -1}; 무효 waveAnimation () { for (int i =0; i <6; i++) { if (waveState[i]>=100) { waveStateAnimation[i] =-1; // 희미함 } else if (waveState[i] <=10) { waveStateAnimation[i] =1; // 밝은 } waveState[i] +=waveStateAnimation[i]; } for (int i =0, i <6, i+=2) { SoftPWMSet(innerLedPins[i], waveState[0]); SoftPWMSet(middleLedPins[i], waveState[1]); SoftPWMSet(edgeLedPins[i], waveState[2]); SoftPWMSet(innerLedPins[i + 1], waveState[3]); SoftPWMSet(middleLedPins[i + 1], waveState[4]); SoftPWMSet(edgeLedPins[i + 1], waveState[5]); } 지연(10);}바이트 루프 카운터 =0;바이트 루프 상태 =150; 무효 루프 애니메이션() { SoftPWMSet(innerLedPins[loopCounter], 루프 상태); SoftPWMSet(middleLedPins[loopCounter], 루프 상태); SoftPWMSet(edgeLedPins[loopCounter], 루프 상태); 루프 카운터 =_nextIndex(루프 카운터, 1); if (loopCounter ==0) { loopState =(loopState ==150 ? 0 :150); } 지연(100);} 바이트 slowOnCounter =0, 바이트 slowOnState =150; 무효 slowOnAnimation() { 바이트 randomLed =random(0, 18); if (randomLed <6) { SoftPWMSet(innerLedPins[randomLed], slowOnState); } else if (randomLed <12) { SoftPWMSet(middleLedPins[randomLed - 6], slowOnState); } else { SoftPWMSet(edgeLedPins[randomLed - 12], slowOnState); } 슬로우온카운터 ++; if (slowOnCounter>=50) { slowOnCounter =0; slowOnState =(slowOnState ==150 ? 0 :150); } delay(50);}byte shinyState[] ={0, 100, 0, 100, 0, 100};byte shinyStateAnimation[] ={1, 1, 1, 1, 1, 1};byte shinyCounter =0; void shinyAnimation() { for (int i =0; i <6; i++) { if (shinyState[i]>=100) { shinyStateAnimation[i] =-1; // 희미한 } else if (shinyState[i] <=0) { shinyStateAnimation[i] =1; // 밝음 } shinyState[i] +=shinyStateAnimation[i]; SoftPWMSet(edgeLedPins[i], ShinyState[i]); } 반짝이 카운터 ++; if (shinyCounter> 10) { ShinyCounter =0; (바이트 r =random(1, 3), r> 0, r--) { 바이트 randomLed =random(0, 12); if (randomLed <6) { SoftPWMSet(innerLedPins[random(0, 6)], 255); } else { SoftPWMSet(middleLedPins[random(0, 6)], 255); } } } else { for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], 20); SoftPWMSet(middleLedPins[i], 20); } } delay(30);}byte fadingState[] ={0, 100, 0, 100, 0, 100};byte fadingStateAnimation[] ={1, 1, 1, 1, 1, 1};void fadingAnimation() { for (int i =0; i <6; i++) { if (fadingState[i]>=100) { fadingStateAnimation[i] =-1; // 희미함 } else if (fadingState[i] <=0) { fadingStateAnimation[i] =1; // 밝은 } fadingState[i] +=fadingStateAnimation[i]; SoftPWMSet(edgeLedPins[i], fadingState[i]); SoftPWMSet(middleLedPins[_nextIndex(i, 1)], fadingState[i]); SoftPWMSet(innerLedPins[i], 50); } delay(20);}void _fill(바이트 값) { for (int i =0; i <6; i++) { SoftPWMSet(edgeLedPins[i], 값); SoftPWMSet(middleLedPins[i], 값); SoftPWMSet(innerLedPins[i], 값); }}byte _prevIndex(짧은 인덱스, 바이트 단계) { 인덱스 -=단계; 동안 (인덱스 <0) { 인덱스 +=6; } 반환 인덱스;}byte _nextIndex(짧은 인덱스, 바이트 단계) { 인덱스 +=단계; 동안 (인덱스> 5) { 인덱스 -=6; } 반환 인덱스;}

    회로도


    제조공정

    1. 맞춤 핀은 무엇에 사용됩니까?
    2. 맞춤 핀은 무엇으로 만들어졌습니까?
    3. 다웰 핀을 선택할 때 고려해야 할 5가지 사항
    4. 롤링 핀
    5. 볼링 핀
    6. 안전핀
    7. 초저전력 시스템이 TinyML에 AI 희망을 고정시킵니다
    8. Raspberry PI I/O 브레이크아웃 케이블 및 플러그보드 어댑터
    9. 다이내믹 트라이앵글 아트
    10. BGA – 무엇입니까?