SPAC1 아두이노 2WD 자동차 스마트카 로봇 PART2

PART2에서는 아두이노 보드에 프로그램을 업로드하고 초음파테스트, 모터구동테스트를 거친 후 최종 구동소스로 주행테스트를 진행합니다.

 

PART2 - SPAC1 테스트 및 구동

SPAC1 아두이노 자동차는 아두이노 우노 보드를 사용하여 2바퀴 구동의 스마트카를 구성한 조립키트로서 최소한의 부품으로 구성하여 조립이 간단합니다. 초음파센서로 장애물을 감지하고 회피하며, 2바퀴 모터 구동을 위해 L298N 모터 드라이브 모듈을 사용합니다. PART2에서는 PART1에서 조립된 자동차를 가지고 실제 구동을 해봅니다.

아래 링크로 가시면 아두이노 IDE 소프트웨어 설치파일을 다운로드할 수 있으며 기본적인 아두이노 IDE 사용법을 익힐 수 있습니다.

아두이노IDE 설치 및 사용방법 링크

 

1. 초음파센서 테스트

SPAC1에 사용된 초음파센서는 HC-SR04로서 초음파를 발사하고 물체에 반사되어 오는 초음를 감지하여 물체와의 거리를 측정합니다.

특징

  • 구동전압 : DC 5V
  • 감지거리 : 1-500cm
  • 핀맵 : VCC(5V), TRIG(9), ECHO(8), GND(GND) 괄호는 아두이노 우노 보드연결핀

결선도

아래 링크에서 아두이노 보드용 라이브러리를 다운받아서 아두이노 IDE 소프트웨어가 설치된 디렉토리에서 하위 library 디렉토리에 붙여넣습니다.

라이브러리

 

소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다.

#include <Ultrasonic.h> 

Ultrasonic sensor(9,8,30000); // (Trig핀, Echo핀, 최대거리 단위는 us) 즉 30000us = 약 5미터

int distance = 0; //거리를 저장할 변수를 선언합니다.

void setup() {
  
Serial.begin(9600); //시리얼포트를 초기화합니다.
  
}

void loop() {
  
  distance = sensor.Ranging(CM);  // 거리를 측정하고 distance 변수에 저장합니다.
  Serial.print("Distance "); // "Distance "를 시리얼모니터에 출력합니다.
  Serial.print(distance); // distance 변수에 저장된 값을 출력합니다.
  Serial.println(" cm"); // 센티미터 단위를 출력합니다.
  delay (2000); // 2초간 딜레이를 한 후에 다시 반복합니다.
  
}

다음은 프로그램 업로드 후 시리얼 모니터로 본 결과입니다.

2. L298N 모터 구동 테스트

2바퀴의 직류모터 구동을 위해 L298N 모터드라이브 모듈을 사용합니다. 

특징

  • 디지털 구동전압 : DC 5V
  • 모터드라이브 전압 : 5~35V
  • 디지털 구동 전류 : 0~36mA
  • 드라이브 전류: 최대 2A
  • 동작 모드 : H-bridge

결선도

아래 링크에서 아두이노 보드용 라이브러리를 다운받아서 아두이노 IDE 소프트웨어가 설치된 디렉토리에서 하위 library 디렉토리에 붙여넣습니다.

라이브러리

 

소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다. 전진, 후진, 좌회전, 우회전의 간단한 모터제어를 해볼 수 있습니다.

 

#include <ControlMotor.h> // 라이브러리를 사용합니다.
// 아두이노 보드에서 사용할 핀을 설정합니다.
ControlMotor control(2,3,7,4,5,6); // 우측모터1,우측모터2,좌측모터1,좌측모터2,우측PWM,좌측PWM

int speed = 150; //모터속도를 저장할 변수를 선언합니다. 초기속도는 150입니다.

void setup() 
{
} 
 
