Paso 3: código
He tratado de escribir el código fácil de ser demasiado simple para los principiantes. Pero si usted tiene cualesquiera problemas, preguntas y puede sugerencias, me gustaria saber.
Algunos consejos:
- Distancia mínima es la distancia de frenado para evitar accidente. La mejor distancia de cualquier bloque de parar el robot, es depende de la velocidad de la caja de cambios.
- Robot se vuelve a la distancia máxima.
- backDist y turnDist deben ser modificado para requisitos particulares dependen de la velocidad del robot.
- Ha utilizado un comportamiento al azar incluyendo una parada, melodía y movimiento al azar.
//******************************
* Por: http://blog.mshams.ir *
//******************************
números de PIN
const pinMotor1 bytes = 4, pinMotor2 = 5 pinMotor3 = 6, pinMotor4 = 7;
const pinLed byte = 8, pinTone = 10, pinSonar1 = 11, pinSonar2 = 12;
sonido frecuencia
const int toneFreq = 800;
Distancias de sonar
minDistance byte const = 45, maxDistance = 1000;
Estados motor
byte const M_STOP = 0, M_GO = 1, M_BACK = 2, M_RIGHT = 3, M_LEFT = 4, M_RIGHT2X = 5 M_LEFT2X = 6;
Estados de robot
byte const R_START = 0, R_DRIVE = 1, R_BLOCK = 2, R_TURN = 3;
detectar la resaca
const int hangoverWait = 5000;
bloque de detección ir detrás
const int backDist = 1000, turnDist = 300;
comportamiento aleatorio
const int randomChance = 300 randomStopWait = 10000, randomTurnWait = 200;
Estado del byte = R_START;
int i, contador = 0;
dist int;
void setup() {}
randomSeed(analogRead(1));
init pernos motor
pinMode (pinMotor1, salida);
pinMode (pinMotor2, salida);
pinMode (pinMotor3, salida);
pinMode (pinMotor4, salida);
pinMode (pinSonar1, salida);
pinMode (pinSonar2, entrada);
pin de LED init
pinMode (pinLed, salida);
}
void loop() {}
Switch (estado) {}
caso R_START:
Motor(M_GO);
Melody();
Estado = R_DRIVE;
rotura;
caso R_DRIVE:
Dist = Pingu();
Si (dist < minDistance) {}
Motor(M_STOP);
Estado = R_BLOCK;
}
else if (aleatorio (0, randomChance) == 5) {}
RandomTone();
Motor(M_STOP);
Delay(randomStopWait);
Motor (random (M_BACK, M_LEFT2X + 1));
Delay(randomTurnWait);
Motor(M_GO);
}
rotura;
caso R_BLOCK:
BEEP();
Motor(M_BACK);
Delay(backDist);
Motor (random (M_RIGHT2X, M_LEFT2X + 1));
Delay(turnDist);
Estado = R_TURN;
rotura;
caso R_TURN:
Dist = Pingu();
Si (dist > = maxDistance) {}
Motor(M_STOP);
Motor(M_GO);
BEEP();
Estado = R_DRIVE;
}
Else {}
contador += 1;
Si (contador > = hangoverWait) {}
Contador = 0;
Motor(M_STOP);
RandomTone();
Estado = R_BLOCK;
}
}
rotura;
}
}
void Blink (estado del byte) {}
digitalWrite (pinLed, estado);
}
void {Beep()
Blink(1);
SpeakTone(2);
SpeakTone(1);
Blink(0);
}
void Melody() {}
Blink(1);
para (int i = 1; i < 10; i ++) {}
SpeakTone(i);
}
Blink(0);
}
void RandomTone() {}
Blink(1);
para (int i = 1; i < 10; i ++) {}
SpeakTone (random(1, 10));
}
Blink(0);
}
void SpeakTone(byte note) {}
tono (pinTone, toneFreq * Nota);
Delay(100);
noTone(pinTone);
}
anular el Motor (estado de byte) {}
byte m1, m2, m3, m4;
Switch (estado) {}
caso M_STOP:
M1 = m2 = m3 = m4 = bajo;
rotura;
caso M_GO:
M1 = alta;
m2 = bajo;
M3 = alta;
M4 = bajo;
rotura;
caso M_BACK:
M1 = bajo;
m2 = alta;
M3 = bajo;
M4 = alta;
rotura;
caso M_RIGHT:
M1 = alta;
m2 = bajo;
M3 = bajo;
M4 = bajo;
rotura;
caso M_LEFT:
M1 = bajo;
m2 = bajo;
M3 = alta;
M4 = bajo;
rotura;
caso M_RIGHT2X:
M1 = alta;
m2 = bajo;
M3 = bajo;
M4 = alta;
rotura;
caso M_LEFT2X:
M1 = bajo;
m2 = alta;
M3 = alta;
M4 = bajo;
rotura;
}
digitalWrite (pinMotor1, m1);
digitalWrite (pinMotor2, m2);
digitalWrite (pinMotor3, m3);
digitalWrite (pinMotor4, m4);
}
int Pingu() {}
digitalWrite (pinSonar1, bajo);
delayMicroseconds(5);
digitalWrite (pinSonar1, HIGH);
delayMicroseconds(5);
digitalWrite (pinSonar1, bajo);
delayMicroseconds(2);
duración = pulseIn (pinSonar2, HIGH);
volver (duración / 2 de 29);
}