>> 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