void loop() 
{//한쪽 모터는 시계방향, 다른 모터는 반시계방향으로 회전합니다.
//따라서 자동차는 전진을 하게 됩니다. 속도는 점점 증가합니다.
 while(speed < 254){
 speed++;
 control.Motor(speed,1); 
 delay (200);}
//한쪽 모터는 반시계방향, 다른 모터는 시계방향으로 회전합니다.
//따라서 자동차는 후진을 하게 됩니다.
  control.Motor(-180,1);
  delay(3000);
//두 개의 모터가 시계방향으로 회전합니다.
//따라서 자동차는 왼쪽으로 회전합니다.
  control.Motor(200,100);
  delay(3000);
//두 개의 모터가 반시계방향으로 회전합니다.
//따라서 자동차는 오른쪽으로 회전합니다.
  control.Motor(200,-100);
  delay(3000);
//두 개의 모터가 정지합니다.
  control.Motor(0,1);
  delay(3000);
  
  speed = 150;//변수를 재설정합니다.
}

3. SPAC1 아두이노 자동차 구동

이제는 앞의 테스트를 바탕으로 최종적으로 SPAC1을 구동해 봅니다.

 

소스코드

아래는 최종 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다. 초음파센서로 장애물을 확인하고 장애물을 피해서 SPAC1이 이동을 합니다.

 

#include <ControlMotor.h>//모터제어 라이브러리를 사용합니다.
// 아두이노 보드에서 사용할 핀을 설정합니다.
ControlMotor control(2,3,7,4,5,6); // 우측모터1,우측모터2,좌측모터1,좌측모터2,우측PWM,좌측PWM

#include <Ultrasonic.h>//HC-SR04 초음파센서 라이브러리를 사용합니다.
Ultrasonic sensor(9,8,30000); // (Trig핀, Echo핀, 최대거리 단위는 us) 즉 30000us = 약 5미터

int mesurement_speed = 5;//센서 측정 속도를 조정합니다.
long int distance = 0; //거리를 저장할 변수를 선언합니다.
int random_value = 0;//랜덤값을 저장합니다. 

void setup() 
{ 
Serial.begin(9600);//시리얼포트를 초기화합니다.
 
} 
 
void loop() 
{ 
 
  
  control.Motor(150,1);//150의 속도로 자동차가 전진합니다.
  distance=sensor.Ranging(CM);//거리를 측정하고 distance 변수에 저장합니다.

  delay(mesurement_speed);//센서측정 속도를 제어하기 위한 딜레이.
 
 //다음은 장애물이 없는 경우에 해당합니다.
 Serial.print("No obstacle ");//장애물이 없다고 시리얼 모니터에 출력합니다.
 Serial.println(distance);//거리를 출력합니다.
 Serial.print("Random ");//"Random"을 출력합니다.
 Serial.println(random_value);//랜덤값을 출력합니다.

 random_value = random (2);//자동차가 한쪽 방향으로만 회전하는 것을 막기 위해 랜덤값을 만듭니다.
  
  
  while(distance<30){//장애물과의 거리가 30cm이하일 경우에 적용됩니다.
        
  
  delay(mesurement_speed);//센서측정 속도를 제어하기 위한 딜레이.
  control.Motor(0,1);//모터를 정지시킵니다.
  distance = sensor.Ranging(CM);
  delay(1000);

  if(random_value==0){// 랜덤값이 0인경우에 해당됩니다.
 Serial.print("Distance ");//"Distance "를 시리얼모니터에 출력합니다.
 Serial.println(distance);//거리를 출력합니다.
 Serial.print("Random ");//"Random"을 출력합니다.
 Serial.println(random_value);//랜덤값을 출력합니다.
 
  control.Motor(170,100);//자동차가 0.4초동안 오른쪽으로 회전합니다.
  delay(400);}
  
  else if (random_value==1){//랜덤값이 1인경우에 해당됩니다.
 Serial.print("Distance ");//"Distance "를 시리얼모니터에 출력합니다.
 Serial.println(distance);//거리를 출력합니다.
 Serial.print("Random ");//"Random"을 출력합니다.
 Serial.println(random_value);//랜덤값을 출력합니다.
 
  control.Motor(170,-100);//자동차가 0.4초동안 왼쪽으로 회전합니다.
  delay(400);}
  }
} 

Topic: 

Tags