Attiny85 - мозг гирлянды

Как и обещал где-то в комментариях, расскажу как запрограммировать микроконтроллер Attiny85 без программатора при помощи Arduino. Мощности и памяти контроллера хватает чтобы гонять около 100 «умных» диодов WS2812B. А для новогоднего светильника в бутылке хватит и отрезка ленты с тремя десятками диодов. Если у вас завалялась плата ардуино, светодиоды и ATtiny85, то одного вечера будет достаточно для создания гирлянды со светоэффектами.


Эта инструкция написана для чайников, каковым я и себя считаю. Так что прошу прощения заранее за некоторый непрофессионализм в терминах и подходе. Расписано будет подробно по шагам, так что нужны только базовые знания, чтобы знать как выглядит чип, как считать ножки и подключать проводки. В сети полно инструкций как запрограммировать контроллер при помощи Arduino UNO. Но найти правильную инструкцию для Arduino Mega было нелегко. В конце концов я это преодолел.
Чтобы ориентироваться где какие ноги у контроллера, привожу распиновку тиньки. В сети встречаются картинки с неправильной нумерацией. Цианом нарисованы номера цифровых пинов, которые нужно использовать в коде программы.

Чтобы избежать разночтений, я буду использовать физические номера ног контроллера в корпусе dip8. Со стороны Ардуино Уно/Мега используются номера написанные на плате у разъемов.

Ардуино как программатор

  • Готовим Arduino IDE для работы с Attiny85. Идем Tools--> Board-->Boards Manager, набираем в поиске ATtiny и ставим пакет «ATtiny by David. A Mellis». В списке должен появиться ATtiny 25/45/85. Если не появился (старый IDE), то перегружаем программу.
  • Подключаем Arduino к компьютеру, открываем File-->Examples--> 11. Arduino ISP-->ArduinoISP. Ничего менять не надо. Выбираем Tools-> Board -> Arduino/Genuino Mega or Mega 2560 (или Uno если вы используете ее), далее выбираем Tools->Processor->ATmega2560, прошиваем плату ардуино — теперь она будет нашим программатором.

Самое сложное — подключить ATtiny.
Вариант для Arduino Mega 2560:

Для Arduino UNO используется другой набор:

Arduino Uno--> ATtiny85
5V -> 8 Vcc
GND -> 4 GND
13 -> 7 SCK
12 -> 6 MISO
11 -> 5 MOSI
10 -> 1 Reset

Выбираем простой пример (File-->Examples-->01. Basics->Blink) Его и будем шить в тиньку, чтобы убедиться, что всё работает и программируется. В примере везде меняем LED_BUILTIN на 0 (0й цифровой пин — это будет 5я ножка чипа)
Выбираем:
  • Tools-> Board -> ATtiny25/45/85
  • Tools->Processor->ATtiny85
  • Tools->Clock->Internal 1MHz
  • Tools->Programmer->Arduino as ISP
Теперь прошиваем программу моргания светодиодом — Sketch-> Upload using programmer.

Может так случиться, что прошивальщик выдаст ошибку, что не совпадает сигнатура. В этом случае скорее всего где-то плохой контакт. У меня пару раз такое случилось. Надо поправить ножки контроллера, хорошенько вдавить его в отверстия breadboard или воспользоваться разъемом, поправить/поменять провода. После того как прошивка удалась, собираем тестовую схему (простенький светодиод и сопротивление 220Ом) для проверки, что светодиод моргает, как написано в программе, с интервалом в 1 сек.


Гирлянда

Теперь мы готовы делать наш светильник/гирлянду. Ставим чип из нашей диодной моргалки обратно на прошивку. Тут как раз удобно иметь разъем для чипа, который всегда будет подключен как надо, а мы будем только втыкать чип уже не думая о том куда какие провода подключать. У меня год пролежал сокет подключенным к ардуине и через год я воткнул микроконтроллер и без проблем прошился. Для этой статьи я только проверил, что всё работает как надо и зарисовал схему.

Начнем с разгона нашего контроллера. Так как никаких внешних компонент мы не используем, то ограничимся внутренним генератором, который максимально поддерживает 16МГц. Выбираем Tools->Clock->Internal 16MHz. Далее Tools->Burn Bootloader. Внешне ничего не произойдет, но в чипе буду перешиты фьюзы, которые определяют режим работы контроллера. Будьте осторожны с выбором частоты. Если вы случайно прошьете Clock->External ??MHz то без внешнего кварца с этим чипом вы уже работать не сможете.

