Микроконтроллер ATtiny85 является удобной и сравнительно мощной альтернативой старшим моделям микроконтроллеров семейства AVR. Его применение особенно оправданно в тех случаях, когда вы стремитесь к минимизации размеров вашего устройства.
Микросхема ATtiny85 содержит 8 контактов – 6 контактов ввода/вывода (включая Reset) и 2 контакта питания. Но как его программировать если он не имеет USB интерфейса как большинство современных микроконтроллерных плат? В этом случае его можно запрограммировать с помощью платы Arduino Uno (этот способ мы рассмотрим в данной статье) или сконструировать самодельный USB программатор для ATtiny85.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Микроконтроллер ATtiny85 (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Резистор 220 Ом (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Краткие сведения о микроконтроллере ATtiny85
ATtiny85 – это высокопроизводительный 8-битный микроконтроллер с низким энергопотреблением, построенный на основе архитектуры Advanced RISC. Он имеет 8 Кбайт перепрограммируемой флеш-памяти (память программ), 512 Байт EEPROM (энергонезависимой памяти), 512 Байт оперативной памяти (SRAM), 6 контактов ввода/вывода общего назначения 32 регистра общего назначения, один 8-битный таймер/счетчик с режимом сравнения, один 8-битный высокоскоростной таймер/счетчик, USI (универсальный последовательный интерфейс), внутренние и внешние прерывания, 4-х канальный 10-битный АЦП (аналого-цифровой преобразователь), программируемый сторожевой таймер с внутренним генератором, 3 программно управляемых режима энергопотребления.
Назначение контактов (распиновка) микроконтроллера ATtiny85 приведено на следующем рисунке.
Большинство контактов ATtiny85 могут выполнять несколько функций.
Пошаговое руководство по программированию ATtiny85 с помощью платы Arduino Uno
Шаг 1. Конфигурирование платы Arduino Uno в качестве ISP
Поскольку ATtiny85 является всего лишь микроконтроллером, то для его программирования необходимо использовать ISP (In-System Programming – внутрисистемное программирование. Поэтому нам необходимо сконфигурировать Arduino Uno в качестве ISP чтобы ее можно было использовать как программатор для ATtiny85. Для этого подсоедините Arduino Uno к компьютеру и запустите Arduino IDE. После этого откройте пункт меню File > Example > ArduinoISP и загрузите код ArduinoISP в плату Arduino Uno.
Шаг 2. Схема для программирования ATtiny85
Схема для программирования ATtiny85 с помощью платы Arduino Uno представлена на следующем рисунке.
В схеме положительный вывод светодиода подключен к контакту 0 микроконтроллера ATtiny85 через резистор 220 Ом. Полная схема соединений представлена в следующей таблице.
ATtiny85 | Плата Arduino Uno |
Vcc | 5V |
GND | GND |
Pin 2 | 13 |
Pin 1 | 12 |
Pin 0 | 11 |
Reset | 10 |
Внешний вид конструкции проекта в сборе выглядит примерно следующим образом:
Шаг 3. Программирование ATtiny85 с помощью Arduino IDE
Для программирования ATtiny85 с помощью Arduino IDE первым делом нам необходимо добавить поддержку ATtiny85 в Arduino IDE. Для этого откройте пункт меню File > Preferences, добавьте приведенную ниже ссылку в поле Additional Boards Manager URLs и нажмите ‘OK.’
Затем откройте пункт меню Tools > Board > Board Manager, запустите там поиск ‘attiny’ и установите его последнюю версию.
После этого вы увидите как у вас появится новый пункт в меню Arduino IDE – в пункте Board появится подпункт с именем ‘Attiny25/45/85’.
Теперь откройте File > Examples > Basics и в нем откройте пример с миганием светодиода (Blink example).
Измените в этом примере номер контакта с LED_BUILTIN на 0.
Теперь снова откройте пункт меню Tools -> Board и выберите “Attiny25/45/85”, потом выберите ATtiny85 в пункте Tools > Processor.
Теперь можете произвести загрузку кода программы в микроконтроллер. Если после загрузки программы светодиод, подключенный к контакту 0 микроконтроллера Attiny85, начнет мигать, значит, программа загружена успешно.
В следующем видео вы можете более подробно посмотреть все описанные в статье процессы.
5 ответов к “Программирование ATtiny85 с помощью платы Arduino Uno”
Прежде чем что-то программировать нужно записать загрузчик. И если не критично потребление установить 16 МГц.
Добрый день! Подскажите, какие библиотеки для SSD1306 Вы использовали и где можно скачать их? Дело в том, что при компиляции программы вываливаются ошибки:
Arduino: 1.8.13 (Windows 10), Плата:»ATtiny25/45/85, ATtiny85, Internal 1 MHz»
sketch_nov07a:58:1: error: ‘SPRITE’ does not name a type; did you mean ‘EERIE’?
SPRITE sN,sS,sE,sW,sG;
^~~~~~
EERIE
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino: In function ‘void setup()’:
sketch_nov07a:66:3: error: ‘ssd1306_128x64_i2c_init’ was not declared in this scope
ssd1306_128x64_i2c_init();
^~~~~~~~~~~~~~~~~~~~~~~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:66:3: note: suggested alternative: ‘SH1106_128x64init’
ssd1306_128x64_i2c_init();
^~~~~~~~~~~~~~~~~~~~~~~
SH1106_128x64init
sketch_nov07a:67:3: error: ‘ssd1306_fillScreen’ was not declared in this scope
ssd1306_fillScreen(0x00);
^~~~~~~~~~~~~~~~~~
sketch_nov07a:68:24: error: ‘ssd1306xled_font8x16’ was not declared in this scope
ssd1306_setFixedFont(ssd1306xled_font8x16);
^~~~~~~~~~~~~~~~~~~~
sketch_nov07a:68:3: error: ‘ssd1306_setFixedFont’ was not declared in this scope
ssd1306_setFixedFont(ssd1306xled_font8x16);
^~~~~~~~~~~~~~~~~~~~
sketch_nov07a:69:3: error: ‘sN’ was not declared in this scope
sN = ssd1306_createSprite( 0, 0, 8, N);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:69:3: note: suggested alternative: ‘N’
sN = ssd1306_createSprite( 0, 0, 8, N);
^~
N
sketch_nov07a:69:8: error: ‘ssd1306_createSprite’ was not declared in this scope
sN = ssd1306_createSprite( 0, 0, 8, N);
^~~~~~~~~~~~~~~~~~~~
sketch_nov07a:70:3: error: ‘sS’ was not declared in this scope
sS = ssd1306_createSprite( 0, 0, 8, S);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:70:3: note: suggested alternative: ‘S’
sS = ssd1306_createSprite( 0, 0, 8, S);
^~
S
sketch_nov07a:71:3: error: ‘sE’ was not declared in this scope
sE = ssd1306_createSprite( 0, 0, 8, E);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:71:3: note: suggested alternative: ‘E’
sE = ssd1306_createSprite( 0, 0, 8, E);
^~
E
sketch_nov07a:72:3: error: ‘sW’ was not declared in this scope
sW = ssd1306_createSprite( 0, 0, 8, W);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:72:3: note: suggested alternative: ‘W’
sW = ssd1306_createSprite( 0, 0, 8, W);
^~
W
sketch_nov07a:73:3: error: ‘sG’ was not declared in this scope
sG = ssd1306_createSprite(34, 47, 4, G);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:73:3: note: suggested alternative: ‘G’
sG = ssd1306_createSprite(34, 47, 4, G);
^~
G
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino: In function ‘void loop()’:
sketch_nov07a:107:3: error: ‘sN’ was not declared in this scope
sN.x=k92+k26*cos(a+PI); sN.y=k31+k26*sin(a+PI);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:107:3: note: suggested alternative: ‘N’
sN.x=k92+k26*cos(a+PI); sN.y=k31+k26*sin(a+PI);
^~
N
sketch_nov07a:108:3: error: ‘sS’ was not declared in this scope
sS.x=k92+k26*cos(a); sS.y=k31+k26*sin(a);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:108:3: note: suggested alternative: ‘S’
sS.x=k92+k26*cos(a); sS.y=k31+k26*sin(a);
^~
S
sketch_nov07a:109:3: error: ‘sW’ was not declared in this scope
sW.x=k92+k26*cos(a+PI/2); sW.y=k31+k26*sin(a+PI/2);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:109:3: note: suggested alternative: ‘W’
sW.x=k92+k26*cos(a+PI/2); sW.y=k31+k26*sin(a+PI/2);
^~
W
sketch_nov07a:110:3: error: ‘sE’ was not declared in this scope
sE.x=k92+k26*cos(a-PI/2); sE.y=k31+k26*sin(a-PI/2);
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:110:3: note: suggested alternative: ‘E’
sE.x=k92+k26*cos(a-PI/2); sE.y=k31+k26*sin(a-PI/2);
^~
E
sketch_nov07a:112:43: error: ‘sG’ was not declared in this scope
sN.draw();sS.draw();sW.draw();sE.draw();sG.draw();
^~
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino:112:43: note: suggested alternative: ‘G’
sN.draw();sS.draw();sW.draw();sE.draw();sG.draw();
^~
G
C:\Users\Victor\Documents\Arduino\sketch_nov07a\sketch_nov07a.ino: In function ‘void printGrados(int)’:
sketch_nov07a:123:36: error: ‘STYLE_NORMAL’ was not declared in this scope
ssd1306_printFixed(0,50, gStr, STYLE_NORMAL);
^~~~~~~~~~~~
sketch_nov07a:123:5: error: ‘ssd1306_printFixed’ was not declared in this scope
ssd1306_printFixed(0,50, gStr, STYLE_NORMAL);
^~~~~~~~~~~~~~~~~~
exit status 1
‘SPRITE’ does not name a type; did you mean ‘EERIE’?
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
Добрый вечер, к сожалению собрать этот проект еще не успели, только перевели. Посмотрите на нашем сайте проекты с использованием дисплеев SSD1306, в них рассмотрена работа с различными библиотеками, поддерживающими данный дисплей.
Добрый день. Меня зовут Александр, 61 год. Я хочу сделать один проэкт для моих внуков на модельной жедезной дороге. Это должно работать на Attiny85. Составные части: 1. Attiny85 2. две кнопки ( не выключатели) 3. 1 штука LED 4. Servo мотор — 1 штука ( SG90 9G Micro Mini Servo) или подобный 5. RM065 10КОм (?) потенциометр — 1 штука Принцип работы: Начальное состояние так называемое «0» состояние- ничего не происходит. Внимание: мы имеем две кнопки: А и Б Сначало нажимается кнопка А, потом Б. После нажатия Б в Attiny85 срабатывает счеткик с 0 на увеличение 1. В это время начинает мигать LED (можно сказать симметрично по 0,5 сек.). Потом через 1 сек. ( после нажатия Б) поворачивается servo-мотор на 180 град. и останавливается. LED-продолжает мигать. При нажатии АБ — 2 раз, АБ — 3 раз , и более- счетчик считает 2, 3 и более. Если на счетчике не «0», LED постоянно мигает, а серво находится в полодении 180 град. Уменьшение на счетчике только после комбинации БА, БА. Если состояния счеткика становится на «0», Servo поворачивается в положение 0 град. и только потом ( при нулевом Servo) перестает мигать LED. Потенциометр необходим для регулирования скорости вращения servo (ШИМ сигнала) Если сможите такой скейч сделать, сколько это будет стоить. С уважением Александр
Добрый вечер. К сожалению, временно не могу вам помочь, нет сейчас возможности работать ни с Ардуино, ни с Attiny85. По отдельности все аспекты работы вашего проекта у нас на сайте рассмотрены (подключение сервомотора, кнопок, светодиодов и т.д.). Если необходимо, могу привести ссылки на них