Уже на за горами новогодние праздники и душа периодически просит праздника. Душа радиолюбителя может эти праздники создавать.
В прошлом году я делал новогодние снежинки с эффектом метеора из светодиодов WS2812 и из ленты этих же светодиодов, что оказалось гораздо проще. В этом году долго ломал голову, что бы сделать, пока на глаза не попалась елочка из фикспрайса, купленная в прошлом году на сувенир. В елочке стоял трехцветный мигающий светодиод и три часовых батарейки
Решил, что эффект метеора или стартующей ракеты в данной елке будет неплохо смотреться. Но не Ардуину же туда ставить! Нужно что-то предельно простое и миниатюрное, работающее от батарейки. И чудо — получилось создать эффект метеора на самом младшем AVR контроллере — Attiny13. Итак, статья о том что и как получилось.
Использованные компоненты
- Микроконтроллер AVR ATtiny13A в корпусе SOP8 — $0.3 (при партии 10 шт)
- Кусочек ленты из 8 светодиодов WS2812 — $0.7
- Микросхема BL8530-501 для повышающего преобразователя — $0.1
- Елочка (если не нашли ничего подходящего в фикспрайсе или новогоднем базаре) — $1
- Держатель для батареек в корпусе с выключателем — $0.8
- Диод шоттки, катушка 47 мкГн, два конденсатора, кусочек текстолита
Итоговый бюджет около $3
Если запитать елочку от USB Или зарядника, то не нужна схема преобразователя и держатель батареек и бюджет уменьшается до $2 — $2.5, а если найти готовую игрушку, в которую можно встроить схему, то и во все 100 руб.
Для микроконтроллера с 64 байтами!!! оперативной памяти и 1 Кбайтом флэша под программу нечего думать об использовании ардуиновских библиотек вроде NeoPixel, которые я использовал в предыдущих проектах с WS2812. Для маленьких тинек я нашел библиотеку с минимумом возможностей, написанную на ассемблере и влезающую даже в ATtiny10.
Светодиоды WS2812 очень прожорливые и яркие и работают от 5В (ну хотя бы от лития 3.7В). Поэтому никакие литиевые CR2032 И прочие в этом проекте не годятся. Использовал повышающий стабилизатор на BL8530 о котором рассказывал в этой статье. Получилось, что для экономии места можно запитать мою поделку от 1-й или 2-х батареек (АА или ААА).
Правда одного аккумулятора ААА хватает только на два часа непрерывной работы, зато двух уже на 5 часов, а одной алкалиновой батарейки АА часов на десять. Можно упростить питание и использовать литиевый аккумулятор 3.7В напрямую или 5В от USB или на худой конец три штуки ААА. Тогда преобразователь можно не делать.
Я же сделал универсальную схему для встраивания в различные елочные игрушки, макушечки и прочее.
В качестве микроконтроллера подойдет любая тинька начиная с ATtiny13A
AVR-ки я прошиваю через самодельный программатор на Arduino Nano
Подробнее о программировании тинек в Arduino IDE я рассказывал в этой статье.
На программаторе сразу удобно прогнать все эффекты до впаивания микроконтроллера в плату.
И проверять их в корпусе елочки.
Вырезаю на станке простейшую миниатюрную плату с монтажом на стороне меди
Размер платы 40х10 мм, что вполне позволяет ей замещать одну батарейку в держателе.
Лета припаивается прямо к плате либо при помощи трех проводков.
Загрузив программу, можно все это добро собирать вместе с елочкой
Дизайн этой платы немного другой, в корпусе DIP8 на панельке, на котором удобнее отлаживаться.
И вот елочка собрана
Эффект метеора или ракеты на ATtiny13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
/* * Эффект метеора на ATTINY13 * Copyright (C) 2016 Алексей Шихарбеев * http://samopal.pro */ #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> #include "light_ws2812.h" // Количество светодиодов в ленте 8 - 15 #define NUM_PIXEL 8 #define TM 60 struct cRGB led[NUM_PIXEL]; uint8_t num_pixel = NUM_PIXEL; uint8_t DX = 2; int main(void) { while(1) { // Цикл перебора пары цветов 0-5 for( uint8_t i=0; i<6; i++)Mode1(TM,i); } } /* * Эффект метеора * @param wite - Таймаут между фазами эффекта, мс * @param pair - пара цветов 0-5 */ void Mode1(uint16_t wait, uint8_t pair){ uint8_t x = 1; if( num_pixel > 8 ) x = 0; // Метеор летит for( uint8_t i1=0; i1<num_pixel; i1++ ){ // Чистим все for( uint8_t i2=0; i2<num_pixel; i2++ )SetStarColor1(i2, 0, pair); // Светодиод-ядро метеора SetStarColor1(num_pixel-i1,15, pair); // Хвост метеора for( uint8_t i2=0; i2<i1; i2++ )SetStarColor1(num_pixel-i2-x, 16-(i1-i2)*DX, pair); // Отобразить эффект и ждать паузу ws2812_setleds(led,num_pixel); delay(wait); } // Метеор пролетел, затухание хвоста for( uint8_t i1=0; i1<num_pixel; i1++ ){ for( uint8_t i2=0; i2<num_pixel; i2++ ){ int c = 16-(i1-(i2-8))*2; if( c < 0 )c = 0; SetStarColor1(num_pixel-i2-1,c, pair); } // Отобразить эффект и ждать паузу ws2812_setleds(led,num_pixel); delay(wait); } } /** * Разгорание одного пиксела на каждом луче * @param n - Номер пиксела в луче * @param br - Ярклсть * @param pair - Пара цветов 0-5 * */ void SetStarColor1( uint8_t n, uint8_t br, uint8_t pair){ if( br > 15 )br=15; if( br < 8 ){ switch( pair ){ case 0 : case 3 : led[n].r = br*32; break; case 1 : case 4 : led[n].g = br*32; break; case 2 : case 5 : led[n].b = br*32; break; } } else { switch( pair ){ case 0 : led[n].r = 255; led[n].g = (br-8)*32; break; case 1 : led[n].g = 255; led[n].b = (br-8)*32; break; case 2 : led[n].b = 255; led[n].r = (br-8)*32; break; case 3 : led[n].r = 255; led[n].b = (br-8)*32; break; case 4 : led[n].g = 255; led[n].r = (br-8)*32; break; case 5 : led[n].b = 255; led[n].g = (br-8)*32; break; } } } |
Полученный эффект можно посмотреть здесь
Эффект радужной волны
Прошлогоднего эффекта метеора или стартующей ракеты (в зависимости от направления) мне показалось мало и я сделал елочке эффект радужной волны.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
/* * Эффект радуги на ATTINY13 * Copyright (C) 2016 Алексей Шихарбеев * http://samopal.pro */ #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> #include "light_ws2812.h" // Количество светодиодов в ленте 1 - 16 #define NUM_PIXEL 8 #define STEP1 16 #define STEP2 2 uint8_t TM = 10; struct cRGB led[NUM_PIXEL]; uint8_t num_pixel = NUM_PIXEL; int main(void) { // Переменные для эффкта радуги uint8_t color = 0; while(1) { // Цикл перебора пары цветов 0-5 for( int i=0; i< num_pixel; i++ ){ Wheel(color + i*STEP1, i ); ws2812_setleds(led,num_pixel); color += STEP2; delay(TM); } } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. void Wheel(byte WheelPos,uint8_t n) { if(WheelPos < 85) { led[n].r = WheelPos * 3; led[n].g = 255 - WheelPos * 3; led[n].b = 0; } else if(WheelPos < 170) { WheelPos -= 85; led[n].r = 255 - WheelPos * 3; led[n].g = 0; led[n].b = WheelPos * 3; } else { WheelPos -= 170; led[n].r = 0; led[n].g = WheelPos * 3; led[n].b = 255 - WheelPos * 3; } } |
https://youtu.be/HVzIV3x3csA
К сожалению, оба эффекта в память ATtiny13 не влезли. Зато отлично поместились в новогодний фонарик-ночник вместе с другими эффектами и управлением по хлопку через микрофон в память ATtiny85. Но это уже совсем другая статья.
Скетчи, подправленная библиотека (выкинул немного кода) и чертеж платы можно взять здесь.
Алексей, а можно то же самое, только на пять лучей на 13-й или только на ардуино?
На 13-й тиньке больше 10 диодов не далось подключить
Разве что всех лучей у звездочки/снежинки соединить вход данных параллельно
А так 85-я тинька или Мега любая
Алексей, у вас комменты то на русском то на инглиш
На инглиш в основном только спам, который отсекается
Все таки аудитория русскоязычная
Скажите Алексей, а у Вас нет hex файла для прошивки тиньки через usb asp?
https://github.com/samopal-pro/-hristmas_tree/tree/master/bin
Один — эффект метеоров, второй радуга
Спасибо большое, буду пробовать.
Добрый день!
А можно скорость меньше сделать?
Параметр
#define TM 60
Извините Алексей, забыл спросить, какие фьюзы выставлять?
9.6МГц без делителя. BOD без разницы
Спасибо.
Собрал, всё работает, ещё раз спасибо. Понравился эффект метеор, подскажите какое максимальное количество пикселей потянет тинька с данным эффектом?
15 у меня работала, 16 вставала от переполнения памяти
А Вы прошивки на заказ делаете? Мне нужен не совсем обычный датчик движения с подсветкой на ws2812b.
Делаю. Правда до января не возьмусь. Иного работы.
Присылайте на E-mail что снизу странички задание. Обсудим
light_ws2812.cpp:72:5: error: #error «Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?»
выдает при компиляции, 9.6 мгц
Может 9.6 МГц с делением частоты?
подскажите, как она у вас во boards.txt описана?
attiny13at9m_bod.name=ATtiny13 @ 9.6MHz (internal 9.6 MHz clock, Preserve EEPROM, BOD - 2.7V )
attiny13at9m_bod.upload.tool=arduino:avrdude
attiny13at9m_bod.upload.using=arduino:usbtiny
attiny13at9m_bod.bootloader.tool=arduino:avrdude
attiny13at9m_bod.bootloader.low_fuses=0x32
attiny13at9m_bod.bootloader.high_fuses=0xFB
attiny13at9m_bod.upload.maximum_size=1024
attiny13at9m_bod.upload.maximum_data_size=64
attiny13at9m_bod.upload.speed=57600
attiny13at9m_bod.build.mcu=attiny13
attiny13at9m_bod.build.f_cpu=9600000
attiny13at9m_bod.build.core=core13
Алексей а Вы получили моё письмо? А то с этим оутлуком никак не мог разобраться.
Да. Отвечу сегодня
Алексей, можно Вас попросить исходники «фонарика с хлопком» или хотя бы подправленный hex? Хочу в елочку засунуть бесхозную digispark без микрофона и управления.
https://github.com/samopal-pro/-hristmas_tree/tree/master/Christmas_tree_AT85_v1.0
Большое спасибо
Здравствуйте, Алексей. У меня валяется ATtiny12, у которой предельная тактовая — 8 МГц. Хочу запихать в неё «радугу» Для применения в танцевальном костюме для дочки. Если правильно понимаю, то простое выставление частоты в фьюзах на 8Мгц собьёт тактовую частоту для управления WS2812. В какой из подключаемых библиотек надо внести коррективы под эту частоту и насколько? Подозреваю, что это . Программа сама вроде не должна меняться?
ЗЫ: и можно ссылочку, откуда загрузить все эти библиотеки?
блин, фразу обрезало: Подозреваю, что это util/delay.h
Друг очень добрый день. Прекрасная работа. Я из Боготы Колумбии и поклонник электроники. Я хочу спросить тебя, что у меня есть мотоцикл, и я хотел бы сделать некоторые огни с этим типом светодиода ws2812, а attiny13a разместить их на задней части мотоцикла будет вы можете помочь мне, это мой адрес электронной почты, чтобы связаться с нами, спасибо вам большое. Julroj07@gmail.com
А есть исходник под тини 13? Хекса маловато будет!
/*
* Эффект метеора на ATTINY13
* Copyright (C) 2016 Алексей Шихарбеев
* http://samopal.pro
*/
#include
#include
#include
#include "light_ws2812.h"
// Количество светодиодов в ленте 8 - 15
#define NUM_PIXEL 8
#define TM 60
struct cRGB led[NUM_PIXEL];
uint8_t num_pixel = NUM_PIXEL;
uint8_t DX = 2;
int main(void)
{
while(1) {
// Цикл перебора пары цветов 0-5
for( uint8_t i=0; i<6; i++)Mode1(TM,i);
}
}
/* 15 )br=15;
* Эффект метеора
* @param wite - Таймаут между фазами эффекта, мс
* @param pair - пара цветов 0-5
*/
void Mode1(uint16_t wait, uint8_t pair){
uint8_t x = 1;
if( num_pixel > 8 ) x = 0;
// Метеор летит
for( uint8_t i1=0; i1
if( br < 8 ){ switch( pair ){ case 0 : case 3 : led[n].r = br*32; break; case 1 : case 4 : led[n].g = br*32; break; case 2 : case 5 : led[n].b = br*32; break; } } else { switch( pair ){ case 0 : led[n].r = 255; led[n].g = (br-8)*32; break; case 1 : led[n].g = 255; led[n].b = (br-8)*32; break; case 2 : led[n].b = 255; led[n].r = (br-8)*32; break; case 3 : led[n].r = 255; led[n].b = (br-8)*32; break; case 4 : led[n].g = 255; led[n].r = (br-8)*32; break; case 5 : led[n].b = 255; led[n].g = (br-8)*32; break; } } }
Библиотеки для Тини нужны только по ссылке из статьи
Добрый день.
Если Вы тут еще бываете, может поможете?
Хотел бы на основе Вашей работы разобраться с библиотекой Light_WS2812. Нет ли у Вас исходника НЕ для ARDUINO IDE? Или надо в ARDUINO IDE загнать платформу ATTiny?
Кстати, по ходу дела вопрос, как же в АТТини13-ю залез НЕХ больше 1 кВ?
С ув.,
Андрей
Можно для поддержки Attiny поставить пакет поддержки в Ардуино IDE
Можно попробовать компилировать в любой другой среде. В коде нет привязки к Arduino IDE в виде loop() и прочих. Обычный Си++
HEX больше одного килобайта потому что это не BIN-формат. Каждый байт кодируется двумя байтами — его шестнадцатеричной записью
Спасибо Вам за поддержку
Hi!I’m Arman from Bangladesh.Your project is very nice.After seeing your project,i got inspired to make it.But when i went to do this project.I’m facing some difficulties.
I’m using Arduino Uno to programme ATTiny13a(Using latest arduino ide&Attiny hardware library).When i upload the simple blink sketeches,i can upload the code in ATTiny using Arduino as ISP.But whenever i went to use your code for this project,the arduino ide says»Compiling Error for ATTiny13A».Then i used your method to compile the code from your another blog where you told how to programme ATTiny13A using Arduino IDE.I followed this tutorial according to your instructions as well as same version(1.6.5)of Arduino ide,same hardware librabry also same library of WS2812B.Nevertheless,i got the same error message.I’m trying to make this project from around two weeks ago.I did my best.But i failed.Would you mind helping me?
One things should be noted that i didn’t understand this line «I am flashing AVRs through a makeshift programmer on the Arduino Nano».I googled it but didn’t find any necessary things.
Здравствуйте. Решил по вашей статье повторить эффект радуги для небольшого ночника. При компиляции в Arduino IDE получаю ошибку:
light_ws2812.cpp:72:5: error: #error «Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?»
#error «Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?»
^~~~~
exit status 1
#error «Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?»
Что и где нужно поправить? Спасибо!
Может быть тактовая маленькая?
А как ее правильно выставить? У меня тинька 13а
Программировал в Arduino IDE с пакетом MicroCore для ATiny13
https://github.com/MCUdude/MicroCore
Выставлял 9.6МГц внутренний резонатор
Спасибо!
Собрал снежинку 10 диодов в луче плюс маленькие «рожки» по середине и в конце луча. Залил эффект переливание. Я в полном восторге. Огромное спасибо за ваш труд.
Привет, Алексей! Эффект радужной волны попытал в Протеус, пока тиньки и светики едут от наших друзей. Нет оранжевого и желтого цвета, это глюк симуляции? И как сделать смену цветов ну очено медленно — 1-2 минуты?
Никогда не пробовал в Протеусе эмулировать эффекты. На вид никаких деффектов цвета не нашел, хотя битность цвета там в библиотеке порезана из за малой памяти тинькт