Далее ставим библиотеку FastLED и открываем пример File-->Examples-->FastLED->DemoReel100

Меняем:
  • DATA_PIN 0
    Помним — это будет 5я ножка на ATtiny85.
  • LED_TYPE WS2812B
    Или загляните в файл FastLED.h чтобы найти ваш тип диодной ленты.
  • NUM_LEDS 30
    Пропишите сколько диодов вы отрезали для своей гирлянды. До 100 должны работать почти все эффекты. Для экспериментов можно ленту не резать, а посмотреть сколько диодов потянет чип с выбранными эффектами. Некоторые эффекты требуют больше памяти, некоторые меньше, так что реальное количество вы узнаете экспериментируя с программой.
  • FRAMES_PER_SECOND 30
    Изначально стоит 120, но особого смысла в этом не вижу, а частота и мощность нашего контроллера ограничена. 30 кадров в секунду работает неплохо.
  • Находим строчку со списком эффектов, которые будут сменять друг друга
    SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };

    Для своей гирлянды в бутылке я оставил 4 эффекта:
    SimplePatternList gPatterns = { rainbowWithGlitter, confetti, sinelon, juggle };
  • Можно поиграться с интервалом смены эффектов и смены базового цвета. Для этого поправьте цифры в следующих строчках:

    EVERY_N_MILLISECONDS( 20 ) { gHue++; }
    EVERY_N_SECONDS( 10 ) { nextPattern(); }
Готово — гирлянда работает. Год назад я так и оставил. Прицепил к одному чипу две ленты диодов и они управлялись одним сигналом. Повесил обе гирлянды на елку.

Лампа


В этом году решил сделать настольную праздничную лампу:


  • отрезал 30 диодов
  • припаял USB разъем к ленте
  • перешил чип на 30 диодов
  • чип припаял прямо к контактам ленты и скрыл в термоусадке
  • чтобы елочная мишура случайно не закоротила чего на ленте, все контактные площадки закрыл термоусадкой, а открытые контакты диодов замазал клеем PVA, так как лака дома не нашлось :)
  • в бутылку из под виски засунул гирлянду и елочную мишуру
  • подключил к простой 1.5А зарядке для телефонов. Её достаточно для 30 диодов. Для длинной гирлянды источник нужен мощнее.


Всё получилось, всё работает, бутылка лежит на работе и создает праздничное настроение команде.

Использованные материалы:
ЗЫ. Прошивал чип впервые год назад, когда делал гирлянду, поэтому некоторые подробности мог упустить. Спрашивайте, если что не получается.
ЗЗЫ. Вискарь из бутылки лучше выпить заранее, чтобы работе ничего не мешало.

Обновление: добавил картинку с тестовой схемой к мигалке простым светодиодом.
Добавить в избранное +59 +89
+
avatar
  • vovadpua
  • 17 декабря 2018, 17:29
+26
Если бы бутылка была полная то "… световые эффекты были бы ярче.."
+
avatar
  • tedbeer
  • 17 декабря 2018, 17:35
+1
Да, была мысль засунуть гирлянду в силиконовый шланг и опустить в «подходящую» жидкость. Но решил, что жидкость надо употребить по назначению.
Была также идея без всякого шланга залить в бутылку масло. Но больше нравится идея — разрезать бутылку и засунуть внутрь аккумулятор и зарядку, может даже беспроводную. Тогда работать сможет без проводов.
+
avatar
  • nochkin
  • 17 декабря 2018, 18:55
0
Как вариант — я делал похожее в пластиковой полупрозрачной бутылке (у нас в таких кефир и айран продаётся).
Стенки бутылки приятно рассеивали свет от WS2811.
С контроллером я халявил, конечно, и поставил ESP8266 и 18650.
+
avatar
  • tedbeer
  • 17 декабря 2018, 17:49
+6
Световые эффекты ярче, если полна не бутылка, а зритель :)
+
avatar
+2
масла машинного залить, оно диэлектрик, была б полная бутылка и моргала красиво.
+
avatar
+12
но однако опасно это, 1 января и масло могут выпить)
+
avatar
  • jeepeg
  • 17 декабря 2018, 17:51
+3
Немного странно выглядит, человек покупает голую тиньку и не покупает копеечный программатор, а вместо этого городит программатор из ардуины. Я не осуждаю этот вариант, тем более он рабочий, но тратить на это время…
+
avatar
  • nochkin
  • 17 декабря 2018, 19:01
