Рубрики
Схемы на AVR

Программирование ATtiny85 с помощью платы Arduino Uno

Микроконтроллер ATtiny85 является удобной и сравнительно мощной альтернативой старшим моделям микроконтроллеров семейства AVR. Его применение особенно оправданно в тех случаях, когда вы стремитесь к минимизации размеров вашего устройства.

Микросхема ATtiny85 содержит 8 контактов – 6 контактов ввода/вывода (включая Reset) и 2 контакта питания. Но как его программировать если он не имеет USB интерфейса как большинство современных микроконтроллерных плат? В этом случае его можно запрограммировать с помощью платы Arduino Uno (этот способ мы рассмотрим в данной статье) или сконструировать самодельный USB программатор для ATtiny85.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Микроконтроллер ATtiny85 (купить на AliExpress).
  3. Светодиод (купить на AliExpress).
  4. Резистор 220 Ом (купить на AliExpress).
  5. Макетная плата.
  6. Соединительные провода.

Краткие сведения о микроконтроллере 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.’

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

Затем откройте пункт меню 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. По отдельности все аспекты работы вашего проекта у нас на сайте рассмотрены (подключение сервомотора, кнопок, светодиодов и т.д.). Если необходимо, могу привести ссылки на них

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *