반응형

【 아두이노프렌즈 초소형 아두이노 ATtiny85 기초부터 응용까지 완벽 풀코스(초미니 OLED 온·습도계 제작)

 


 여러분은 아래 이미지를 보시고 똑 같은 기능이 가능한 3가지 모델 중 어떤 것을 선택하시겠어요?
( 제품 비용, 제품 크기-공간 차지 등 고려 시 )

 당연히 너무 타이니(tiny)해서 매력적인 ATtiny85을 선택해야 겠죠?  ^^
그럼, 이번 시간을 통해 가격도 타이니,  크기도 타이니해서 공간 차지도 적어 너무 매력적인 ATtiny85에 대해 기초 부터 상세하게 설명드리고, 게다가 'OLED 온·습도계'라는 멋진 응용작품까지 만드는 법에 대해 상세하게 설명드릴테니 안내에 따라 실습해보세요. 

【 ATtiny85 개요 】


'ATtiny85'는 Atmel사의 AVR 시리즈중 하나이며,  8bit, 8pin 스몰 사이즈의 Microcontroller 입니다.(Atmel 사는 후에
Microchip사에 인수됨)  
 아두이노 보드의 메인 칩인 ATmega328 MCU와 같은 계열의 마이크로 프로세서 유닛입니다. 
따라서, 아두이노 처럼 프로그래밍된 코드를 올려 입출력 포트를 제어하는 프로젝트에 이용할 수 있으며, 비록 입출력 포트수가 적고 프로그래밍 영역 메모리(플래시 메모리)가 작지만,  우노 보드 보다 몇 배나 작은 크기로 인해 초소형 저전력 아두이노 프로젝트에 매우 적합한, 장점이 많은 MCU입니다. 
다만, 이렇게 아두이노IDE 툴을 통해 아두이노 코드를 업로드하여 작동하도록 하기 위해서는 부트로더라는 영역에 부트로더가 우선 설치되어져야 합니다.  마치 PC에서 윈도우와 같은 운영체제 설치와 응용프로그래밍이 돌아가기 위해 먼저 설치되어 있는 MBR과 같은 부트레코드(부트코드)가 필요하듯 말이죠.

여기서 시리즈 모델명에 대한 풀이를 잠시 하면 아래 이미지와 같습니다. 

따라서  ATtiny85는 8핀 타입의  IC이며, 코딩으로 프로그래밍 가능한 Flash 메모리 용량이 8Kb인 MCU가 됩니다.  필요한 경우, 아래 데이터 시트(Data Sheet)를 살펴 보세요.

ATTINY85.pdf
4.53MB

 

ATtiny85에 부트로더를 직접 올리는 실습은 아래 실습 과정에 있습니다
PC 에서의 MBR영역
AVR 칩에 부트로더와 코드가 탑재되는 영역

 따라서,  이번 학습에서는 앞부분에 부트로더를 굽는(칩의 메모리 영역에 기록) 과정부터 알려드립니다.  이 과정에서 절차를 생략하거나 순서가 바뀌면 에러가 날 수 있기 때문에 최대한 상세하게 안내를 하고 있으니, 천천히 보면서 개념을 정리하고 넘어가시면 좋습니다.  

 다음으로, 이런 부트로더를 굽는 과정에서는 Atmel 사의 AVR 시리즈 칩에서 사용하던 AVR ISP라는 전용 프로그래머가 필요합니다.  이 것 또한 따로 구하려면 비용이 들고, 번거롭기도 한데요, 다행히 아두이노 우노 혹은 나노 보드를 가지고 이런 AVR ISP 프로그래머를 만들어 사용할 수 있습니다. (중반부에 회로도면과 방법 설명)   물론,  아두이노 우노(나노) 보드에 올려진 Atmega328칩에는 이런 부트로더가 이미 탑재된 상태로 출시되기 때문에,  부트로더 탑재 과정 없이 바로 아두이노 코드를 올릴 수 있게 됩니다.

AVR ISP 프로그래머

