October 17, 2018

디바이스마트 미디어:

[11호]GPS 자동차를 만들어 보자!-1

11FGPS038GPS 자동차를 만들어 보자! -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) 모터제어 하드웨어 구성

11FGPS003 11FGPS014
1. 자동차의 차체 모습이다. 4개의 DC모터가 연결되어 있다. 2. 자동차의 차체 내부 모습이다.
4개의 DC모터 선이 연결되어 커넥터에 연결되어 있다.
11FGPS025 11FGPS036
3. 차체에 드릴로 구멍을 뚫어서 서포터로 위에 기판을 고정한다. 4. 기판은 200 x 300 기판으로
기판에 구멍을 뚫어서 차체와 서포터로 고정시킨다.
11FGPS039 11FGPS040
5,6. 자동차의 배터리는 11.1V 2200mA의 리튬 폴리머 배터리로 ATMEGA128의 전원과 모터드라이버의 전원을 각각 하나씩 공급한다.(ATMEGA128에 한 개, 모터 드라이버에 한 개 각각 전원 공급)
11FGPS041 11FGPS042
7,8. 기판에 ATmega128, 모터 드라이버를 기판에 드릴로 뚫은 후 서포터와 나사로 고정시킨다. ATmega128은 [(주)뉴티씨] ATMEGA128Pro (KD-128PRO-C) 제품으로 외부전원 12V 입력, 내부동작 5V 단일 전원을 사용하고 7805가 내장되어 있어 5V출력 단자가 많다.
11FGPS043 11FGPS004
9,10. 모터 드라이버는 [(주)뉴티씨]DC 모터 구동모듈 Dual 2A (AM-DC2-2D)로 두 개의 모터를 제어할 수 있고 최대 전류는 2A 구동 전압은 5V∼45V이다. 컨트롤 신호에 10핀 커넥터로 ATmega128의 PORTC에 연결되고 전원 공급 핀에 리튬폴리머 배터리가 연결된다.
11FGPS005 11FGPS006
11FGPS007 11FGPS008
11,12,13,14. 차체에 기판을 고정시킨다. 차체와 기판에 드릴로 구멍을 뚫고 서포터와 나사로 고정시킨다.
11FGPS009 11FGPS010
15,16. 기판에 배터리를 연결시킨다. 배터리 연결 선은 연장선으로 연장하여 기판의 커넥터에 그림과 같이 연결 시킨다. 모터 커넥터 역시 그림처럼 모터 드라이브에 연결 시킨다.

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에 프로그램을 입력하는 과정을 나타내었다.

11FGPS011 11FGPS012
17. 프로그램을 시작하면 프로그램을 저장할 위치를 지정한다. 18. 컴파일러할 부품을 선택한다. GPS자동차의 경우 ATMEGA128로 선택한다.
11FGPS013 11FGPS015
19. 프로그램 작성 화면이다. 프로그램은 C언어로 작성하였다. 프로그램이 작성되면 F7키를 눌러서 에러가 없으면 HEX파일이 생성된다. 20. 생성된 HEX파일을 ATMEGA128모듈에 저장하는 화면이다. Flash부분에서 저장할 HEX파일을 선택하고 Program버튼을 누르면 저장된다.
11FGPS016 11FGPS017
21. ATMEGA128에 프로그램을 저장하기 위해 PC와 연결된 모습이다. USB를 통해서 연결된다. 22. 프로그램이 ATMEGA128로 성공적으로 저장이 되면 빨간 박스안처럼 OK가 나타나고 ATMEGA128에 프로그램이 저장된다.

나. 지그비 조정기를 이용하여 GPS 자동차를 RC카 제어

지그비 조정기는 로보블럭의 지그비 조정기를 사용하였다. GPS 자동차와 지그비 조정기가 서로 무선통신을 하기 위해 지그비 조정기에서 지원하는 지그비 모듈은 사용하지 않고 Xbee pro라는 지그비 모듈을 공통적으로 사용하였다. 지그비 조정기에는 버튼에 따라 20가지 코드값이 출력되어 ATmega128에서 코드를 분석, DC모터를 제어한다.

1) 지그비 하드웨어 구성

23. 지그비 조정기의 사진이다.24. AA전지를 두 개 연결하고 서포터를 연결하기 위한 구멍을 드릴로 뚫는다.

11FGPS018 11FGPS019
11FGPS020 11FGPS021
25. 드릴로 뚫은 구멍에 서포터를 고정한다. 26. 연결할 지그비 모듈을 PCB 변환기판에 연결하여 일반 기판에 고정시킨다.
11FGPS022 11FGPS023
27,28. 지그비 모듈을 지그비 조정기에 설치한 모습이다. 일반 기판에도 구멍을 뚫어 서포터로 고정한다
11FGPS024 11FGPS026
29,30. 지그비 모듈은 Xbee pro라는 모듈로 3.3V에서 동작을 하고 무선 통신 최대 거리 1.6km에 2mm 핀 간격을 가진 모델이다. 자동차에 설치된 기판은 2.5mm 기판이므로 2mm 핀간격을 2.5mm 기판에 부착하기 위해 간단한 PCB를 제작하여 GPS 자동차에 설치하였다.
11FGPS027 11FGPS028
31,32. PC에도 똑같은 지그비 모듈인 Xbee pro를 사용하는데 PC와 지그비 모듈을 연결하기 위해 역시 지그비 인터페이스 보드가 필요하다. 지그비 인터페이스 보드는 usb연결로 usb케이블을 통해 연결된다.
11FGPS029
33. 지그비가 통신을 하기 위해서는 3.3V의 전압이 인가되어야 한다. 하지만 ATMEGA128의 출력 전압은 5V라서 레귤레이터를 통해 5V를 3.3V로 전압을 바꿔줘야 한다. 필자는 레귤레이터를 LM-1117-3.3 LS라는 레귤레이터를 사용했다. 위 그림은 LM-1117의 데이터 시트이다.LM-1117을 Vin과 Vout 단자에 병렬로 캐패시터가 하나씩 필요하다는 것을 알 수 있다.
11FGPS030
34. 실제 자동차에서 레귤레이터 회로를 구성한 모습. 위와 같이 회로를 구성하면 자동차의 지그비에 3.3V가 인가되어 지그비 통신이 가능하다. ATmega128과 지그비 통신은 UART1로 통신을 한다.

아래 코드는 지그비 조정기의 버튼이 출력하는 코드를 나타낸 표이다.

11FGPS056

 

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;

 

2부에서 계속 이어집니다.

Comments
One Response to “[11호]GPS 자동차를 만들어 보자!-1”
  1. una says:

    안녕하세요 정말 좋은 자료 잘 보고 갑니다!
    제가 지그비 인터페이스로 통신 설정 하는 것이 궁금해서 찾다가 여기 들어오게 되었는데요
    혹시 도움 좀 받을 수 있을까요?

Leave A Comment

*