Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Анимация светодиодной матрицы RGB в Excel для WS2812

Компоненты и расходные материалы

Arduino UNO
× 1
ws2812 Светодиодная матрица RGB 8x8
× 1
Провода перемычки "папа / мама"
Мои три - Black-Gnd, Red-5v и Green-Data
× 3
Батарея 9 В (стандартная)
× 1
9 В для разъема Barrel Jack
× 1
Male-Header 5 Position- 1 Row- Long (0.1 " )
Требуются только три булавки
× 1

Необходимые инструменты и машины

Паяльник (общий)
Проволока для припоя, без свинца

Об этом проекте

Убедившись в наличии онлайн-поддержки, я заказал светодиодную матрицу WS2812 8x8 RGB, ожидая, что она будет адресована как координатная структура XY, а не гирляндная цепь (лента) из 64 светодиодов, обернутых в 8 рядов по 8!

Поиск «Анимация WS2812 Led» дал мало, что я мог сразу понять. Когда я нашел видео на YouTube, созданное Кевином Дарра, он обращался к матрице 16 x 16 (гирляндная цепь из 256 светодиодов), как если бы это была система координат XY.

Его утилита Excel скомпилировала текстовый код для копирования / вставки в его набросок, в котором были все необходимые функции; не нужно импортировать библиотеки.

Когда он выбирал ячейки в своей утилите и добавлялись значения RGB, они применялись к этим выбранным ячейкам без дискриминации; не то, что я хотел, поэтому я переделал и перестроил его. Это также означало, что мне пришлось изменить его эскиз для совместимости с форматом 8x8.

Когда я просил больше о моем WS2812, мне приходилось постоянно модифицировать мое приложение Excel, LED_Utility.xlsm.

Теперь книга Excel предлагает:

  • Свойства светодиодов RGB рассматриваются индивидуально.
  • Динамическое изменение этих свойств с помощью программирования.
  • XY перемещение этих свойств для имитации движения.
  • Значения RGB, которые необходимо адресовать, а также изменение положения XY.
  • Адресация светодиодов 8x8 и 16x16.
  • Небольшая коллекция значений RGB для быстрого ознакомления.

В частности, моя цель:

  • Создайте красный полый квадрат, включайте и выключайте его.
  • Наложите на другой квадрат слой разных цветов и чередуйте их.
  • Вырастите Красный квадрат и поиграйте с ним.
  • Обдумайте, как использовать функции для хранения отображаемых элементов; Я построю затухающую спираль.
  • Создайте дизайн, в котором цвета будут появляться и исчезать.
  • Добавьте движения в дизайн.
  • Адресные массивы 16x16.

Я действительно понимаю, что знание программирования создаст проблемы. Я предложил некоторые рекомендации, но предлагаю изучить или спросить кого-нибудь, кто может лично вам посоветовать.

TO НАЧАТЬ

Соберите оборудование

Если ваша матрица поставляется без контактов заголовка, припаяйте группу контактов заголовка к задней части матрицы в нижнем месте (DIN, + 5V, GND). Подключите контакт DIN к контакту 8 справа от Arduino, а два других - к соответствующим точкам на другой стороне платы.

Для этой платы и утилиты XY (0, 0) находится вверху слева.

Утилита Excel

Откройте файл LED_Utility.xlsm. Вы увидите три листа:«Восемь», «Шестнадцать» и «ColMap».

Последний - небольшой образец кодов RGB, предоставленный для справки.

Я установил для LED_Utility.xlsm режим только для чтения, чтобы предотвратить перезапись, а также для поощрения использования «SaveAs» для сохранения файла для возможного повторного использования. Также были встроены некоторые другие «ловушки ошибок».

Выберите рабочий лист «Восемь».

Обратите внимание, что правая сетка заполнена нулями. Это важно, поскольку эскиз не принимает нулевые значения.

Как показано выше, есть четыре кнопки (на «Sixteen» они, вероятно, будут за пределами экрана справа, одна под другой, но будут работать, как описано ниже).

Чтобы создать текстовый код:

«Показать» отображает RGB значений в левой сетке. Он обрабатывает только значения от 0 до 255. Он будет предупреждать о значениях выше 255 или любых переменных.

«Var Map» принимает числовые значения и переменные, но не отображает их.

«Wrap Map» - двухуровневая. Он принимает значения RGB, обычно вводимые для отображения «Показать». Затем он добавляет функцию модуля для кодирования эскиза, чтобы учесть выход за пределы матрицы. Во-вторых, могут быть добавлены переменные, но они должны быть запрограммированы позже в эскизе. Я не говорю об этом здесь.

Каждый из них генерирует «красный» текст под сеткой (на обоих листах), совместимый с эскизом, предназначенным для его принятия.

«Очистить», очевидно, аннулирует обе сетки.

Все это будет описано позже.

Когда вы работаете с Утилита Excel, я рекомендую вам использовать File / SaveAs ... после того, как вы сгенерировал ваш код, чтобы вам не приходилось воссоздавать дизайн в некоторых другой момент, особенно если дизайн достаточно сложный. Кроме того, ваш исходный файл LED_Utility.xlsm предназначен только для чтения, чтобы защитить его от перезаписано

Набросок

Код предлагается ниже с предупреждение для сохранения с помощью свойства только для чтения.

Откройте Arduino IDE и загрузите скетч LED_Arduino.ino.

Вы увидите, что:

  • Строка 3 определяет используемый вывод Arduino. Установлен как контакт 8.
  • Строка 4 определяет светодиодные блоки на плате. Это 64.
  • Строка 5, однако, умножает это число на 3, чтобы учесть количество RBG, таким образом, 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 скетча. Ячейки N8, 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, ваша матрица будет включать и выключать этот квадрат.

Прежде чем двигаться дальше, примите во внимание:

  • Очистка обеих сеток.
  • Измените некоторые цвета внутри этого квадрата.
  • Добавьте квадрат другого цвета вокруг оригинала.

Project2

Я предлагаю вам открыть эскиз Red_Square.ino и сохранить его как Colour_Sq («.ino» будет добавлено автоматически), чтобы предотвратить перезапись Red_Square.ino.

Загрузив Colour_Sq.ino в среду IDE, перейдите к Red_Square в служебной программе и измените средние квадраты. MakeO8, O10, O14 и O16 «255». N11 и P11 равны «0», а N12 и P12 равны «255». Нажмите «Показать».

После того, как вы добавили новый код в, я ожидал, что строка 47 в IDE, вам нужно будет следовать за ней с помощью этого блока кода:

  RGB_update (-1, 0, 0, 0); задержка (1000); clearLEDs (); RGB_update (-1, 0, 0, 0); задержка (1000);  

Обратите внимание, что вы можете изменить значение задержки по своему усмотрению; 1000 соответствует 1 секунде.

Project3

Перезагрузите Red_Square.ino и сохраните его как Grow.

Воссоздайте Красную площадь в Утилите. Вокруг этого квадрата добавьте значения по вашему выбору для создания границы, они могут быть от 0 до 255, но ниже 32 могут быть очень тусклыми. Это мое творение в «LED_Utility.xlsm»:

Теперь удалите значения для этого внутреннего красного квадрата и нажмите «Показать». Скопируйте сгенерированный код в строку 47 вIDE и скопируйте / вставьте строки с 42 по 46 после этого. Загрузите в Arduino для чередования внутреннего красного квадрата, а затем квадрата, окруженного разными цветами.

Если хотите, попробуйте расширить до другой границы.

Project4

Возможно, вы знаете, что по мере того, как мы добавляем код в «Цикл», он имеет тенденцию становиться длинным и, возможно, создавать трудности для редактирования позже.

Здесь я строю спираль.

Изображение взято из Рабочей тетради «spir5.xlsm». Это кульминация четырех предыдущих Рабочих тетрадей.

«Spir1.xlsm» был центром с яркими (255) блоками, «spir2.xlsm» использовал значения внутреннего квадрата 4x4, «spir3.xlsm» был размером 27 квадратных блоков и т. Д. На каждом этапе я копировал код к моему эскизу, но не к «петле».

Вместо этого я создал 5 пустых функций под «циклом» и сослался на них в «цикле»:

  Пустой цикл () {Sp1 (); Sp2 (); Sp3 (); Sp4 (); Sp5 (); clearLEDs (); delay (1000);}  

Моя первая функция void Sp1 ():

  void 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…».

В этом примере может показаться тривиальным предложение открыть «spir4.xlsm» для редактирования цветов внешних подсказок для редактирования специальной функции, а не для редактирования в «цикле».

На грани смешного. Предположим, вы хотите последовательно по одной отображать буквы слова «MISSISSIPPI». Имеется 11 символов, что означает 77 строк кода для обработки void loop (). Если вы решили изменить букву «S», вам необходимо внести 4 правки. В слове всего 4 символа. Поэтому имеет смысл создать функцию для каждого из них и вызывать их соответствующим образом из «цикла».

Project5

Этот проект учитывает другую функцию LED_Utility, «Var Map». Здесь будут представлены переменные, поэтому потребуются некоторые базовые знания программирования.

Будет использоваться синтаксис «For Loop», а также условие «If».

«For» будет использоваться для увеличения или уменьшения значения RGB, например:

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

«Если» изменит процедуру по мере необходимости.

Давайте начнем просто, я имею в виду просто.

Создайте красный квадрат 2x2 в середине LED_utility и «Показать», и вот код:

  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);». Я обнаружил, что моим глазам необходимо знать, что второй блок закрылся!

