아두이노라는 기본적인 개념을 생각하고

아두이노만 생각하면 이제 내부로 입력받거나

외부로 출력하는 기본적인 것은 이해가되지만

 

실제로 외부에서 많이 사용되는 일반적인 DC모터와

그 다음으로 많이 사용되는 스테핑모터, RC서보모터, BLDC모터 등

여러 가지가 있죠.

 

참고로 산업현장에 가면 제어할 수 있는 일반적인

모터는 모두 서보모터로 부를 수 있으니 단어를

나중에 중복해서 부를 수 있으니 미리 참고 하십시오.

 

그럼 우리가 부르는 RC서보모터의 구조를 볼까요?

  

 

RC서보모터는 일반적으로 컨트롤러 회로와 내부에는 DC모터가

있으며 모터의 힘을 증가시키는 기어부분이 있습니다.

모터는 결국 DC 회로에 신호를 받아오는 신호에 따라서 각도가

원하는 각도로 돌아가도록 설정 되어 있는데요.

 

서보모터를 아두이노에 연결하는 방법부터 볼께요.

서보모터는 크게 3개의 케이블이 연결되어 있습니다.

3중 가장 가운데 빨간선이 VCC(5V)가 되고 검은색 또는 진한색을

가지는 쪽이 접지(0V), 그리고 최종적으로 노란색 또는 흰색이

되는 선이 신호선이 됩니다.

 

연결은 아주 단순하게 이루어지게 됩니다.

그림과 같이 기본적으로 전원선을 입력하면 되고요.

그리고 노란색선이 아두이노와 연결되어 제어하게 됩니다.

 

 

 

기본 동작의 원리를 한번 이해해 보겠습니다.

서보모터는 전원만 연결되었다고 동작되는 모터가 아닙니다.

 

특정한 신호를 흘려보낼 때 원하는 각도로 움직이는 모터가

되는데요.

 

자세한 동작 원리를 볼까요?

 

그림을 보면 오른쪽으로 움직일 때, 중간일 때,

그리고 왼쪽으로 움직일 때 모두 신호의 시간이

차이가 있음을 알 수 있습니다.

 

오른쪽의 경우 ON 타임의 시간이 0.7ms

가운데의 경우 ON 타임의 시간이 1.5ms

왼쪽의 경우 ON 타임의 시간이 2.3ms

볼 수 있죠.

 

한마디로 펄스가 얼마나 오랫동안 켜져 있느냐에

따라 서보모터의 각도 값이 켜지게 되느냐가 차이가 나게 됩니다.

우리가 프로그래밍 할 때 Delay()라고 해서 그안에 각도를

주는 시간에 따라서 달라진다는 이야기입니다.

 

 

오늘 간단한 예제로 여러분이 배웠던 개념중에

2편에서 LED제어시간이 얼마나 켜져 있는 가를

활용해서 모터를 제어한다고 생각하시면 됩니다.

 

그럼 2편의 기본 소스를 가져와서 수정하는 작업부터

조금씩 배워 보겠습니다.

 

void setup() {

pinMode(2, OUTPUT); //서보모터의 제어로 사용할핀

}

 

void loop() {

 

int i = 0; // 100번의 신호를 출력하기 위해 변수 지정

 

for(i=0 ; i < 99 ; i++ ) // 원하는 횟수 반복

{

digitalWrite(2, HIGH); // 2번 핀으로 켜짐

delayMicroseconds(1500); // 1.5ms 동안의 시간을 지연

digitalWrite(2, LOW); // 2번 핀으로 꺼짐

delay(5); // 5ms 동안 지연

}

delay(1000); // 1초 동안 동작 멈춤

 

for(i=0 ; i < 99 ; i++ )// 원하는 횟수 반복

{

digitalWrite(2, HIGH); // 2번 핀으로 켜짐

delayMicroseconds(700); // 0.7ms 동안의 시간을 지연

digitalWrite(2, LOW); // 2번 핀으로 꺼짐

delay(5); // 5ms 동안 지연

}

delay(1000); // 1초 동안 동작 멈춤

 

}

 

 

우리는 2편에서 LED를 켜짐과 꺼짐으로 1초동안

반복하는 프로그램을 작성했습니다.

이번에는 이와 동일한 방법으로 켜짐과 꺼짐을

