#include <IRremote.h>//IR리모콘을 사용하기 위한 헤더파일 호출
	//모터드라이버핀과 아두이노의 연결번호
#define EA 3
#define EB 11
#define M_IN1 4
#define M_IN2 5
#define M_IN3 13
#define M_IN4 12
int motorA_vector = 1;
//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.
int motorB_vector = 1;
//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.
int motor_speed = 255;	//모터 스피드
int readIR;	//리모콘으로 부터 들어오는 값을 저장하는 변수
int RECV_PIN = 14;	//적외선 수신센서 모듈과 A0 연결
IRrecv irrecv(RECV_PIN);	//IR읽어오는 핀 지정
decode_results results;
void setup()	//초기화
{
 	//모터관련 핀들을 출력으로 설정한다.
  pinMode(EA, OUTPUT);
  pinMode(EB, OUTPUT);
  pinMode(M_IN1, OUTPUT);
  pinMode(M_IN2, OUTPUT);
  pinMode(M_IN3, OUTPUT);
  pinMode(M_IN4, OUTPUT);
  irrecv.enableIRIn(); //IR 신호 읽어오는 핀 지정
}
void loop()
{
  if (irrecv.decode(&results))	// 새로 수신 된 ir값이 있는지 여부를 확인
  {
    switch (results.value)	// 수신 된 ir값에 따라 case문을 선택
    {
     	//읽어온 IR값과 비교
      case 0x00FF18E7:	// Key 2, 전진
        readIR = 2;
        break;
      case 0x00FF10EF:	// Key 4, 좌회전
        readIR = 4;
        break;
      case 0x00FF38C7:	// Key 5, 정지
        readIR = 5;
        break;
      case 0x00FF5AA5:	// Key 6, 우회전
        readIR = 6;
        break;
      case 0x00FF4AB5:	// Key 8, 후진
        readIR = 8;
        break;
      default:
        break;
    }

    irrecv.resume();	//ir 신호를 수신하기 위한 동작을 호출
  }

  if (readIR == 2)
  {
    motor_con(motor_speed, motor_speed);	//전진
  }
  else if (readIR == 4)
  {
    motor_con(255, 0);	//좌회전
  }
  else if (readIR == 5)
  {
    motor_con(0, 0);	//정지
  }
  else if (readIR == 6)
  {
    motor_con(0, 255);	//우회전
  }
  else if (readIR == 8)
  {
    motor_con(-motor_speed, -motor_speed);	//후진
  }
}

void motor_con(int M1, int M2)	//모터 함수
{
  if (M1 > 0)	//모터A 정회전
  {
    digitalWrite(EA, HIGH);
    digitalWrite(M_IN1, motorA_vector);
    digitalWrite(M_IN2, !motorA_vector);
  }
  else if (M1 < 0)	//모터A 역회전
  {
    digitalWrite(EA, HIGH);
    digitalWrite(M_IN1, !motorA_vector);
    digitalWrite(M_IN2, motorA_vector);
  }
  else	//모터 A 정지
  {
    digitalWrite(EA, LOW);
    digitalWrite(M_IN1, LOW);
    digitalWrite(M_IN2, LOW);
  }

  if (M2 > 0)	//모터B 정회전
  {
    digitalWrite(EB, HIGH);
    digitalWrite(M_IN3, motorB_vector);
    digitalWrite(M_IN4, !motorB_vector);
  }
  else if (M2 < 0)	//모터B 역회전
  {
    digitalWrite(EB, HIGH);
    digitalWrite(M_IN3, !motorB_vector);
    digitalWrite(M_IN4, motorB_vector);
  }
  else	//모터 B 정지
  {
    digitalWrite(EB, LOW);
    digitalWrite(M_IN3, LOW);
    digitalWrite(M_IN4, LOW);
  }
}