После загрузки красный блок увеличивается до полной яркости, затем уменьшается, выключается и повторяется.

Project6

Давайте теперь воспользуемся условием «Если».

Восстановите этот предыдущий красный квадрат в LED_utility, но окружите его блоками «небесно-голубого», используя 255 для значений G и B. Используйте «Показать».

Оставьте Red 255 в покое, но замените все G 255 на «g», а B 255 на «b»,

а затем нажмите «Var Map».

Перезагрузите «LED_Arduino.ino» в среду IDE и сохраните как «FadeBorder».

Теперь у нас будут некоторые проблемы. У нас есть две переменные, «g» и «b», и каждой из них должно быть присвоено значение. Они также должны быть заявлены в программе. Я намерен объявить букву «g» в выражении «for», но мне нужно объявить букву «b» ранее в эскизе. На скетче в строке 5 находится объявление BYTE RGB [192]. Ниже введите «int b =0;».

В качестве объяснения нельзя использовать два цикла «for», которые потребуются позже. Здесь каждое значение «b» должно совпадать со значением «g», сгенерированным циклом «for».

Мой «цикл» структурирован, как показано ниже, но без кода моей карты:

  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 связано со значением G с помощью утверждения «b =g;». Значение R остается неизменным на уровне 255, в то время как граница тускнеет вверх и вниз по яркости.

