반응형

http://deneb21.tistory.com/465 글에서 ATtiny85를 이용해서 자동으로 금붕어의 사료를 줄 수 있는 장치를 만들어 보았다. 이번에는 아두이노 버전으로 만들어 보았다. 아두이노는 프로 미니 5V 16Mhz 제품을 이용하였다. 아두이노 버전이라고 특별히 다른 것은 없다. 핀의 연결이 다르고 소스 상에서 SoftwareServo 라이브러리를 이용했다면 이를 아두이노의 기본 라이브러리인 Servo 라이브러리를 이용한 것이 다르다. 그 이외에 약간의 변경사항이 있다. 

동작은 12시간(조절가능)마다 사료를 주게 되어 있으며 1분 마다 작동확인을 위한 LED가 깜빡이게 하였고 사료를 주기 전에 피에조 부저가 3번 Beep 음을 내도록 만들었다.

거의 대부분의 부분은 ATtiny 버전과 다름이 없으니 이 글에서는 달라진 연결과 소스에 대해서만 다루겠다. 다른 부분은 ATtiny 버전의 글을 참고하면 된다.


■ 연결

Fish_Feeder.fzz



■ 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <Servo.h> 
 
Servo myservo;  //create servo object to control a servo 
 
int pos = 0;    //variable to store the servo position 
//int term = 960; // 16hours
//int term = 1440; // 24hours
int term = 720//Feeding term
int servo = 9;  //Servo Pin
int led = 12;  //LED Pin
int speaker = 11//piezo speaker Pin
 
void setup(){
  Serial.begin(9600);
  Serial.println("Arduino auto Fish Feeder");
  Serial.println("http://deneb21.tistory.com");
  pinMode(led, OUTPUT);
  pinMode(speaker, OUTPUT);
}
 
void loop(){
    for(int i=1;i<=term;i++)
    {
      delay(59500);  // 59 sec
      digitalWrite(led,HIGH);  //working LED
      delay(500);  // 1 sec , 59+1 = 1 minute
      digitalWrite(led,LOW);
    }
    Serial.println("Feeding Fish Now");
    feedFish();
}
 
// FEED THE FISH...
void feedFish()
{
  myservo.attach(servo);  // attaches the servo on pin9 to the servo object 
  myservo.write(0);
  delay(15);
  for(int i=0;i<3;i++)  //feeding alarm
  {
    tone(speaker,4000,1000);
    delay(2000);
  }
  
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  }
  myservo.detach();
}
cs

아두이노 프로 미니는 자체 시리얼 통신칩이 없으므로 FTDI 모듈을 통해서 소스를 업로드 해야 한다. 방법은 다음의 URL 에서 확인이 가능하다. http://deneb21.tistory.com/393


반응형
반응형

