금붕어를 키우기 시작하면서 까먹지 않고 하루에 아침 저녁으로 물고기 밥을 챙겨주는 것도 일과 중의 하나가 되었다. 그래서 자동으로 물고기 밥을 주는 장치를 유튜브에 검색해 봤더니 다양한 장치가 나온다. 그 중에서 가장 간단하고 괜찮을 것으로 생각되는 것을 찾았다. 바로 서보모터에 물고기 사료통을 달아서 정해진 시간에 사료통이 기울어지고 사료가 어항으로 떨어져서 물고기 밥을 자동으로 줄 수 있게 만든 장치였다.
바로 위의 장치이다. 아두이노를 이용해서 만들었다.
나는 이런 비슷한 장치를 상대적으로 저렴하고 간단하게 만들 수 있는 ATtiny 칩으로 만들어 보고자 한다. 지난 두 번의 포스팅(http://deneb21.tistory.com/455, http://deneb21.tistory.com/462)에서 아두이노를 ISP로 이용해서 ATtiny칩에 프로그램을 심는 과정과 심을 수 있는 보드를 만들어 보았으므로 바로 프로그래밍이 가능한 상태이다. 위의 동영상에서 보듯이 물고기 자동 밥주기 장치의 제일 중요한 부분은 서보모터의 제어이다. 서보모터의 제어에 대해서 알아보자.
먼저 아두이노 IDE 에 기본적으로 포함된 Servo 라이브러리를 이용해서 제어해 보려고 했으나 에러가 발생했다. 그래서 구글링을 해 보니 ATtiny 에서 사용할 수 있는 라이브러리가 있었다. SoftwareServo 라는 라이브러리 이다.
■ SoftwareServo Library
https://docs.google.com/file/d/0B6s_UhmkBLQfVTVQWEh6aS1yb0E/edit
위의 라이브러리를 설치하고 아래와 같이 ATtiny85 칩에 코딩을 해서 업로드 해 주었다.
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 |
칩과 서보 배터리의 연결은 아래와 같다.
배터리는 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 |
서보가 가변저항의 저항값의 변화에 따라 움직이는 것을 볼 수 있다. RC 비행기 같은 리모트 콘트롤 제어 등에 사용할 수 있을 듯 하다.
'아두이노' 카테고리의 다른 글
[ATtiny] ATtiny85 절전모드 실험 (0) | 2016.12.16 |
---|---|
[ATtiny] ATtiny85 와 서보모터를 이용한 자동 물고기 사료 공급장치 (5) | 2016.12.15 |
[ATtiny] ATtiny85 MCU 프로그래밍 보드 제작 (0) | 2016.12.12 |
[아두이노] DC 모터, 아두이노 PWM으로 속도 제어 (4) | 2016.12.01 |
[아두이노] ATtiny85 MCU 칩의 개발환경 설정, 아두이노 우노 이용 (0) | 2016.11.30 |