Как и обещал где-то в комментариях, расскажу как запрограммировать микроконтроллер 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:
Выбираем простой пример (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 };
Можно поиграться с интервалом смены эффектов и смены базового цвета. Для этого поправьте цифры в следующих строчках:
Готово — гирлянда работает. Год назад я так и оставил. Прицепил к одному чипу две ленты диодов и они управлялись одним сигналом. Повесил обе гирлянды на елку.
Лампа
В этом году решил сделать настольную праздничную лампу:
отрезал 30 диодов
припаял USB разъем к ленте
перешил чип на 30 диодов
чип припаял прямо к контактам ленты и скрыл в термоусадке
чтобы елочная мишура случайно не закоротила чего на ленте, все контактные площадки закрыл термоусадкой, а открытые контакты диодов замазал клеем PVA, так как лака дома не нашлось :)
в бутылку из под виски засунул гирлянду и елочную мишуру
подключил к простой 1.5А зарядке для телефонов. Её достаточно для 30 диодов. Для длинной гирлянды источник нужен мощнее.
Всё получилось, всё работает, бутылка лежит на работе и создает праздничное настроение команде.
ЗЫ. Прошивал чип впервые год назад, когда делал гирлянду, поэтому некоторые подробности мог упустить. Спрашивайте, если что не получается.
ЗЗЫ. Вискарь из бутылки лучше выпить заранее, чтобы работе ничего не мешало.
Обновление: добавил картинку с тестовой схемой к мигалке простым светодиодом.
Да, была мысль засунуть гирлянду в силиконовый шланг и опустить в «подходящую» жидкость. Но решил, что жидкость надо употребить по назначению.
Была также идея без всякого шланга залить в бутылку масло. Но больше нравится идея — разрезать бутылку и засунуть внутрь аккумулятор и зарядку, может даже беспроводную. Тогда работать сможет без проводов.
Как вариант — я делал похожее в пластиковой полупрозрачной бутылке (у нас в таких кефир и айран продаётся).
Стенки бутылки приятно рассеивали свет от WS2811.
С контроллером я халявил, конечно, и поставил ESP8266 и 18650.
Немного странно выглядит, человек покупает голую тиньку и не покупает копеечный программатор, а вместо этого городит программатор из ардуины. Я не осуждаю этот вариант, тем более он рабочий, но тратить на это время…
Уж лучше собрать программатор из того, что уже есть под рукой, чем покупать ещё одно устройство, потом ждать его по почте, а потом оно будет собирать пыль из-за ненужности.
Потому что мало хороших инструкций для чайников как и что делать. Поищите на алиэкспресс «attiny85 programmer» и потом найдите среди найденного настоящий программатор, а не платку с юсб разъемом и стабилизатором питания. Вот пару раз наступив на грабли пытаешься решить задачу тем что есть под руками. А под руками была Ардуино Мега. И то еще пришлось покопаться, как же ее использовать вместо более слабенькой Ардуино Уно.
кому они нужны? и много ли тут найдется тех, кто их хотя бы на картинке видел
я не говорю уже о покупке
не надо все доводить до идиотизма (бабская манера)
Я на них писал, и программатор для них писал.
Просто не нужно в вопросах программирования пользоваться гиперболизацией, любой значит любой, почти любой значит почти любой, на порядок значит в 10 раз итд итп.
Просто не нужно в вопросах программирования пользоваться гиперболизацией
в вопросах жизни не нужно занудствовать и здаротствовать
ты на них писал, я про них слышал краем уха
как думаеш, есть ли тут еще кто-то, кто про них вообще что-то знает?
если я говорю все, то значит это все авр и автоматом подразумеваются тиньки и меги ходовые у паял
не у профи каких-то, а у простых паял, т.к. тут сидит немного домашних паял, а в основном просто обычные, кто хотел бы, да «всерукинедоходят» и тупо поглощают контент
чем страдают совковые ботаны? непомерным чсв и стремлением показать свои никому не нужные крутые знания, за что их обычно бьют или чморят
или проще говоря — не надо умничать
никогда не писал для 85той, но вижу там есть SPI, разве он не работает в ISP режиме с копеечным USBASP и обязательно покупать какой-то специализированный «attiny85 programmer»?
Согласен, я про это и написал. USBASP стоит копейки и ждать его ровно столько же сколько и эти самые аттини. Видимо просто людям нравится героически бороться с трудностями, созданными ими самими.
USBASP представляет из себя ту же самую плату с мегой(только младшей), как и ардуина с соответствушей прошивкой. Так что ничего криминального нет в том, чтобы ардуину превратить в программатор.
Ладно он сам так делает. Но вот рекомендовать такое для повторения чайникам — не айс. Чайнику надежней будет купить программатор, поставить мелкую программу и ткнуть пару раз мышкой — все проц прошит.
А уж если и это «верх возможностей», то рано еще за паяльник браться.
Задумался.
tiny85 стоит 4,5$ за две штуки.
Arduino Nano стоит от 2$ за штуку. При этом имеет на борту всё нужное.
Если надо помельче (хотя зачем), то Pro MIni где-то от 1.5$. Правда требует адаптера USB-USART.
Или это как демонстрация работоспособности идеи? Ну так понятно, что работать будет — куда оно денется.
Да, кстати, на питание AVR очень рекомендуется вешать керамический конденсатор от 0.1мкФ. Ну и на RST тоже.
Если уж навесным монтажём вешаете.
Я по ссылке брал 10 тинек за $10.5. Это сейчас там скурвилось.
Конструктивная критика приветствуется. Я ж написал — я чайник :) Я понимаю, что ногам болтаться в воздухе негоже, особенно RST. Но тут и железка не такая ответственная.
Целей в статье несколько:
— как использовать Arduino Mega 2560 в качестве прошивальщика. Год назад упарился искать правильное подключение.
— показать, что копеечного контроллера с крошечным объемом памяти хватает на вполне жизненную поделку
— pro mini — под пробку не засунешь, уже будет торчать и надо как-то облагородить плату
— pro mini накладывает меньше ограничений, т.к. имеет в 2-4 раза больше памяти
Ну так понятно, что работать будет — куда оно денется.
Вот это совсем неочевидно — памяти мало.
Правда требует адаптера USB-USART
Если поковыряться, может можно так же шить через ардуино без адаптера?
Если поковыряться, может можно так же шить через ардуино без адаптера?
Можно, конечно. ISP контакты там в любом случае есть, так что можно и через ардуинку шить. Можно даже Nano использовать как конвертер USB-UART — там все нужные контакты есть.
плата с стм32 и железным усб (куда можно залить загрузчик) стоит меньше 2х баксов
сейчас пойду мусор выносить и думаю в ящике уже пришла эта платка и еще куча всего
Даааа. Я в школе собирал в 70е. Стартер и параллельно кондер. И так 3-4 канала. Крутяк. А светильники фары от трактора. Стекла крашеные самодельными разноцветным лаком. Или просто натягивали воздушные шарики.
А я пытаюсь успеть повторить вот такой проект к новому году:
Вся затыка с Blynk, не компилируется, да и знаний не хватает. Но постараюсь разобраться и успеть.
У Nitecore Tube такой же контроллер? Слетела прошивка, теперь на максмальном режиме стробоскоп. Можно ли его вылечить перепрошивкой и где достать скетч?
#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;
}
}
Была также идея без всякого шланга залить в бутылку масло. Но больше нравится идея — разрезать бутылку и засунуть внутрь аккумулятор и зарядку, может даже беспроводную. Тогда работать сможет без проводов.
Стенки бутылки приятно рассеивали свет от WS2811.
С контроллером я халявил, конечно, и поставил ESP8266 и 18650.
я не говорю уже о покупке
не надо все доводить до идиотизма (бабская манера)
Просто не нужно в вопросах программирования пользоваться гиперболизацией, любой значит любой, почти любой значит почти любой, на порядок значит в 10 раз итд итп.
ты на них писал, я про них слышал краем уха
как думаеш, есть ли тут еще кто-то, кто про них вообще что-то знает?
если я говорю все, то значит это все авр и автоматом подразумеваются тиньки и меги ходовые у паял
не у профи каких-то, а у простых паял, т.к. тут сидит немного домашних паял, а в основном просто обычные, кто хотел бы, да «всерукинедоходят» и тупо поглощают контент
чем страдают совковые ботаны? непомерным чсв и стремлением показать свои никому не нужные крутые знания, за что их обычно бьют или чморят
или проще говоря — не надо умничать
А уж если и это «верх возможностей», то рано еще за паяльник браться.
Дигиспарк so8w платка в два раза дешевле :)
Главное, что они решают вопрос «здесь и сейчас», а цена… ну за скорость цена растет, что поделать.
В оффлайне (Промэлектроника) одна микруха в дип стоит емнип 168р.
tiny85 стоит 4,5$ за две штуки.
Arduino Nano стоит от 2$ за штуку. При этом имеет на борту всё нужное.
Если надо помельче (хотя зачем), то Pro MIni где-то от 1.5$. Правда требует адаптера USB-USART.
Или это как демонстрация работоспособности идеи? Ну так понятно, что работать будет — куда оно денется.
Да, кстати, на питание AVR очень рекомендуется вешать керамический конденсатор от 0.1мкФ. Ну и на RST тоже.
Если уж навесным монтажём вешаете.
Конструктивная критика приветствуется. Я ж написал — я чайник :) Я понимаю, что ногам болтаться в воздухе негоже, особенно RST. Но тут и железка не такая ответственная.
— как использовать Arduino Mega 2560 в качестве прошивальщика. Год назад упарился искать правильное подключение.
— показать, что копеечного контроллера с крошечным объемом памяти хватает на вполне жизненную поделку
— pro mini — под пробку не засунешь, уже будет торчать и надо как-то облагородить плату
— pro mini накладывает меньше ограничений, т.к. имеет в 2-4 раза больше памяти
Вот это совсем неочевидно — памяти мало.
Если поковыряться, может можно так же шить через ардуино без адаптера?
если паяльник не 100ваттный «топор», то без проблем можно подпаяться и к ней, или посадить на soic-dip адаптер.
а залить прошивку можно вообще 1000 и 1 способом, вплоть до — вручную, с несколькими проводками и батарейкой из кокоса))
Лучше уж тогда лот из 10 штук у этого же продавца взять за 9.73 с бесплатной доставкой.
сейчас пойду мусор выносить и думаю в ящике уже пришла эта платка и еще куча всего
но можно сделать пробку побольше и батарейку туда еще засунуть
Остальное всё как написано.
ХОЧУ!!!!1111адынадын
Мало того, что питание 1.5 вольта так еще и через резистор…
Да и для «тиньки» маловато 1.5 вольта.
3 батарейки подключены на рисунке параллельно!
Вся затыка с Blynk, не компилируется, да и знаний не хватает. Но постараюсь разобраться и успеть.
уже повторил сегодня на arduino pro mini с гирляндой на 50 светодиодов :))