ATtiny85 i drugi mali mikrokontroleri
ATtiny85 i srodni mali mikrokontroleri: pinovi, memorija, programiranje Unom u Arduino IDE-u i PlatformIO-u, Digispark i rad na gumbastoj bateriji.
Na Arduinu Uno radi jedan čip, mikrokontroler ATmega328P. Sve ostalo na tiskanoj pločici samo mu pomaže: USB čip za vezu s računalom, regulator napona, kristal za takt, tipka RESET i LED-ice. Kad je projekt gotov, a treba mu samo nekoliko pinova, cijeli Uno je prevelik, troši previše struje i šteta ga je ugraditi. Tada se koristi sam mikrokontroler, bez Arduina oko njega. Najpoznatiji takav mali mikrokontroler je ATtiny85: ima samo osam nožica, manji je od nokta, a programira se istim jezikom i istim naredbama kao Arduino.
Na ovoj stranici najviše je o čipu ATtiny85: kako su raspoređeni njegovi pinovi, kako mu Arduino Uno učitava program u Arduino IDE-u i u PlatformIO-u i kako s njim napraviti nešto što mjesecima radi na gumbastoj bateriji. Na kraju su i drugi mali mikrokontroleri, od još manjeg ATtiny13A do novijih čipova kao što su ATtiny412 i CH32V003.
Sam čip nema zaštitu koju ima Uno
Na čipu nema regulatora napona ni ikakve zaštite. ATtiny85 radi s 2,7 do 5,5 V: napajaj ga s 5 V iz Una, iz dvije ili tri baterije AA ili iz gumbaste baterije od 3 V. Bateriju od 9 V nikad ne spajaj izravno na njega. Iz jednog pina čip smije dati najviše 40 mA, a svi pinovi zajedno oko 60 mA. Zato računaj s 20 mA po pinu, kao na Unu, i LED-icu uvijek spoji preko otpornika.
Čip bez Arduina
ATtiny85 dolazi u dva kućišta. DIP-8 ima nožice razmaknute 2,54 mm, pa se utakne u breadboard preko srednjeg razmaka, kao na slici niže. SOIC-8 je upola manji, s nožicama razmaknutima 1,27 mm, i lemi se na tiskanu pločicu. Iznutra su isti.

Na jednom kraju čipa je urez, a pokraj njega točkica koja označava nožicu 1. Gledano odozgo, s urezom gore, nožice se broje oko čipa suprotno od kazaljke na satu: niz lijevu stranu od 1 do 4, pa uz desnu od 5 do 8. Ako čip utakneš okrenut naopako, plus i minus dođu na krive nožice i čip se može pregrijati.
Da bi radio, čipu treba samo napajanje: plus na nožicu 8 (VCC), minus na nožicu 4 (GND). Na pločici koju radiš za stalno stavi i keramički kondenzator od 100 nF između tih dviju nožica, što bliže čipu. On mu daje struju u trenucima kad je treba odjednom mnogo. Program mu ne možeš učitati preko USB-a, jer ga nema. To radi programator, a programator može biti i Arduino Uno.
ATtiny85 i ATmega328P
U tablici je ATtiny85 uz ATmega328P, čip koji radi na Unu:
| ATtiny85 | ATmega328P (Uno) | |
|---|---|---|
| Nožice | 8 | 28 (u kućištu DIP) |
| Pinovi za ulaze i izlaze | 6 (5 ako RESET ostane RESET) | 23 (20 na Unu) |
| Memorija za program (flash) | 8 KB | 32 KB |
| Radna memorija (RAM) | 512 B | 2 KB |
| EEPROM | 512 B | 1 KB |
| Analogni ulazi | 4 (jedan je na RESET-u) | 6 |
| Izlazi PWM | 3 | 6 |
| Serijska veza (UART) | nema, samo u programu | ima |
| I2C i SPI | preko jednog sklopa (USI) | ima oba |
| Takt | unutarnji 1 ili 8 MHz, 16 MHz s PLL-om, kristal do 20 MHz | 16 MHz s kristalom na Unu |
| Napon | 2,7 do 5,5 V (ATtiny85V od 1,8 V) | 1,8 do 5,5 V (Uno: 5 V) |
Brojevi su iz Microchipovih tehničkih listova (datasheeta). ATtiny85 ima četiri puta manje memorije za program i radne memorije od Una, ali za program koji pali LED-ice, čita tipkalo ili senzor i odlučuje što dalje, to je dovoljno. Program Disanje niže na ovoj stranici zauzme 532 bajta od 8192.
Raspored pinova

