Paso 10: Código de Arduino para obstáculos evitando Robot
El código siguiente utiliza los sensores de este instructable para controlar un obstáculo autónomo evitando robot. Los interruptores de la hoja se utilizan para detectar contacto con objetos a la izquierda y la derecha. Si se activa un interruptor de contacto, el robot se detiene, retrocede y entonces da vuelta lejos del objeto antes de continuar. El sensor de distancia infrarrojo se utiliza para determinar la distancia a objetos delante del robot. Si un objeto está más cercano que una tolerancia de ajuste, las paradas de robot y un servo gira el sensor de IR a la derecha y hacia la izquierda para las mediciones. El robot se convierte entonces en la dirección de la más clara antes de continuar. Un botón se utiliza para iniciar el robot. Aunque técnicamente no los sensores, el láser, el zumbador y el LED se utiliza para dar retroalimentación visual y sonora de los sensores. Cuando el robot esté en movimiento, el LED verde está encendido. Cuando el robot se detiene, los sonidos del zumbador y el LED rojo se enciende. El láser se une al sensor IR dando una indicación visual de dónde apunta el sensor de distancia infrarrojo.
He pegado el código de Arduino a continuación (con jodido formato), pero por alguna razón no he podido subir un archivo que contiene el código. Esto es extraño ya que fui capaz de hacerlo por mi anterior instructable. Sin embargo esta vez, cada vez que intento subir el archivo .ino me sale el mensaje "ERROR 400: no se puede cargar secuencias de comandos:"
/ * 4/29/14
Este código utiliza varios sensores para controlar el comportamiento
de un obstáculo autónomo evitando robot. Como el robot
se mueve hacia adelante, que un sensor de distancia infrarrojo mide la distancia
a los obstáculos del robot. Si la distancia medida
es inferior a una tolerancia del sistema, las paradas de robot y un pans de servo
el sensor IR derecha y la izquierda para determinar la ruta más clara.
El robot se convierte en la dirección de la ruta más clara
y luego procede.
Hoja derecha e izquierda interruptores detectan contacto con objetos
a la derecha o izquierda del robot. Cuando se hace contacto, la
robot realiza copias de seguridad y después da vuelta lejos del objeto detectado
antes de continuar.
Un láser montado sobre el sensor del IR indica la dirección
en la que el robot está "buscando". Cuando el robot se detiene un
LED rojo se enciende y suena un zumbador piezoeléctrico. Cuando el robot está
avanzando, se enciende un LED verde. Cuando se acciona el robot
ningún movimiento ocurre hasta que un botón en el robot
presiona.
*/
#include < Servo.h >
Servo leftWheelServo;
Servo rightWheelServo;
Servo panServo;
Declarar pines digitales
int stopLightPin = 2;
int leftContactPin = 3;
int rightContactPin = 4;
int servoPinLeft = 5;
int servoPinRight = 6;
laserPin int = 7;
int goLightPin = 8;
int servoPinPan = 9;
int buzzerPin = 12;
int buttonPin = 13;
Declarar pines analógicos
int Irpín = 4;
Definir las variables
int distanceReading;
int wallDistance;
int wallDistanceTolerance = 30;
int distanceReadingLeft;
int distanceReadingRight;
int wallDistanceLeft;
int wallDistanceRight;
int panDelay = 1000; Retardo para permitir el sensor IR tomar una lectura
int turnTime = 250; Duración de vuelta basado en ensayo y error
buzzTime int = 200;
buttonValue int = 0;
int oldButtonValue = 0;
int leftContactValue = 0;
int rightContactValue = 0;
void setup()
{
pinMode (buzzerPin, salida);
pinMode (stopLightPin, salida);
pinMode (goLightPin, salida);
pinMode (buttonPin, entrada);
pinMode (laserPin, salida);
digitalWrite (buzzerPin, bajo);
digitalWrite (stopLightPin, bajo);
digitalWrite (goLightPin, bajo);
leftWheelServo.attach(servoPinLeft);
rightWheelServo.attach(servoPinRight);
panServo.attach(servoPinPan);
Sonido zumbador para indicar que el robot tiene poder
digitalWrite (stopLightPin, HIGH);
digitalWrite (buzzerPin, HIGH);
Delay(buzzTime);
digitalWrite (buzzerPin, bajo);
Espere hasta que el botón se presiona antes de mover
mientras que (buttonValue == LOW)
{
leftWheelServo.write(90);
rightWheelServo.write(90);
buttonValue = digitalRead(buttonPin);
}
Sonido zumbador para indicar Inicio botón ha sido presionado
digitalWrite (buzzerPin, HIGH);
Delay(buzzTime);
digitalWrite (buzzerPin, bajo);
Descomentar la alimentación serial para probar si es necesario
Serial.Begin(9600);
}
void loop()
{
Encienda el láser
digitalWrite (laserPin, HIGH);
Sensor de distancia de punto recto
panServo.write(90);
Avanzar
leftWheelServo.write(0);
rightWheelServo.write(120);
digitalWrite (goLightPin, HIGH);
digitalWrite (stopLightPin, bajo);
Prueba para abordajes de pared
leftContactValue = digitalRead(leftContactPin);
Si (leftContactValue == HIGH)
{
Parada
leftWheelServo.write(90);
rightWheelServo.write(90);
digitalWrite (goLightPin, bajo);
digitalWrite (stopLightPin, HIGH);
digitalWrite (buzzerPin, HIGH);
Delay(buzzTime);
digitalWrite (buzzerPin, bajo);
Copia de seguridad
leftWheelServo.write(120);
rightWheelServo.write(0);
digitalWrite (goLightPin, HIGH);
digitalWrite (stopLightPin, bajo);
Delay(500);
Gire a la derecha
leftWheelServo.write(180);
rightWheelServo.write(180);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
Restablecimiento de variables de contacto izquierdo
leftContactValue = 0;
}
rightContactValue = digitalRead(rightContactPin);
Si (rightContactValue == HIGH)
{
Parada
leftWheelServo.write(90);
rightWheelServo.write(90);
digitalWrite (goLightPin, bajo);
digitalWrite (stopLightPin, HIGH);
digitalWrite (buzzerPin, HIGH);
Delay(buzzTime);
digitalWrite (buzzerPin, bajo);
Copia de seguridad
leftWheelServo.write(120);
rightWheelServo.write(0);
digitalWrite (goLightPin, HIGH);
digitalWrite (stopLightPin, bajo);
Delay(500);
Gire a la izquierda
leftWheelServo.write(0);
rightWheelServo.write(0);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
RESET sensor derecho variable
rightContactValue = 0;
}
Tomar lectura del medidor de distancia
distanceReading = analogRead(IRpin);
wallDistance = distanceReading/40-10;
La fórmula de la distancia de la pared anterior se determina por ensayo
y error y conversión lineal
Para comprobar si una pared está cerca
Si (wallDistance < wallDistanceTolerance)
{
Parada
leftWheelServo.write(90);
rightWheelServo.write(90);
digitalWrite (goLightPin, bajo);
digitalWrite (stopLightPin, HIGH);
digitalWrite (buzzerPin, HIGH);
Delay(buzzTime);
digitalWrite (buzzerPin, bajo);
Bandeja de servo de la distancia a la izquierda y derecha para ver la dirección
ofrece un camino más claro
panServo.write(170);
Delay(panDelay);
distanceReadingLeft = analogRead(IRpin);
Delay(panDelay);
wallDistanceLeft = distanceReadingLeft/40-10;
panServo.write(20);
Delay(panDelay);
distanceReadingRight = analogRead(IRpin);
Delay(panDelay);
wallDistanceRight = distanceReadingRight/40-10;
Quite el comentario de serie impresión declaraciones para fines de depuración
Serial.Print(wallDistance);
Serial.println ("cm");
Serial.Print(wallDistanceLeft);
Serial.println ("cm");
Serial.Print(wallDistanceRight);
Serial.println ("cm");
Serial.println("");
Serial.println(distanceReading);
Serial.println(distanceReadingLeft);
Serial.println(distanceReadingRight);
Serial.println("");
Para comprobar que la dirección ofrece un camino claro
y el robot en esa dirección
Si (wallDistanceLeft > wallDistanceRight)
{
Gire a la izquierda
leftWheelServo.write(180);
rightWheelServo.write(180);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
}
otra cosa
{
Gire a la derecha
leftWheelServo.write(0);
rightWheelServo.write(0);
Delay(turnTime);
leftWheelServo.write(90);
rightWheelServo.write(90);
}
}
Delay(200);
}