<목표>
- 아두이노 내부 전원은 매우 약하다.
각종 센서나 LED 사용에는 큰 문제가 없지만, 모터류를 사용할 때에는 문제가 항상 따른다.
전류가 부족한 문제로, 모터쪽으로 과전류가 흐르게 되면 아두이노가 오작동 하는 등 문제가 생긴다.
그래서 원래는 외부전원을 사용하는 등 정석의 방법이 존재 한다.
하지만 이런 외부전원 회로를 만드는게 힘든 상황이거나 귀찮을 경우에 서모모터를 여러개 사용해야 하는 경우가 생기곤 한다.
이럴 때에 어떻게해야 아두이노 내부전원으로 서보모터를 여러개 돌릴 수 있을지 알아보자.
<준비물>
- 아두이노(나노, 우노, 메가), 시리얼 통신 케이블, 점퍼선(M-M), 서보모터(SG-90) 여러개
<회로도>
아두이노 내부 전원 5V 를 통해서 서보모터 여러개에 전원 공급을 해준다.
signal 신호는 각각 하나씩 연결을 해준다.
이런 확장보드가 있으면 더욱 편하게 서보모터를 이용할 수 있다.
없다면 미니브레드보드를 이용해서 5V와 GND를 확장시켜줘야 한다.
<코드>
#include <Servo.h>
Servo myservo1; // create servo object to control a servo
Servo myservo2; // create servo object to control a servo
Servo myservo3; // create servo object to control a servo
int pos1 = 0; // variable to store the servo position
int pos2 = 0;
int pos3 = 0;
int pos = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
myservo1.attach(7);
delay(100);
for (pos1 = 0; pos1 < 360; pos1 += 1)
{
if(pos1 >= 180)
pos = 359-pos1;
else
pos = pos1;
myservo1.write(pos);
delay(15);
}
delay(500);
myservo1.detach();
myservo2.attach(8);
for (pos2 = 0; pos2 < 360; pos2 += 1)
{
if(pos2 >= 180)
pos = 359-pos2;
else
pos = pos2;
myservo2.write(pos);
delay(15);
}
delay(500);
myservo2.detach();
myservo3.attach(9);
for (pos3 = 0; pos3 < 360; pos3 += 1)
{
if(pos3 >= 180)
pos = 359-pos3;
else
pos = pos3;
myservo3.write(pos);
delay(15);
}
delay(500);
myservo3.detach();
}
<실행 결과>
위의 영상에서 확인할 수 있는 것처럼, 모터가 순서대로 잘 돌아가는 것을 확인할 수 있다.
이번 포스팅에서 핵심은 <Servo.h> 에 있는 함수 두개가 핵심이다.
바로 ~.attach( ) 와 ~.detach( ) 이다.
~.attach( ) 는 해당 핀에 전류를 흘려 보내는 것이다.
정확히 말하자면 전류이긴 하지만, PWM 신호에 맞춰서 신호가 보내진다.
서보모터에 대해서 자세하게 알고 싶다면 아래 포스팅을 참고하면 좋다.
그렇다면 ~.detach( ) 는 무슨 역할을 할까?
함수 이름에서 유추할 수 있듯이 반대 개념으로 전류를 차단하는 역할을 한다.
일단 위에서 각각 함수의 역할에 대해서 알았으므로, 좀 더 전문적으로 이해해보자.
서보모터는 PWM 신호에 따라서 각도를 유지하는데, 서보모터에 전류가 들어가 있으면 손으로 힘을 주어도 각도가 강하게 유지된다.
다른 상황으로, 서보모터를 아두이노에서 다 분리한 상태로 사람의 힘으로 모터를 돌리면 빡빡하지만 각도가 변하면서 돌아가게 된다.
이런 현상이 있는 이유는, 5V 와 GND 때문이 아니라, signal 신호 때문에 그렇다.
전류 공급이 되지 않는 서보 모터는 그냥 일반적인 기어드모터 라고 보면 된다.
하지만 전류가 공급이 되고 있는 서보 모터는 스텝모터와 같아진다.
힘을 주어 모터를 강제로 회전시키려해도 계속 해당 각도를 유지하려 하기 때문에 회전이 되지 않는다.
보통은 아두이노에서 서보모터를 사용할 때, ~.detach( ) 함수를 사용하지 않는다.
외부전원을 사용하는 경우에는 당연 필요가 없을 뿐더러, 전류가 계속 들어가야 그 각도가 유지되기 때문이다.
그럼에도 간단히 테스트 하는 상황에서 서보모터를 여러개 사용해야 할 때가 분명 있다.
그런 경우가 있으니깐 이렇게 검색해서 이 포스팅을 찾아왔을 것이니 말이다 ㅎㅎ
~.detach( ) 함수를 사용해서 서보모터를 원하는 방향으로 회전시키고 전류를 차단시키고,
다음 서보모터를 ~.attach( ) 함수를 사용해서 원하는 각도를 가리키는 신호를 보내주는 것이다.
이렇게 하면 아두이노 내부 전원으로도 충분히 서보모터를 제어할 수 있게 되는 것이다.
그러면 궁금증이 하나 생긴다. 서보모터에 전류를 빼면 각도 유지가 제대로 안 되는것 아닌가? 라는 궁금증 말이다.
반은 맞고, 반은 틀리다.
당연히 외부의 힘이 강하게 들어온다면 각도 유지는 되지 않는다.
하지만, 전류 없는 서보모터를 사람 손으로 돌리려 했을때, 쉽게 되지는 않는다는 경험을 다 해봤을 것이다.
그렇다, 엄청 강한 외부 힘이 아니면 서보모터는 기어드모터와 같기 때문에 그 각도를 애초에 유지할 수 있는 것이다.
로봇에 사용하는 서보모터에는 당연히 외부전원을 사용하는 것이 좋고,
간단하게 사용하는 경우라면 이렇게 ~.attach( ) 와 ~.detach( ) 함수만을 이용하면 쉽게 여러개 서보모터를 제어할 수 있게된다.
또한 배터리를 이용하는 경우 전력소모를 줄이는 과정이 필요한데,
이 때에도 ~.detach( ) 를 사용해서 전류를 차단해 주는 것이 좋다.
물론 힘을 많이 받는 경우에는 당연히 ~.detach( ) 를 사용하면 좋지 않은 결과를 초래할 수 있다...
이건 경험과 실제로 해보지 않는이상 모르는 것이니깐 이런 방법도 있다더라~ 하고 참고하면 될듯 하다.
※ 궁금하시거나 질문사항이 있으시면 댓글로 작성해주시면 답변해 드릴 수 있는 부분에서 친절히 답변드리겠습니다!
'코딩 > 아두이노' 카테고리의 다른 글
아두이노 입출력 인터럽트에 대해서 알아보자 attachInterrupt() (2) | 2020.12.23 |
---|---|
아두이노와 ESP8266으로 wifi에 연결해서 웹서버 만드고, 센서값 출력하기 (24) | 2020.10.23 |
모스펫으로 DC모터 제어하는 방법 ( IRFZ44N ) (6) | 2020.09.14 |
아두이노에서 서보모터 SG-90 사용하는 방법 (0) | 2020.09.14 |
아두이노에서 적외선 근접센서 TCRT5000 사용하는 방법 (11) | 2020.08.19 |
댓글