Project7

Пришло время воспользоваться оператором «if».

Создайте и «Покажите» следующее, используя 255, где переменные появляются в правой сетке. Обратите внимание, что в ячейках, прилегающих к эритроцитам, появляется крошечная буква «L». Это позволит программе получить контроль над этими ячейками, когда это необходимо.

На этот раз светодиоды будут гаснуть зеленым и красным до тех пор, пока не будет достигнуто значение 64, а затем эти средние граничные ячейки станут желтыми, а яркость платы продолжит увеличиваться. Тогда процесс будет обратным.

Я снова предложу базовую структуру моей «петли». Я назвал этот набросок «FadeColourChange.ino».

  void loop () {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);} for (int r =255; r> =0; r -) {if (r <65) {g =r; l =0;} [Добавьте сюда код карты] RGB_update (-1, 0, 0, 0); delay (50);}}  

Project8

В этом последнем проекте я не буду менять цвета, а введу движение; У меня есть стрелка, которая перемещается по доске, но снова появляется слева.

Здесь я хочу только сгенерировать код, используя «Показать».

Поскольку я хочу, чтобы стрелка перемещалась из текущего положения в каждую следующую позицию, мне нужно изменить значение «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,2,255,128,128); mapLEDXY (2,3 , 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, 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», мне нужно значение модуля. Это заставило меня создать кнопку «Обернуть карту». Код для одного светодиода теперь выглядит следующим образом:

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 ++) {[mapcode]}}  

Если я сделаю «y <1» во втором цикле, «y» не будет учитываться. И наоборот, изменение «y» на 8 и «x» на 0 имеет другой эффект.