아래는 ATtiny85의 상세 핀아웃(PinOut) 입니다.
IC에는 1번핀 부터~ 8번 핀까지 물리적인 핀 번호가 있으며,  PB0~PB5 까지 6개의 디지털 입출력이 가능한 포트가 있습니다.  이중에 PB5, PB2, PB4, PB3번 포트는 아날로그 입력에 대한 처리가 가능한 포트 이며,  PB0와 PB1 포트는 PWM출력(디지털 방식의 아날로그 값 출력)이 가능한 포트 입니다.   따라서, 아두이노 코드와 회로 연결를 통해 핀 아웃에 적혀진 기능을 사용할 수 있습니다.

ATtiny85의 핀 아웃(Pin Out), '보라색 원'표시는 1번핀의 위치를 알려줌

 

 

 일반적으로 많이 사용되는 주요 기능핀만 보기 좋게 정리된 이미지가 있어 소개합니다. 
주요 기능핀으로, I2C 통신용 핀(물리적 5번 핀, 7번 핀)과, SPI통신용(물리적 5번, 6번, 7번핀)핀이 표시되어 있고, PWM(물리적 5번핀, 6번핀),  Reset핀(물리적 1번 핀),  +전원 8번 핀 , -전원(GND) 4번 핀 등이 표시 되어 있으니 참고하세요.  

ATtiny85의 주요 핀 기능 표시

[ ※ 본 게시물의 모든 이미지는 클릭하면 확대 됩니다  ]



【 학습 목차 】

 

【 실습 재료 】

1. ATtiny85 : 1개 이상  (되도록 2~3개 이상 여유 있게 준비 하세요)
2. 전해 콘덴서 : 10uF 1개 (용량은 더 작거나 조금 더 커도 크게 관계 없습니다)
3. LED :  5 개 이상
4. 저항 : 220Ω 5개 이상(100Ω~470Ω도 가능),  4.7kΩ 1개 (1kΩ~10kΩ도 가능)
5. I2C type OLED (128x64 픽셀) :  1개 이상
6. 온습도 센서 :  DHT11 또는 DHT22 1개     (또는 각 1개)
7. 아두이노 보드 : 우노 보드 1개 또는 나노 보드 1개 (또는 각 1개)
8. 브레드 보드 : 400홀 1개 또는 170홀 3개  (또는 모두)
9. 전원 :  3.6~5.5V 사이 전원으로 사용가능한 모든 종류 가능

【 실습 #2 】 아두이노 우노 보드를 이용한 AVR ISP 보드 만들기 

▶ 회로 연결도면
우노보드를 이용해서 ATtiny85용 AVR ISP 보드를 만드는 연결도면 입니다.
아래 연결도를 보고 조립해 주세요.

우노보드를 이용해서 ATtiny85용 AVR ISP 연결도면

 단, 아래 이미지를 참고해서 콘덴서의 +, - 극성을 구분해서 연결해야 합니다.
파란색 사각형에 표시된 흰색 줄무늬가 있는 쪽의 리드선(길이가 짧은)이 '-극성'핀입니다.
상대적으로 다리(리드선)이 긴 쪽이 +극성 핀입니다.

 

< 실습 #1-1> ArduinoISP 코드를 아두이노 우노 보드에 업로드하기
먼저, 아두이노 IDE 프로그램을 실행시키고 아래 이미지 처럼 예제 파일에 있는  ArduinoISP 예제파일을 열어서 아두이노 우노 보드에 빌드&업로드 시켜주세요.   
: 아두이노 IDE 메뉴 》 예제 》 11. ArduinoISP 》 ArduinoiSP

이미지 클릭하여 확대해서 보세요

- 이때, 업로드시 에러가 난다면,  보드에 연결해 놓았던 콘덴서는 잠시 제거합니다.  코드가 업로드 되면 다음 단계 실습을 다시 연결해 주세요

 

