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

WS2812 RGB LED 어레이 애니메이션용 Excel

구성품 및 소모품

Arduino UNO
× 1
ws2812 8x8 RGB LED 매트릭스
× 1
남성/여성 점퍼 와이어
내 3개는 Black-Gnd, Red-5v 및 Green-Data입니다.
× 3
9V 배터리(일반)
× 1
9V 대 배럴 잭 커넥터
× 1
Male-Header 5 Position-1 Row-Long(0.1" )
3개의 핀만 필요합니다.
× 1

필요한 도구 및 기계

납땜 인두(일반)
납땜 와이어, 무연

이 프로젝트 정보

온라인 지원이 있는지 확인한 후 WS2812 8x8 RGB LED 매트릭스를 주문했는데 8행 8행으로 포장된 64개 LED의 데이지 체인(테이프)이 아니라 XY 좌표 구조로 처리될 것으로 예상했습니다!

"WS2812 Led animation" 검색은 내가 쉽고 즉시 이해할 수 있는 것이 거의 없었습니다. Kevin Darrah가 제작한 YouTube 비디오를 찾았을 때 그는 마치 XY 좌표계인 것처럼 16 x 16 매트릭스(256LED 데이지 체인 연결)를 다루고 있었습니다.

그의 Excel 유틸리티는 필요한 모든 기능이 포함된 스케치에 복사/붙여넣기를 위한 텍스트 코드를 컴파일했습니다. 라이브러리를 가져올 필요가 없습니다.

그가 유틸리티 내에서 셀을 선택하고 RGB 값을 추가하면 선택된 셀에 차별 없이 적용됩니다. 내가 원하는 것이 아니므로 다시 디자인하고 다시 만들었습니다. 또한 8x8 호환성을 위해 그의 스케치를 변경해야 했습니다.

내 WS2812에 대해 더 많이 물어보면서 Excel 애플리케이션인 LED_Utility.xlsm을 계속 수정해야 했습니다.

이제 Excel 통합 문서는 다음을 제공합니다.

<울>
  • LED RGB 속성은 개별적으로 해결해야 합니다.
  • <울>
  • 프로그래밍을 통해 이러한 속성을 동적으로 변경합니다.
  • <울>
  • 동작을 시뮬레이션하기 위한 속성의 XY 재배치
  • <울>
  • RGB 값을 지정하고 XY 위치를 변경합니다.
  • <울>
  • 8x8 및 16x16 LED 주소 지정 모두.
  • <울>
  • 빠른 참조를 위한 작은 RGB 값 모음입니다.
  • 구체적으로 제 목표는 다음과 같습니다.

    <울>
  • 빨간 속이 빈 사각형을 만들고 켜고 끕니다.
  • <울>
  • 다른 색상의 레이어로 다른 사각형을 오버레이하고 서로 번갈아가며 사용합니다.
  • <울>
  • 빨간 사각형을 키워서 가지고 놀아보세요.
  • <울>
  • 표시 요소를 유지하기 위한 기능 사용에 대한 생각을 고려하십시오. 희미해지는 나선을 만들겠습니다.
  • <울>
  • 색상이 흐려졌다가 사라지는 디자인을 만듭니다.
  • <울>
  • 디자인에 움직임을 가져오세요.
  • <울>
  • 16x16 어레이를 처리합니다.
  • 나는 프로그래밍 지식이 문제를 일으킬 것이라는 것을 알고 있습니다. 나는 몇 가지 지침을 제공했지만 연구를 제안하거나 개인적으로 조언할 수 있는 사람에게 물어보십시오.

    까지 시작

    하드웨어 조립

    매트릭스에 헤더 핀이 없는 경우 헤더 핀 뱅크를 매트릭스 후면의 아래쪽 위치(DIN, +5V, GND)에 납땜합니다. DIN 핀을 Arduino 오른쪽의 핀 8에 연결하고 나머지 두 개를 보드의 다른 쪽의 일치하는 위치에 연결합니다.

    이 보드와 유틸리티의 경우 XY(0, 0)는 왼쪽 상단입니다.

    엑셀 유틸리티

    LED_Utility.xlsm 파일을 엽니다. "Eight", "Sixteen" 및 "ColMap"의 세 시트가 표시됩니다.

    마지막은 참조용으로 제공된 RGB 코드의 작은 샘플입니다.

    LED_Utility.xlsm을 읽기 전용으로 설정하여 덮어쓰기를 방지하고 "SaveAs"를 사용하여 파일을 재사용할 수 있도록 유지하도록 권장합니다. 다른 "오류 트래핑"도 내장되어 있습니다.

    "여덟" 워크시트를 선택합니다.

    오른쪽 그리드는 0으로 채워져 있습니다. 스케치가 'null' 값을 허용하지 않기 때문에 이는 중요합니다.

    위에 표시된 것과 같이 4개의 버튼이 있습니다("Sixteen"에서는 화면 오른쪽에 있고 다른 하나는 아래에 있지만 아래 설명된 대로 작동합니다).

    텍스트 코드를 생성하려면:

    "표시"는 왼쪽 그리드에 값의 RGB를 표시합니다. 0-255 사이의 값만 처리합니다. 255 이상의 값이나 모든 변수에 대해 경고합니다.

    "Var Map"은 숫자 및 변수를 허용하지만 표시를 제공하지 않습니다.

    "랩 맵"은 2계층입니다. 일반적으로 "표시" 디스플레이에 입력되는 RGB 값을 허용합니다. 그런 다음 행렬의 오버런을 허용하기 위해 스케치 코딩을 위한 모듈러스 함수를 추가합니다. 두 번째로 변수를 추가할 수 있지만 나중에 스케치에서 프로그래밍해야 합니다. 여기서 다루지 않습니다.

    각각은 그리드 아래(두 워크시트 모두에서) 아래에 '빨간색' 텍스트를 생성하며 이를 수용하도록 설계된 스케치와 호환됩니다.

    "Clear"는 분명히 두 그리드를 모두 무효화합니다.

    이것들은 모두 나중에 설명될 것입니다.

    작업할 때 Excel 유틸리티, 다음을 수행한 후 파일/다른 이름으로 저장...을 사용하는 것이 좋습니다. 디자인을 다시 만들 필요가 없도록 코드 생성 다른 점, 특히 디자인이 상당히 복잡한 경우. 또한 귀하의 원본 LED_Utility.xlsm이 읽기 전용으로 설정되어 있는 것을 방지합니다. 덮어씁니다.

    스케치

    코드 제공 아래 함께 주의 사항 읽기 전용 속성으로 저장합니다.

    Arduino IDE를 열고 'LED_Arduino.ino' 스케치를 로드합니다.

    다음과 같은 내용이 표시됩니다.

    <울>
  • Line 3은 사용 중인 Arduino 핀을 정의합니다. 이것은 핀 8로 설정됩니다.
  • <울>
  • 4번째 줄은 보드의 LED 장치를 정의합니다. 64개입니다.
  • <울>
  • 5번째 줄은 RBG 수를 고려하여 해당 수치에 3을 곱하므로 192가 됩니다.
  • <울>
  • 8, 10, 25행은 사용 중인 함수를 정의합니다.
  • 3행과 19행 사이에 원본 텍스트가 변경되었지만 16x16 매트릭스를 다루도록 편집할 수 있습니다. 즉, 소프트웨어에 LED_Ardino16.ino를 제공했으며 LED_Utility.xlsm이 이를 수용할 것입니다.

    종종 나는 'LED_Arduino.ino'를 연 다음 어떤 이름으로 "다른 이름으로 저장"을 열 것을 조언할 것입니다. 그러면 적절한 속성을 '읽기 전용'으로 설정하지 않은 경우 'LED_Arduino.ino'가 변경되지 않습니다. [새로 만든 파일에는 여전히 읽기 전용 속성이 설정되어 있습니다. 향후 편집 및 저장을 위해 릴리스].

    동시에 새로 생성된 스케치는 포트와 보드 중 하나 또는 둘 모두를 재정의해야 합니다. 오류 메시지가 표시되지만 즉시 해결되지 않을 수 있습니다.

    프로젝트 1

    LED_Arduino.ino를 Arduino IDE에 로드하고 Red_Square로 저장합니다(ino는 자동으로 추가됩니다).

    처음에는 3x3 빨간색 사각형을 만들 것을 제안합니다. 스케치의 40행에 해당 코드를 입력합니다. CellsN8, O8, P8, N11, P11, N14, O14 및 P14는 255의 값을 유지합니다.

    LED_Utility의 빨간색 텍스트,

    <사전><코드>mapLEDXY(2,2,255,0,0);mapLEDXY(2,3,255,0,0);mapLEDXY(2,4,255,0,0);mapLEDXY(3,2,255,0,0); mapLEDXY(3,4,255,0,0);mapLEDXY(4,2,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0);

    40행에 복사하면 그 아래의 텍스트가 자연스럽게 아래로 이동합니다.

    스케치를 Arduino에 업로드하면 매트릭스가 해당 사각형을 켜고 끕니다.

    계속 진행하기 전에 다음 사항을 고려하십시오.

    <울>
  • 두 그리드 지우기.
  • <울>
  • 해당 사각형 내에서 일부 색상을 변경합니다.
  • <울>
  • 원본 주변에 다른 색상의 사각형을 추가합니다.
  • 프로젝트2

    Red_Square.ino를 덮어쓰지 않도록 스케치 Red_Square.ino를 열고 Color_Sq('.ino'가 자동으로 추가됨)로 저장하는 것이 좋습니다.

    Color_Sq.ino가 IDE에 로드된 상태에서 유틸리티의 Red_Square로 이동하여 중간 사각형을 수정합니다. MakeO8, O10, O14 및 O16 '255'. N11과 P11은 '0'이지만 N12와 P12는 '255'입니다. "표시"를 누릅니다.

    에 새 코드를 추가한 후 IDE에서 47행을 예상하고 다음 코드 블록을 따라야 합니다.

    <사전><코드>RGB_update(-1, 0, 0, 0);delay(1000);clearLEDs();RGB_update(-1, 0, 0, 0); 지연(1000);

    자신에 맞게 지연 값을 변경할 수 있습니다. 1000은 1초에 해당합니다.

    프로젝트3

    Red_Square.ino를 다시 로드하고 Grow로 저장합니다.

    유틸리티에서 빨간색 사각형을 다시 만듭니다. 사각형 주위에 원하는 값을 추가하여 테두리를 만듭니다. 값은 0에서 255 사이일 수 있지만 32보다 작을 수 있습니다. 이것은 'LED_Utility.xlsm'에서 만든 것입니다.

    이제 내부 빨간색 사각형의 값을 삭제하고 "표시"를 누릅니다. 생성된 코드를 IDE의 47행에 복사하고 그 뒤에 42~46행을 복사하여 붙여넣습니다. 내부 빨간색 사각형과 다양한 색상으로 둘러싸인 사각형을 번갈아 가며 Arduino에 업로드하세요.

    원하는 경우 다른 테두리로 확장해 보십시오.

    프로젝트4

    "Loop"에 코드를 추가하면 코드가 길어지고 나중에 편집하기 어려울 수 있다는 사실을 알고 계실 것입니다.

    여기에서 나선형을 만들고 있습니다.

    이미지는 통합 문서 "spir5.xlsm"에서 가져온 것입니다. 4개의 이전 통합 문서의 절정입니다.

    "spir1.xlsm"은 밝은(255) 블록이 있는 중심이었고 "spir2.xlsm"은 내부 4x4 정사각형 값을 사용했으며 "spir3.xlsm"은 27 정사각형 블록 등을 사용했습니다. 각 단계에서 코드를 복사했습니다. 내 스케치에는 적용되지만 "루프"에는 적용되지 않습니다.

    대신 "loop" 아래에 5개의 void 함수를 만들고 "loop" 내에서 참조했습니다.

    무효 루프(){Sp1();Sp2();Sp3();Sp4();Sp5();clearLEDs();delay(1000);} 

    내 첫 번째 함수인 void Sp1()은 다음과 같습니다.

    <사전><코드> 무효 Sp1(){mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255, 0,0);RGB_update(-1, 0, 0, 0);delay(100);clearLEDs();RGB_update(-1, 0, 0, 0);delay(10);}

    "mapLEDXY..."의 두 줄을 제외하고 각각의 연속적인 기능은 동일합니다.

    이 예제에서 "loop" 내에서 편집하는 것보다 전용 기능을 편집하기 위해 외부 팁의 색상을 편집하기 위해 "spir4.xlsm"을 열어 제안하는 것이 사소해 보일 수 있습니다.

    우스꽝스러운 것에 경계를 두고 "MISSISSIPPI"라는 단어를 한 번에 하나씩 연속적으로 표시하고 싶다고 가정해 보겠습니다. 11개의 문자가 있으므로 'void loop()'가 처리할 77줄의 코드를 의미합니다. "S"를 변경하기로 결정했다면 4번의 편집을 해야 합니다. 단어에 사용된 문자는 4개뿐입니다. 따라서 각각에 대한 함수를 만들고 "loop"에서 적절하게 호출하는 것이 합리적입니다.

    프로젝트5

    이 프로젝트는 LED_Utility의 또 다른 기능인 "Var Map"을 고려합니다. 여기에서는 변수가 소개되므로 몇 가지 기본 프로그래밍 지식이 필요합니다.

    "For 루프" 구문과 "If" 조건이 사용됩니다.

    "for"는 다음과 같은 RGB 값을 늘리거나 줄이는 데 사용됩니다.

    for (int r=0; r<=256; r++) {} orfor (int r=255; r>=0; r--) {}  

    "만약"은 필요에 따라 절차를 수정합니다.

    간단하게 시작하겠습니다. 간단히 말해서요.

    LED_utility와 "Show" 중간에 2x2 빨간색 사각형을 만들고 코드는 다음과 같습니다.

    <사전><코드>mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0);

    이제 255개의 값을 모두 'r'로 변경합니다. "표시"를 누르십시오. … 우와! 그것은 마음에 들지 않습니다. 알겠습니다. 제가 추가한 보호 기능입니다. "Var Map"을 누르고 생성된 코드를 확인하십시오.

    <사전><코드>mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0);

    255는 'r'로 대체되었습니다.

    IDE에서 아카이브된 LED_Arduino.ino를 열고 "변경 사항"으로 저장합니다.

    40행에 다음을 입력하십시오.

    for (int r=0; r<256;r++){}/// 다음에:for (int r=255;r>=0;r--){}  

    각 'for' 문 뒤에는 공백 줄이 있습니다.

    41행에 Excel 코드를 붙여넣습니다.

    <사전><코드>mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0);다음으로:RGB_update(-1, 0, 0, 0);delay(50);

    이제 동일한 4줄 코드 블록을 두 번째 "for" 블록에 복사/붙여넣기합니다.

    "for" 블록 다음에 "}" 아래에 'delay(200);'를 추가합니다. 두 번째 블록이 닫혔다는 것을 눈으로 확인하는 데 필요하다는 것을 알았습니다!

    업로드 시 빨간색 블록이 최대 밝기로 증가했다가 감소했다가 꺼지고 반복됩니다.

    프로젝트6

    이제 "If" 조건을 사용해 보겠습니다.

    LED_utility에서 이전 빨간색 사각형을 다시 만들고 G 및 B 값 모두에 대해 255를 사용하여 '하늘색' 블록으로 둘러쌉니다. "표시"를 사용하십시오.

    Red 255는 그대로 두고 G 255는 모두 'g'로, B 255는 'b'로 변경,

    그런 다음 "Var Map"을 누릅니다.

    "LED_Arduino.ino"를 IDE에 다시 로드하고 "FadeBorder"로 저장합니다.

    이제 몇 가지 문제가 발생합니다. 두 개의 변수 'g'와 'b'가 있으며 각각에 값이 지정되어야 합니다. 또한 프로그램에서 선언해야 합니다. 'for' 문에서 'g'를 선언하려고 하지만 스케치의 앞부분에서 'b'를 선언해야 합니다. 5행의 스케치에는 BYTE RGB[192] 선언이 있습니다. 그 아래에 'int b=0;'을 입력합니다.

    설명의 요점으로 나중에 필요할 때 두 개의 "for" 루프를 사용할 수 없습니다. 여기서 모든 'b' 값은 'for' 루프에서 생성된 'g' 값과 같아야 합니다.

    내 "루프"는 다음과 같이 구성되지만 내 지도 코드는 없습니다.

    void loop() {delay(50);for (int g=0; g<256;g++){b=g;[여기에 지도 코드 추가]RGB_update(-1, 0, 0, 0 );delay(50);}for (int g=255;g>=0;g--){b=g; [여기에 지도 코드 추가]RGB_update(-1, 0, 0, 0);delay(50);}} 

    B 값은 'b=g;' 문으로 G 값에 연결됩니다. R 값은 255에서 정적 상태를 유지하는 반면 경계선은 밝기가 위아래로 희미해집니다.

    프로젝트7

    이제 "if" 문을 사용할 때입니다.

    오른쪽 그리드에 변수가 나타나는 위치에 255를 사용하여 다음을 만들고 '표시'합니다. 적혈구에 인접한 셀에 아주 작은 'L'이 나타납니다. 그러면 프로그램이 적절한 경우 해당 셀을 제어할 수 있습니다.

    이번에는 LED가 값 64에 도달할 때까지 녹색과 빨간색으로 페이드업한 다음 보드의 밝기가 계속 증가하면서 중간 경계 셀이 노란색으로 변경됩니다. 그러면 프로세스가 반대로 됩니다.

    다시 내 '루프'의 기본 구조를 제공합니다. 저는 이 스케치를 'FadeColourChange.ino'라고 불렀습니다.

    void 루프() { delay(50);for (int r=0; r<256;r++){g=r;if(g>64){ g=65; l=r;}[여기에 맵 코드 추가]RGB_update(-1, 0, 0, 0); 지연(50);}(int r=255;r>=0;r--){if(r<65){g=r; l=0;}[여기에 지도 코드 추가]RGB_update(-1, 0, 0, 0);delay(50);}} 

    프로젝트8

    이 마지막 프로젝트에서는 색상을 변경하지 않고 움직임을 소개합니다. 보드를 가로질러 이동하지만 왼쪽에서 다시 나타나는 화살표가 있습니다.

    여기서는 "Show"를 사용하여 코드를 생성하기만 합니다.

    화살표가 현재 위치에서 다음 위치로 이동하기를 원하기 때문에 'x' 값을 변경해야 합니다.

    이것은 G29:G33에서 생성된 코드입니다:

    <사전><코드>mapLEDXY(0,3,0,255,255);mapLEDXY(1,1,255,128,128);mapLEDXY(1,3,0,255,255);mapLEDXY(1,5,255,128,128,);mapLEDXY(2,28,215);mapLEDXY(2,28,215) ,0,255,255);mapLEDXY(2,4,255,128,128);mapLEDXY(3,3,255,128,128);

    '1'은 X 좌표에 대한 가장 작은 값이므로 'x'라고 하고 다른 모든 값은 1씩 감소합니다.

    <사전><코드>mapLEDXY(x+0,3,0,255,255);mapLEDXY(x+1,255,128,128);mapLEDXY(x+1,3,0,255,255);mapLEDXY(x+1,5,255,128,128);mapLEDXY(x 2,255,128,128);mapLEDXY(x+2,3,0,255,255);mapLEDXY(x+2,4,255,128,128);mapLEDXY(x+3,3,255,128,128);

    내 'for (int x...loop'는 루프의 몇 패스 동안 화살촉이 아래쪽 행으로 오버플로된다는 점을 제외하고는 잘 작동합니다!

    해결책! 값이 '8'을 초과하면 모듈러스 값이 필요합니다. 그래서 "Wrap Map" 버튼을 만들게 되었습니다. 이제 하나의 LED에 대한 코드가 다음과 같이 나타납니다.

    mapLEDXY((x +1) % 8, (y +1) %8, 255, 128, 128);

    XY 레이아웃을 해결하려면 하나가 사용되지 않더라도 두 개의 'for' 루프를 중첩하는 것이 가장 좋습니다(예, 어색한 대안을 찾았습니다).

    for(int x=0;x<8;x++){for(int y=0;y<8;y++){[맵코드]}} 

    두 번째 루프에서 'y<1'을 만들면 'y'는 무시됩니다. 반대로 'y'를 8로 변경하고 'x'를 0으로 변경하면 다른 효과가 나타납니다.

    마지막으로 "Wrap Map"은 RGB 변수를 허용합니다. 내가 참조한 위의 내용을 참조하십시오. 기본적인 프로그래밍을 가진 사람은 그것을 다룰 수 있어야 합니다. INO 스케치 ArrowVar.ino를 추가했습니다. 여기서 화살촉 전면의 밝기가 약간의 데모로 변경됩니다.

    16x16 매트릭스 사용.

    위에 언급된 모든 사항은 16x16 WS2812 매트릭스에 적용됩니다. 그러나 'LED_Arduino16.ino' 스케치를 사용해야 합니다.

    제공된 스케치는 'Spiral16.ino'를 제외하고 8x8 Matrix용으로 설계되었습니다. 'Spiral.ino'보다 더 큰 디스플레이를 제공합니다.

    이 나선형의 16x16 매트릭스에는 광 확산기로 2장의 프린터 용지가 있습니다. 적당한 이미지를 담기 위해 약 10초간 디스플레이를 멈췄습니다.

    코드를 개발하려면 LED_Utility.xlsm을 열고 페이지 하단의 "Sixteen" 탭을 선택하십시오.

    저처럼 디스플레이가 너무 커서 스크롤해야 하는 경우 축소 옵션을 사용하세요. 그래도 코드를 복사하려면 약간의 스크롤이 필요합니다.

    확장 프로그램?

    다른 크기의 행렬을 처리할 수 있습니까?

    내 'LED_Arduino.ino'와 'LED_Arduino16.ino'가 오프닝 라인에서 왜 그렇게 다른지 궁금합니다. 내 첫 번째에 특정 줄이 주석 처리되어 있습니다. 두 스케치 모두 내가 원하는 대로 작동합니다.

    방금 보드를 구입했지만 '8x32'용 워크시트를 작성하지 않을 예정입니다. "스케치 " 위에. 해결해야 할 매개변수가 있습니다. 15행과 18행에도 특히 주의하십시오.

    참고:UNO 유형 보드보다 작은 옵션도 고려하고 있습니다.

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

    코드

    <울>
  • LED_Arduino
  • LED_ArduinoC/C++
    이 스케치는 프로젝트의 기초를 형성합니다. 저장할 때 읽기 전용으로 설정해야 하며 추가 사용은 덮어쓰기를 방지하고 쉽게 재편집할 수 있도록 보관을 위해 '다른 이름으로 저장'으로 설정해야 합니다.
    //여기에 변수 및 정의 - WS2812 드라이버 코드#define WS2812_pin 8에 필요 // 지금은 디지털 핀 8만 작동합니다#define numberOfLEDs 64// RGB LED의 총 수 [256]byte RGB[192];//LED의 수에 3을 곱한 다음 [768]// FUNCTIONS HEREvoid RGB_update(int LED, 바이트 RED, 바이트 GREEN, 바이트 BLUE);//LED를 구동하는 함수void mapLEDXY(int x, int y, 바이트 RED, 바이트 GREEN, 바이트 BLUE) { int RGBlocation =0; //if (y % 2 ==0) { //짝수 열 [주석 제거] RGBlocation =x + y * 8; //[16] // } else { //홀수 열 [설명 해제] //RGBlocation =7 - x + y * 8; //[15] 및 [16] // } [주석 제거] RGB[RGBlocation * 3] =BLUE; RGB[RGB위치 * 3 + 1] =빨간색; RGB[RGB위치 * 3 + 2] =녹색;} 무효 clearLEDs() { memset(RGB, 0, sizeof(RGB));} 무효 설정() { pinMode(WS2812_pin, OUTPUT); 클리어LED(); RGB_update(-1, 0, 0, 0);}//setup0void loop() {//아래 RGB_update 바로 위에 mapLEDXY 라인을 붙여넣습니다.RGB_update(-1, 0, 0, 0); 지연(1000); 클리어LED(); RGB_update(-1, 0, 0, 0); delay(1000);}//loop//WS2812 Driver Functionvoid RGB_update(int LED, byte RED, byte GREEN, byte BLUE) { // LED는 0으로 시작하는 LED 번호 // RED, GREEN, BLUE는 밝기 0 ..255 해당 LED 바이트 ExistingPort, WS2812pinHIGH;//pinWrites 속도를 높이기 위한 로컬 변수 if (LED>=0) { //REG GREEN BLUE 값을 RGB[] 배열에 매핑 RGB[LED * 3] =초록; RGB[LED * 3 + 1] =빨간색; RGB[LED * 3 + 2] =파란색; } noInterrupts();//비트 스트림을 보내는 동안 인터럽트를 종료합니다... ExistingPort =PORTB; // 전체 PORT B의 상태를 저장합니다. - 해당 포트의 다른 핀을 망치지 않고 전체 포트에 씁니다. WS2812pinHIGH =PORTB | 1; // 이것은 WS2812 핀으로 전체 PORTB를 설정하는 데 사용할 수 있는 바이트를 제공합니다. HIGH int bitStream =numberOfLEDs * 3;//LED 문자열의 총 바이트 //이 for 루프는 모든 비트(8에서 a 시간) WS2812 핀 ON/OFF 시간을 설정하려면 (int i =bitStream - 1; i>=0; i--) { PORTB =WS2812pinHIGH;//bit 7 먼저 핀을 HIGH로 설정합니다. 0/1의 //여기에 까다로운 부분이 있습니다. 바이트의 비트가 높음/낮음인지 확인한 다음 해당 상태를 핀에 맞춥니다. // (RGB[i] &B10000000) RGB[i]의 다른 비트를 제거합니다. ], 그래서 여기에 B10000000 또는 B00000000이 남을 것입니다 // 그러면 비트 마스크 ""&&B10000000)""을 사용하여 AND'하여 비트가 높거나 낮은지 확인하기 쉽습니다. 이것은 1 또는 0을 제공합니다 // 1이면 기존 포트와 OR하여 핀을 HIGH로 유지하고 0이면 핀을 LOW PORTB =((RGB[i] &B10000000) &&B10000000) | 기존 포트; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");//이것은 NOPS입니다 - 이것은 우리가 시계를 지연하게 합니다 더 정확한 타이밍을 위한 주기 PORTB =ExistingPort;//좋아, 여기서 우리는 0/1 비트 상태에 관계없이 LOW여야 한다는 것을 압니다 __asm__("nop\n\t""nop\n\t""nop\n\ t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");//0/1 비트 상태에 관계없이 핀에 대한 최소 LOW 시간 // 그런 다음 수행 다음 비트에 대해 다시 등등... 약간의 변경을 위해 마지막 비트를 참조하십시오. PORTB =WS2812pinHIGH;//bit 6 PORTB =((RGB[i] &B01000000) &&B01000000) | 기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t"); PORTB =기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t "); PORTB =WS2812pinHIGH;//비트 5 PORTB =((RGB[i] &B00100000) &&B00100000) | 기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t"); PORTB =기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t "); PORTB =WS2812pinHIGH;//비트 4 PORTB =((RGB[i] &B00010000) &&B00010000) | 기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t"); PORTB =기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t "); PORTB =WS2812pinHIGH;//비트 3 PORTB =((RGB[i] &B00001000) &&B00001000) | 기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t"); PORTB =기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t "); PORTB =WS2812pinHIGH;//비트 2 PORTB =((RGB[i] &B00000100) &&B00000100) | 기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t"); PORTB =기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t "); PORTB =WS2812pinHIGH;//비트 1 PORTB =((RGB[i] &B00000010) &&B00000010) | 기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t"); PORTB =기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t "); PORTB =WS2812pinHIGH;//bit 0 __asm__("nop\n\t");//이 마지막 비트에서 검사가 훨씬 빠르므로 여기에 NOP를 추가해야 합니다. PORTB =((RGB[i] &B00000001) &&B00000001) | 기존 포트; __asm__("안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t""안돼\n\t"); PORTB =ExistingPort;//핀 LOW를 쓴 후 NOP가 없음을 참고하십시오. 이는 FOR 루프가 NOPS 대신 사용할 수 있는 클록 사이클을 사용하기 때문입니다. }//for 루프 인터럽트();//인터럽트 활성화 // 모두 완료되었습니다!}//RGB_update 무효
    Led_Utility.xlsm
    이 응용 프로그램은 스케치에 복사/붙여넣기를 위한 다양한 텍스트를 생성합니다.https://github.com/CobraCat/LED_Utility
    스케치.zip
    이것은 개발 중에 사용된 일부 또는 그 이상의 스케치입니다. '지원'으로 제공됩니다.https://github.com/CobraCat/LED_Utility

    제조공정

    1. 비행 시뮬레이터용 Arduino가 있는 LCD 패널
    2. FS2020용 Arduino가 있는 스위치/LED 패널
    3. WS2812 RGB LED 어레이 애니메이션용 Excel
    4. 글로벌 IoT 보안을 위한 3단계
    5. 2020년의 3가지 디지털 제조 동향
    6. SMB 해외 진출을 위한 3가지 팁
    7. 격변의 해에 소매업체를 위한 세 가지 교훈
    8. 빨리 물러나십시오! 로봇 - 어린이를 위한 이지 스타터 프로젝트
    9. 산업 장비 유지 관리를 위한 세 가지 팁
    10. 중공업 장비 구매를 위한 세 가지 팁