В качестве последней мысли, «Wrap Map» будет принимать переменные RGB. См. Выше, где я упоминал. Тот, кто владеет базовым программированием, должен уметь с этим справиться. Я добавил эскиз INO, ArrowVar.ino, где передняя часть стрелки меняет яркость в качестве небольшой демонстрации.

Использование матрицы 16x16

Все вышесказанное применимо для матрицы WS2812 16x16. Однако необходимо использовать скетч LED_Arduino16.ino.

Приведенные эскизы предназначены для матрицы 8x8, за исключением одного, Spiral16.ino. Он обеспечивает больший дисплей, чем Spiral.ino.

Эта спиральная матрица размером 16x16 имела 2 листа бумаги для печати в качестве светорассеивателя. Отображение было приостановлено примерно на 10 секунд, чтобы получить приемлемое изображение.

Для разработки кода откройте LED_Utility.xlsm и выберите вкладку «Шестнадцать» внизу страницы.

Если, как у меня, ваш дисплей слишком большой и вам нужно прокручивать, используйте опцию уменьшения. Даже в этом случае для копирования кода потребуется некоторая прокрутка.

Расширения?

Можно ли обращаться к матрицам других размеров?

Мне интересно, почему мои «LED_Arduino.ino» и «LED_Arduino16.ino» так различаются начальными строками. У меня есть некоторые закомментированные строки в моем первом; оба эскиза работают так, как я хочу.

Я не собираюсь писать Рабочий лист для формата «8x32», хотя я только что приобрел доску. Я направлю вас к « Эскиз " выше. Есть параметры, которые необходимо решить. Также будьте внимательны к строкам 15 и 18.

NB:Я также рассматриваю варианты меньшего размера, чем плата типа UNO.

Код

  • LED_Arduino
