아두이노 로봇카
File
Link
Contents
※ 첨부된 ppt 자료이외에 프라이봇 쇼핑몰 초보자를 위한 가이드 게시판 1~2번 "아두이노 로봇 가지고 놀기" 온라인 실습교재 : ABOT실습교재[제1부].pdf ABOT실습교재[제2부].pdf" 자료를 참고할 수 있습니다.
아두이노 로봇카 실습 세부목차
4. 더듬이센서로 주행하기
6. 적외선센서로 주행하기
7. 주행거리 제어하기
※ 본 페이지의 내용은 패럴렉스(Learn.Parallax.com)사의 공식 홈페이지에서 제공되는 자료를 참고하여 작성되었습니다. 또한, 본 내용은 아두이노 neo-로봇카v2 또는 아두이노 로봇카N 키트실습에 사용할 수 있습니다.
본 자료의 원문을 참조하려면 패럴렉스 사의 아두이노를 위한 로보틱스 홈페이지를 방문할 수 있습니다. 이 자료의 로봇카 모든 제어명령 및 센서신호 수집작용은 프라이비 보드 또는 아두이노를 통하여 수행됩니다. 프라이비 보드는 아두이노 우노와 동일한 ATmega328P 마이컴이 사용된 호환보드이며, 아두이노 우노와 동일한 사용법이 적용됩니다.
아두이노를 처음 시작하는 분이나, 아두이노 프로그래밍에 익숙하지 않은 분은 아래 실습내용을 따라하기 바랍니다. 프로그래밍 기술은 C언어 문법을 사용합니다. 아래 내용의 링크를 선택해서 각자 필요한 내용을 먼저 살펴볼 수 있습니다.
아래 세부 내용들을 살펴볼 수 있습니다.
1) Hi 출력하기
2) 값을 저장하고 읽기
3) if 조건문으로 판단하기
4) for 반목문으로 숫자를 세고 제어를 반복하기
아래 로봇카에서 사용된 프라이비 보드는 아두이노 우노와 동일한 입/출력 핀 구조를 가지고 있습니다. 프라이비 에듀 보드와 USB2.0 A to B 케이블을 준비하고, 아두이노 홈페이지(www.arduino.cc)에서 최신 아두이노 IDE 프로그램을 다운로드 받아 설치합니다.
이제 로봇카를 동작하기 위한 아두이노 프로그래밍 방법을 시작할 준비가 되었습니까? 아래 Hi 문장을 모니터에 표시하는 것부터 천천히 시작해봅시다. 당신이 지금 첫걸음을 시작했다면 이미 전문가에 가까이 다가서기 시작했습니다.
void setup(){
Serial.begin(9600);
Serial.print("Hi !");
}
void loop()
{
}
프라이비 보드를 PC와 연결하고, 위의 스케치를 업로드합니다. Serial.print("Hi !"); 문장에서 괄호안 ""의 내용을 당신의 기호에 맞도록 변경해서 다시 시도해봅시다! 또 다른 내용으로 출력됩니까? 만약 모니터에서 한번만 출력하지 않고 연속적으로 "Hi !" 문장을 출력하려면
Serial.print("Hi !"); 문장을 setup( ) 함수에 넣지 말고 loop( ) 함수에 넣어서 업로드하면 됩니다. 반복하여 출력되는 시간을 조절하려면 delay(1000); 이라는 문장을 추가하십시오. 여기서 괄호안 숫자 1000은 1000ms 를 의미하고 1초와 같은 시간입니다. 출력되는 문장이 줄을 바꿔서 표시되려면 print( ) 함수 대신 printf( ) 함수를 사용하면 됩니다.
Serial.printf("Hi !");
모니터에서 출력하는 문장의 내용은 간단히 프라이비 보드에 연결된 다양한 센서 출력값으로 변경 표시할 수 있습니다.
2) 값을 저장하고 불러오기
컴퓨터에서 어떤 값을 저장하거나, 불러오려면 변수(variable)를 사용해야 합니다. 변수는 컴퓨터 프로그램 외부 또는 프라이비 입/출력 핀을 통한 값의 입출력 그리고 마이컴의 내부 메모리에 저장하거나 가져올 때 사용하는 이름입니다. 변수는 반드시 C-언어처럼 선언되어야 정상적인 동작을 합니다.
정수형 변수 선언 int a = 42;
문자형 변수 선언 char c = 'K';
실수형 변수 선언 float root4 = sqrt(4,0);
int a = 42; 문장은 변수 a 가 정수형 변수로 선언되고, 동시에 변수 a 초기값이 42 라는 것을 선언한 것입니다, 변수값 범위는 -32,768에서 32767 범위를 갖습니다. 유사한 방법으로 문자형 변수와 실수형 변수를 각각 선언하여 스케치에서 활용할 수 있습니다. 변수 선언 및 초기화 수단으로 어떤 값을 메모리에 저장하는 방법을 소개했습니다. 이제 메모리에 저장된 값을 어떻게 꺼낼 수 있을까요?
가장 간단한 방법 한가지는 함수의 매개 변수로 전달하여 사용하는 것입니다. 다시 말하면, 조금전 사용했던 printf( )함수에 어떤 특정 문장을 대신하여 메모리에 저장된 어떤 값을 여러분의 컴퓨터 모니터에서 출력할 수 있는데, 예를 들면 print(a); 또는 printf(c); 또는 printf(root4); 라는 표현으로 바꾸어 사용할 수 있습니다.
전역(Global)변수와 지역(Local)변수
하나의 함수블록 안에서만 변수로 선언하는 것을 지역변수라고 하고, 두 개 이상의 함수블록 벗어나서도 변수로 사용하려면 전역변수로 선언해야만 합니다. 지역변수 선언을 전역변수선언으로 변경하는 방법은 매우 간단해서, 중괄호 안에서 선언했던 문장을 setup( ) 함수가 시작하기 전의 함수 외부로 옮겨 선언하기만 하면 됩니다.
setup(){
Serial.begin(9600);
int a = 42; // 지역변수 선언방법
char c = 'K';
float root4 = sqrt(4.0);
Serial.println(a);
Serial.println(c);
Serial.println(root4);
}
void loop(){
}
int a = 42; // 전역변수 선언방법
char c = 'K';
float root4 = sqrt(4.0);
setup(){
Serial.begin(9600);
Serial.println(a);
Serial.println(c);
Serial.println(root4);
}
void loop(){
}
로봇카의 자율제어 동작을 위해서는 여러 가지 판단하는 단계가 필요합니다. 컴퓨터의 판단은 기본적으로 사람처럼 복잡한 상황판단을 요구하는 것이 아닌 가장 간단한 논리적 판단의 연속작용이라고 할 수 있습니다. 가장 간단한 로봇카 제어용 논리적 제어 판단에 필요한 문장이 if 조건문입니다.
if 조건문에서는 두 개의 변수 값을 서로 비교 판단할 논리 연산자( > , < , >= , <= , == , != )들을 사용하는데, 그 중에서 "a 가 b 보다 크다" 라는 논리적 표현으로 "a > b" 라는 표현을 사용합니다.
if (a>b) { }
if 조건문의 의미는 a 변수 값이 b 변수 값보다 크면 if 조건문의 { } 내부 문장들을 모두 실행하고, 만약 a 변수 값이 b 변수 값보다 크지 않다면 { } 내부 문장을 모두 실행하지 않는다는 문법적 의미를 담고 있습니다.
여기에 덧붙여서 만약 a 변수 값이 b 변수 값보다 크지 않은 조건에서는 또 다른 문장들을 실행하기 위해 else 라는 조건문을 추가하면 됩니다. 아래 두가지 종류의 중괄호 문장 내용이 동시에 출력되는 일은 절대 발생하지 않습니다.
if (a>b) { 조건에 긍정하는 조건문장 }
else { 조건에 부정하는 조건문장 }
아래 스케치 문장을 업로드해서 모니터에 출력되는 문장을 살펴보고, a 변수와 b 변수의 값을 서로 바꿔서 다시 업로드하고 출력되는 문장을 살펴봅시다. 지금은 직접 변수값을 임의로 입력하여 사용하지만, 로봇카 제어에서는 어떤 센서의 출력값을 각각의 변수 a 또는 변수 b 의 값으로 연결해서 사용할 수 있습니다. 이런 경우는 여러분이 변수 a 변수 b 의 값을 직접 변경해서 나타나는 출력효과가 순간적으로 일어날 수 있고, 로봇카의 자율주행에서도 유용하게 사용될 수 있습니다.
int a = 5;
int b = 4;
setup(){
Serial.begin(9600);
if(a > b) {
Serial.print("Hi ! ");
}
else {
Serial.print("Hello !");
}
}
void loop(){
}
if ~ else 조건문은 긍정 조건과 부정 조건 두가지 그룹으로 판단하는 방법입니다. 조금 더 다양한 조건문을 표현하기 위해서 아래 문장 구조를 활용할 수 있습니다. 지금부터 if ~ else if ~ else 문장에 관하여 설명할 것입니다. 아래 조건문은 두 가지 이상의 세부적인 조건으로 동작을 실행하기 위하여 사용합니다. 반드시 조건 사이의 중복이나 논리적 오류가 없도록 구성해야 합니다.
if(a > b) {
Serial.print("a is greater than b");
}
else if(a < b) {
Serial.print("b is greater than a");
}
else {
Serial.print("a is equal to b");
}
if 조건문에서 사용하는 연산자로 && 그리고 || 연산자를 사용할 수 있어서 훨씬 더 복잡하고 다양한 조건문을 만들어서 지능적으로 동작하는 로봇카를 구현할 수 있습니다. && 연산자는 논리적 AND 를 의미하고, || 연산자는 논리적 OR 을 의미합니다.
예를 들어 a 변수값이 10보다 크고, b 변수값이 10보다 작은 조건을 동시에 만족하는 조건문은 아래와 같이 표현할 수 있습니다.
if((a > 10) && (b < 10)) {
Serial.print("적당한 범위 속에 있습니다.");
}
그리고 조건문의 a 변수값이 100보다 큰 값이거나, 또는 b 변수값이 0 보다 작은 값의 조건중 하나를 만족하는 경우 아래 문장으로 표현할 수 있습니다.
if((a > 100) || (b < 0)) {
Serial.print("위험 상황 !");
}
마지막으로 a 변수값과 b 변수값이 정확하게 일치하는 조건을 표현하는 문장은 다음과 같습니다. 만약 일치하지 않는 조건을 사용하려면 아래 또 다른 표현을 사용합니다.
if(a == b) {
Serial.print("a와 b는 같다.");
}
if(a != b) {
Serial.print("a와 b는 같지않다.");
}
아두이노 스케치에서 사용하는 loop( ) 문이 반복문의 동작을 수행합니다. 이제 사용자의 필요에 따라 선택적으로 반복하는 명령을 수행하기 위해서는 for 반복문 또는 while 반복문을 사용해야 합니다. 두가지 반복문 사용방법은 조금 다르지만, 기본적인 원리는 동일하므로, 여기서는 for 반복문을 중심으로 설명합니다.
void setup(){
Serial.begin(9600);
for(int i=1;i<=5;i++){
Serial.println(i);
}
}
void loop(){
}
for 반복문은 문장내에서 세미콜론 ; 으로 분리된 3가지 요소에 의해 반복문 중괄호 { } 내의 문장들에 대한 반복의 조건 및 횟수가 결정됩니다. 예를 들어 다음의 for 반복문장을 살펴봅시다!
for ( int i = 1 ; i <= 10 ; i++) {
Serial.println(i);
delay(500);
}
먼저 for 반복문에서는 사용하는 변수 i 를 선언하는 요소와, 반복이 진행되는 조건을 의미하는 조건문 요소, 그리고 i 변수값이 반복이 실행될 때마다 어떻게 바뀌는지를 정의한 증분 요소가 표시됩니다. 예를 풀어서 설명하면, i = 1 에서 시작하여, i 값이 10 이 될때까지 중괄호 문장들을 실행한다는 의미이고, 증분에 해당하는 i++ 는 1 씩 증가시키는 연산을 의미합니다. 이제 for(int i=1;i<=5;i++) 반복문에 대하여 왜 1부터 5까지 숫자가 출력되었는지 이해할 수 있습니까? 여러분은 for 반복문에서 초기값 설정과 반복의 조건 그리고 증분을 각각 다르게 변경하여 사용할 수 있습니다.
이전 페이지로 다음 페이지로