동일한 방법으로 작성하되 시간의 주기를 조금

변화시켜보겠습니다. 상단의 켜짐 시간을 1.5ms

하면 제대로 동작되지 않을 수 있으니

delay()단위보다 1000정도로 자세히 제어할 수 있는

delayMicroseconds()로 시간을 짧게 제어하도록 하겠습니다.

 

delay(1.5) => delayMicroseconds(1500);

그럼 시간단위는 밀리세컨즈 단위에서 마이크로세컨즈단위로

수정하여 값을 제어하도록 명령을 사용합니다.

 

 

digitalWrite(2, HIGH); // 2번 핀으로 켜짐

delayMicroseconds(1500); // 1.5ms 동안의 시간을 지연

digitalWrite(2, LOW); // 2번 핀으로 꺼짐

delay(5); // 5ms 동안 지연

 

제어는 켜지는 시간이 1.5ms 꺼지는 시간은 5ms

설정했습니다.

이렇게 할 경우 기본 각도 값은 90도가 됩니다.

 

digitalWrite(2, HIGH); // 2번 핀으로 켜짐

delayMicroseconds(700); // 0.7ms 동안의 시간을 지연

digitalWrite(2, LOW); // 2번 핀으로 꺼짐

delay(5); // 5ms 동안 지연

 

 

이번에 꺼지는 시간을 0.7초 꺼지는 시간은 5ms

설정하면 각도 값은 오른쪽으로 90로 움직입니다.

 

그런데 여기서 문제는 특정각도로 움직이는 신호가

단 한번만 제어 신호를 만들 경우

우리가 신호를 발생했던 시간 1.5ms의 경우만

서보모터가 1.5ms 움직이다 멈추게 되는 것입니다.

그럼 100번 신호를 만들어서 보낼 경우

150ms의 신호만 움직이게 되겠죠. 물론 꺼져있는

시간까지 더 하면 650ms가 움직이게 됩니다.

 

100번을 더하는 방법은 오늘

for(;;) 조건식을 배우게 되는데요.

for라는 의미는 반복을 의미 합니다

 

for(초기값;조건식;증감식) { 반복될 프로그램 }

 

예시

for( i=0 ;i<50;i++) { println(“test”) }

 

 

for는 다음과 같은 구조를 가지고 있습니다.

초기 값은 최초에 입력되는 값을 설정합니다.

지금 i 라는 값을 0으로 먼저 지정해 두었죠.

 

조건식은 초기 값이 지정된 값과 비교해서 크다

또는 작다가 되는데요. 값을 증가한 값과 비교해서

틀려지게 되면 반복되는 프로그램에서 동작하지

않고 탈출하면됩니다.

 

증감식에서는 초기 값을 변화되도록 설정해서

몇 회가 반복될지 또는 증감의 수식에 따라 조건식이

달라지게 됨으로 이것에 변화를 줄 수 있게 됩니다.

 

 

 

전체 값을 이제 살펴보면요

void setup에 몇 번 핀을 사용할지 설정합니다.

우리는 서보모터를 2번으로 선택했기 때문에

pinMode(2,OUPUT);으로 설정되고요.

 

void loop안에 서보모터가 0도 또는 90도 계속반복해서

돌도록 프로그램을 작성하는데요.

 

서보모터의 동작조건은

결국 0도로 켜질 때는

2번 핀이 켜지는 시간이 1.5ms가 되도록 설정해주고

꺼지는 시간도 5ms 정도를 두었습니다.

 

그러나 이것을 서보모터가 0도까지

움직이는데 걸리는 시간이 어느 걸리기 때문에

 

100회 이상 반복해서 신호를 주도록 세팅하기 위해

for라는 명령어를 사용했고요.

 

마찬가지로 오른쪽 90도 방향으로 움직일 때는

0.7ms 동안 움직이도록 설정하고 꺼져 있는 시간

5ms를 정해 두었습니다.

 

오른쪽으로 동작할 때도 마찬가지로 100회 동안

켜져 있는 시간이 0.7ms 꺼지는 시간이 5ms

되도록 지정해 두었습니다.

 

 

90각도로 움직일때와 0도의 움직임은 다음과 같이 동작됩니다.

 

+ Recent posts