Paso 10: código
#include
#include
A continuación se muestran las constantes simbólicas. En lugar de tener que para teclear un número pin no automóvil cada vez que queremos hacer algo podemos escribir una fácil de entender el nombre que representa el pin, entonces el compilador sustituirá los nombres con los números
#define LeftMotorForward 8
#define LeftMotorBackward 9
#define RightMotorForward 10
#define RightMotorBackward 11
#define USTrigger 3
#define USEcho 2
#define MaxDistance 100
#define LED 13
Aquí hemos creado dos 'objetos', uno para el servo y otra para el sensor de ultrasonidos
Servo servo;
Sonar de NewPing (USTrigger, USEcho, MaxDistance);
A continuación estamos creando variables de entero sin signo que vamos a utilizar más adelante en el código. Están sin firmar ya que sólo tendrán valores positivas
unsigned int duración;
unsigned int distancia;
unsigned int FrontDistance;
unsigned int LeftDistance;
unsigned int RightDistance;
unsigned int tiempo;
unsigned int CollisionCounter;
void setup() //This bloque ocurre una vez al inicio
{
Serial.Begin(9600); He incluido el serial inicializar, pero comentó, si desea depurar e información impresa en el monitor serial solo descomentar
Aquí estamos estableciendo los modos de pin. Como vamos a enviar las señales de los pines establecemos como salidas
pinMode (LeftMotorForward, salida);
pinMode (LeftMotorBackward, salida);
pinMode (RightMotorForward, salida);
pinMode (RightMotorBackward, salida);
pinMode (LED, salida);
servo.Attach(6); El servo está conectado al pin 4
}
void loop() //This bloque se repite mientras esté activado el Arduino
{
servo.Write(90); Girar el servo para el frente
Scan(); Ir a la función de exploración
FrontDistance = distancia; Definir la variable FrontDistance el valor de la distancia que se devuelve desde la función de exploración
Serial.println ("frente de distancia =");
Serial.Print(Distance);
Si (FrontDistance > 60 || FrontDistance == 0) //If allí es nada enfrente del robot dentro de los 15 cm o el valor de la distancia es 0 (para la biblioteca de newping que significa que no volvió ping) entonces...
{
moveForward(); Ir a la función moveForward
}
//Else otra cosa (si hay algo enfrente del robot dentro de 40cm) entonces...
{
CollisionCounter = CollisionCounter + 1;
moveStop(); Ir a la función moveStop
Navigate();
}
}
void moveForward() //This función le dice al robot a avanzar
{
Serial.println("");
Serial.println ("avanzando");
digitalWrite (LeftMotorBackward, bajo);
digitalWrite (LeftMotorForward, alto);
digitalWrite (RightMotorBackward, bajo);
digitalWrite (RightMotorForward, alto);
}
void moveBackward() //This función dice el robot para moverse hacia atrás
{
Serial.println("");
Serial.println ("mover hacia atrás");
digitalWrite (LeftMotorForward, bajo);
digitalWrite (LeftMotorBackward, alto);
digitalWrite (RightMotorForward, bajo);
digitalWrite (RightMotorBackward, alto);
}
void moveLeft() //This función dice que el robot gire a la izquierda
{
Serial.println("");
Serial.println ("mover izquierda");
digitalWrite (LeftMotorForward, bajo);
digitalWrite (LeftMotorBackward, alto);
digitalWrite (RightMotorBackward, bajo);
digitalWrite (RightMotorForward, alto);
}
void moveRight() //This función dice que el robot gire a la derecha
{
Serial.println("");
Serial.println ("moviendo a la derecha");
digitalWrite (LeftMotorBackward, bajo);
digitalWrite (LeftMotorForward, alto);
digitalWrite (RightMotorForward, bajo);
digitalWrite (RightMotorBackward, alto);
}
void moveStop() //This función dice el robot se detiene
{
Serial.println("");
Serial.println("stopping");
digitalWrite (LeftMotorBackward, bajo);
digitalWrite (LeftMotorForward, bajo);
digitalWrite (RightMotorForward, bajo);
digitalWrite (RightMotorBackward, bajo);
}
void scan() //This función determina que las distancia las cosas son del sensor de ultrasonidos
{
Serial.println("");
Serial.println("scanning");
Tiempo = sonar.ping();
distancia = tiempo / US_ROUNDTRIP_CM;
Delay(500);
}
void navigate()
{
Serial.println ("hay un obstáculo!");
servo.Write(167); Mover el servo a la izquierda (mi pequeño servos no como va a 180 por lo que jugaba con el valor hasta que funciono muy bien)
Delay(1000); Esperar medio segundo para el servo para llegar
Scan(); Ir a la función de exploración
LeftDistance = distancia; Establece la variable LeftDistance a la distancia a la izquierda
Serial.println ("distancia a la izquierda =");
Serial.Print(Distance);
servo.Write(0); Mover el servo a la derecha
Delay(1000); Esperar medio segundo para el servo para llegar
Scan(); Ir a la función de exploración
RightDistance = distancia; Establece la variable RightDistance a la distancia a la derecha
Serial.println ("distancia a la derecha =");
Serial.Print(Distance);
Si (abs (RightDistance - LeftDistance) < 5)
{
moveBackward(); Ir a la función moveBackward
Delay(200); Hacer una pausa en el programa durante 200 milisegundos dejar el robot inversa
moveRight(); Ir a la función moveRight
Delay(100); Hacer una pausa en el programa durante 200 milisegundos dejar que el robot gire a la derecha
}
otra cosa if(RightDistance < LeftDistance) //If la distancia a la derecha es menor que el de la izquierda entonces...
{
moveLeft(); Ir a la función moveLeft
Delay(100); Hacer una pausa en el programa de medio segundo dejar que el robot gire a la
}
otra if(LeftDistance < RightDistance) //Else si la distancia a la izquierda es menor que el de la derecha...
{
moveRight(); Ir a la función moveRight
Delay(100); Hacer una pausa en el programa de medio segundo dejar que el robot gire a la
}