- 환경설정하기 :  ATtiny85에 부트로더를 올리기거나 코드를 업로드하기 위해서는 우선적으로 ATtiny85 보드가 선택항목에 포함 되어 있어야 합니다.  아두이노 IDE 기본 설치 상태에서는 tiny85보드 항목이 보이지 않는데요,  이때,
  1.1 attiny관련 보드 정보를 담고 있는 JSON 파일에 대한 링크를 아두이노 IDE 환경설정 탭에서 추가해주세요. 

만약, 아래 이미지 처럼 기존에 esp8266과 같은 다른 보드의 URL이 존재할 경우, 아래 이미지 처럼, 창 아이콘을 눌러 팝업창이 뜨면 거기 제일 아랫줄에 붙여넣기 하여 추가해주면, 여러가지 보드를 동시에 추가해 놓을 수 있게 됩니다.   (아래 ATtiny 보드 추가용 주소를 복사하야 아두이노 환경설정에 추가해 주세요)

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

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


- 아래 이미지, 아두이노 IDE 》 툴 》 보드 : 》 보드 매니저...    에서 검색창에 'attiny'로 검색 한 후 검색된 항목을 설치해 주세요. 

- 아래 이미지, 아두이노 IDE 메뉴 》 툴 》에서 , 
  보드 :  ATtiny25/45/85 ,   프로세서 : ATtiny85 ,   Clock : "Internal 8 MHz"  로 선택하고  
  포트는 자신의 아두이노 ISP 보드가 연결된 포트 번호를 선택하세요.

 이때, 프로그래머는 : 반드시 "Arduino as ISP"로 선택하세요.  ('ArduinoISP'는 아니에요! X )

- 아래 이미지,  다음 부트로더 굽기를 누르면  AVR ISP로 동작하는 아두이노 우노를 통해 ATtiny85칩의 플래시 메모리의 부트로더 영역에 부트로더가 탑재됩니다. 

- 아래 이미지, "부트로더 굽기 완료" 표시가 뜨면 부트로더가 ATtiny85에 탑재 성공한 것이에요.

- 이제 ATtiny는 아두이노 IDE를 통해 코드를 올리고 아두이노처럼 동작할 수 있습니다. 
- 아래 이미지,  그럼 5번 핀(PB0의 0번 포트)에 연결된 LED를 Blink 기본 예제를 올려서 잘 깜빡이는지? 동작을 테스트해 볼게요.

- 잘 깜빡인다면, 딜레이 타임을 조절해서,  예를 들어 delay(400) 으로 바꾸어 다시 업로드 테스트해 보세요.  바뀐 코드 적용도 잘 될거에요.

-  와우~!!!  
여러분은 방금 멋진 작업을 하셨습니다. 
지금의 ATtiny85 칩은 아두이노 처럼 코드 올려서 동작 시킬 수 있게 된 것이죠. 
작고 간단한 일에는 덩치큰 아두이노 우노 형님이 나서지 않더라도, ATtiny85 막내가 충분히 처리할 수 있게 된 것이에요.
그럼, 정말 그런 것인지?  우노와 연결된 케이블이나 전원선을 제거하고 ,  ATtiny85칩에 직접 전원을 넣어 보면,  우노보드 없이 ATtiny 칩만으로도 동작할 수 있는지? 확인이 되겠죠. (아래 이미지)

Data Sheet를 살펴보면, tiny85칩은 기본적으로 동작전원이 '2.7v~5.5v'로 되어 있으니, 부족하거나 오버되지 않도록 주의해 주세요. 

물론 OLED 같은 경우 3.3V 전원이 요구되니 공급전압은 3.3v 이상이어야 전체적으로 동작됩니다.  
따라서 전체 구성되는 모듈들의 최소 요구전압을 확인하여 공급전압을 결정해야 합니다.

 - 응용회로로 LED를 여러개 연결하여 ATtiny85의 포트 여러개를 제어하는 연습을 해볼게요.
 - 아래 이미지, 회로 연결도와 코드를 참고하세요.  
 - 순서는 부트로더가 탑재된 tiny85칩에 LED1to5.ino 코드를 업로드  → 순차점멸회로에 코드 업로드된 tiny85칩 연결 → 적절한 외부 전원을 연결하여 동작을 확인함.

