[Arduino] 아두이노 RC카 대회

학교에서 했던 초음파 센서와 적외선 센서를 이용한 RC카 자율주행 프로그램을 할 때 했던 코드.

// 35.5

#define front 4
#define back 2
#define fronttrig 5
#define frontecho 6
#define backtrig 8
#define backecho 7
#define IR_R_PIN 2
#define IR_L_PIN 4

// 방향
#define DIR_R 10
#define DIR_L 12
// 속도
#define PWM_R 3
#define PWM_L 11

int value_L, value_R;
int n = 0;

float length, b_distance, f_distance;

void setup() {
  Serial.begin(9600);

  // IR 센서
  pinMode(IR_R_PIN, INPUT);
  pinMode(IR_L_PIN, INPUT);

  // 모터
  pinMode(DIR_R, OUTPUT);
  pinMode(DIR_L, OUTPUT);

  pinMode(PWM_R, OUTPUT);
  pinMode(PWM_L, OUTPUT);

  pinMode(3, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);

  // 초음파 센서
  pinMode (fronttrig, OUTPUT);
  pinMode (frontecho, INPUT);
  pinMode (backtrig, OUTPUT);
  pinMode (backecho, INPUT);
}

void loop() {
  value_L = digitalRead(IR_R_PIN);
  value_R = digitalRead(IR_L_PIN);
  
  if (value_R == 1 && value_L == 1) {
    Forward(95);
    // 왼쪽 반응
  } else if (value_L == 1 && value_R == 0) {
    delay(25);
    Backward(160);
    delay(215);
    Turn_Left(253);
    delay(360);
    // 오른쪽 반응
  } else if ( value_L == 0 && value_R == 1){
    delay(25);
    Backward(160);
    delay(215);
    Turn_Right(253);
    delay(350);
    // 오른쪽 반응
  } else if ( value_L == 0 && value_R == 0){
   delay(100);
   Backward(80);
   delay(500);
   Turn_Right(100);
   delay(100);
  }
}

void Forward(int val) {
  digitalWrite(DIR_R, HIGH);
  digitalWrite(DIR_L, HIGH);
  analogWrite(PWM_R, val);
  analogWrite(PWM_L, val);
}

void Backward(int val) {
  digitalWrite(DIR_R, LOW);
  digitalWrite(DIR_L, LOW);
  analogWrite(PWM_R, val);
  analogWrite(PWM_L, val);
}

void Stop() {
  analogWrite(PWM_R, 0);
  analogWrite(PWM_L, 0);
}

void Turn_Right(int val) {
  digitalWrite(DIR_R, LOW);
  digitalWrite(DIR_L, HIGH);
  analogWrite(PWM_R, 0);
  analogWrite(PWM_L, val);
}

void Turn_Left(int val) {
  digitalWrite(DIR_R, HIGH);
  digitalWrite(DIR_L, LOW);
  analogWrite(PWM_R, val);
  analogWrite(PWM_L, 0);
}

//
//void f_ultrasound() {
//  digitalWrite(backtrig, HIGH);
//  delay(1);
//  digitalWrite(fronttrig, HIGH);
//  delay(10);
//  digitalWrite(fronttrig, LOW);
//  length = pulseIn(frontecho, HIGH);
//  f_distance = ((float)(340 * length) / 10000) / 2;
//  Serial.print("front");
//  Serial.print(f_distance);
//  Serial.println("cm");
//}
//
//void b_ultrasound() {
//  digitalWrite(backtrig, LOW);
//  delay(1);
//  digitalWrite(backtrig, HIGH);
//  delay(10);
//  digitalWrite(backtrig, LOW);
//  length = pulseIn(backecho, HIGH);
//  b_distance = ((float)(340 * length) / 10000) / 2;
//  Serial.print("back");
//  Serial.print(b_distance);
//  Serial.println("cm");
//
//  if (b_distance < 20.0) {
//    digitalWrite(LED_BUILTIN, HIGH);
//  }
//}

모터의 변수 값을 조정하면서 최적의 수치만 찾으면 기록은 빨리 단축 시킬 수 있었다.

댓글남기기