+8
Уж лучше собрать программатор из того, что уже есть под рукой, чем покупать ещё одно устройство, потом ждать его по почте, а потом оно будет собирать пыль из-за ненужности.
+
avatar
  • tedbeer
  • 17 декабря 2018, 19:22
+1
Потому что мало хороших инструкций для чайников как и что делать. Поищите на алиэкспресс «attiny85 programmer» и потом найдите среди найденного настоящий программатор, а не платку с юсб разъемом и стабилизатором питания. Вот пару раз наступив на грабли пытаешься решить задачу тем что есть под руками. А под руками была Ардуино Мега. И то еще пришлось покопаться, как же ее использовать вместо более слабенькой Ардуино Уно.
+
avatar
  • kalobyte
  • 17 декабря 2018, 19:44
+2
Поищите на алиэкспресс «attiny85 programmer»
тини 85 программируется так же, как и любой контроллер из авр серии
+
avatar
0
Насчет любого это ты погорячился, как насчет attiny11?
+
avatar
  • kalobyte
  • 17 декабря 2018, 21:07
-4
кому они нужны? и много ли тут найдется тех, кто их хотя бы на картинке видел
я не говорю уже о покупке
не надо все доводить до идиотизма (бабская манера)
+
avatar
+5
Я на них писал, и программатор для них писал.
Просто не нужно в вопросах программирования пользоваться гиперболизацией, любой значит любой, почти любой значит почти любой, на порядок значит в 10 раз итд итп.
+
avatar
  • kalobyte
  • 18 декабря 2018, 02:09
-1
Просто не нужно в вопросах программирования пользоваться гиперболизацией
в вопросах жизни не нужно занудствовать и здаротствовать
ты на них писал, я про них слышал краем уха
как думаеш, есть ли тут еще кто-то, кто про них вообще что-то знает?

если я говорю все, то значит это все авр и автоматом подразумеваются тиньки и меги ходовые у паял
не у профи каких-то, а у простых паял, т.к. тут сидит немного домашних паял, а в основном просто обычные, кто хотел бы, да «всерукинедоходят» и тупо поглощают контент

чем страдают совковые ботаны? непомерным чсв и стремлением показать свои никому не нужные крутые знания, за что их обычно бьют или чморят
или проще говоря — не надо умничать
+
avatar
+1
никогда не писал для 85той, но вижу там есть SPI, разве он не работает в ISP режиме с копеечным USBASP и обязательно покупать какой-то специализированный «attiny85 programmer»?
+
avatar
  • jeepeg
  • 17 декабря 2018, 20:25
0
Согласен, я про это и написал. USBASP стоит копейки и ждать его ровно столько же сколько и эти самые аттини. Видимо просто людям нравится героически бороться с трудностями, созданными ими самими.
+
avatar
+5
USBASP представляет из себя ту же самую плату с мегой(только младшей), как и ардуина с соответствушей прошивкой. Так что ничего криминального нет в том, чтобы ардуину превратить в программатор.
+
avatar
  • jeepeg
  • 17 декабря 2018, 21:38
0
Да, всё верно. То же самое и в удобной форме и уже прошитая.
+
avatar
  • kirich
  • 18 декабря 2018, 03:56
+7
а вместо этого городит программатор из ардуины.
Да ладно Вам, есть решение куда как круче, программировать вручную :)
+
avatar
0
Ладно он сам так делает. Но вот рекомендовать такое для повторения чайникам — не айс. Чайнику надежней будет купить программатор, поставить мелкую программу и ткнуть пару раз мышкой — все проц прошит.
А уж если и это «верх возможностей», то рано еще за паяльник браться.
+
avatar
  • Harwest
  • 17 декабря 2018, 18:11
+1
Капец тиньки в Дип дорогие!
Дигиспарк so8w платка в два раза дешевле :)
+
avatar
  • Demz
  • 18 декабря 2018, 12:46
0
я удивлен, что вы этого до сих пор не знали))
Главное, что они решают вопрос «здесь и сейчас», а цена… ну за скорость цена растет, что поделать.
+
avatar
  • Harwest
  • 18 декабря 2018, 13:54
0
На дип я вообще не смотрел, всего одну первую платку недавно купил.
В оффлайне (Промэлектроника) одна микруха в дип стоит емнип 168р.
+
avatar
  • Murometz
  • 17 декабря 2018, 18:14