2016 크리스마스가 얼마 남지 않았다. 이 즈음 집안에 크리스마스 트리를 장식하거나 각종 크리스마스 장식들을 하곤 한다. 그래서 나도 하나 만들고 싶어서 검색을 해봤다. 그 중에 마음에 드는 것이 있었다. Maker 사이트인 코코아팹에서 공개했던 ATtiny85를 이용한 크리스마스 트리 만들기이다. (http://kocoafab.cc/make/view/309)그걸 그대로 따라해 보았다. 


ATtiny85는 위의 그림과 같이 PB0 ~ PB5 까지 6개의 GPIO 핀이 있다. 그래서 상식적으로는 6개 이상의 LED는 연결하는게 불가능하다고 생각할 수도 있겠다. 하지만 1995년 찰리 알렌이라는 사람이 고안한 찰리플렉싱 (Charlieplexing) 이라는 기술을 적용하므로써 적은 IO핀으로도 많은 수의 LED의 제어가 가능하다. 제어가능한 LED의 갯수는 다음의 수식으로 구할 수 있다. 


※ 찰리플렉싱으로 제어 가능한 LED의 개수 구하기

n : GPIO 핀의 개수

LED개수 = n*(n-1)


즉, 오늘 ATtiny에서는 4개의 핀을 사용할 것이므로 12개의 LED를 제어할 수 있다. 아두이노 우노에 있는 14개의 핀으로는 무려 182개의 LED를 제어할 수 있는 것이다. 간단한 원리는 PIN을 INPUT 모드로 변환할 때 임피던스가 커지게 되고 마치 선이 연결되지 않은 효과를 가져온다. 이런 현상을 이용해서  INPUT/LOW, OUTPUT/LOW , OUTPUT/HIGH 의 3가지 상태를 가지고 각각의 LED를 제어할 수 있는 것이다. 자세한 내용은 검색해보면 많이 나온다. 어떻게 이런 아이디어를 생각을 했을까? 찰리라는 사람은 아이큐가 매우 높은 사람임에 틀림이 없다. ^^


트리만들기는 위에서도 말했지만 코코아팹 (http://kocoafab.cc/make/view/309) 의 내용을 그대로 따라 했다. 그래서 회로도나 코드도 링크의 것을 이용하면 된다. 다만 코코아팹의 글 내용 중에 프릿징 브레드보드 회로도가 나오는데 PB5 에 파란색 선을 연결한 것으로 나오지만 그대로 연결하고 소스를 업로드하면 LED가 켜지지 않는다. PB5 에 연결하지 말고 바로 아래의 PB3에 연결하면 제대로 작동한다. 검토가 제대로 안된 듯 하다. 그래서 그 회로도만 수정해서 여기에 올린다.


수정한 회로도 (원본 : http://kocoafab.cc/make/view/309)



이번에 사용할 LED들과 ATtiny85, 저항(220옴), 브레드보드 이외에도 LED 들을 연결할 전선이 필요하다.


회로도대로 납땜으로 연결한 모습이다. 헷갈리지 않게 극성을 잘 보고 연결해야 하고 전선의 길이를 잘 조절해서 연결해야 한다. 


전원으로는 AA건전지 4개가 들어간 6V 배터리팩을 이용하였다. 스위치가 달려서 켜고 끄기가 편하다.


전원을 ON 해 보았다. 꽤 이쁜 LED 반짝이가 만들어졌다.


녹색 하드보드지를 잘라서 트리모양을 만들었는데... 트리 맞나? 암튼 트리이다. 저기에 군데군데 구멍을 뚫고 LED를 하나씩 꼽을 것이다.


구멍을 뚫고 LED들을 모두 꼽은 다음 테스트


마지막으로 트리 맨위에 달 별모양의 LED를 만들어 주었다. 같은 극성끼리 LED다리를 납땜하고 220옴 저항을 중간에 연결하고 PB4 와 GND에 연결하였다. 딱 보기에 만들기 어려워 보이는데 의외로 별거 아니었다.


완성된 모습이다. 안쓰는 화분에 트리를 꼽고 탈지면으로 눈장식을 해 보았다. 그런데 눈이 너무 많이 온 것 같다.


뒷면의 모습이다. 지저분...


징글벨을 배경음으로 깔고 완성 후 찍어 보았다. 어설프지만 직접 만들었다는데에 의의가 있을 것이다. 그리고 방안에 불끄고 켜두면 꽤 이쁘다. 쓸만하다. 아두이노로도 만들 수 있지만 작은 MCU 인 ATtiny를 이용했다는 것도 의미가 있을 것이다. 한가지 아쉬운 점은 맨 위의 별을 만든 LED의 다리가 너무 길어서 별로 별 같지가 않은 것이다. 다리를 좀 더 짧게 자르는 것이 나을 것 같다.


그냥 의례적으로 말이 아니라 정말로 다사다난했던 한 해가 가고 있다. 가족과 함께하는 따뜻한 연말연시가 되었으면 좋겠다. Merry Christmas & Happy New Year.

반응형
반응형

인터넷을 돌아 다니다 보니 ATtiny 칩을 절전모드(Sleep Mode - Power Down Mode) 로 설정해서 3V 리튬 배터리 하나로도 수 백일을 작동하게 할 수 있다는 글을 보았다. 집안에서 AC 어댑터를 사용해서 전원을 공급한다면 별 문제가 안되겠지만 휴대기기 같이 배터리로 작동하는 장치를 만들 경우 이는 중요한 문제가 될 수도 있을 것이다. 그래서 인터넷에서 찾은 글들을 토대로 정말 전력소모가 줄어드는지 실험해 보기로 했다. 사실 MCU에 대해서 너무 깊이 들어가면 전공자도 아니고 나는 잘 모른다. 아직 계속 공부 중 이지만 이번 실험을 하면서 어려운 용어가 많이 튀어 나왔다. 인터럽트, 워치독, 레지스터... 등등 아직도 희미하게만 알고 있지 하드웨어 깊숙히 들어가면 명확히 설명하기 어려운 단어들이다. 아무튼 짬짬히 공부 중이니 언젠가는 빠삭하게 알 수 있는 날이 올 것이다. 고로 오늘의 실험은 자세한 분석용 보다는 정보의 스크랩에 의의를 두기로 하고 나중에 ATtiny 를 사용할 때 활용할 수 있도록 하는 것을 목표로 하였다.




1. LED Blink 시의 소비전류

그냥 일반적인 LED Blink 예제를 실행했을때의 소비전류이다. 소비전류의 측정은 테스터기를 전류측정(20m)에 두고 테스터기의 + 는 전원 + 에 연결하였고 테스터기 - 는 ATtiny VCC 에 연결하고 측정 하였다.


1
2
3
4
5
6
7
8
9
10
11
12
int led = 0//Attiny PB0
 
void setup() {                
  pinMode(led, OUTPUT);     
}
 
void loop() {
  digitalWrite(led, HIGH);
  delay(4000);
  digitalWrite(led, LOW);
  delay(4000);
}
cs


 

LED 가 ON 되었을 경우 12.1mA 정도의 전류를 소모했고 꺼질 시 3.5mA 정도를 소모했다.



2. ADC Off 만 했을때 소비전류

이건 Power Down 모드가 아니라 그냥 일반모드에서 ADC (Analog to Digital Converter) 만 꺼도 소비전류가 조금은 줄어든다고 하여 실험해 보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//*** Utility macros ***//
#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off)
// #define adc_enable()  (ADCSRA |=  (1<<ADEN)) // re-enable ADC
 
int led = 0//Attiny PB0
 
void setup() {                
  pinMode(led, OUTPUT);
  adc_disable(); // ADC uses ~320uA
}
 
void loop() {
  digitalWrite(led, HIGH);
  delay(4000);
  digitalWrite(led, LOW);
  delay(4000);
}
 
cs


 

프로그램의 주석에도 있지만 정말 0.32mA 정도가 줄어 들었다.



3. Sleep Mode 설정 했을 때 소비전류

LED 가 4초간 켜졌다가 꺼지면 Sleep Mode(Power Down)로 들어가고 다시 4초 후에 켜지는 것을 반복한다. Sleep Mode 로 들어가면 다시 깨워줄 이벤트가 필요한데 외부의 스위치나 핀 체인지 동작을 통해서 인터럽트를 발생시켜 깨울 수도 있다. 하지만 위의 경우는 자신이 알아서 깨어났다 잠을 잤다가 해야 하기 때문에 Watch Dog Timer 라는 것을 이용해서 깨우게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <avr/sleep.h>
#include <avr/wdt.h>
 
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
 
volatile boolean f_wdt = 1;
 
int pinLed = 0;
 
 
void setup() 
  {
    pinMode(pinLed, OUTPUT);
    setup_watchdog(9);// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
                      // 6=1sec, 7=2 sec, 8=4 sec, 9= 8sec
  }
 
//****************************************************************
void loop()
  {
    if (f_wdt == 1)  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    {
      f_wdt = 0;     // reset flag
      
      digitalWrite(pinLed, HIGH);
      delay(4000);
      digitalWrite(pinLed, LOW);
      system_sleep();
    }
  }
 
//****************************************************************  
// set system into the sleep state 
// system wakes up when wtchdog is timed out
  void system_sleep()
  {
    cbi(ADCSRA, ADEN);                    // switch Analog to Digitalconverter OFF
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // sleep mode is set here
    sleep_enable();
    sleep_mode();                         // System sleeps here
    sleep_disable();                      // System continues execution here when watchdog timed out 
    sbi(ADCSRA, ADEN);                    // switch Analog to Digitalconverter ON
  }
 
  //****************************************************************
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
  void setup_watchdog(int ii)
  {
    byte bb;
    int ww;
    if (ii > 9 ) ii = 9;
    bb = ii & 7;
    if (ii > 7) bb |= (1 << 5);
    bb |= (1 << WDCE);
    ww = bb;
    MCUSR &= ~(1 << WDRF);
    WDTCR |= (1 << WDCE) | (1 << WDE);
    WDTCR = bb;
    WDTCR |= _BV(WDIE);
  }
  //****************************************************************
  // Watchdog Interrupt Service / is executed when  watchdog timed out
  ISR(WDT_vect)
  {
    f_wdt = 1;  // set global flag
  }
  
cs


 

LED가 켜졌을 때는 일반적인 모드와 다를게 없는 소비전류이다. 하지만 LED 가 꺼지고 Sleep Mode 로 집입했을 때 소비전류는 0.01 또는 그 이하가 측정이 되었다.


Sleep Mode를 잘 이용하면 배터리가 오래가는 휴대장치를 만들 수 있을 것으로 생각된다.


■ ATtiny 관련 참고

※ ATtiny 프로그래밍 환경 참고 : http://deneb21.tistory.com/455, http://deneb21.tistory.com/462

※ ATtiny 서보모터 제어 & 라이브러리 참고 : http://deneb21.tistory.com/463


반응형
반응형

제목이 좀 거창하지만 심플하게 ATtiny85 MCU 칩과 서보모터를 이용해서 지금 키우고 있는 금붕어의 사료를 자동으로 줄 수 있도록 장치를 만들어 보았다. 당분간은 그럴 일이 없지만 몇 일 동안 집을 비우게 되면 이 장치가 작동해서 금붕어 들의 밥을 챙겨 줄 수 있을 것이다. 금붕어는 현재 4마리를 키우고 있으며 하루에 두 번 12시간 간격으로 12알 정도의 사료를 주고 있다. 이를 자동화 하는 것이 목표이다. 


하지만 정확히 12알을 주는 것은 아래의 방법으로는 불가능하고 12알씩 따로 컨테이너에 담아두고 회전하면서 구멍으로 떨어뜨리는 장치를 만들어야 하는데 좀 복잡해진다. 뭐 금붕어가 10알 떨어진다고 불평하진 않을테니... 아무튼 그래서 이런 저런 생각 끝에 복잡하게 하지 않고 유튜브 동영상을 참고하여 비슷하게 만들어 보았다.


예전의 글에서 말했듯이 이런 간단한 장치에 아두이노를 사용하는 것은 어떻게 보면 낭비(?)일 것이다. 그런 의미에서 ATtiny 라는 싸고 저렴한 칩 하나를 이용해서 기능을 구현한다는 것이 의미가 있다고 생각한다.


사료통으로 집안에 굴러다니는 조그만 플라스틱 약병을 이용하였다. 서보모터와 붙이기 위해 약병 뚜껑의 꼭지 부분을 잘랐다.


글루건으로 서보모터 브라켓하고 약병 뚜껑을 접착해 주었다.


그리고 약통에 사료가 나올 수 있게 구멍을 뚫어주고 약통뚜껑과 접착된 브라켓을 서보모터에 끼워주면 된다. 이러면 사료주는 장치는 다 만든거나 다름이 없다. 엄청 심플하다.


그리고 이제 ATtiny85 칩에 프로그래밍을 하면 된다. 예전의 글에서도 말 했듯이 아두이노의 기본 Servo 라이브러리는 ATtiny 에서 작동하지 않았다. 그래서 SoftwareServo 라는 라이브러리를 이용하였다. 그리고 코딩도 아두이노의 그것과는 미묘하게 다른 면이 있다.


회로의 연결은 아래와 같다. ATtiny 서보모터 제어 글에서 연결했던 것과 같다. 참고로 서보제어 단자는 ATtiny85의 PB1 단자에 연결하였다.




■ 소스

※ ATtiny 프로그래밍 환경 참고 : http://deneb21.tistory.com/455http://deneb21.tistory.com/462

※ ATtiny 서보모터 제어 & 라이브러리 참고 : http://deneb21.tistory.com/463

SoftwareServo.zip

※ 소스 참고 : http://natemcbean.com/bin/FISHFEEDEERMAXIMUMEFFECTIVENESS.pde


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <SoftwareServo.h> 
 
SoftwareServo myservo;  // create servo object to control a servo 
 
int pos = 0;    // variable to store the servo position 
 
long FEEDINGDELAY = 43200000// 12 hours
//long FEEDINGDELAY = 57600000; // 16 hours
//long FEEDINGDELAY = 60000;  //for Test
 
long endtime; 
long now;
 
void setup() 
  myservo.attach(1);  // attaches the servo on pin 1 to the servo object 
  myservo.write(0);
  delay(15);
  
  
  // FEED THE FISH..
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();        // must call at least once every 50ms or so to keep your servos updating
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
 
 
void loop() 
  // process times
  now = millis();
  endtime = now + FEEDINGDELAY;
  
  while(now < endtime) {
   myservo.write(0);
   delay(20000);
   now = millis();   
  }
  
  // FEED THE FISH..
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();        // must call at least once every 50ms or so to keep your servos updating
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}
cs


소스는 위와 같다. 자신이 원하는 시간을 FEEDINGDELAY 변수에 적용하면 된다. 나의 경우는 12시간 간격으로 줄 것이기 때문에 위와 같이 선택했다. 일단 칩에 전원이 공급되면 무조건 서보가 한 번 움직여서 사료를 주게 된다. 그 후 loop() 의 while 문에서 설정한 시간만큼 지연시키게 되고 시간이 경과하면 while문을 빠져나오게 되고 for 문이 작동 되면서 서보가 움직이게 되고 사료를 주게 된다. 이것이 무한반복 된다.


어느 정도 각도에서 내가 원하는 만큼의 사료가 나오는지 테스트를 많이 해 보아야 한다. 정확히는 맞지 않더라도 근사치의 사료양이 공급되어야 어항도 깨끗하게 유지되고 금붕어도 굶거나 너무 과식하는 현상이 없어질 것이다.


어항 언저리에 서보모터를 양면테이프로 붙여서 테스트 해 보았다. 적당량보다 조금 많은 양의 사료가 나왔다. 이럴 경우 약병을 약간 돌려서 구멍 있는 쪽이 조금 덜 기울어지게 하면 밑으로 떨어지는 사료가 줄어든다. 제일 알맞은 각도가 나오면 나중에도 그 각도를 맞출 수 있도록 네임펜으로 표시를 해 주었다.


최종적으로 미니 브레드보드에 회로를 구성하고 AA건전지 4개를 이용해서 6V 전원을 공급해 주었다. ATtiny 데이터시트에 보면 5.5V 까지가 권장 공급전압인데 6V 를 인가해 주어도 이상 없이 동작한다.


이제 잘 작동하는지 관찰하면 되겠다. 

이로써 집을 비울 경우 물고기 밥주는 문제는 해결되었다고 생각한다. 단, 개선의 여지는 많이 있어 보인다.



※ 추가내용 (2016.12.17) : 몇 일을 관찰해 보니 아주 잘 작동하지만 현재 작동하고 있는지 아닌지 확인할 방법이 없어서 1분 마다 깜빡이도록 LED 를 하나 추가로 달아주었다. millis() 를 이용한 기존의 소스를 delay() 로 바꿔주고 전원을 기존의 배터리에서 안 쓰는 핸드폰 어댑터 5V, 1A 짜리로 교체해 주었다.


ATtiny_Fish_Feeder.fzz


■ 변경된 소스
- delay() 를 이용하여 12시간(720분) 간격으로 서보가 동작하여 물고기 밥을 주도록 변경하였다. 
- PB0 에 LED 하나를 추가 하여 1분 마다 깜빡이도록 수정 하였다.
- 향후 개선 아이디어 : 먹이 주는 시간에 주변이 어두울 경우 금붕어가 먹이를 잘 먹을 수 있도록 LED 가 10분 정도 수족관을 밝혀주는 것도 괜찮을 것 같다. (CDS 센서, 고휘도 LED 필요) , 먹이 주는 시간이 되면 알람이 울리게 하는 것도 괜찮을 듯 하다. 금붕어의 파블로프의 개化? (피에조 부저 필요)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <SoftwareServo.h> 
 
SoftwareServo myservo;  // create servo object to control a servo 
 
int pos = 0;    // variable to store the servo position 
int term = 720// 12hours = 43200sec = 720minutes
int led = 0;  // LED Pin (PB0)
 
void setup(){
  pinMode(led, OUTPUT);
  myservo.attach(1);  // attaches the servo on PB1 to the servo object 
  myservo.write(0);
  delay(15);
  feedFish();
}
 
void loop(){
    for(unsigned int i=0;i<=term;i++)
    {
      delay(59000);  // 59 sec
      digitalWrite(led,HIGH);
      delay(1000);  // 1 sec , 59+1 = 1 minute
      digitalWrite(led,LOW);
    }
    feedFish();
}
 
// FEED THE FISH..
void feedFish()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();        // must call at least once every 50ms or so to keep your servos updating
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}
cs






※ 추가내용 (2016.12.18) : 어떤 이유인지 확실히는 모르겠는데 새로 업로드한 소스에서 12시간에 6분 정도가 빨리 흐른다. 아마도 ATtiny 에 내장된 타이머가 정밀하지 않은 탓은 아닐까? 하는데 term 변수인 720분에 6분을 더해서 오차를 보정해 주었다.


1
2
3
//int term = 720; 
int term = 726;
 
cs




※ 추가내용 (2016.12.19) : 먹이를 주기전 Beep 음이 3번 울리도록 피에조 스피커를 추가하고 소스를 변경해 주었다. Beep 음은 아두이노에 있는 tone() 함수를 이용했는데 이 함수는 순수한 생짜의 ATtiny 에서는 지원되지 않는다. 사용하려면 http://deneb21.tistory.com/455 의 맨 아래 추가내용에 관련 내용(ATtiny Core 적용)을 적어 놓았다.  참고로 tone() 사용 시 음의 주파수를 500을 주었더니 소리가 제대로 나지 않았다. 아래는 이제까지 수정사항을 반영한 연결과 소스이다.


ATtiny_Fish_Feeder2.fzz



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <SoftwareServo.h> 
 
SoftwareServo myservo;  // create servo object to control a servo 
 
int pos = 0;    // variable to store the servo position 
//int term = 720; // 12hours = 43200sec = 720minutes
int term = 726// 12hours = 43200sec = 720minutes
int led = 0;  // LED Pin (PB0)
int speaker = 2//speaker Pin (PB2)
 
void setup(){
  pinMode(led, OUTPUT);
  myservo.attach(1);  // attaches the servo on PB1 to the servo object 
  myservo.write(0);
  delay(15);
  feedFish();
}
 
void loop(){
    for(unsigned int i=0;i<=term;i++)
    {
      delay(59000);  // 59 sec
      digitalWrite(led,HIGH);
      delay(1000);  // 1 sec , 59+1 = 1 minute
      digitalWrite(led,LOW);
    }
    feedFish();
}
 
// FEED THE FISH..
void feedFish()
{
  //feeding alarm
  for(unsigned int i=0;i<3;i++)
  {
    tone(speaker,2000,1000);
    delay(2000);
  }
  
  //feeding (servo move)
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();        // must call at least once every 50ms or so to keep your servos updating
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}
cs


반응형
반응형

금붕어를 키우기 시작하면서 까먹지 않고 하루에 아침 저녁으로 물고기 밥을 챙겨주는 것도 일과 중의 하나가 되었다. 그래서 자동으로 물고기 밥을 주는 장치를 유튜브에 검색해 봤더니 다양한 장치가 나온다. 그 중에서 가장 간단하고 괜찮을 것으로 생각되는 것을 찾았다. 바로 서보모터에 물고기 사료통을 달아서 정해진 시간에 사료통이 기울어지고 사료가 어항으로 떨어져서 물고기 밥을 자동으로 줄 수 있게 만든 장치였다.


바로 위의 장치이다. 아두이노를 이용해서 만들었다. 


나는 이런 비슷한 장치를 상대적으로 저렴하고 간단하게 만들 수 있는 ATtiny 칩으로 만들어 보고자 한다. 지난 두 번의 포스팅(http://deneb21.tistory.com/455http://deneb21.tistory.com/462)에서 아두이노를 ISP로 이용해서 ATtiny칩에 프로그램을 심는 과정과 심을 수 있는 보드를 만들어 보았으므로 바로 프로그래밍이 가능한 상태이다. 위의 동영상에서 보듯이 물고기 자동 밥주기 장치의 제일 중요한 부분은 서보모터의 제어이다. 서보모터의 제어에 대해서 알아보자.


먼저 아두이노 IDE 에 기본적으로 포함된 Servo 라이브러리를 이용해서 제어해 보려고 했으나 에러가 발생했다. 그래서 구글링을 해 보니 ATtiny 에서 사용할 수 있는 라이브러리가 있었다. SoftwareServo 라는 라이브러리 이다.

 


위의 라이브러리를 설치하고 아래와 같이 ATtiny85 칩에 코딩을 해서 업로드 해 주었다.


■ 소스
0 ~ 180도 까지 반복적으로 서보가 움직이는 소스, 아두이노의 기본 Servo 라이브러리와 거의 같은 코딩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <SoftwareServo.h> 
 
SoftwareServo myservo;                 // create servo object to control a servo 
                                       // a maximum of eight servo objects can be created 
 
int pos = 0;                           // variable to store the servo position 
 
void setup() 
  myservo.attach(1);                  // attaches the servo on PB1 to the servo object 
 
void loop() 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();        // must call at least once every 50ms or so to keep your servos updating
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    SoftwareServo::refresh();
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}
 
cs



칩과 서보 배터리의 연결은 아래와 같다.


ATtiny_Servo.fzz


배터리는 AA전지 4개를 직렬연결해서 6V이다. ATtiny 의 동작전압이 5.5V 까지이나 6V를 공급해도 이상없이 작동 되었다.



심플하다. 칩 하나와 서보 뿐이다. 잘 작동한다. 아두이노를 이런 간단한 동작의 구현에 쓰는 것은 낭비일 것이다. 일단 ATtiny 에서 서보 다루는 방법을 알았으니 나머지 자잘한 부분만 해결하면 물고기 밥주는 장치를 만들 수 있을 것 같다. 예를 들어 물고기 사료량을 조절할 수 있도록 한다거나 밥 주는 타이머를 어떻게 구현할지 등에 대해서 좀 더 생각해 봐야겠다.



번외로 가변저항에 의해서 서보를 움직이는 자료도 있어서 실행해 보았다. 아두이노에서의 방법과 다르지 않다. analogRead 를 통해서 가변저항의 변화되는 값을 읽은 다음 서보에 analogWrite 로 값에 맞게 움직이게 하는 것이다.


■ 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int analogPin = 3;   // potentiometer connected to adc 3
int val = 0;         // variable to store the read value
int aref = 0;
int servoPin = 0//Steppermotor pin connected to pin 0
 
void setup()
{
  pinMode(servoPin, OUTPUT);   // sets the pin as output
}
 
void loop()
{
  val = analogRead(analogPin);   // read the input pin
 
  analogWrite(servoPin,val/4);
}
cs


ATtiny_Servo_With_POT.fzz


서보가 가변저항의 저항값의 변화에 따라 움직이는 것을 볼 수 있다. RC 비행기 같은 리모트 콘트롤 제어 등에 사용할 수 있을 듯 하다.

반응형
반응형

예전에 작성한 글 'http://deneb21.tistory.com/455' 에서 아두이노 우노를 ISP로 사용해서 ATtiny85 칩에 프로그램을 업로드 하는 방법에 대해서 알아보았다. 하지만 매번 이렇게 ATtiny 칩에 프로그래밍을 하려면 브레드보드를 연결해야하고 할 때마다 회로를 다시 구성해야 하는 것이 번거로웠다. 그래서 전용으로 사용할 수 있도록 만능기판에 회로를 구성해서 프로그래밍 보드를 만들어 보았다. 아두이노는 우노 대신 만능기판에 얹기 위해서 작은 사이즈의 아두이노 나노를 이용해 보았다.


사용한 부품들이다. 아두이노 나노, Female 핀헤더 소켓(아두이노 나노 꼽는 용도), 만능기판, 220옴 저항, LED, 8핀 IC 소켓, 25V 10uF 전해 커패시터, 연결용 전선 그리고 사진에 없지만 LED ON/OFF 를 위한 스위치를 추가로 달아주었다. 스위치는 달아주어도 되고 안달아도 상관이 없다. 전해 커패시터는 규격보다 조금 더 큰 용량도 상관은 없는 것 같다. 지난번에는 22uF 를 연결해도 정상적으로 작동이 되었다. 


ATtiny85_Programming_Board.fzz



회로의 구성은 위와 같이 해 주었다. LED 는 ATtiny85 칩의 테스트를 위하여 달아 주었다. Blink 같은 예제를 업로드 해서 칩이 잘 작동하는지 보기 위해 ATtiny85의 PB3 에 연결해 주었다. 하지만 이런 과정이 필요가 없다면 생략도 가능하다. 위의 부품목록에 없는 스위치는 LED 의 Cathode 와 GND 사이에 위치해서 LED 를 끄거나 켜도록 한다. 물론 이것도 생략 가능.


위의 회로도를 참고해서 납땜하면 된다. 만능기판의 단자간 폭이 좁으므로 쇼트되지 않도록 매우 유의해서 납땜해야 한다. 납땜 초보인 나는 몇 번 이나 쇼트가 나서 다시 녹이고 떼어내느라 진땀을 뺏다. ^^;

위와 같이 납땜이 완료되었고 소켓에 아두이노 나노를 꼽았다. 여분의 아두이노가 많이 있기 때문에 기판에서 나노를 떼어내지는 않을 것 같긴 한데 아무튼 소켓에 꼽는 방식으로 만들어 주었다. 그리고 그게 더 나을 것이다.


뒷면의 모습, 간단한 회로인데 초보라 그런가 지저분한 모습, 전문가들이 보면 뭐라 할 듯. 전선을 연결할 길이에 딱 맞게 잘라서 연결해야 할텐데 귀찮아서 모두 똑같은 길이의 전선을 사용했더니 뭔가 정리가 안된 느낌이다.


아무튼 기능만 잘 되면 나는 만족이다. PC에 연결하고 Blink 예제를 ATtiny85에 업로드 해 보았다. 잘 작동한다.


Blink 예제 업로드 후 잘 작동하는 모습... 한 번에 성공해서 기분이 좋다. ^^


간단하게 기판에 스위치 ON/OFF, LED가 연결된 ATtiny Pin, 칩의 꼽는 방향을 표시해주고 플라스틱 쪼가리와 스페이서로 받침대를 만들어 주었다. 조금 더 정리된 느낌이 난다.


허접하지만 이걸 사용하면 매번 ATtiny 칩을 프로그래밍 할 때 브레드보드에 회로를 구성하지 않고 아두이노 처럼 바로 PC에 꼽아서 사용하면 된다. 그리고 제목에는 ATtiny85 라고 썼지만 이 보드는 ATtiny25, 45, 85 모두 꼽아서 프로그래밍이 가능하다.


※ 아두이노를 ISP로 사용해서 ATtiny85 칩에 프로그램을 올리는 방법을 상세하게 알고 싶다면 [http://deneb21.tistory.com/455] 를 클릭하면 됩니다.



▶추가내용 (2016.12.27) : 위의 보드와 비슷한 기능을 하는 기성품 보드도 판매하고 있다. 칩만 꼽으면 Digispark 와 같은 기능을 한다. USB를 통해 PC와 직접 연결이 가능하다. aliexpress, ebay 등에서 'Pluggable Development Board For Attiny" 로 검색하면 나온다. 하지만 차라리 이럴거면 Digispark 를 사는게 더 나을듯 하다. 

반응형
반응형

ATtiny85 MCU에 대해서는 예전에 Digispark 보드에 대해서 알아보면서 한 번 다룬적이 있다. (http://deneb21.tistory.com/394http://deneb21.tistory.com/395)하지만 지금부터 하려고 하는 것은 ATtiny85 칩만을 가지고 아두이노의 기능을 할 수 있도록 프로그래밍 하는 방법에 대해서 알아보려고 한다. 이렇게 하면 아두이노로 돌리기엔 과분(?)했던 자잘한 프로그램들을 저렴한 칩 하나에서 동작시킬 수 있으니 여러모로 절약이라고 생각되며 합리적인 다운사이징이라고 생각이 된다. 먼저 개발환경을 설정하는 방법에 대해서 알아보려고 하는데 아두이노 우노를 ISP 로 삼아서 ATtiny칩에 프로그램을 이식하는 방법에 대해서 알아보려고 한다. 모든 정보는 본 포스팅에서 다루는 보드 라이브러리 개발자의 사이트인 http://highlowtech.org/?p=1695 (MIT 미디어랩 소속) 을 참고 하였다.


위의 칩이 ATtiny85 이다. 8KB의 메모리를 가진다. 보통 아두이노가 32KB 정도를 가지는데 비해 1/4 정도의 공간이다. 하지만 8KB 의 공간은 꽤 큰 공간이다. 아마도 간단한 센서제어 등의 프로그래밍 용도로는 차고도 넘치는 공간이라고 할 수 있을 것 같다. 게다가 새끼손톱 정도의 크기여서 프로젝트의 공간활용에도 많은 도움이 될 것으로 생각한다. 칩은 알리익스프레스 직구로 개당 1달러 정도에 구입할 수 있으니 돈도 많이 절약이 될 것이다. 


■ ATtiny 데이터시트 & 스펙

atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf

아래는 데이터시트에서 카피해 온 칩의 스펙이다. (ATtiny 25, 45, 85 Series)

Features

• High Performance, Low Power AVR® 8-Bit Microcontroller

• Advanced RISC Architecture

– 120 Powerful Instructions – Most Single Clock Cycle Execution

– 32 x 8 General Purpose Working Registers

– Fully Static Operation

• Non-volatile Program and Data Memories

– 2/4/8K Bytes of In-System Programmable Program Memory Flash

• Endurance: 10,000 Write/Erase Cycles

– 128/256/512 Bytes In-System Programmable EEPROM

• Endurance: 100,000 Write/Erase Cycles

– 128/256/512 Bytes Internal SRAM

– Programming Lock for Self-Programming Flash Program and EEPROM Data Security

• Peripheral Features

– 8-bit Timer/Counter with Prescaler and Two PWM Channels

– 8-bit High Speed Timer/Counter with Separate Prescaler

• 2 High Frequency PWM Outputs with Separate Output Compare Registers

• Programmable Dead Time Generator

– USI – Universal Serial Interface with Start Condition Detector

– 10-bit ADC

• 4 Single Ended Channels

• 2 Differential ADC Channel Pairs with Programmable Gain (1x, 20x)

• Temperature Measurement

– Programmable Watchdog Timer with Separate On-chip Oscillator

– On-chip Analog Comparator

• Special Microcontroller Features

– debugWIRE On-chip Debug System

– In-System Programmable via SPI Port

– External and Internal Interrupt Sources

– Low Power Idle, ADC Noise Reduction, and Power-down Modes

– Enhanced Power-on Reset Circuit

– Programmable Brown-out Detection Circuit

– Internal Calibrated Oscillator

• I/O and Packages

– Six Programmable I/O Lines

– 8-pin PDIP, 8-pin SOIC, 20-pad QFN/MLF, and 8-pin TSSOP (only ATtiny45/V)

• Operating Voltage

– 1.8 - 5.5V for ATtiny25V/45V/85V

– 2.7 - 5.5V for ATtiny25/45/85

• Speed Grade

– ATtiny25V/45V/85V: 0 – 4 MHz @ 1.8 - 5.5V, 0 - 10 MHz @ 2.7 - 5.5V

– ATtiny25/45/85: 0 – 10 MHz @ 2.7 - 5.5V, 0 - 20 MHz @ 4.5 - 5.5V

• Industrial Temperature Range

• Low Power Consumption
      – Active Mode : 1 MHz, 1.8V: 300 µA
      – Power-down Mode : 0.1 µA at 1.8V

핀의 구성은 위와 같다. 하나의 핀을 다용도로 사용이 가능하지만 대표적으로 보면 디지털 I/O 5개, 아날로그 I/O 3개를 사용할 수 있다. 동작전압은 2.7 - 5.5V 로서 1.5V 건전지 2개나 3V 리튬 코인셀, 3.7V 리튬이온 배터리, USB 전원 등 다양한 전원을 사용할 수 있겠다.

전원 관련하여 특히 파워다운 모드(Power-down Mode)에서는 0.1μA 까지 소모 전류를 낮출 수 있어서 배터리를 아주 알뜰하게 사용할 수도 있다.

이제부터 어떻게 아두이노 우노를 이용해서 ATtiny85 칩에 프로그램을 업로드 할 수 있는지 알아보겠다. 아두이노 IDE 구버전(1.0.x)을 사용하는 경우(온라인 보드라이브러리 설치 미지원 버전)와 최신버전(온라인 보드라이브러리 설치 지원 버전) 두 가지 경우 모두에 대해서 설명하려한다. 굳이 이렇게 하는 이유는 환경을 설치하려는 나의 노트북 (화이트 맥북, OS X 10.6 에서는 최신버전 아두이노 IDE의 설치가 지원되지 않았기 때문이다 ㅠ.ㅠ) 아래의 구버전 설치법은 아두이노 IDE 1.0.x 버전에서만 설치가 가능하다.

아두이노 IDE 의 보드 라이브러리 온라인 설치 가능 여부는 메뉴 중 환경설정창을 열어보면 위와 같이 나오는데 맨 아래에 URL 입력창이 있으면 신버전이다. 내가 쓰는 1.0.5 버전은 없음. 고로 수동설치해야 함.

※준비물: 아두이노 우노, ATtiny85 칩, 10μF 정도의 전해 커패시터(약간 큰 용량도 상관이 없다), 케이블, 브레드보드, LED, 220옴 저항 등.

Step 1. 아두이노 우노가 ISP 로 작동할 수 있도록 만들어 주어야 한다. 아두이노 IDE 를 실행하고 파일->예제->Arduino ISP 를 클릭한다. 

클릭하면 스케치 창이 하나 뜨면서 ISP 코드가 나타난다.

업로드 버튼을 눌러서 아두이노에 ISP 프로그램을 업로드 해 준다. 이제 아두이노 우노는 ISP 의 역할을 하게 된다.

출처: http://highlowtech.org/?p=1801

만약 위와 같은 전용 ISP 하드웨어가 있다면 이 과정을 생략하고 아래의 2번 과정만 거치면 바로 ATtiny85에 프로그램을 올릴 수 있다.

Step 2-1. 온라인 보드 라이브러리 설치가 지원되지 않는 아두이노 IDE 구버전(Ver 1.0.x)의 경우는 아래와 같이 보드 라이브러리를 설치한다.

  • https://github.com/damellis/attiny/archive/ide-1.0.x.zip 을 다운로드 받아서 압축을 풀면 'attiny-ide-1.0.x' 라는 폴더가 나오는데 하위 폴더에 'attiny' 라는 폴더가 있다. 이 폴더를 복사한다.
    attiny-ide-1.0.x.zip

  • 복사한 attiny 폴더를 맥의 경우 응용프로그램 폴더 -> 아두이노 아이콘 위에서 마우스 오른쪽 버튼을 클릭하면 '패키지 내용보기' 라는 메뉴가 나온다. 이것을 실행한다. 그러면 프로그램이 설치된 폴더가 나오는데 'Contents -> Resources -> java -> hardware' 폴더에 'attiny' 폴더를 붙여넣기 하면 된다.


  • 윈도우의 경우 아두이노 IDE 설치 폴더 하위의 'hardware' 폴더에 'attiny' 폴더를 붙여넣기 하면 된다. (하지만 윈도우 사용자의 경우 그냥 최신버전의 IDE를 사용하는게 좋다.)

  • 이제 아두이노 IDE 를 다시 실행해서 '도구 -> 보드' 메뉴를 보면 아래와 같이 ATtiny 관련 보드들이 나오는 것을 볼 수 있다. 이 중에서 우리는 ATtiny85 를 선택하고 프로그래밍 하면 되는 것이다. 또는 다른 ATtiny 칩 선택도 물론 가능하다.
    OS X 구버전 아두이노 IDE


Step 2-2. 온라인 보드 라이브러리 설치가 지원되는 아두이노 IDE 신버전의 경우는 아래와 같이 보드 라이브러리를 설치한다. (윈도우 버전만 설명한다. 나의 OS X 10.6은 위에서도 말했다시피 지원이 안된다.)
  • 아두이노 IDE를 실행하고 '파일 -> 환경설정' 에 들어간다.

    위와 같이 환경설정창이 뜨는데 그림의 버튼을 클릭하면 '추가적인 보드매니저 URLs' 라는 창이 뜬다. 맨 아래에 다음의 URL을 입력해 준다. 'https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json' 입력하고 확인을 눌러준다. 환경설정창도 확인을 눌러서 닫아준다.

  • 아두이노 IDE '툴 -> 보드 -> 보드매니저' 를 실행한다.



  • 보드 매니저를 실행하면 아래와 같이 보드 라이브러리를 선택하는 창이 뜨는데 이 중에서 'attiny by David A. Mellis' 를 설치한다.



  • 설치가 끝난 후 아두이노 IDE 를 다시 시작하고 '툴 -> 보드' 메뉴를 보면 ATtiny 관련 장치가 새로 생성된 것을 볼 수 있다.

  • 이로써 소프트웨어적인 개발환경 설치는 끝났다. 만약 ISP 하드웨어가 있다면 3번의 과정 없이 바로 아두이노 IDE 로 코딩을 들어가면 된다.

Step 3. 아두이노 우노를 PC에서 분리하고 아래의 그림과 같이 회로를 구성한다. 

출처: http://highlowtech.org/?p=1706

ATtiny85 Pin

Arduino Pin

PB2 (SCK)

D13

PB1 (MISO)

D12

PB0 (MOSI)

D11

PB5 (Reset)

D10

위와 같이 연결하고 칩의 전원은 5V 를 사용하며 아두이노 우노의 RESET 단자와 GND 에 전해 콘덴서(10μF)를 극성에 유의하여 연결해 준다. (전해 콘덴서 + 를 RESET에 연결, - 를 GND 에 연결)

실제로 연결한 모습이다. 부품이 몇 개 없으니 간단하게 연결이 가능하다. 나의 경우는 10μF 짜리 콘덴서가 없어서 22μF, 100V 짜리를 달아 주었다. 내압은 25V 정도면 충분하다.

Step 4. Test

가장 만만한 예제인 LED Blink 테스트를 해보기로 한다.  LED 하나와 220옴 저항을 준비해서 LED의 플러스극을 ATtiny85 의 디지털 단자인 PB4에 연결한다. 마이너스는 GND에 저항과 함께 연결한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 4 has an LED connected on most Arduino boards.
// give it a name:
int led = 4;
 
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}
 
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}
cs

소스를 보면 알겠지만 기존의 blink 예제에서 led 핀을 13번에서 ATtiny의 핀인 4번으로 바꿔준 것 밖에 없다. 소스가 완성 되었으니 이제 업로드를 위한 준비를 한다.

- 업로드 전 체크사항 1 : '툴(도구) -> 보드' 에서 ATtiny85를 선택해야 한다. 클럭은 1Mhz 내부클럭을 사용할 것이다. (보드 라이브러리 버전에 따라 보드, 프로세서, 클럭을 따로 선택해 주어야 하는 경우도 있다. 원하는 것을 선택하면 된다.)

- 업로드 전 체크사항 2 : '툴(도구) -> 프로그래머' 에서 'Arduino as ISP' 를 선택한다.

위의 체크사항을 모두 제대로 선택 했으면 업로드 버튼을 눌러서 blink 예제를 업로드 해 준다. 잠시 후 업로드 완료가 되어 LED가 깜빡이는 것을 볼 수 있다. 아두이노를 통해서 ATtiny 칩으로 프로그램이 업로드 되어 아두이노는 전원만 공급하는 역할을 하고 칩 독자적으로도 동작이 잘 된다. 이 상태에서 아두이노를 분리하고 배터리 등의 외부전원을 연결해도 여전히 잘 작동한다.



위의 영상은 아두이노 우노를 떼어내고 배터리를 연결해서 ATtiny85 가 단독으로 동작하는 영상이다.

그런데 프로그램 업로드시 업로드 완료까지 잘 되는데 이상한 경고문구가 나온다.

avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85

라는 경고 문구 인데 위에 참고한 사이트에 보니 그냥 무시하면 되는 거라고 한다. Don't worry.

출처 : http://highlowtech.org/?p=1229

앞으로 ATtiny85 칩을 가지고 여러가지를 해 볼 생각이다. 살짝 기대가 된다.


※추가내용 (2016.12.18) : 위와 같이 했는데 아두이노의 기본적인 함수인 tone() 등이 되지 않는다면 attiny core 를 설치하면 아두이노와 거의 비슷한 환경에서 코딩이 가능하다. https://code.google.com/archive/p/arduino-tiny/ (← 고마운 사람들)에서 다운로드 받을 수 있으며 다운 받은 후 압축을 풀고 윈도우의 경우 아두이노 IDE 설치 폴더 하위의 hardware 하위에 tiny 폴더를 복사하고 (Mac 의 경우는 '응용프로그램 - 아두이노IDE 에서 오른쪽 마우스 - 패키지 내용보기 - Contents - Resources - Java - hardware 하위) Prospective Boards.txt 파일의 이름을 boards.txt 로 변경하고 IDE를 재시작하면 일부 기능을 제외하고 아두이노와 거의 비슷한 환경에서 코딩이 가능하다. 아래에 내가 실제로 설치해서 사용하고 있는 core 파일을 올린다. 아두이노 1.0.x대의 파일과 아두이노 1.5.x 에서 사용할 수 있는 코어가 따로 있다.

attiny_core_1.0.zip

attiny_core_1.5.zip



※추가내용 (2016.12.27) : 아두이노 나노와 만능기판을 이용해서 ISP 기능을 하는 ATtiny 전용 보드를 만들어 보았다. http://deneb21.tistory.com/462

반응형

+ Recent posts