이미지를 클릭하면 확대 됩니다

< 아두이노 코드 : 1 to 5 LED 순차 점멸 코드 >

/* LED 5개 순차 점멸 하기  with Tiny85         */
/* Rasino.tistory.com   YouTube: 라즈이노 IoT */
int i=0;
void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);    
}

void loop() {
  for (i=0; i<5; i++) { 
    digitalWrite(i, HIGH);   
    delay(200);               
  }
  for (i=4; i>=0; i--) { 
    digitalWrite(i, LOW);   
    delay(200);               
  }
}

(Code download)

LED1to5.zip
0.00MB

<실제 동작 모습>

- 멋지지 않습니까? 이렇게 작은 칩하나로 커다란 아두이노를 대신할 수 있으니 말이죠~!
  물론, 입·출력포트 수가 적고, 메모리 용량이 작아, 아두이노보드 처럼 사용하기에는 제약이 있지만,
  이처럼 작고 단순한 제어나 제품사이즈를 소형화 시켜야하는 프로젝트에는 정말 활용하기 좋습니다
- 여기서 LED에 연결된 저항의 역할은 과도한 전류의 흐름을 조절하여 LED를 보호하는 역할을 해요
- ※ 저항을 먼저 거친 후 LED가 연결되어도 되고, LED를 먼저 거치고서 저항이 연결되어도 됩니다

- 그럼, 이번에는 스위치를 넣어 입력에 따른 출력을 제어할 수 있는지? 간단히 확인해 볼게요
 이 개념이 중요한 이유는? 스위치 대신 다양한 센서로 제어가 가능하다는 뜻이며, LED 대신 OLED와 같은 디스플레이나 모터 같은 것을 제어할 수 있다는 뜻이기 때문입니다. 
- 연결위치는 LED순차 점멸회로에서 5번 LED가 연결된 선을 빼고 스위치를 달아주겠습니다.
  스위치를 누르는 순간 GND와 연결 되어 있어서 LOW ( 0 ) 값이 입력되며, 스위치를 누르지 않았을 때는 확실한 High신호가 입력되도록 하기 위해 4.7KΩ의 저항을 달았어요.  이런 용도의 저항을 풀업(Pull UP)저항이라 하며 보통 1㏀~10㏀ 사이 값을 주로 사용하게 됩니다. 

ATtiny85 LED 순차점등 스위치 제어 연결도

- 코드내용은 스위치를 누르면 LED의 순차 점멸 속도를 더 빠르게 하도록 하였는데요,
 위에서의 과정과 똑같이 UNO로 만든 AVR ISP를 통해 아래 코드를 업로드하세요.

/* 스위치로 LED 순차 점멸 속도 바꾸기 with Tiny85 */
/* Rasino.tistory.com   YouTube: 라즈이노 IoT  */
int i=0; 
int SW;
void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, INPUT);    
}
void loop() {
  SW=digitalRead(4);
  if (SW==LOW) {         
    for (i=0; i<4; i++) { 
      digitalWrite(i, HIGH);   
      delay(20);               
    }
    for (i=3; i>=0; i--) { 
      digitalWrite(i, LOW);   
      delay(20);               
    }
  }
  if (SW==HIGH) {         
    for (i=0; i<4; i++) { 
      digitalWrite(i, HIGH);   
      delay(80);               
    }
    for (i=3; i>=0; i--) { 
      digitalWrite(i, LOW);   
      delay(80);               
    }
  }    
}

(Code download)

ATtinyControlLEDSW.zip
0.00MB

<실제 동작 모습>

- 스위치를 누르지 않은 상태에서는 20ms(0.02)초 간격으로 LED가 On/Off 되며,  만약 
  스위치를 누르게 되면 80ms(0.08초) 간격으로 LED가 On/Off 되게 됩니다

- 이번에는 Uno보드 보다 작은 Nano 보드를 이용해서 AVR ISP 전용보드를 만들어 볼게요.
  작업 방법은 Uno 보드에서와 동일합니다.  아래 회로 연결도를 보고 조립해 주세요.