+1
Однозначный плюс за прямые руки. И прям в тему поделка, к Новому Году )
+
avatar
0
Задумался.
tiny85 стоит 4,5$ за две штуки.
Arduino Nano стоит от 2$ за штуку. При этом имеет на борту всё нужное.
Если надо помельче (хотя зачем), то Pro MIni где-то от 1.5$. Правда требует адаптера USB-USART.
Или это как демонстрация работоспособности идеи? Ну так понятно, что работать будет — куда оно денется.
Да, кстати, на питание AVR очень рекомендуется вешать керамический конденсатор от 0.1мкФ. Ну и на RST тоже.
Если уж навесным монтажём вешаете.
+
avatar
  • tedbeer
  • 17 декабря 2018, 18:28
+2
Я по ссылке брал 10 тинек за $10.5. Это сейчас там скурвилось.
Конструктивная критика приветствуется. Я ж написал — я чайник :) Я понимаю, что ногам болтаться в воздухе негоже, особенно RST. Но тут и железка не такая ответственная.
+
avatar
  • dansar
  • 18 декабря 2018, 07:46
+1
Сейчас к вам придёт salamatin и скажет, что нужно было использовать stm32f030 по $0.5 за штуку :)
+
avatar
  • tedbeer
  • 17 декабря 2018, 18:48
+1
Целей в статье несколько:
— как использовать Arduino Mega 2560 в качестве прошивальщика. Год назад упарился искать правильное подключение.
— показать, что копеечного контроллера с крошечным объемом памяти хватает на вполне жизненную поделку
— pro mini — под пробку не засунешь, уже будет торчать и надо как-то облагородить плату
— pro mini накладывает меньше ограничений, т.к. имеет в 2-4 раза больше памяти
Ну так понятно, что работать будет — куда оно денется.
Вот это совсем неочевидно — памяти мало.
Правда требует адаптера USB-USART
Если поковыряться, может можно так же шить через ардуино без адаптера?
+
avatar
0
Если поковыряться, может можно так же шить через ардуино без адаптера?
Можно, конечно. ISP контакты там в любом случае есть, так что можно и через ардуинку шить. Можно даже Nano использовать как конвертер USB-UART — там все нужные контакты есть.
+
avatar
+1
в sop8 вообще меньше 4,5$ за 5шт. aliexpress.com/item/5-ATTINY85-20SU-ATTINY85-20SU-SOP8/32946348479.html, только 3 недели назад брал, недавно пришли, проверял.
если паяльник не 100ваттный «топор», то без проблем можно подпаяться и к ней, или посадить на soic-dip адаптер.
а залить прошивку можно вообще 1000 и 1 способом, вплоть до — вручную, с несколькими проводками и батарейкой из кокоса))
+
avatar
0
И плюс доставка 2.86, итого получается 7.18.
Лучше уж тогда лот из 10 штук у этого же продавца взять за 9.73 с бесплатной доставкой.
+
avatar
0
у меня показывает что доставка бесплатно. видимо зависит от страны проживания.
+
avatar
  • kalobyte
  • 17 декабря 2018, 19:46
0
плата с стм32 и железным усб (куда можно залить загрузчик) стоит меньше 2х баксов
сейчас пойду мусор выносить и думаю в ящике уже пришла эта платка и еще куча всего
+
avatar
  • Harwest
  • 17 декабря 2018, 21:25
0
Она в горлышко не пролезет же?
+
avatar
  • kalobyte
  • 17 декабря 2018, 21:56
0
наверное
но можно сделать пробку побольше и батарейку туда еще засунуть
+
avatar
  • serg_mur
  • 17 декабря 2018, 19:10
0
2812 можно использовать? Какие то изменения в скетч нужно вносить?
+
avatar
  • tedbeer
  • 17 декабря 2018, 19:25
0
LED_TYPE WS2812
Остальное всё как написано.
+
avatar
0
К новому году и цветомузыку можно делать на WS2812В.
+
avatar
  • kalobyte
  • 17 декабря 2018, 19:48
+4
это не светомузыка, это рандомные мигания для эпилептиков
+
avatar
+6
Это вы ещё «светомузыку» на стартерах не видели)))
+
avatar
  • kai2
  • 17 декабря 2018, 21:48
