SPAC2 적외선센서를 사용한 라인트레이서 주행 실험

아두이노 우노를 이용한 2WD 자동차 스마트카 로봇 SPAC2입니다. SPAC1의 상위모델로 충전용 18650배터리 2개(7.4V)를 사용하여 강력한 구동이 가능하고 오랜 주행이 가능합니다. 여기서는 TCRT5000모듈 2개를 사용하여 라인트레이서 주행실험을 합니다.

1. 센서 결선 및 라인트레이서 주행실험

센서와 아두이노 보드의 결선은 아래와 같이 합니다.

1. 우측센서 결선

VCC - 5V
GND - GND
D0 - 3번

2. 좌측센서 결선

VCC - 5V
GND - GND
D0 - 4번

바닥면의 흑색선을 따라서 주행하는 라인트레이서 주행 실험입니다. 흰색바닥면에 절연테이프 등으로 흑색라인을 그린 후 실험하면 됩니다. 센서의 감도는 센서의 볼륨을 미니 드라이버로 조절하면 됩니다.

 

 

소스코드

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

// SPAC2 라인트레이서 구동실험

int Left_motor_back=8;     //좌측모터후진(IN1)
int Left_motor_go=9;     //좌측모터전진(IN2)

int Right_motor_go=10;    // 우측모터전진(IN3)
int Right_motor_back=11;    // 우측모터후진(IN4)

const int SensorRight = 3;   	//우측센서
const int SensorLeft = 4;     	//좌측센서

int SL;    //좌측센서 상태
int SR;    //우측센서 상태

void setup()
{
  //모터구동을을 위한 초기화
  pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
  pinMode(SensorRight, INPUT); //우측센서포트를 입력으로 정의
  pinMode(SensorLeft, INPUT); //좌측센서포트를 입력으로 정의
}
void run()     // 전진
{
  digitalWrite(Right_motor_go,HIGH);  // 우측모터전진
  digitalWrite(Right_motor_back,LOW);     
  analogWrite(Right_motor_go,50);//PWM값 0~255 조정,모터의 회전속도 조절.
  analogWrite(Right_motor_back,0);
  digitalWrite(Left_motor_go,HIGH);  // 좌측모터전진
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,50);//PWM값 0~255 조정,모터의 회전속도 조절.
  analogWrite(Left_motor_back,0);
  //delay(time * 100);   //딜레이  
}

void brake()         //제동, 정지
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  //delay(time * 100);//딜레이  
}

void left()         //좌회전(좌측정지,우측직진)
{
  digitalWrite(Right_motor_go,HIGH);	// 우측모터전진
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,50); 
  analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,LOW);   //좌측모터정지
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  //delay(time * 100);	//딜레이  
}

void spin_left(int time)         //좌측스핀(좌측후진,우측직진)
{
  digitalWrite(Right_motor_go,HIGH);	// 우측모터전진
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,200); 
  analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,LOW);   //좌측모터후진
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절.
  delay(time * 100);	//딜레이  
}

void right()        //우회전(우측정지, 좌측직진)
{
  digitalWrite(Right_motor_go,LOW);   //우측모터정지
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,HIGH);//좌측모터전진
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,50); 
  analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  //delay(time * 100);	//딜레이  
}

void spin_right(int time)        //우측스핀(우측후진, 좌측전진)
{
  digitalWrite(Right_motor_go,LOW);   //우측모터후진
  digitalWrite(Right_motor_back,HIGH);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,HIGH);//좌측모터전진
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,200); 
  analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  delay(time * 100);	//딜레이  
}

void back(int time)          //후진
{
  digitalWrite(Right_motor_go,LOW);  //우측모터후진
  digitalWrite(Right_motor_back,HIGH);
  analogWrite(Right_motor_go,0);
  analogWrite(Right_motor_back,150);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,LOW);  //좌측모터후진
  digitalWrite(Left_motor_back,HIGH);
  analogWrite(Left_motor_go,0);
  analogWrite(Left_motor_back,150);//PWM값 0~255 조정,모터의 회전속도 조절.
  delay(time * 100);     //딜레이  
}

void loop()
{
  while(1)
  {
  //신호가 있으면 LOW  신호가 없으면 HIGH
  SR = digitalRead(SensorRight);
  SL = digitalRead(SensorLeft);
  if (SL == LOW&&SR==LOW)
    run();   //전진
  else if (SL == HIGH & SR == LOW)// 좌회전 
    left();
  else if (SR == HIGH & SL == LOW) // 우회전  
    right();
  else // 정지
  brake();
  }
}

아래는 주행모습입니다.

 

Topic: