아두이노2016. 12. 13. 23:18

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


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


나는 이런 비슷한 장치를 상대적으로 저렴하고 간단하게 만들 수 있는 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 비행기 같은 리모트 콘트롤 제어 등에 사용할 수 있을 듯 하다.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 곰발

    안녕하세요.. 반갑습니다.
    전 아두이노 왕초보인데요..
    해당 도면을 보면 attiny85의 6번핀출력을 모터에 직접 연결하셧네요..
    전 지금까지 tr을 쓰거나 mosfat을 쓰곤 했는데 직접 연결시에
    attiny85의 출력 전류는 공식적으로 얼마나 가능할까요?
    제가 데이터 시트를 볼줄 몰라서 오로지 글로만 배우는 .....
    전 전기나 전자쪽과는 전혀 거리가 먼사람인데 취미로 배우는 사람입니다.
    조언 부탁드립니다.

    2018.05.22 14:13 [ ADDR : EDIT/ DEL : REPLY ]