+6
Даааа. Я в школе собирал в 70е. Стартер и параллельно кондер. И так 3-4 канала. Крутяк. А светильники фары от трактора. Стекла крашеные самодельными разноцветным лаком. Или просто натягивали воздушные шарики.
+
avatar
  • Harwest
  • 18 декабря 2018, 04:30
+5
Стекла крашеные самодельными разноцветным лаком.
Да-да, из цветных паст выдавленных из стержней ;)
+
avatar
  • Demz
  • 18 декабря 2018, 12:49
0
ппц. эт прям на всё село дискотека.
ХОЧУ!!!!1111адынадын
+
avatar
  • kalobyte
  • 17 декабря 2018, 21:55
-1
в садике еще видел в начале 80х
+
avatar
  • kote
  • 17 декабря 2018, 21:17
+2
Нифига светодиод моргать не будет: )

Мало того, что питание 1.5 вольта так еще и через резистор…
Да и для «тиньки» маловато 1.5 вольта.

3 батарейки подключены на рисунке параллельно!
+
avatar
  • tedbeer
  • 17 декабря 2018, 21:21
0
точно! поправил :)
+
avatar
  • ve-nik
  • 18 декабря 2018, 09:31
+1
А я пытаюсь успеть повторить вот такой проект к новому году:

Вся затыка с Blynk, не компилируется, да и знаний не хватает. Но постараюсь разобраться и успеть.
+
avatar
  • f1203
  • 18 декабря 2018, 10:09
0
У Nitecore Tube такой же контроллер? Слетела прошивка, теперь на максмальном режиме стробоскоп. Можно ли его вылечить перепрошивкой и где достать скетч?
+
avatar
  • tedbeer
  • 18 декабря 2018, 11:56
+1
Судя по вот этому видео, где фонарик разобран и показан крупным планом, там другой контроллер или скорее специализированный чип.
+
avatar
  • vasilio
  • 18 декабря 2018, 20:56
+1
спасибо за обзор!
уже повторил сегодня на arduino pro mini с гирляндой на 50 светодиодов :))
+
avatar
  • vasilio
  • 18 декабря 2018, 23:09
0
Кстати, вдруг кому пригодится, добавил кнопочку, переключать режимы
Дополнительная информация
#include <FastLED.h>

FASTLED_USING_NAMESPACE

// FastLED "100-lines-of-code" demo reel, showing just a few 
// of the kinds of animation patterns you can quickly and easily 
// compose using FastLED.  
//
// This example also shows one easy way to define multiple 
// animations patterns and have them automatically rotate.
//
// -Mark Kriegsman, December 2014

#if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
#warning "Requires FastLED 3.1 or later; check github for latest code."
#endif

#define DATA_PIN    2
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    50
CRGB leds[NUM_LEDS];

#define BRIGHTNESS          50
#define FRAMES_PER_SECOND  120

const int  buttonPin = 9;    // the pin that the pushbutton is attached to
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  
// initialize the button pin as a input:
  pinMode(buttonPin, INPUT_PULLUP);
  
  delay(3000); // 3 second delay for recovery
  
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);

}


// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
  
void loop()
{
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == LOW) {
      // if the current state is low then the button went from off to on:
      nextPattern(); //change pattern
    }
  }
    // save the current state as the last state, for next time through the loop
    lastButtonState = buttonState;
  // Call the current pattern function once, updating the 'leds' array
  gPatterns[gCurrentPatternNumber]();

  // send the 'leds' array out to the actual LED strip
  FastLED.show();  
  // insert a delay to keep the framerate modest
  FastLED.delay(1000/FRAMES_PER_SECOND); 

  // do some periodic updates
  EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
  //EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void rainbow() 
{
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 7);
}

void rainbowWithGlitter() 
{
  // built-in FastLED rainbow, plus some random sparkly glitter
  rainbow();
  addGlitter(80);
}

void addGlitter( fract8 chanceOfGlitter) 
{
  if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}

void confetti() 
{
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}

void sinelon()
{
  // a colored dot sweeping back and forth, with fading trails
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16( 13, 0, NUM_LEDS-1 );
  leds[pos] += CHSV( gHue, 255, 192);
}

void bpm()
{
  // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  uint8_t BeatsPerMinute = 62;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  }
}

void juggle() {
  // eight colored dots, weaving in and out of sync with each other
  fadeToBlackBy( leds, NUM_LEDS, 20);
  byte dothue = 0;
  for( int i = 0; i < 8; i++) {
    leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
    dothue += 32;
  }
}