Oznake na slici imaju iste boje kao na stranici Raspored pinova.
| Oznaka | Što znači |
|---|---|
| VCC | napajanje, 2,7 do 5,5 V |
| GND | minus, masa |
| PB4 4 | ime pina u datasheetu, pa broj pina koji pišeš u programu |
| A2 | analogni ulaz |
| ~ | izlaz PWM (analogWrite) |
| MOSI | pinovi kojima programator učitava program (MOSI, MISO, SCK i RESET) |
| SDA | veza I2C (SDA i SCL) |
| TX | serijska veza koju radi program (TX i RX) |
| RESET | RESET |
Na što paziti:
- Nožica i pin nisu isti broj. Bijeli broj na čipu je broj nožice. U programu pišeš broj pina, a to je broj iza slova PB:
digitalWrite(4, HIGH)pali pin PB4, a on je na nožici 3. - Analogni ulazi su A1 (nožica 7), A2 (nožica 3) i A3 (nožica 2). A0 je na nožici 1, koja je RESET: kad napon na njoj padne prenisko, čip se resetira. Zato su za mjerenje praktički samo tri.
- PWM imaju pinovi 0, 1 i 4. Naredba
tone()i biblioteka Servo koriste isti brojač vremena (Timer1) kao PWM na pinu 4, pa dok one rade,analogWrite()na pinu 4 ne radi. - Serijske veze nema. ATtiny85 nema sklop UART. Paket ATTinyCore zato ima
Serialnapravljen u programu: šalje na pinu 0 (TX), a prima na pinu 1 (RX). Da bi to vidio u Serial Monitoru, treba ti USB-serijski pretvarač. Unutarnji oscilator čipa točan je samo na oko 10 %, a serijskoj vezi treba točnost od nekoliko posto. Ako na Serial Monitoru vidiš čudne znakove, kriv je takt. - I2C radi s bibliotekom Wire na pinovima 0 (SDA) i 2 (SCL), ali samo s vanjskim pull-up otpornicima, na primjer od 4,7 kΩ prema plusu.
- MOSI, MISO, SCK i RESET koristi programator. Ako je na njima nešto što ih jako opterećuje, programiranje može ne uspjeti. LED-ica s otpornikom tu ne smeta, ali modul je bolje odspojiti dok učitavaš program.
Takt i fuse bitovi
Čip ima nekoliko postavki koje pamti i kad nema napajanja. Zovu se fuse bitovi. Oni određuju koji takt čip koristi, ostaje li nožica 1 RESET i čuva li se EEPROM kad se učitava novi program.
Nov ATtiny85 radi na 1 MHz: unutarnji oscilator od 8 MHz podijeljen s 8. Program napisan za 8 MHz na njemu bi išao osam puta sporije, pa bi delay(1000) trajao osam sekundi. Zato svakom novom čipu prvo postaviš fuse bitove: u Arduino IDE-u naredbom Burn Bootloader, a u PlatformIO-u naredbom pio run -t fuses. Ponovi to svaki put kad promijeniš takt.
Unutarnji oscilator može raditi na 1 ili 8 MHz, a uz PLL i na 16 MHz. Za točniji takt, do 20 MHz, treba vanjski kristal, ali on zauzme dvije nožice (2 i 3).
Dvije postavke nakon kojih čip više ne odgovara
- Vanjski kristal ili vanjski takt, a nisi ga spojio. Čip tada stoji i čeka takt, pa ga programator više ne može dosegnuti. Spoji kristal ili izvor takta koji si odabrao, pa ponovno postavi fuse bitove.
- RESET kao šesti obični pin (postavka RSTDISBL). Neke upute s interneta to rade da dobiju još jedan pin. Nakon toga čip se više ne može programirati Unom, nego samo posebnim programatorom od 12 V (high-voltage).
Programiranje Unom
ATtiny85 nema USB. Program mu učitava programator preko četiri pina: MOSI, MISO, SCK i RESET. Takav način zove se ISP (in-system programming), a koristi istu vezu SPI kao mnogi moduli. Arduino Uno postaje programator kad mu učitaš program ArduinoISP. Spajanje je isto u Arduino IDE-u i u PlatformIO-u.
Uno postaje programator
- Spoji Uno, na kojem još ništa nije spojeno na pinove 10 do 13, na računalo. U Arduino IDE-u otvori File → Examples → 11.ArduinoISP → ArduinoISP, odaberi Arduino Uno i učitaj program kao svaki drugi. Ako radiš samo u PlatformIO-u, isti program nađeš u Arduinovu repozitoriju arduino-examples na GitHubu. Učitaj ga u projekt za Uno.
- Odspoji USB i spoji ATtiny85 kao na slici i u tablici. Pazi da je urez čipa gore.
- Između RESET-a i GND-a Una utakni elektrolitski kondenzator od 10 µF, dužom nožicom (+) na RESET. Kad računalo otvori vezu s Unom, Uno se inače resetira i ne pokreće ArduinoISP na vrijeme. Kondenzator to sprječava. Stavi ga tek nakon što si učitao ArduinoISP, jer s njim se ni Unu ne može učitati novi program.
- Na nožicu 3 (pin 4) spoji LED-icu preko otpornika od 470 Ω, za prvi program.
| Uno | ATtiny85 |
|---|---|
| 13 | nožica 7 (SCK) |
| 12 | nožica 6 (MISO) |
| 11 | nožica 5 (MOSI) |
| 10 | nožica 1 (RESET) |
| 5V | nožica 8 (VCC) |
| GND | nožica 4 (GND) |


