>> code javascript
const int motor1A = 2;
const int motor1B = 3;
const int motor2A = 4;
const int motor2B = 5;
const int motorPwm = 6;

const int echoPin = 8;
const int trigPin = 7;

enum Mode{modeLeft, modeRight, modeForward, modeBackward};
Mode mode = modeForward;

void back(){
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);

  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH);
}
void backward(){
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);

  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH);
}
void forward(){
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);

  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
}
void turnLeft(){
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);

  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
}
void turnRight(){
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);

  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH);
}

double getDistance(){
  double duration = 0;
  double distance = 0;

  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite( trigPin, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( trigPin, LOW );
  duration = pulseIn( echoPin, HIGH );
  if (duration > 0) {
    duration = duration/2;
    distance = duration*340*100/1000000;
    if(distance > 100){
      distance = 100;
    }
  }
  return distance;
}

void setup() {
  Serial.begin(9600);
  pinMode(motor1A, OUTPUT);
  pinMode(motor2A, OUTPUT);
  pinMode(motor1B, OUTPUT);
  pinMode(motor2B, OUTPUT);
  pinMode(motorPwm, OUTPUT);

  digitalWrite(motorPwm, LOW);

  pinMode( echoPin, INPUT );
  pinMode( trigPin, OUTPUT );

  forward();
}

int sp = 255;
int count = 0;
int nearCount = 0;
int forceTurnCount = 0;
int forceBackCount = 0;

void loop() {
  switch(mode){
    case modeLeft: turnLeft(); break;
    case modeRight: turnRight(); break;
    case modeForward: forward(); break;
    case modeBackward: backward(); break;
  }

  // speed
  analogWrite(motorPwm,sp);

  double distance = getDistance();
  if(distance < 50){
    nearCount ++;
  }else{
    nearCount = 0;
  }

  if(nearCount > 10 && mode == modeForward){
    mode = modeBackward;
    forceBackCount = 100;
    Serial.println("detect object. back");
  }else if(mode == modeBackward){
    forceBackCount --;
    if(forceBackCount == 0){
      forceTurnCount = 30;
      mode = modeLeft;
    }
    Serial.println("back");
  }else if(mode == modeLeft){
    forceTurnCount --;
    if(forceTurnCount == 0){
      mode = modeForward;
    }
    Serial.println("left");
  }else{
    mode = modeForward;
    Serial.println("forward");
  }
  
  count ++;
  if(count == 512){
    count = 0;
  }
}
5643382
wiki
1522504817