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

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

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

 

실제로 외부에서 많이 사용되는 일반적인 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가 아닌 모든 내용일 때 내용이 실행되도록
제작해둔 조건문입니다.





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

 

실제 프로그램에서는 어떤 내용이 들어갈지는 아이디어를 설계한 사람이 넣어줘야

하는데요. 그것은 요리 하는 행동과 비슷합니다.

 

예를 들자면 라면을 끓일 때 냄비에 물을 붓고 일정시간 가열하고 적정온도가 되면

라면회사에서 알려주는 레시피 대로 재료를 넣고 더 끓이면 완성 되겠죠.

 

간단한 레시피가 익숙해 있지 않은 사람이 처음부터 라면을 끓여본다.

이건 어떻게 보면 어렵지만...

시간이 지난 후에 라면을 만들어 먹는건 아주 쉬운 행동이었어요.

 

프로그램도 마찬가지 처음에는 기술적으로 배워야 하는 내용이 무엇인지 정도를 이해하는

것입니다.

 

요리에서 무언가를 만들기 위해 가열을 하게 되는데요.

프로그램도 원하는 형태의 내용을 작성할 때 최종적으로 회로 기판에 넣는 작업을

우리는 컴파일하고 업로드 한다고 이야기 합니다.

 

여기서 전문용어가 하나 나오내요. 컴파일과 업로드

컴파일은 실제 기계 내부에서 가장 상단에 만들어진 개발자의 프로그램을

기계언어로 변화하는 과정이고요.

업로드는 기계언어로 만들어진 파일을 회로기판에 넣을 수 있도록 하는 과정을

간단히 이야기 합니다.

 

 

물론 이 내용을 더 복잡하게 다양한 단어로 표현하지만

아직은 어려운 단어들을 최대한 적게 쓰는 것이 좋으니

이해하기 쉬운 그대로 컴파일 업로드 정도로 생각하면됩니다.

 

프로그램을 제작하게 될 때 좀 전에 이야기한 요리에서 가열하는 것과

컴파일은 동일하다고 생각하면 되고 업로드 하는 것은 만들어진 프로그램 파일을

PC에서 회로 기판으로 옮겨담는 과정이라고 생각하면 쉽습니다.

마침 큰 냄비에서 끓인 라면을 실제로 먹는 그릇으로 옮겨 담는다고 표현하면 좋겠네요.


 

아두이노를 열게되면, 상당에 탭 중에 스케치를 눌러서 들어가면 확인/컴파일업로드

내용이 있습니다.

그리고 단축키도 있는데요.


 

상단 탭 바로 아래 둥근모양이 그림에 보이죠. 체크동그라미가 확인/컴파일이고 우측화살표 모양이 업로드입니다.

 

 

 

 

 

 

하나씩 순서대로 눌러 볼까요?

다음과 같은 과정이 진행 후 최종적으로 컴파일 완료라고 뜨게 됩니다.

 



 

 

다음이 업로드를 누르면 프로그램이 다운로드 되는데요.

업로드를 누르면 컴파일이 되고 난 후 아두이노에 프로그램을 업로드 합니다.

 

그런데 그냥은 안되고 오류가 뜨게 됩니다.

다음과 같이 보드에 로딩중에 문제 발생 이라고 뜨게 되죠.


 

동작이 안되고 에러가 뜬다고 당황하시면 안됩니다.

 

컴파일 후에 컴파일 완료는 되었는데 프로그램이 안되는 이유는

다음과 같이 발생될 수 있습니다.

 

 

 

사용되는 보드가 맞는지 확인을 해봐야 됩니다.

 

=> 보드 => Arduino/Genuino Uno 로 선택해서

자신이 현재 사용되는 보드를 선택했는지

 

다른 한 가지는

 

PC에서 프로그램 후 아두이노로 프로그램을 연결해야하는데..

겉으로 보기에는 USB 단자로 연결했는데..

속으로 연결 안된 경우가 많습니다.

속이 연결 안되었다는 것은 PC의 흔히 이야기하는 포트가 잘못 연결되었다고

생각하면 되는데요.

우리가 누군가에게 전화걸 때 잘못 전화된 것과 동일하다가 생각하시면

간단합니다.

아두이노라는 회로를 USB로 연결했는데 다른 번호를 선택했다면 수정하면 되겠죠.

 

상단의 툴 탭을 누르고 아래 중간쯤 보다 조금 밑에 포트:”라는 탭이 있죠.

거기서 자기가 실제 연결되고 있는 포트에 연결을 해줍니다.

제꺼는 COM4(Arduino/Genuino Uno) 가 새로 생성되어 있는데요.

그것으로 연결을 합니다.

 

 

==========================================

혹시 포트가 잡히지 않는 분은 여기 부분을 참고해주세요.

 

PC를 우측마우스로 클릭 하면 아래와 같이 속성이 나오면 클릭

시스템 화면에 들어가면 좌측의 장치 관리자 클릭

장치관리자에서 펼처진 화면이 나올 수 있으나 우선 다음과 같이 보여드립니다.

 


 

 

장치관리자에서 포트(COM & LPT) 부분으로 내려가서 확인해 봅니다.