ArduinoISP može pokazivati što radi na tri LED-ice: na pinu 9 polako svijetli i gasi se dok čeka, na pinu 8 svijetli kad nešto ne uspije, a na pinu 7 dok učitava program. Nisu obavezne.
Cijeli programator sa sve tri LED-ice je na shemi. Svaka LED-ica ima svoj otpornik od 470 Ω prema GND-u.

U Arduino IDE-u
Arduino IDE ne zna sam za ATtiny85. Treba mu paket ATTinyCore.
- U File → Preferences, u polje Additional boards manager URLs, dodaj adresu
http://drazzy.com/package_drazzy.com_index.json. Zatim u Boards Manageru potraži ATTinyCore i instaliraj ga. - U izborniku Tools odaberi:
- Board → ATTinyCore → ATtiny25/45/85 (No bootloader)
- Chip: ATtiny85
- Clock Source: 8 MHz (internal)
- Port: port Una
- Programmer: Arduino as ISP
- Odaberi Tools → Burn Bootloader. Unatoč imenu, to ne učitava bootloader, nego samo postavlja fuse bitove za odabrani takt. To radiš jednom za svaki čip i nakon svake promjene Clock Source.
- Otvori program i učitaj ga naredbom Sketch → Upload Using Programmer (Ctrl + Shift + U), koja uvijek koristi odabrani programator.
Prvi program: LED-ica na nožici 3 polako se pali i gasi, kao da diše.
// Disanje: LED-ica na pinu 4 (nožica 3) polako se pali i gasi.
// ATtiny85, takt 8 MHz (internal); program učitava Arduino Uno (Arduino as ISP).
const int LED = 4; // PB4, nožica 3
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
for (int i = 0; i <= 255; i++) { // sve jače
analogWrite(LED, i);
delay(4);
}
for (int i = 255; i >= 0; i--) { // sve slabije
analogWrite(LED, i);
delay(4);
}
}
Ako učitavanje ne uspije i javi Device signature = 0x000000, Uno ne dopire do čipa. Provjeri žice prema tablici, je li čip okrenut urezom gore, ima li Uno kondenzator na RESET-u i je li na Unu ArduinoISP, a ne neki drugi program.
U PlatformIO-u
PlatformIO za ATtiny85 koristi isti ATTinyCore, pa programi izgledaju isto. Napravi projekt za ploču Generic ATtiny85 i u platformio.ini upiši:
; ATtiny85 koji programira Arduino Uno s programom ArduinoISP
[env:attiny85]
platform = atmelavr
board = attiny85
framework = arduino
board_build.f_cpu = 8000000L ; takt 8 MHz iz unutarnjeg oscilatora
; Uno kao programator (Arduino as ISP)
upload_protocol = stk500v1
upload_speed = 19200
upload_port = COM3 ; port Una (na Linuxu npr. /dev/ttyACM0)
upload_flags =
-P$UPLOAD_PORT
-b$UPLOAD_SPEED
; fuse bitovi za 8 MHz iz unutarnjeg oscilatora; postavlja ih "pio run -t fuses"
board_fuses.lfuse = 0xE2
board_fuses.hfuse = 0xDF
board_fuses.efuse = 0xFF
board_fuses.lock_bits = 0xFF ; čip nije zaključan
upload_protocol = stk500v1iupload_speed = 19200kažu da je programator Uno s ArduinoISP-om, koji razgovara brzinom od 19 200 bauda.upload_portje port Una. Za ATtiny85 PlatformIO ga ne traži sam, pa ga upiši: na Windowsima je to COM i broj (vidiš ga i u Arduino IDE-u, u Tools → Port), a na Linuxu najčešće/dev/ttyACM0.upload_flagsšalje port i brzinu programu koji učitava program u čip (avrdude).board_fusessu fuse bitovi: 0xE2 je takt od 8 MHz iz unutarnjeg oscilatora, a 0xDF i 0xFF su tvornička vrijednost ostalih postavki, s RESET-om koji ostaje RESET.
Program je u src/main.cpp i počinje s #include <Arduino.h>, a ostatak je isti kao gore. Onda:
- Jednom za svaki čip, i nakon svake promjene takta, postavi fuse bitove. U terminalu PlatformIO-a upiši
pio run -t fuses. - Program učitaj kao svaki drugi: strelicom Upload u donjoj traci ili naredbom
pio run -t upload. PlatformIO tada sam koristi Uno kao programator.
Za takt od 1 MHz promijeni board_build.f_cpu u 1000000L i board_fuses.lfuse u 0x62, pa ponovno postavi fuse bitove.
Digispark: ATtiny85 s USB-om
Digispark je mala tiskana pločica s čipom ATtiny85, USB priključkom, regulatorom napona od 5 V i LED-icom. Na čipu je bootloader Micronucleus, mali program koji prima novi program preko USB-a, pa Uno kao programator nije potreban. Izvorni Digispark napravila je tvrtka Digistump, a danas se najčešće prodaju njegove kopije.
- Za program ostaje 6586 bajtova, jer ostatak memorije zauzima bootloader.
- Pinovi se zovu P0 do P5 i isti su kao PB0 do PB5. P3 i P4 spojeni su na USB. Dok je Digispark spojen na računalo, ne koristi ih, a imaj na umu da na njima ima dodatnih dijelova za USB.
- LED-ica je na P1 (na nekim kopijama na P0).
- Kad ga utakneš, bootloader nekoliko sekundi čeka novi program, a tek onda pokreće tvoj.
U Arduino IDE-u, uz ATTinyCore, odaberi Board → ATTinyCore → ATtiny85 (Micronucleus / DigiSpark) i klikni Upload. Kad IDE napiše Please plug in the device, u roku od minute utakni Digispark. Na Windowsima prvo treba instalirati upravljački program, koji ATTinyCore donosi sa sobom.
Krijesnica na gumbastoj bateriji
Uno troši struju i kad ništa ne radi, jer na njemu stalno rade USB čip, regulator i LED-ica ON. Sam ATtiny85 na 1 MHz i 3 V troši oko 0,6 mA. Kad spava (power-down), troši samo oko 0,2 µA, a oko 4 µA ako ga budi watchdog, mali brojač vremena koji radi i dok čip spava. Zato s njim možeš napraviti uređaj koji mjesecima radi na jednoj gumbastoj bateriji.
Krijesnica: LED-ica bljesne svake četiri sekunde, a između bljeskova čip spava. Spoji je kao gore: LED-ica s otpornikom od 470 Ω na nožici 3. Program učitaj Unom uz takt 1 MHz (internal) (ne zaboravi Burn Bootloader). Zatim odspoji Uno i na nožice 8 (+) i 4 (−) spoji držač baterije CR2032.
// Krijesnica: LED-ica na pinu 4 bljesne svake 4 sekunde, a između bljeskova ATtiny85 spava.
// ATtiny85, takt 1 MHz (internal), napajanje iz gumbaste baterije CR2032.
#include <avr/sleep.h>
const int LED = 4; // PB4, nožica 3
ISR(WDT_vect) {
// watchdog je probudio čip; tu ne treba ništa raditi
}
void setup() {
pinMode(LED, OUTPUT);
ADCSRA &= ~_BV(ADEN); // isključi analogne ulaze, i u snu troše struju
WDTCR = _BV(WDCE) | _BV(WDE); // dopusti promjenu postavki watchdoga
WDTCR = _BV(WDIE) | _BV(WDP3); // svake 4 s prekid koji budi čip (bez reseta)
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // najdublji san
}
void loop() {
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
sleep_mode(); // spavaj dok te watchdog ne probudi
}
U setup() program isključi analogno-digitalni pretvornik, koji bi i u snu trošio struju, i namjesti watchdog da svake četiri sekunde napravi prekid (interrupt). Prekid probudi čip, on izvrši prazan ISR(WDT_vect) i nastavi iza sleep_mode(), na kraju loop(). Onda loop() krene ispočetka: bljesak i ponovno spavanje.