- 만약, ArduinoISP 코드를 업로드 할 때, 아래처럼, avrdude : stk500_getsysc ( ) attempt 10 of 10 : not in sys...  와 같은 에러가 발생한다면,   AVR ISP 회로를 만들면서 Reset 포트에 연결한 콘덴서를 잠시 제거한 후에 업로드 해보세요.   업로드가 완료 된 후에 다시 콘덴서를 꽂아주면 됩니다.

 - 업로드가 완료되면, LED순차회로 코드를 업로드 시켜 동작을 확인해 보세요.

- 아래이미지, 리튬폴리머 배터리를 연결할 때 사용하는 커넥터는 핀이 매우작아 브레드보드에 꽂기가 어려운데요,  아래 이미지에서와 같은 부품을 구해서 납땜으로 핀을 확장해 주면, 브레드보드에도 꽂을 수 있게 됩니다.


여기서 중요한 건,  리튬 이온, 리튬 폴리머와 같은 전지를 사용할 때는, 반드시 합선(전기적으로 +양극과 -음극 단자 연결된 상태)에 주의해야 합니다.  이는 겉으로 보기에 직접적으로 연결되어 보이지 않더라도, 회로적으로 낮은 저항 값으로 인해 합선과 같은 결과가 나타날 수 있으니,  전기전자적 기본지식이 부족하다면, 임의적인 확장이나 선 연결을 자제해 주시기 바랍니다.  그래야 합선으로 인한 소폭발 및 화재를 예방 할 수 있습니다. 

 

- 그럼 이제 tiny85의 기본 사용법을 충분히 익히셨다면, 이제 활용도 높은 응용회로를 만들어 볼게요
- I2C 통신을 이용해 온·습도 센서의 데이터를 받아 OLED에 표시해주는 미니'온습도계'입니다

[ 선수 학습 자료 ]  OLED 온·습도계를 만들기 과정에 참고하면 도움될 사전학습자료 입니다. 

1. 【 아두이노 센서#17】 DHT11 온·습도 센서 다루기 #1

2. 【 아두이노 센서#18】 DHT11 온·습도 센서 다루기 #2

3. 【 아두이노 센서#19】 DHT22 온·습도 센서 다루기 with LCD#3

4. 【 아두이노모듈#29】 OLED 처음 사용 설명서 #1 (SPI, I2C 주요 5종 사용법 안내)

 

 5-1.  DHT11센서 또는 DHT22 센서를 를 활용한 OLED 초소형 온·습도계 회로 연결도를 참고하여 회로를 완성하세요.

DHT11센서와 OLED를 활용한 온습도계 연결도
DHT11센서와 OLED를 활용한 온습도계 연결도

  ※ OLED의 경우에는 아래 이미지처럼, GND와 VCC 단자의 순서가 다른경우가 있으니 잘 보면서 연결하세요.   또한 많은 종류의 OLED는 3.3V 전원과 5V 전원까지 모두 지원하지만, 특정 제조사 모델의 경우 5V로만 동작하는 경우가 있으니 OLED를 구입한 곳(또는 제조사)의 스펙을 확인해 보세요.



5-2.  아래 소스 코드를 ATtiny85에 업로드하세요.
 : 업로드 시에는 위에서 만든 Uno AVR ISP를 이용하거나,  Nano로 만든 AVR ISP 프로그래머를 이용해서 업로드하면 되며,  새로운 칩을 사용할 경우, 부트로더 탑재 단계부터 시작해 주세요,   혹은 기존 부트로더가 올려진 칩에서는 이 단계를 건너뛰고 아두이노 코드를 바로 전송시키면 됩니다. 

 [ 소스 코드 - DHT11 센서용 ]

ATtiny_OLED_DHT11_TinyOzOled.zip
0.00MB

 [ 소스 코드 - DHT22 센서용 ]

ATtiny_OLED_DHT22_TinyOzOled.zip
0.00MB


