#include 
// ピン定義
const int motor1Pin1 = 6;
const int motor1Pin2 = 7;
const int motor2Pin1 = 4;
const int motor2Pin2 = 5;
const int speakerPin = 13;
const int redLED = 10;
const int greenLED = 9;
const int blueLED = 8;
const int irReceiverPin = 2;
// 赤外線受信オブジェクト
IRrecv irrecv(irReceiverPin);
decode_results results;
void setup() {
  // モータ、LED、スピーカのピンを出力に設定
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  pinMode(speakerPin, OUTPUT);
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(blueLED, OUTPUT);
  // 赤外線受信開始
  irrecv.enableIRIn();
}
void loop() {
  if (irrecv.decode(&results)) {
    unsigned long code = results.value;
    irrecv.resume(); // 次の受信の準備
    switch (code) {
      case 0xFF02FD: // 前
        ledOn(blueLED, 1000);
        moveForward(1000);
        break;
      case 0xFF9867: // 後
        ledOn(greenLED, 1000);
        moveBackward(1000);
        break;
      case 0xFF906F: // 右
        ledOn(redLED, 100);
        turnRight(100);
        moveForward(100);
        break;
      case 0xFFE01F: // 左
        ledOn(redLED, 100);
        turnLeft(100);
        moveForward(100);
        break;
      case 0xFF30CF: // 1
        ledOn(redLED, 1000);
        break;
      case 0xFF18E7: // 2
        ledOn(blueLED, 1000);
        break;
      case 0xFF7A85: // 3
        ledOn(greenLED, 1000);
        break;
      case 0xFF10EF: // 4
        ledOn(redLED, 1000);
        ledOn(blueLED, 1000);
        break;
      case 0xFF38C7: // 5
        ledOn(greenLED, 1000);
        ledOn(blueLED, 1000);
        break;
      case 0xFF5AA5: // 6
        ledOn(greenLED, 1000);
        ledOn(redLED, 1000);
        break;
      case 0xFF42BD: // 7
        ledOn(redLED, 1000);
        ledOn(greenLED, 1000);
        ledOn(blueLED, 1000);
        break;
      case 0xFF52AD: // 9
        asm volatile ("jmp 0"); // Arduinoをリセット
        break;
      default: // その他のボタン
        moveForward(300);
        tone(speakerPin, 1000, 300); // スピーカ鳴らす
        break;
    }
  }
}
// モータ制御関数
void moveForward(int duration) {
  digitalWrite(motor1Pin1, HIGH);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, HIGH);
  digitalWrite(motor2Pin2, LOW);
  delay(duration);
  stopMotors();
}
void moveBackward(int duration) {
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, HIGH);
  delay(duration);
  stopMotors();
}
void turnRight(int duration) {
  digitalWrite(motor1Pin1, HIGH);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, HIGH);
  delay(duration);
  stopMotors();
}
void turnLeft(int duration) {
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin1, HIGH);
  digitalWrite(motor2Pin2, LOW);
  delay(duration);
  stopMotors();
}
void stopMotors() {
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, LOW);
}
// LED制御関数
void ledOn(int pin, int duration) {
  digitalWrite(pin, HIGH);
  delay(duration);
  digitalWrite(pin, LOW);
}