Graf je izračunat iz struja iz datasheeta: bljesak od 50 ms s LED-icom od 2,6 mA, baterija od 210 mAh. Da program između bljeskova čeka s delay() umjesto da spava, baterija bi trajala oko 14 dana, bez obzira na to koliko je bljeskova (crveno). Uz spavanje i bljesak svake četiri sekunde traje oko 200 dana, a uz bljesak svakih osam sekundi oko 370 dana (zeleno). Stvarna baterija dat će nešto manje, jer na hladnom i pri jakim kratkim strujama gubi kapacitet.
Baterija i Uno nikad zajedno
Ne spajaj bateriju CR2032 dok je na čip spojen Uno. Iz Unovih 5 V struja bi potekla u bateriju, a litijske gumbaste baterije ne smiju se puniti: mogu se napuhati i procuriti. Prvo učitaj program, odspoji Uno, pa tek onda stavi bateriju. Gumbaste baterije drži daleko od male djece.
Ostali mali mikrokontroleri
ATtiny85 nije jedini mali mikrokontroler. U tablici su neki drugi koji se mogu programirati u Arduino IDE-u, uz ATmega328P za usporedbu:
| Čip | Nožice | Pinovi | Flash | RAM | UART | Programira se | Paket za Arduino IDE |
|---|---|---|---|---|---|---|---|
| ATtiny13A | 8 | 6 | 1 KB | 64 B | ne | ISP | MicroCore |
| ATtiny85 | 8 | 6 | 8 KB | 512 B | ne | ISP | ATTinyCore |
| ATtiny84A | 14 | 12 | 8 KB | 512 B | ne | ISP | ATTinyCore |
| ATtiny2313A | 20 | 18 | 2 KB | 128 B | da | ISP | ATTinyCore |
| ATtiny412 | 8 | 6 | 4 KB | 256 B | da | UPDI | megaTinyCore |
| ATtiny1614 | 14 | 12 | 16 KB | 2 KB | da | UPDI | megaTinyCore |
| CH32V003 | 8 do 20 | do 18 | 16 KB | 2 KB | da | SDI (WCH-LinkE) | WCH-ov paket |
| ATmega328P | 28 | 23 | 32 KB | 2 KB | da | ISP | isti kao za Uno |
- ATtiny13A ima isti raspored nožica kao ATtiny85, ali samo 1 KB memorije za program i 64 bajta RAM-a. U to stanu samo vrlo mali programi, kao što je treptanje ili jednostavan mjerač vremena.
- ATtiny84A je iz iste obitelji kao ATtiny85, ali ima 14 nožica, 12 pinova i 8 analognih ulaza. Odaberi ga kad ATtinyju85 ponestane pinova.
- ATtiny2313A (i ATtiny4313, s dvostruko više memorije) ima 20 nožica i pravi sklop UART, pa serijska veza radi pouzdano. Analognih ulaza nema.
- Noviji ATtinyji (serije 0, 1 i 2), kao što su ATtiny412 i ATtiny1614, imaju sklopove UART, I2C i SPI i unutarnji oscilator od 16 ili 20 MHz, dovoljno točan za serijsku vezu. Programiraju se preko jednog pina (UPDI), a programator je obični USB-serijski pretvarač s jednom diodom. Dolaze samo u kućištima za lemljenje (SOIC), pa ih za breadboard treba zalemiti na malu pločicu s muškim konektorom.
- CH32V003 kineske tvrtke WCH ima 32-bitnu jezgru RISC-V od 48 MHz, 16 KB flasha i 2 KB RAM-a, a radi s 3,3 ili 5 V. Programira se malim programatorom WCH-LinkE preko jedne žice, a za Arduino IDE ima paket tvrtke WCH.
- ATmega328P može raditi i sam na breadboardu, bez Una. Treba mu kristal od 16 MHz ili unutarnji oscilator od 8 MHz, a program je isti kao na Unu. To je dobar izbor kad ti ATtiny nije dovoljan, a cijeli Uno je previše.
Tvrtka Microchip, koja danas radi ATtinyje, radi i male mikrokontrolere PIC, ali se oni programiraju drugim alatima, a ne u Arduino IDE-u.
Koji odabrati?
- Za učenje i prvi pokus: Arduino Uno ili Nano. Kad program radi, prenesi ga na mali čip.
- Mali uređaj s nekoliko LED-ica, tipkalom ili senzorom, na bateriju: ATtiny85. Lako se utakne u breadboard, a programira ga Uno.
- Bez programatora, preko USB-a: Digispark.
- Više pinova: ATtiny84A, a kad treba i više memorije, ATmega328P sam na breadboardu.
- Serijska veza s računalom ili drugim čipom: ATtiny2313A ili noviji ATtiny, kao ATtiny412.
- Mnogo istih uređaja na tiskanoj pločici koju lemiš: noviji ATtinyji ili CH32V003.
- Wi-Fi ili Bluetooth: nijedan od ovih, nego ESP32 ili ESP8266.
Što smo naučili?
- ATtiny85 je mikrokontroler s osam nožica i šest pinova. Programira se istim naredbama kao Arduino, a uz napajanje mu ne treba gotovo ništa.
- Nožica i pin nisu isti broj: u programu pišeš broj iza slova PB.
- Programom ArduinoISP Uno postaje programator, u Arduino IDE-u (Upload Using Programmer) i u PlatformIO-u (
upload_protocol = stk500v1). Unu tada treba kondenzator od 10 µF na RESET-u. - Takt se postavlja fuse bitovima, jednom za svaki čip: Burn Bootloader ili
pio run -t fuses. - Čip koji spava troši stotinu puta manje struje, pa radi mjesecima na gumbastoj bateriji.
Mali kviz
1. LED-ica je na nožici 3 čipa ATtiny85. Koji broj pišeš u digitalWrite()?
- Nožica 3 je pin PB4, a u programu se piše broj iza slova PB:
digitalWrite(4, HIGH).
2. Na novom čipu program s delay(1000) trepće svakih osam sekundi umjesto svake sekunde. Zašto?
pio run -t fuses u PlatformIO-u.3. Zašto Unu koji programira ATtiny85 treba kondenzator od 10 µF između RESET-a i GND-a?
4. U izborniku si odabrao 16 MHz (external), a kristala nema. Što se dogodilo i kako to popraviti?
5. Krijesnica koja spava radi oko 200 dana, a ona koja čeka s delay() oko 14 dana. Odakle tolika razlika?
delay(), čip radi i troši oko 0,6 mA. Dok spava, troši oko 4 µA, više od sto puta manje. LED-ica svijetli samo 50 ms svake četiri sekunde, pa većinu struje troši ono što čip radi između bljeskova.