[ 필수 라이브러리 ] 
- 컴파일 과정에서의 대부분의 에러는 맞지 않은 라이브러리 사용으로 인한 에러이니 반드시 아래 내용을 읽어보세요.

 - 라이브러리는 이름이 같아도 파일의 용량이 다르면 안에 내용이 다르다는 것을 뜻합니다.
서로 다른 사람이 라이브러리를 수정, 추가 또는 만들었기 때문에 제가 코드 작성에 사용한 라이브러리를 그대로 사용하셔야 컴파일 에러가 나지 않습니다.  반드시 아래 첨부해드리는 라이브러리를 설치해서 실행해보세요. 
 - 라이브러리 설치할 때, 가장 깔끔하고 좋은 방법은 아래 이미지 처럼, 아두이노 IDE의 메뉴에서, 
   "스케치 》 라이브러리 포함하기 》 .ZIP 라이브러리 추가...  "  메뉴를 통한 설치입니다. 
   그래서 아래 첨부해드리는 라이브러리를 다운받아 압축을 풀지 않은 채로 .ZIP 라이브러리 추가... 메뉴를 통해 다운받은 라이브러리 압축파일을 선택해서 추가해 주세요.


 1-1.  온습도 센세와 관련된 라이브러리 입니다.  

DHT.zip
0.00MB

 1-2.  OLED 라이브러리 입니다. (플래시 메모리 용량이 적은 ATtiny85에, 사용할 수 있도록 축소시킨 라이브러리 이며, 기본 작은 사이즈의 영문 알파벳 및 숫자 및 아스키 기호를 표시하고, 큰 사이즈의 숫자를 나타낼 수 있게 디자인 되었습니다.   큰 알파벳 X ,  한글 X ,    기타 화면 클리어 ,  출력과 관련된 명령어를 사용할 수 있습니다)

TinyOzOled-master.zip
0.01MB

  1-3.   I2C 통신을 위한 라이브러리 입니다. (아래 압축파일 내부에 'TinyWireM.h' 파일 :  DHT 센서와 그리고 OLED와 같은 I2C 통신을 하는 장치와 Tiny칩과의 I2C 통신을 하는데 필요한 라이브러리 입니다)

ssd1306_minimal.zip
0.02MB

 


【 동작 확인 】
 DHT11 센서와 DHT22센서 회로에 코드를 올리고 전원을 연결하여 동작확인을 해보세요.

DHT11 온습도 센서를 이용한 ATtiny85 회로
DHT22 온습도 센서를 이용한 ATtiny85 회로

DHT22 센서를 이용하면, 데이터 값이 소숫점 1자리까지 DHT11센서보다 정밀하게 표시 됩니다. 

끝으로,  아래 이미지에 보이는 것 처럼, 용도와 목적에 맞게 다양한 전원을 활용할 수 있습니다. 
- 3.7V 리튬폴리머 배터리,  - 3.7v 리튬이온 배터리,  4.5V AA건전지(1.5V AA x 3개 직렬 소켓 활용) , 
  3.0V CR2032 무수은전지(리튬)  ,  여기서 DHT센서와 OLED모듈의 구동전압이 최하 3.3v 이상이 되어하 합니다.  하지만, 3V로 구동되는 회로 제작시 참고될 수 있도록 연결해 본 것입니다.   아래 다양한 전원사용은 영상을 참고하면 명확하게 확인 가능합니다.

 

[ 에러 체크리스트 ]

[코드 컴파일 과정과 하드웨어 조립과정에서 예상할 수 있는 에러에 대한 체크 리스트]

 

 

【  전체 과정 영상으로 학습하기!  】

 

 

[ 만약,  ATtiny84를 활용하신다면,  아래 링크를 참고해 보세요.  매우 정리가 잘 되어 있습니다 ]
https://blog.naver.com/jehongjeon/222509007422

 

ATtiny84 / 85 OLED 구동 (PORT_USI was not declared in this scope 해결)

안녕하세요 jehongjeon 입니다 어느새 방학이 끝나고 다시 학기가 시작했네요 이번 학기는 작품 만들기 &am...

blog.naver.com

 

반응형