[11호]GPS 자동차를 만들어 보자!-1
GPS 자동차를 만들어 보자! -1
글 | 유한대 김경수(neocima3255@naver.com) 外
※ 상기 내용은 2010년에 진행된 유한대학과의 산학연 졸업 작품지원 프로젝트에 일환으로 작성되어진 원고임을 밝힙니다.
1. 서론
가. 개발동기 및 목적
최근 GPS 위성 신호가 민간에 공개된 이후 그 활용도가 사회적으로 증가하고 있고 발전 가능성이 무궁무진해서 나도 한번쯤 GPS를 활용한 작품을 만들어보고 싶었다. GPS 자동차의 개발 목적은 작품을 만들면서 마이크로프로세서와 GPS를 심도 있게 공부하고 그것을 구현해 내는 것이다.
나. 과제 해결 방안 및 과정
1) 과제해결방안
GPS 자동차를 구성하고 있는 부품들에 대해서 충분히 공부를 하고 이해를 해서 활용할 줄 알아야 한다. 작품을 만들기전 단계별로 계획을 세우고 그 계획대로 조금씩 작품을 완성해 나간다. 우선 기본적으로 우리 조가 구상하고 있는 GPS 자동차는 지그비 모듈과 지그비 조정기를 활용해서 조정기로 수동 조작을 할수 있고, GPS 모듈을 이용하여 GPS 위성데이터를 수신해서 ATMEGA128을 통해 데이터를 필터링 하고 그 필터링한 데이터값을 이용해서 지정된 좌표로 모터를 구동해서 이동한다. 1단계로는 DC모터와 모터드라이버, ATMEGA128을 통해서 DC모터를 구동하고 지그비와 지그비 조정기를 사용해서 수동 조작을 하는 RC카 만들기이다. 2단계로는 차체에 GPS 모듈을 장착해서 GPS 데이터를 GPS 자동차가 수신받고 그 수신받은 데이터를 ATMEGA128 프로세서를 통해서 필터링한 후 지그비 통신을 통해 PC로 그 값을 확인한다. 값을 확인할 때는 PC의 하이퍼 터미널을 통해서 값을 확인한다. 3단계로는 PC에서 프로그램을 통해 목표 좌표를 지정해서 지그비로 GPS 자동차에 데이터를 송신하면 GPS 자동차의 현재 좌표와 수신받은 목표 좌표로 이동거리와 방향을 설정하고 마그네틱 컴파스 센서(나침판 센서)로 방향을 잡고 목표 좌표만큼 DC모터를 구동한다. 4단계로는 GPS 자동차에 초음파 센서를 장착하여 장애물을 탐지하고 피하는 기능을 수행한다. 각 단계별로 작품을 완성하기 위해서는 단계별로 사용된 제품의 매뉴얼이나 데이터 시트를 완벽하게 숙지하고 작품을 만들기전 각 부품을 실습 구현해서 완벽하게 그 부품을 이해하고 활용해야 한다.
2) 과정
가) ATMEGA128을 활용해서 DC모터를 구동.
나) DC모터 드라이버를 활용해서 DC모터를 제어.
다) 지그비 모듈을 이용해서 무선송신.
라) 지그비와 지그비 조정기를 사용해서 통신.
마) GPS 모듈을 사용해서 어떤 데이터가 들어오는지 확인.
바) GPS 데이터를 PC의 하이퍼 터미널로 표현.
사) GPS 데이터를 지그비 통신을 통해 PC로 전송.
아) PC에서 수신받은 GPS 데이터를 확인하고 목표 좌표 데이터를 지그비로 통신.
자) 나침판 센서를 통해서 데이터를 수신받고 수신받은 데이터를 하이퍼 터미널로 구현.
차) 목표 거리만큼 프로그램을 통해 DC모터 제어를 통해 이동.
카) 프로그램 제어를 통해 목표좌표로 GPS 자동차 구동.
2. 제품 제작 과정
가. GPS 자동차의 전원 회로 구성
GPS 자동차의 차체는 디바이스마트에서 판매하는 NT-Destroyer-I 라는 제품이다.
차체에 12V DC 모터가 4개 내장되어 있다. DC모터 연결 선은 커넥터로 연결되어 있다.
1) 모터제어 하드웨어 구성
2) 모터제어 소프트웨어 구성
모터 드라이브의 예제 소스를 이용하여 모터를 제어한다.
모터 드라이버의 핵심 구동 소스는 다음과 같다. 컴파일러는 avr studio를 사용하였다.
#include
#define MOTOR_PORT PORTC //모터 포트 지정
#define MOTOR_DDR DDRC //해당 포트 입출력 설정
#define PWM1_IN (MOTOR_PORT&0×01)
#define PWM1_ON (MOTOR_PORT|=0×01)
#define PWM1_OFF (MOTOR_PORT&=0xFE)
#define DIR1_ON (MOTOR_PORT|=0×02)
#define DIR1_OFF (MOTOR_PORT&=0xFD)
#define ENABLE1_OFF (MOTOR_PORT|=0×04)
#define ENABLE1_ON (MOTOR_PORT&=0xFB)
#define BREAK1_ON (MOTOR_PORT|=0×08)
#define BREAK1_OFF (MOTOR_PORT&=0xF7)
#define PWM2_IN (MOTOR_PORT&0×10)
#define PWM2_ON (MOTOR_PORT|=0×10)
#define PWM2_OFF (MOTOR_PORT&=0xEF)
#define DIR2_ON (MOTOR_PORT|=0×20)
#define DIR2_OFF (MOTOR_PORT&=0xDF)
#define ENABLE2_ON (MOTOR_PORT|=0×40)
#define ENABLE2_OFF (MOTOR_PORT&=0xBF)
void delay (int d){
int i;
for (i=0;1
}
void main (void)
{
MOTOR_DDR = 0xff; // 모터포트 초기화
ENABLE1_ON; // 모터 드라이브 enable
while(1){
// 2초 동안 전진
DIR1_ON;
DIR2_ON;
PWM1_ON;
PWM2_ON;
delay(2000);
PWM1_OFF;
PWM2_OFF;
// 2초 동안 후진
DIR1_OFF;
DIR2_OFF;
PWM1_ON;
PWM2_ON;
delay(2000);
PWM1_OFF;
PWM2_OFF;
}
}
3) ATMEGA128 프로그램 입력
컴파일러 AVR STUDIO로 프로그램을 입력 후 헥사 파일을 만들어서 자동차의 ATMEGA128에 프로그램을 입력하는 과정을 나타내었다.
나. 지그비 조정기를 이용하여 GPS 자동차를 RC카 제어
지그비 조정기는 로보블럭의 지그비 조정기를 사용하였다. GPS 자동차와 지그비 조정기가 서로 무선통신을 하기 위해 지그비 조정기에서 지원하는 지그비 모듈은 사용하지 않고 Xbee pro라는 지그비 모듈을 공통적으로 사용하였다. 지그비 조정기에는 버튼에 따라 20가지 코드값이 출력되어 ATmega128에서 코드를 분석, DC모터를 제어한다.
1) 지그비 하드웨어 구성
23. 지그비 조정기의 사진이다.24. AA전지를 두 개 연결하고 서포터를 연결하기 위한 구멍을 드릴로 뚫는다.
아래 코드는 지그비 조정기의 버튼이 출력하는 코드를 나타낸 표이다.
2) 지그비 소프트웨어 구성
아래 소스를 자동차의 ATmega128에 적용하면 버튼이 눌림에 따라 코드값을 지그비로 받아서 Switch, Case문으로 각 코드마다 구별하여 모터를 구동한다.
#include
#include
int putchar(int data);
int getchar(void);
int seg();
#define MOTOR_PORT PORTC
#define MOTOR_DDR DDRC
#define PWM1_IN (MOTOR_PORT&0×01)
#define PWM1_ON (MOTOR_PORT|=0×01)
#define PWM1_OFF (MOTOR_PORT&=0xFE)
#define DIR1_ON (MOTOR_PORT|=0×02)
#define DIR1_OFF (MOTOR_PORT&=0xFD)
#define ENABLE1_OFF (MOTOR_PORT|=0×04)
#define ENABLE1_ON (MOTOR_PORT&=0xFB)
#define BREAK1_ON (MOTOR_PORT|=0×08)
#define BREAK1_OFF (MOTOR_PORT&=0xF7)
#define PWM2_IN (MOTOR_PORT&0×10)
#define PWM2_ON (MOTOR_PORT|=0×10)
#define PWM2_OFF (MOTOR_PORT&=0xEF)
#define DIR2_ON (MOTOR_PORT|=0×20)
#define DIR2_OFF (MOTOR_PORT&=0xDF)
#define ENABLE2_ON (MOTOR_PORT|=0×40)
#define ENABLE2_OFF (MOTOR_PORT&=0xBF)
void main (void)
{
MOTOR_DDR = 0xff; // 모터포트 초기화
ENABLE1_ON;
DDRE=0×02; //UART1로 통신을 위한 입출력 설정
UBRR1H=0; //UART1로 통신을 위한 초기 설정
UBRR1L=103;
UCSR1A = 0×00;
UCSR1B=0X18;
UCSR1C = 0×06;
while(1){
putchar(getchar()); //UART1로 데이터를 받아서 모터 구동
}
}
int putchar(int data)
{
while(!(UCSR1A&0X20));
UDR1=data;
seg(); //모터 구동 함수
}
int getchar(void)
{
while(!(UCSR1A&0X80));
return UDR1;
}
int seg() //모터 구동 함수
{
switch(UDR1)
{
case 0×01: BREAK1_OFF; // 전진
DIR1_ON;
DIR2_ON;
PWM1_ON;
PWM2_ON;
delay(1000);
BREAK1_ON;
PWM1_OFF;
PWM2_OFF;
break;