LED_Arduino C / C ++
Этот набросок составляет основу проекта. При сохранении он должен быть установлен в режим «Только чтение», а при дальнейшем использовании - «Сохранить как» для архивирования, чтобы предотвратить перезапись и упростить редактирование.
 // ЗДЕСЬ ПЕРЕМЕННЫЕ И ОПРЕДЕЛЕНИЯ - ТРЕБУЕТСЯ КОД ДРАЙВЕРА WS2812 # define WS2812_pin 8 // сейчас работает только цифровой контакт 8 # define numberOfLEDs 64 // общее количество светодиодов RGB [256] byte RGB [192]; // возьмите ваше количество светодиодов и умножьте его на 3 [768] // ЗДЕСЬ ФУНКЦИИ Избегайте RGB_update (int LED, byte RED, byte GREEN, byte BLUE); // функция для управления светодиодамиvoid mapLEDXY (int x, int y, byte RED, byte GREEN, byte BLUE) {int RGBlocation =0; // if (y% 2 ==0) {// четный столбец [раскомментировать] RGBlocation =x + y * 8; // [16] //} else {// нечетный столбец [Раскомментировать] // RGBlocation =7 - x + y * 8; // [15] и [16] //} [раскомментировать] RGB [расположение RGB * 3] =СИНИЙ; RGB [расположение RGB * 3 + 1] =КРАСНЫЙ; RGB [RGBlocation * 3 + 2] =GREEN;} void clearLEDs () {memset (RGB, 0, sizeof (RGB));} void setup () {pinMode (WS2812_pin, OUTPUT); clearLEDs (); RGB_update (-1, 0, 0, 0);} // setup0void loop () {// Вставляем строку (строки) mapLEDXY непосредственно над RGB_update ниже.RGB_update (-1, 0, 0, 0); задержка (1000); clearLEDs (); RGB_update (-1, 0, 0, 0); delay (1000);} // цикл // Функция драйвера WS2812void RGB_update (int LED, byte RED, byte GREEN, byte BLUE) {// LED - это номер светодиода, начинающийся с 0 // RED, GREEN, BLUE - яркость 0 ..255 заданное значение для этого байта светодиода ExistingPort, WS2812pinHIGH; // здесь локальные переменные для ускорения pinWrites if (LED> =0) {// отображаем значения REG GREEN BLUE в массив RGB [] RGB [LED * 3] =ЗЕЛЕНЫЙ; RGB [LED * 3 + 1] =КРАСНЫЙ; RGB [LED * 3 + 2] =СИНИЙ; } noInterrupts (); // уничтожаем прерывания, пока мы отправляем поток битов ... ExistingPort =PORTB; // сохраняем состояние всего ПОРТА B - давайте будем писать во весь порт, не нарушая работу других контактов этого порта WS2812pinHIGH =PORTB | 1; // это дает нам байт, который мы можем использовать для установки всего PORTB с выводом WS2812 HIGH int bitStream =numberOfLEDs * 3; // общее количество байтов в строке светодиода // Этот цикл for проходит через все биты (8 в time), чтобы установить время включения / выключения вывода WS2812 для (int i =bitStream - 1; i> =0; i--) {PORTB =WS2812pinHIGH; // сначала бит 7, установите вывод HIGH - он всегда становится высоким независимо от of a 0/1 // вот сложная часть, проверьте, является ли бит в байте высоким / низким, тогда правая этот статус на вывод // (RGB [i] &B10000000) удалит другие биты в RGB [i ], поэтому здесь мы останемся с B10000000 или B00000000 // тогда легко проверить, является ли бит высоким или низким, используя AND с битовой маской "" &&B10000000) "" это дает 1 или 0 // если это 1, мы выполним операцию ИЛИ с Существующим портом, таким образом сохраняя вывод ВЫСОКИМ, если 0, вывод записывается LOW PORTB =((RGB [i] &B10000000) &&B10000000) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); // это NOPS - они позволяют нам задерживать часы циклов для более точного отсчета времени PORTB =ExistingPort; // хорошо, здесь мы знаем, что мы должны быть НИЗКИМ независимо от состояния бита 0/1 __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t "" nop \ n \ t "" nop \ n \ t "" nop \ n \ t "" nop \ n \ t "); // минимальное время LOW для вывода независимо от состояния 0/1 бит // затем делаем это снова для следующего бита и так далее ... см. последний бит, хотя для небольшого изменения PORTB =WS2812pinHIGH; // бит 6 PORTB =((RGB [i] &B01000000) &&B01000000) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); ПОРТБ =существующий порт; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; // бит 5 PORTB =((RGB [i] &B00100000) &&B00100000) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); ПОРТБ =существующий порт; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; // бит 4 PORTB =((RGB [i] &B00010000) &&B00010000) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); ПОРТБ =существующий порт; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; // бит 3 PORTB =((RGB [i] &B00001000) &&B00001000) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); ПОРТБ =существующий порт; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; // бит 2 PORTB =((RGB [i] &B00000100) &&B00000100) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); ПОРТБ =существующий порт; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; // бит 1 PORTB =((RGB [i] &B00000010) &&B00000010) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); ПОРТБ =существующий порт; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; // бит 0 __asm ​​__ ("nop \ n \ t"); // на этом последнем бите проверка выполняется намного быстрее, поэтому пришлось добавить сюда NOP PORTB =((RGB [i] &B00000001) &&B00000001) | ExistingPort; __asm ​​__ ("nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; // обратите внимание, что нет NOP после записи вывода LOW, это потому, что цикл FOR использует тактовые циклы, которые мы можем использовать вместо NOPS} // для прерываний цикла (); // разрешаем прерывания // все готово!} // пусто RGB_update 
Led_Utility.xlsm
Это приложение генерирует различный текст для копирования / вставки в эскиз. Https://github.com/CobraCat/LED_Utility
Sketches.zip
Это некоторые или несколько эскизов, использованных во время разработки. Они доступны как «поддержка». Https://github.com/CobraCat/LED_Utility

Производственный процесс

  1. ЖК-панель с Arduino для симулятора полета
  2. Переключатель / светодиодная панель с Arduino для FS2020
  3. Анимация светодиодной матрицы RGB в Excel для WS2812
  4. Три шага для глобальной безопасности Интернета вещей
  5. Три тенденции цифрового производства на 2020 год
  6. Три совета для малого и среднего бизнеса, выходящего за границу
  7. Три урока для розничных торговцев в год развала
  8. Строим, вперед! Робот - легкий стартовый проект для детей
  9. Три совета по обслуживанию промышленного оборудования
  10. Три совета по покупке тяжелого промышленного оборудования