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

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

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

 

실제로 외부에서 많이 사용되는 일반적인 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도의 움직임은 다음과 같이 동작됩니다.

 

아두이노를 이용한 입력까지 이해하시는데 어려움이
없으시면 이제 간단한 입력과 출력을 이용한 제어를
공부해 볼까 합니다.

앞으로 다양한 센서를 사용해 보고 싶지만
초기에 생활에서 쉽게 사용하고 여러분들이
정말 향후에 사용해 볼 수 있는 센서를 기본으로 
다양하게 활용 하려고 합니다.

제일 먼저 사용해볼 센서는 CDS셀 이라는 것을
이용해 데이터를 받아오려고 합니다.

CDS셀은 아래과 같이 생겼는데요.
빛을 통해 흐르는 전류량에 따라 저항의 크기가
달라지는 특성을 보입니다.
한마디로 빛 감지 센서 또는 광센서라고 부릅니다.









센서의 회로적 연결은 다음과 같이 연결되는데요.
먼저 연결 상태를 보게 되면,

0


5V 부분과 광센서, 광센서와 10KΩ의 저항 그리고 접지(GND)로 연결되고
그리고 광센서와 저항 사이에서 값을 불러오도록
세팅이 됩니다.^^

먼저 그리고 아셔야 되는 것이 일반적으로 
광센서가 아니더라도 저항을 두게 되는 이유는
보호저항이라는 역할을 하도록 기본회로를 설계하는데요.

일반적으로 광센서가 아닌 다를 센서를 사용한다고 하더라도
보호 저항 역할을 하도록 센서를 연결하게 됩니다.

동작 원리에 대해 간단히 이해해 보면요.
보호저항 값이 10KΩ을 가지고 있을 때
CDS의 정확한 값은 센서마다 조금 다를 수 있습니다.
예를 들어서 대략 빛의 밝기에 따라 0~100KΩ으로
광센서의 밝기 값이 달라진다고 합시다.

빛이 밝을 때는 저항이 1kΩ
빛이 아주 어두울 때는 100kΩ 달라질 때



밝은 곳에 둔 저항 값을 계산해 보면요
전압의 분배 원리를 비교해서 계산해 볼까요?

(보호저항+측정저항) = 전체저항
측정저항/전체저항 = 센서 값 비율

센서 값 비율 X 사용전압 = 실제 센서 전압


어두운 저항값

광센서 1k 보호저항은 10k
전체의 저항은 11k가 되겠죠.
가운데 흐르는 전압은 5V가 되고

1 / 11 = 0.09 
0.09 X 5V = 0.45V

실제 흐르는 전압은 0.45V가 되겠죠.

밝은 저항값
100/110 = 0.9
0.9 X 5 = 4.5V 가 될꺼에요.

여기서 나오는 전압의 크기는 우리는
센서에서 획득이되는 전압의 크기가 됩니다.

센서에서 나오는 전압의 크기는 
0~5V 로 표현 될 수 있지만

아두이노 자체에서는 0~5V로 표현하기보다
받아오는 데이터를 10bit로 쪼개서 
수치화 하는데요. 지난 시간에 디지털이
bit 단위로 0또는 1로만 구분될 때는 
0~5V는 0과 1밖에 말 할 수 없습니다.
그런데 10bit로 구분할 때는

아두이노에서는 최대 5V라는 신호를 받을 때
최대로 표현 가능 bit 단위는 10bit 즉 1024까지
표현되는거죠

5V는 1024로
2.5V는 512로 
0V는 0으로 표현 할 수 있다는 말이죠.

여기에 대한 개념은 이제 어느 정도 잡히실 겁니다.
그래도 어렵다면 아니면 저에게 질문해 주시면 됩니다.


 테스트를 해볼려니 갑자기 브레드보드가 필요한데요.
브레드보드는 회로를 쉽게 결선할 수 있도록 도와주는 판인데
빵을 굽는 판과 같이 구멍이 뚤어져 있다고 해서
브레드보드 즉 우리나라 말로 빵판 이라고 합니다.

빵판은 대게 5개의 구멍이 옆으로 연결되어 있습니다.
내부구조는 아래 그림과 같고요.
여러 가지의 부품 또는 부품과 부품간의 결선을 위해 사용됩니다.





다시 돌아가서 연결은 광센서와 저항이 직렬로 연결되도록
빵판에 연결하고 광세서와 저항사이에서 신호를 뽑아 
아두이노로 보낼 수 있도록 다음 그림과 같이 연결합니다.


빵판을 직렬로 연결할 때 CDS의 왼쪽가는 5V와 연결하고
CDS의 다른 한쪽은 저항과 연결 저항의 가장 오른쪽은 접지를 연결합니다.
그리고 저항과 CDS가 연결되는 부분에서 신호를 뽑아서 


자신이 보내고 싶은 위치에 신호를 보냅니다.
그럼 CDS의 값을 변화 시킬때마다 값을 확인 할 수 있게 됩니다.
손으로 CDS를 가릴때와 가리지 않을 때를 확인해볼까요?


3편에서 입력에 따른 값의 확인의 소스를 가져와 볼까요?

상단 탭의 파일 => 예제 => 01.Basics => AnalogReaSerial
이곳에 있는 예제를 열어봅니다.


void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1); 
}

이제 이 소스코드를 알고 계실 겁니다.
그럼 여기 소스의 analogRead(A0) 를 대신해서 analogRead(A2) 에 
CDS값을 입력해볼까요?


그럼 이전과 동일하게 시리얼모니터를 통해 값이 읽어지는
것을 확인할 수 있는데요. 손으로 빛을 가리는 양에 따라
시리얼 모니터의 값의 변화를 확인 할 수 있습니다.

우리는 이제 손을 통해 빛의 밝기를 조절해
강의  2편과 3편에서의 LED를 켜거나 끄는 명령을 활용할 예정인데요.









void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);

}

void loop() {

int sensorValue = analogRead(A2);
Serial.println(sensorValue);

if ( sensorValue < 500)
{
digitalWrite(13, HIGH); 
}
else 
{
digitalWrite(13, LOW); 
}
}


우리는 2편과 3편에서 배운 코드를 조합해서
다음과 같은 코드를 만들었는데요.

A2번 단자를 통해 들어오는 값을
sensorValue에 입력하도록 만들고
지정하는 기준값 500보다 낮으면 13포트가 켜지고

아닌 경우에는 13포트가 꺼지도록 프로그램했습니다.

여기서 if(조건식) { 내용 } else{ 내용 }
다음과 같이 동작하도록 하였습니다.

if는 원하는 조건식에서 맞으면 내용이 실행되고
else는 if가 아닌 모든 내용일 때 내용이 실행되도록
제작해둔 조건문입니다.





오늘의 기본 동작 아래과 같이 동작하니 다시 천천히 이해하시고
궁금한 사항은 질문하십시오.

+ Recent posts