USB를 꼽았을 때와 빼졌을 때 Arduino Uno로 인식되어 옆에 COM4가 몇 번으로

  인식되는지 바로 확인 가능할 겁니다.

 


대게의 경우 포트의 번호가 USB와 연결 될 때와 몇 번이 된다 라고 확인이 가능하지만

여기서 인식은 되지만 알 수 없는 장치로 뜨거나 문제가 발생할 경우

USB 드라이버를 다시 설치해야합니다.

다시 말해 아두이노를 설치할 때 USB를 인식하는 장치를 잘못 설치 했을 수 있기 때문에

귀찮더라도 그냥 아두이노를 다시 설치하시는게 좋을 것 같습니다.

 

================================================================

 

별문제 없을 경우 COM포트가 잡히게 되는데 컴퓨터 마다 조금 다르게 인식될 수 있으므로

아두이노를 연결 시 몇 번으로 연결되는지 확인하고 연결하시면 됩니다.

 

제대로 연결된 상태에서 우측화살표 모양인 업로드 모양을 다시 클릭해보면

아래와 같이 업로드 완료와 “avrdude done. Thank you.”라는 메시지가

 상태 창에 나타납니다.

 


 

업로드가 원활하게 진행되었다면 이제 프로그램까지 보드로

옮길 수 있는 상태에 이르렀습니다.

 

 

그럼 가장 간단한 프로그램 입문하기 전에 지금까지 무언가 쓰여져 있는 내용을

그대로 컴파일이란 작업으로 눌려서 다운했는데 무엇인지 내용을 확인해보죠





 

void setup()하고 {}괄호를 치고 또 밑엔는

void loop()하고 괄로 하고 이렇게 되어 있었습니다.

 

void setup()이라는 부분은 { } 그 괄로 안에 실제 사용할 부분을 미리 알려둔다 라고 생각하면됩니다.

우리는 이것을 선언한다고 이야기하는데요.

우리가 실제 프로그램에서 사용할 내용을 설정하는 구문 이렇게 정도 이해하면 좋을 것 같습니다. 미리 설정해 놔야 컴퓨터도 아 내가 나중에 무얼 사용할 꺼니까 준비해야지 하고

준비단계를 만드는 겁니다.

 

void loop()라는 부분 안의 내용은

이제 입력이나 출력부분을 프로그램하는 부분이라고 이해하면 쉽니다.

그런데 한번만 동작되고 끝 나는게 아니라

기계는 계속적 반복을 하니까 지속적으로 동작 되도록

한다고 생각하시면 쉬울 겁니다.

 


 

이제 간단한 이해를 돕기 위해 LED를 한번 깜박여 보겠습니다.

 

LED를 깜박이는 예제 중에 이미작성된 내용이 있으니 한번 가져와 보죠

상단탭에서 파일 => 예제 => 01.Basics => Blink를 클릭해보시죠

 





 

아래와 같은 내용으로 예제가 출력될 겁니다.





그런데 아까부터 먼지는 몰라도

// 이런내용과

/* */내용이 보였습니다.

두 개의 명령어는 주석으로 이야기합니다.

한마디로 말해서 프로그램 작성시 내용을

작성자만 표시되고 컴퓨터에게는 작성된 내용을 보이지 않도록 하는 것입니다.

 

왜냐구요. 프로그램의 내용이 길어지면 이해하기 힘든부분도 많이 있기 때문에

가운데 주석이라는 것을 달아서 지금부분은 어떻게 처리됨 하고 표식을

남기는 것이지요.

 

또 한가지는 이제 프로그램을 작성하다가 부분적으로

지우고 테스트 해야겠는데 나중에 또 써야 할때도 있게 되죠.

그런 것을 임시로 보이지 않게 가리는 부분이라고 생각하시면 됩니다.

 

그런데 2개의 범위가 서로 다르다는 점

// 내용작성 : 한 줄 내용을 숨기고 싶을 때

/* 내용작성 */ : 줄과 관계 없이 가려져야 되는 시작과 끝을 표시할때




 

 

 

 

 

 

그러면 실제 작성할 내용의 프로그램을 이해해 봅시다

 

void setup() {

// initialize digital pin 13 as an output.

pinMode(13, OUTPUT);

}

 

// the loop function runs over and over again forever

void loop() {

digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(13, LOW); // turn the LED off by making the voltage LOW

delay(1000); // wait for a second

}

 

있는 내용을 그대로 이해해 보면,

 

void setup 에 있는 내용은 사용하게될 핀의 단자가 몇 번인지 선언을 해주는 겁니다.

pinMode(13, OUTPUT); 이렇게 내용이 쓰이게 될 때

pinModevoid setup에 넣어 줌으로써 나중에 사용하는 LED가 몇 번에

사용 될 꺼니까 미리 넣어 주는 명령어를 하나 배운다고 생각하시면 됩니다.

 

향후에 배워야하는 명령어가 여러 가지 있으니 오늘은 명령어를 5개 이하로 배우도록 할께요

pinMode(13, OUTPUT);

digitalWrite(13, HIGH);

delay(1000);

이것까지 3개만 이해 하십시오

 

 

+ Recent posts