Содержание
Работа с голым МК и ATtiny
Внимание! Данный урок опирается на информацию из предыдущего урока о программаторах. Обязательно изучите сначала его
В прошлом уроке я рассказывал о том, как загрузить прошивку в Ардуино, используя внешние устройства: USB-TTL преобразователь и ISP программатор. Как нетрудно догадаться, при помощи этих же инструментов можно загрузить прошивку и в голый чип, будь то ATmega328 или ATtiny85. МК серии ATtiny являются младшими братьями АТмег, у них меньше ног, меньше памяти, меньше интерфейсов и таймеров, но зато они дешевле и хорошо подходят для мелких проектов. Давайте сравним несколько популярных МК:
МК/spec | ATmega328 | ATtiny85 | ATtiny13 |
Flash | 32k | 8k | 1k |
SRAM | 2k | 512b | 64b |
EEPROM | 1k | 512b | 64b |
Цифр. Ног | 23 | 6 | 6 |
Аналог. Ног | 8 | 4 | 4 |
Таймеры | 3 | 2 | 1 |
SPI | + | + | + |
UART | + | – | – |
I2C | + | + | – |
Цена | 95р | 70р | 20р |
Примечание: большинство функций объединены на одних и тех же пинах.
Как вы можете видеть, чем дешевле МК, тем меньше у него возможностей. Полное подробное сравнение можно глянуть здесь.
Питание
Источник питания
Выбор источника питания очень важен для эффективного энергосбережения: максимально желательно питать МК напрямую от батарейки/аккумулятора:
- Трёх-четырёх АА/ААА батареек или аккумуляторов достаточно для работы на стандартной частоте 16 МГц (с 4-мя батарейками нужно быть аккуратнее по суммарному напряжению, а 4 никелевых аккумулятора подходят идеально).
- От одного литиевого аккумулятора (3.7-4.2V) можно работать на 16 МГц, но при разряде ниже 3.5V работа на такой частоте уже может быть не очень стабильной (частоту можно чуть понизить, об этом ниже).
- От литиевой 3V таблетки (CR2025, CR2032 и прочие) микроконтроллер отлично будет работать на внутреннем 8 МГц клоке.
- Плохим вариантом можно считать ситуации, когда приходится использовать понижающие преобразователи и стабилизаторы: они все будут тратить несколько миллиампер “в тепло”, и даже режим сна МК может оказаться абсолютно бессмысленным. Но в любой ситуации нужно считать потребление и прикидывать время работы, для каких-то задач и работа от “Кроны” через стабилизатор будет приемлемой во имя упрощения схемы и стабильных 5 Вольт (китайский транзистор-тестер, например, включается на несколько секунд, поэтому заморочек по питанию нет).
- Если в устройстве используется аккумуляторная батарея, то можно схитрить: высоковольтный потребитель (мотор к примеру) может питаться от общего напряжения с батареи через драйвер, а микроконтроллер может работать от одной его “банки”, соединяясь общим проводом с минусом. Микроконтроллер, особенно в режиме сна, потребляет ничтожно мало по сравнению с тем же мотором, поэтому о разбалансировке банок можно не беспокоиться. Таким образом МК также может мониторить напряжение батареи и отключать её при разряде, выполняя роль BMS. Про измерение напряжения мы говорили в уроке про аналоговые входы.
- Также напомню, что питать всякие железки напрямую от МК можно только в некоторых пределах, подробнее о них и вообще питании проекта мы говорили в уроке о питании Ардуино и схемы в целом.
Самоблокировка питания
Самый надёжный и аппаратно простой способ сэкономить энергию – самоблокировка питания. Он подходит для устройств, которые включаются тактовой кнопкой (без фиксации) и через некоторое время должны сами отключиться до следующего клика по кнопке. Самоблокировка работает следующим образом: нажатие на кнопку подаёт ток на МК, он запускается, подаёт сигнал на “ключ”, который запараллеливает линию питания. Мы отпускаем кнопку, а МК продолжает работать, потому что сам удерживает ключ, через который идёт питание. Отсюда и название: самоблокировка питания. По тайм-ауту или другому алгоритму работы МК может отпустить ключ и отключиться. Через этот же ключ могут питаться и остальные железки, и точно так же быть отключены от питания при самовыключении.
Проблема в том, что МК от AVR могут питаться от любого GPIO пина (при наличии общей GND), поэтому практически все старые схемы из интернета не работают. Пока что удалось найти две схемы на форуме arduino, но лично я их не тестировал. В будущем дополню урок.
Но есть шикарный, простой и рабочий вариант: использовать стабилизатор напряжения с пином Enable, за который МК может “заблокировать” себе питание (за идею спасибо Дмитрию Карманову). Вот пример со стабилизатором me6212c33m5g на 3.3V (стоит в районе 15 руб). На схеме PWR_EN ведёт на физическую кнопку, подключенную второй ногой к питанию (батарейке), BUT_MK идёт на пин МК, который будет подавать высокий сигнал при запуске. 3V3 соответственно линия 3.3 (от неё питается сам МК и опционально что-то ещё), и BAT – батарейка.
Проект на голом МК
Зачем делать проект на своей плате и голом микроконтроллере?
Конечно же размер, своя плата получится компактнее в большинстве случаев.
Энергопотребление. Ни для кого не секрет, что всякие удобные штуки на плате ардуино потребляют огромный по меркам энергосбережения ток, и для автономного устройства лучше взять голый камушек.
Работая с голым камнем мы можем выбрать микроконтроллер под свои задачи. Например для мелкого проекта необязательно брать 328 мегу, если с задачей справится аттини13, которая стоит 20 рублей.
Возможная экономия. Ардуино нано стоит условно 170 рублей без доставки. Голая 328 мега на том же алиэкспресс – 100 рублей. Если брать десяток. В дорогущем российском чип и дип – 190 рублей. То есть если очень приспичит – можно и тут купить без особых потерь, потому что оригинальная нано стоит 3 тысячи рублей в том же ЧИДе.
Удобство разводки платы. Микросхема в корпусе под поверхностный монтаж находится на одном слое и не мешает дорожкам на другом слое.
Удобство монтажа. Даже если делать свою плату прототип лутом, то припаять на неё чип в 100 раз удобнее и быстрее, чем сверлить три десятка отверстий под ардуину, а потом их запаивать.
Мелкосерийное производство готовых или почти готовых плат, для себя если нужно несколько или на продажу
На том же jlcpcb можно заказать изготовление плат с распайкой внимание smd компонентов. То есть ардуину вам никто не припаяет, а вот ту же 328 мегу припаяют за 100 рублей, тиньку 13ю – за 35 рублей, а чем больше партия – тем дешевле
К этому вопросу мы вернёмся ближе к концу этого урока.
Итак, я на личном опыте убедился, что МК способен работать вообще без какой-либо обвязки. Это был проект “Читалка файлов с SD карты” на базе ATmega328. Проект достаточно непростой: МК читал текстовые файлы с карты памяти microSD и выводил их на OLED дисплей. Никаких лишних компонентов на плате нет, МК тактируется от внутренних 8 МГц и всё работает отлично. Даже карта памяти подключена напрямую к МК =) Но в надёжных устройствах делать так не рекомендуется! Что следует помнить и делать по возможности:
Соединять все ноги VCC максимально толстыми дорожками между собой
Соединять все ноги GND максимально толстыми дорожками между собой (а ещё лучше делать заливку полигоном GND)
Поставить керамический конденсатор (~100 нФ) по питанию МК (между VCC и GND) максимально близко к пинам питания
Поставить электролит или тантал на 10-47 мкФ по питанию. Особенно если МК питается от одного источника с другими потребителями
Рекомендуется подтягивать пин RSTЕсли нужна кнопка сброса (reset), цепляем её к RST и на GND к питанию (VCC) резистором на 10 кОм
Если нужен внешний тактовый генератор – подключаем его между пинами XTAL1 и XTAL2 Не забываем в настройках платы или напрямую во фьюзах поставить внешнее тактирование
ВНИМАНИЕ! Если фьюзы настроены на внешнее тактирование и внешний генератор не подключен к пинам – вы не сможете прошить МК даже при помощи ISP программатора!
(см. распиновку своего МК), и оба пина подключаем к GND через керамические конденсаторы на 18-22 пФ (схема ниже)
Например как-то так, питание соединяем, плюс пара конденсаторов и подтяжка RST:
Схема подключения внешнего осциллятора (если нужен). Пины 9 и 10 тут соответственно XTAL1 и XTAL2
Я думаю теперь вы готовы к созданию проекта на своей плате!
Программная часть
Проблема с драйвером датчика MAX30102 заключается в том, что используемый в приборе датчик выпускается на плате MH-ET LIVE. В спецификации на датчик подразумевается, но не указывается явно, что LED1 – красный светодиод, LED2 – инфракрасный (ИК). Однако, если сигнал управления на LED1 равен 0, красный светодиод остается включенным (как на Рисунке 3), если же сигнал управления на LED2 равен 0, то красный светодиод гаснет. Очевидный вывод состоит в том, что LED1 – это ИК светодиод, а LED2 – красный, который также участвует в измерениях уровня насыщения крови кислородом (см. описание ниже). Мы упоминаем этот момент по причине того, что самый распространенный драйвер датчика MAX30102 для проектов на Arduino – это драйвер SparkFun 3010x, в котором однозначно определено, что LED1 – красный, LED2 – ИК. Это может быть справедливо для модулей с датчиком серии MAX30105, установленных на платах SparkFun, но, похоже, не относится к датчику MAX30102 на плате MH-ET LIVE.
Уровень кислорода в крови обозначает насыщение периферийных капилляров кислородом. Более конкретно, это процент насыщенного кислородом гемоглобина по сравнению с общим количеством гемоглобина в крови (насыщенный и ненасыщенный кислородом гемоглобин).
Насыщенный и ненасыщенный гемоглобин имеют разные характеристики поглощения света для красных и ИК длин волн. На этом принципе основана работа датчиков, таких как MAX30102. В вычислениях используется следующее соотношение:
R = (AC_red/DC_red)/(AC_IR/DC_IR)
где AC_xxx является переменной составляющей сигнала xxx, а DC_xxx является постоянной составляющей сигнала xxx. В приборе вычисляются два значения R. Верхнее значение на дисплее (следующее после частоты пульса) вычисляется по классической формуле:
R = 104 — 1.7 × R
Нижнее значение вычисляется с помощью таблицы из Arduino библиотеки драйвера, которая является приближением формулы:
-45.060 × R × R + 30.354 × R + 94.845
Переменная составляющая вычисляется как размах амплитуды сигнала (от пика до пика) после удаления постоянной составляющей. Постоянная составляющая вычисляется с помощью экспоненциального фильтра скользящего среднего, также фильтр применяется при вычислении переменной составляющей. Автор недостаточно экспериментировал с константами в этих фильтрах, чтобы определить насколько надежным является этот метод вычислений указанных величин.
Построение графика сердечного ритма основывается на красном и ИК сигналах от датчика, и также проходят две стадии фильтрации. Первой, как описано выше, является удаление постоянной составляющей. Второй – это фильтр скользящего среднего, который действует как фильтр нижних частот для удаления переходных процессов до того, как сигнал поступит в детектор пульса. Форму сигнала после каждого из этих фильтров можно отобразить, но в целом более интересна форма сигнала без фильтров.
Например, дикротические выемки, которые можно увидеть на полученном с помощью прибора графике сердечного ритма (Рисунок 1) – «второе движение вверх на нисходящей части траектории, соответствующее увеличению давления в аорте при закрытии аортального клапана. – словарь Merriam Webster». Автор заметил, что если эти дикротические выемки более ярко выраженные – у более молодых людей – они могут преодолеть фильтрацию второго уровня и привести к ошибочному выходному сигналу детектора пульса, который, по сути, ищет пики и впадины в сигнале. Работа над проектом продолжается!
Исходный код (скетч Arduino), необходимые библиотеки, проект корпуса (Рисунок 5) для печати на 3D принтере доступны для скачивания в разделе загрузок.
Рисунок 5. | Простой корпус для прибора, напечатанный на 3D принтере. |
Дополнительно автор добавил версию прибора (nanoPulsePPG) для стандартных плат Arduino и протестировал работу на плате Arduino Nano, но также должно работать на плате Arduino Uno. Таким образом, вы можете экспериментировать с исходным кодом и датчиком.
Перенос МК с Arduino на свою плату
Напомню, что источник тактирования играет важную роль при загрузке прошивки. Микроконтроллер может быть настроен на тактирование от внутреннего генератора на 8 МГц, либо на тактирование от внешнего.
- При работе от внутреннего генератора МК запускается и работает просто при подаче напряжения, готов прошиваться как через UART (при наличии загрузчика), так и через ISP.
- При настройке на работу от внешнего генератора МК сможет работать и прошиваться только при подключении внешнего генератора. То есть если генератор физически не подключен к МК – его нельзя будет прошить даже через ISP.
Это же касается переноса микроконтроллера с платы Ардуино на свою плату: на Ардуино стоит кварц. Если на вашей плате есть кварц для МК – всё будет работать сразу. Если на вашей плате нет кварца – перепаянный с Ардуино МК не будет работать и прошиваться. Для переноса МК с платы Ардуино на свою плату (без кварца) нужно настроить МК на внутреннее тактирование, об этом мы говорили в прошлом уроке. Для этого нужно подключить к плате программатор (USB-ASP или Arduino as ASP) и прошить фьюзы
- Вручную через , выставив нужное во встроенном калькуляторе фьюзов.
- Вручную через , сконфигурировав и выставив фьюз-байт вручную в boards.txt.
- Автоматически через конфигурацию ядра. Для Arduino Nano это может быть GyverCore или , там в меню платы есть пункт Clock -> Internal 8 MHz. В Arduino IDE жмём “Записать загрузчик” и прошиваются новые фьюзы, после чего можно выпаивать МК и запускать/прошивать его уже без кварца.
Ставим “ядро”
Для того, чтобы работать с Attiny через Arduino IDE, нам нужно установить так называемое ядро, или как оно называется в самой IDE – плату. Для ATmega328 у нас уже есть стандартное ядро, например плата Arduino NANO. Но тут есть нюанс: внутренние настройки “платы” NANO рассчитаны на работу с загрузчиком (bootloader) и с внешним тактированием 16 Мгц, то есть лучше не рисковать и установить ядро, которое поддерживает работу без загрузчика и с возможностью выбора частоты, чтобы иметь полный контроль над платой. Могу посоветовать вот эти:
- GyverCore – ядро для ATmega328, которое разработали мы с коллегой. Лёгкое и быстрое, возможность работы без загрузчика и широкий выбор вариантов тактирования. Ссылка для менеджера плат: https://alexgyver.github.io/package_GyverCore_index.json
- MiniCore – ядро для поддержки и расширенной настройки МК ATmega328, ATmega168, ATmega88, ATmega48 и ATmega8. Ссылка для менеджера плат: https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
- ATTinyCore – ядро для поддержки и расширенной настройки МК ATtiny 441/841, 44/84, 45/85, 461/861, 48/88, 828, 1634, 87, 167. Ссылка для менеджера плат: http://drazzy.com/package_drazzy.com_index.json
- MicroCore – ядро для поддержки и расширенной настройки МК ATtiny13, ATtiny13A и ATtiny13V. Ссылка для менеджера плат: https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
- megaTinyCore – ядро для поддержки и расширенной настройки МК ATtiny 3217, 1617, 817, 417, 3216, 1616, 816, 416, 1614, 814, 414, 214, 412, 212, 1607, 807, 1606, 806, 406, 1604, 804, 404, 204, 402, 202. Новые модели шьются по UPDI, по этой теме читайте отличную статью на русском языке. Можно сделать программатор из обычной Ардуины – читай тут. Данное ядро можно установить через менеджер плат, ищите по названию Arduino megaAVR board package, никаких ссылок вставлять не нужно.
- MightyCore – ядро для поддержки и расширенной настройки МК ATmega8535, ATmega16, ATmega32, ATmega164, ATmega324, ATmega644 и ATmega1284. Ссылка для менеджера плат: https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json
- MegaCore – ядро для поддержки и расширенной настройки МК ATmega64, ATmega128, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90CAN32, AT90CAN64 и AT90CAN128. Ссылка для менеджера плат: https://mcudude.github.io/MegaCore/package_MCUdude_MegaCore_index.json
Как установить ядро: идём в Файл/Настройки и вставляем ссылку в окно дополнительных ссылок для менеджера плат
Далее идём в Инструменты/Плата/Менеджер плат… и находим нужное ядро. Устанавливаем
После этого в списке плат появится новое семейство плат/МК на выбор. Я буду работать с ATtiny85
Нас интересует меню Clock – тактирование. ATtiny85 интересна тем, что может тактироваться от внутреннего источника на 8 МГц, но также может его “умножить” на 2 и получится 16 МГц, этот вариант называется 16 MHz (PLL). Это очень круто, потому что голый чип будет работать с почти максимальной скоростью, что делает его ничуть не хуже той же Arduino Nano.
Выбираем программатор из списка (я буду прошивать при помощи USB ASP). Однократно выполним Инструменты/Записать загрузчик, чтобы применить настройки тактирования:
Про остальные менюшки и варианты можно догадаться из их названия, или почтить подробное описание на GitHub по ссылкам выше.
Finished Circuit
After proving out the sub-components like rotary encoder and LCD, and demonstrating working code for them, I had to redraw the waveform characters for the 5×8 block characters on the HD44780. I converted to storing the custom characters in since leaving in code RAM was consuming too much memory. I also had to come up with a bank-switching scheme, since HD44780 only allows eight user-defined characters in its RAM memory at a time.
Maybe I’ll be able to prove what OP said about the circuit’s output passive filter characteristics when I get to those in my The Art of Electronics book that I am going through.
NOTE: Original source schematic had 6.8k resistors and 1.5 nF caps on the filter, and that’s what I built originally.
О возможностях среды разработки
Arduino IDE имеет встроенный набор плат и микроконтроллеров, с которыми можно работать; в её основе лежит классический программатор AVR, кстати, благодаря ему и можно обращаться к устройству командами на Си.
Однако не всегда удобно и рационально использовать предложенные микроконтроллеры. Согласитесь, что глупо брать плату с парой десятков выводов для работы с 1 датчиком и 1 исполнительным механизмом, в роли которого может быть:
- сервопривод;
- транзистор;
- светодиод;
- соленоид и т. д.
Поэтому сторонние разработчики создали целый ряд совместимых плат. Работать с ними можно через Arduino IDE, используя простые команды встроенного языка. Для этого были переписаны загрузчики и библиотеки команд.
UART и ISP
Для подключения прошиваторов к голому чипу нам нужно будет изучить распиновку (pinout) на нужный микроконтроллер. Распиновки бывают цветные и красивые (часто с ошибками), а бывают более серьёзные и правильные. Лучше всего открыть даташит на нужный МК и на второй же странице найти 100% правильную распиновку. Например для ATmega328, ATtiny85 и ATtiny13:
На данных “схемах” подписаны все функции пинов МК. Чтобы загрузить прошивку через USB-TTL, то есть при помощи “живущего в памяти” загрузчика (bootloader), МК должен иметь на борту аппаратный UART, то есть пины RX и TX. Если таких пинов нет – прошивку можно загрузить только через ISP программатор. Вы спросите, а как же Digispark? Там стоит МК ATtiny85, у которого нет UART, но прошивка загружается через USB! Верно, но там хитрые разработчики сделали не менее хитрый загрузчик, который имитирует USB, и прошивка на Digispark загружается при помощи специальной программы, которая запускается в фоне, когда вы нажимаете кнопку “Загрузить” в Arduino IDE. Резюмируя для общего случая:
- Если в МК прошит загрузчик (bootloader) и на борту имеется аппаратный UART (пины RX TX), прошивку можно загрузить через USB-TTL “загружатор”, также через него можно заниматься отладкой кода при помощи Serial.
- Если в МК нет пинов RX TX, значит прошивку можно загрузить только при помощи ISP программатора, да и о загрузчике в целом можно забыть, не нужен он. Отладкой всё ещё можно пользоваться, подключив USB-TTL и подняв на МК “программный” UART. Например в ядре для ATtiny85 (об этом ниже) уже идёт встроенный SoftwareSerial и можно им пользоваться.
Макетная плата
Готовую схему необходимо развести на плате. Это также можно сделать в KiCad. Для этого сначала требуется завершить работу со схемой:
- Промаркировать элементы на схеме , все настройки можно оставить по умолчанию.
- Сопоставить элементы схемы с посадочными местами на плате . Появится следующее окно:
Здесь для наглядности следует включить просмотр выбранного элемента .
Поскольку предстоит работать с макетной платой необходимо следить, чтобы все посадочные места укладывались в сетку 1/10″ (2.54mm). Если требуемый элемент найти не удаётся, проще назначить похожий, затем, в редакторе печатной платы, изменить его (Ctrl+E) и записать в свою библиотеку.
Как только все посадочные места будут назначены нужно сохранить результат и вернуться в редактор схемы. - Сгенерировать netlist , настройки по умолчанию вполне приемлемы.
Редактор схемы можно закрыть и перейти к редактору печатной платы . Здесь нажать , затем загрузить ранее созданный netlist (Read Current Netlist), убедиться, что не было ошибок и закрыть окно. Если схема была изменена или элементам были назначены другие посадочные места, необходимо обновить netlist и загрузить его здесь снова.
При первой загрузке netlist все посадочные места окажутся стопкой в одной куче. Сначала необходимо переключить сетку на 1/10″ (2.54mm), растащить элементы (используя кнопку m), убрать лишние надписи Visibles → Render → Values и, пользуясь подсказками редактора, соединить элементы дорожками.
Результат будет выглядеть примерно так:
Оставшиеся белые линии, указывают какие посадочные места необходимо соединить проводами. К сожалению в KiCad нет способа вывести результат, так чтобы его было удобно воспроизвести на макетной плате. Но в данном случае макетная плата получилась не большой, и с ней можно поступить просто: отключить лишние надписи Visibles → Render → Footprints Front, снять скриншот и зеркально отразить его по вертикали.
Готовый макет:
Тут два несоответствия со схемой выше: не распаяны подстроечные элементы R1,C3 и диод короче на одно отверстие.
Плата немного побита жёсткой отладкой, но на то она и макетная. Большинство других вариантов, после всех модификаций, выглядело бы хуже.
ATtiny85: прототип беспроводного сенсора +14
- 17.12.15 06:03
•
custos
•
#267798
•
Гиктаймс
•
Tutorial
•
•
6400
Open Source, DIY или Сделай сам, Arduino, Электроника для начинающих
Обычно, для перехода от идеи к реализации, необходим прототип устройства, удобный для проверки и отладки на месте, что особенно важно для мобильного устройства. Далее постараюсь максимально подробно разобрать процесс создания прототипа беспроводного сенсора на базе ATtiny85.
Цель — создать сенсор работающий, условно говоря, в коробке с искусственным освещением и передающий температуру и статус освещения с немедленной реакцией на изменение освещения: включилось, отключилось, мигнуло
Сенсор решено было сделать мобильным и питать от элемента CR2032, иначе говоря, при разряде до 2.7V (предел для датчика TMP36), можно рассчитывать на 200mAh.
Микроконтроллер ATtiny85 имеет всего 5 портов ввода/вывода и возможность отключить RESET в пользу дополнительного порта. Данный бюджет был распределён следующим образом:
- 3 порта — радиомодуль NRF24L01+, спецификация требует пять портов, но в данном случае это не приемлемо и будет использована 3-х пиновая конфигурация;
- 1 порт — датчик освещения на базе фототранзистора BPW17N;
- 2 порта — температурный датчик на базе TMP36, второй порт нужен для подачи питания, чтобы иметь возможность отключать датчик при необходимости.
Программирование
Итак, что же даёт нам ядро помимо выбора настроек МК? Можно программировать МК всё теми же командами, что и раньше! Мигать светодиодами через digitalWrite, измерять напряжение через analogRead и прочее прочее. Давайте напишем классический Blink:
void setup() { pinMode(PB3, OUTPUT); } void loop() { digitalWrite(PB3, HIGH); delay(500); digitalWrite(PB3, LOW); delay(500); }
PB3 – это номер пина, прямо как на распиновке.
Всё! Осталось загрузить прошивку. Для этого нажимаем Скетч/Загрузить через программатор:
Я подключил светодиод через резистор на 220 Ом и он мигает два раза в секунду, всё как написано.
Что следует помнить при работе с тиньками: у них мало памяти, а все вот эти Ардуино-функции являются кошмаром индуса и занимают очень много места в памяти. Если тини85 ещё как-то переживёт такие издевательства и сможет уместить в себе вполне интересный проект из Ардуино-функций, то в тини13 уже сложно уместить что-то серьёзное. Напомню: всего 64 байта оперативной памяти и 1 кб флэша! Для перехода на 13-ые тиньки рекомендуется научиться работать с МК напрямую, при помощи даташита и регистров.
Я думаю вы поняли, что в целом работа с голыми МК не особо то и отличается от работы с обычной платой Arduino, и теперь можно переходить к сложным самоделкам на базе своей платы, в центре которой будет стоять микроконтроллер. Давайте поделюсь парой советов по минимальной обвязке.