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

Arduinoflake!

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

Arduino Nano R3
× 1

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

Снежинка состоит из 30 светодиодов, сгруппированных в 17 независимых сегментов, которыми можно управлять отдельно с помощью микроконтроллера Arduino Nano. Каждую группу светодиодов можно затемнить с помощью ШИМ для создания красивой анимации.

Инструменты

Все, что вам понадобится, это паяльник, припой и плоскогубцы.

Строительство

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

Опорная конструкция, которая также действует как проводка, создана из латунных стержней 0,8 мм, спаянных вместе с оловом. Всего я использовал 2 метра удочки. Почему произвольная форма? Потому что я всегда хотел попробовать это, и это проверка вашего терпения и навыков.

Сначала я создал шестигранник с сердечником, согнув один стержень и спаяв концы вместе. Добавив еще 6 стержней к вершинам шестиугольника, проводка заземления завершена, все катодные выводы светодиодов теперь необходимо припаять к нему, чтобы создать узор снежинки. Сложнее всего было добавить светодиоды SMD, но я помог себе с помощью приспособления, сделанного из картона и двустороннего скотча.

Затем пришло время добавить микроконтроллер Arduino Nano под основную структуру, оставив достаточно места между ними, чтобы разместить 3 слоя проводов латунных стержней, которые будут соединять контакты микроконтроллера со всеми выводами анода светодиодов. Это потребовало огромного терпения. Вам нужно не только избежать короткого замыкания между проводами, но также добавить резистор, ограничивающий ток, чтобы он выглядел красиво.

Листовые светодиоды отдельно подключаются к ближайшему выходному выводу Arduino. Светодиоды ответвлений сгруппированы по два и подключены к выводам ШИМ. Светодиодные индикаторы на сердечнике также сгруппированы по два и подключены к остальным контактам. Arduino NANO имеет только 18 выходных контактов (только входные A6 и A7), и мне нужен один контакт для сенсорного датчика, в результате чего у меня осталось только 17 контактов, поэтому две пары основных светодиодов соединены вместе, чтобы создать группу из 4. I Я использую резисторы 220 Ом, чтобы ограничить ток, протекающий через каждый вывод, примерно до 8 мА. Это означает, что в сумме 240 мА, что немного выше для микросхемы ATmega328, но она работает - безопасный максимум составляет 200 мА.

Датчик касания

Чтобы иметь возможность взаимодействовать со снежинкой, я добавил еще один латунный стержень для создания емкостного сенсорного датчика. Я нашел отличную библиотеку и руководство Пола Стоффрегена. Сенсорный датчик используется для взаимодействия с arduinoflake - изменение анимации, включение / выключение, свечение при прикосновении, вы называете это ...

Заключительное примечание

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

Код

Первоначально я думал, что смогу только затемнять светодиоды ответвления, которые подключены к аппаратным выводам PWM. Но, к счастью, существует замечательная программная библиотека PWM, которая позволила мне использовать все выводы, как если бы они были аппаратным PWM. Эта установка открыла безграничные возможности для анимации! Ознакомьтесь с приведенным ниже кодом с некоторыми из первых анимаций.

Код

  • snowflake.ino
snowflake.ino Arduino
Исходный код
 #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 touchSensor =ADCTouchSensor (A0, 1); void setup () {Serial.begin (115200); SoftPWMBegin ();} byte animation =0; long touchAt =0; void loop () {switch (анимация) {case 0:_fill (100); ломать; case 1:shinyAnimation (); // fadingAnimation (); ломать; случай 2:circleAnimation (); ломать; случай 3:loopAnimation (); ломать; case 4:fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); анимация ++; ломать; case 5:smileAnimation (); ломать; по умолчанию:анимация =0; ломать; } int touchValue =touchSensor.read (); если (touchAt + 2000  1000) {touchAt =millis (); // приземлиться, таймаут охлаждения 2 секунды анимация ++; _fill (0); }} void fireworkAnimation () {for (int i =0; i <4; i ++) {SoftPWMSet (innerLedPins [i], 100); задержка (100); } SoftPWMSet (innerLedPins [4], 100); для (int я =0; я <6; я ++) {SoftPWMSet (middleLedPins [я], 255); } задержка (50); для (int я =0; я <6; я ++) {SoftPWMSet (innerLedPins [я], 0); SoftPWMSet (edgeLedPins [i], 255); } задержка (50); для (int я =0; я <6; я ++) {SoftPWMSet (middleLedPins [я], 0); } задержка (50); _fill (0);} void smileAnimation () {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 ++) {если (circleState [я]> =100) {circleStateAnimation [я] =-1; // затемнение} else if (circleState [i] <=10) {circleStateAnimation [i] =1; // яркий} circleState [i] + =circleStateAnimation [i]; } для (int i =0; i <6; i ++) {SoftPWMSet (innerLedPins [i], circleState [0]); SoftPWMSet (middleLedPins [i], circleState [1]); SoftPWMSet (edgeLedPins [i], circleState [2]); } delay (5);} byte waveState [] ={100, 55, 10, 10, 55, 100}; byte waveStateAnimation [] ={1, 1, 1, -1, -1, -1}; void 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]; } для (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]); } delay (10);} byte loopCounter =0; byte loopState =150; void loopAnimation () {SoftPWMSet (innerLedPins [loopCounter], loopState); SoftPWMSet (middleLedPins [loopCounter], loopState); SoftPWMSet (edgeLedPins [loopCounter], loopState); loopCounter =_nextIndex (loopCounter, 1); если (loopCounter ==0) {loopState =(loopState ==150? 0:150); } delay (100);} байт slowOnCounter =0; byte slowOnState =150; void slowOnAnimation () {byte randomLed =random (0, 18); если (randomLed <6) {SoftPWMSet (innerLedPins [randomLed], slowOnState); } иначе, если (randomLed <12) {SoftPWMSet (middleLedPins [randomLed - 6], slowOnState); } else {SoftPWMSet (edgeLedPins [randomLed - 12], slowOnState); } slowOnCounter ++; если (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]); } shinyCounter ++; если (shinyCounter> 10) {shinyCounter =0; for (байт r =random (1, 3); r> 0; r--) {byte randomLed =random (0, 12); если (randomLed <6) {SoftPWMSet (innerLedPins [random (0, 6)], 255); } else {SoftPWMSet (middleLedPins [случайный (0, 6)], 255); }}} else {для (int я =0; я <6; я ++) {SoftPWMSet (innerLedPins [я], 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 () {для (int я =0; я <6; я ++) {если (fadingState [я]> =100) {fadingStateAnimation [я] =-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 (значение байта) {для (int i =0; i <6; i ++) {SoftPWMSet (edgeLedPins [i], value); SoftPWMSet (middleLedPins [i], значение); SoftPWMSet (innerLedPins [i], значение); }} байт _prevIndex (короткий индекс, шаг байта) {индекс - =шаг; в то время как (индекс <0) {индекс + =6; } return index;} byte _nextIndex (короткий индекс, шаг байта) {index + =step; в то время как (индекс> 5) {индекс - =6; } индекс возврата;} 

Схема


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

  1. Для чего используются установочные штифты?
  2. Из чего сделаны установочные штифты?
  3. 5 вещей, которые следует учитывать при выборе установочных штифтов
  4. Скалка
  5. Боулинг
  6. Английская булавка
  7. Система со сверхнизким энергопотреблением подкрепляет надежды ИИ на TinyML
  8. Коммутационный кабель ввода-вывода Raspberry PI и адаптер коммутационной панели
  9. Рисунок динамического треугольника
  10. BGA — что это такое?