Paso 4: programación
Perro de guardia
Para el robot perro de guardia, el código ha sido programado como un "si lo" cláusula. En su estado latente, o en otras palabras la parte "else" de la cláusula, el robot es programado para realizar una función de "sway" en el que analiza de lado a lado. La función de balanceo consiste en el Arduino envíos señales los servos para girar a la izquierda, demora un poco, luego gire a la derecha, demora un poco y repetir. Si cualquiera de los sensores infrarrojos detecta algo dentro de cierta gama de la zona, el robot realizará un tipo de alarma. La alarma contiene un "bucle" for así como los códigos para activación de luces y sonidos. La alarma comienza parando los servos y luego inicia el bucle for. El bucle provoca parpadeo de los 4 LED de la placa Arduino según cuántos destellos en la función de bucle, en este caso elegimos 20 flashes. El Arduino luego procede a jugar a un juego adelante tono luego disco un segundo tono, entonces lejos de nuevo a su posición inicial. La base de este programa es que el perro de guardia es vigilar sobre su territorio, si ve algo entonces alerta y "persigue" al intruso lejos.
Código para perro guardián:
#include / / incluye la librería Servo
Servo servoLeft; Declarar servoRight izquierdo y derecho de Servos Servo;
void setup() / / código de inicialización
{pinMode (10, INPUT); / / pines para alimentación de entrada/salida
pinMode (9, salida);
pinMode (3, entrada);
pinMode (2, salida);
pinMode (5, salida);
pinMode (6, salida);
tono (11, 3000, 1000); Reproducir tono durante 1 segundo
Delay(1000);
servoLeft.attach(13); Conectar Servos de izquierda y derecho para pernos
servoRight.attach(12); }
void loop() / / bucle código principal
{int irLeft = irDetect (9, 10, 39000); / / Set a izquierda y derecha infrarrojos sensores para detectar movimiento dentro de cierto rango de zona
int irRight = irDetect (2, 3, 39000);
Si ((irLeft == 0) || (irRight == 0)) Si las izquierda o la derecha sensores infrarrojos detectan algo, realizan la función de alarma
{alarm(20);
}
Else / / en los demás casos, realizan la función de "sway"
{sway(0);}
}
irDetect int (int irLedPin, int irReceiverPin, frecuencia largo)
{tono (irLedPin, frecuencia, 8); / / IRLED 38 kHz durante al menos 1 ms
Delay(1); Espere 1 ms
int ir = digitalRead(irReceiverPin); Receptor de infrarrojos -> ir variable
Delay(1); Tiempo antes de revisión
volver a ir; Retorno 1 no detectar detectar 0}
Anular alarma (int parpadea) / / función de alarma
{servoLeft.writeMicroseconds(1500); / / parada de enviar señales en ambos Servos
servoRight.writeMicroseconds(1500);
para (int i = 1; i < = parpadea; i ++) / creado para la función de "bucle" for, la variable aumenta de 1 a la cantidad de destellos declarado
{digitalWrite (5, HIGH); digitalWrite (6, HIGH); / / enciende el LED en los pines 5 y 6
Delay(50); Retardo de 50 milisegundos
digitalWrite (5, bajo); Apagar el LED en los pines 5 y 6
digitalWrite (6, bajo);
Delay(50); Retardo de 50 milisegundos
} tono (11, 4000, 1000); Reproducir tono durante 1 segundo
Delay(1000);
Forward(2000); Seguir adelante durante 2 segundos
digitalWrite (5, alto);
digitalWrite (6, HIGH); / / enciende el LED en los pines 5 y 6
tono (11, 2000, 1000); Reproducir tono durante 1 segundo
Delay(1000);
digitalWrite (5, bajo);
digitalWrite (6, bajo);
backward(2000); Ir hacia atrás durante 2 segundos
}
anular la influencia (int tiempo) / / función de balanceo
{servoLeft.writeMicroseconds(1700); / / Servos girar a máxima velocidad servoRight.writeMicroseconds(1700) en sentido antihorario;
Delay(1000); ... por 1 segundo
servoLeft.writeMicroseconds(1300); Servos de girar a toda velocidad hacia la derecha servoRight.writeMicroseconds(1300);
Delay(1000); ... por 1 segundo
}
void avanzar (int tiempo) / / función de adelante
{servoLeft.writeMicroseconds(1700); / / izquierda Servo velocidad completa en sentido antihorario servoRight.writeMicroseconds(1300); / / full-speed del Servo derecho hacia la derecha
Delay(Time); Demora para el valor declarado de la hora
}
vacío hacia atrás (int tiempo) / / al revés función
{servoLeft.writeMicroseconds(1300); / / full-speed del Servo de la izquierda hacia la derecha
servoRight.writeMicroseconds(1700); Servo velocidad hacia la izquierda a la derecha
Delay(Time); Demora para el valor declarado de la hora
}
Mailman
Para el robot de Mailman, el código ha sido programado como un "si lo" cláusula así. La función principal es a través de los fototransistores, el hombre de correo robot será la tendencia hacia la fuente de luz. Si el cartero detecta algo a través de sus sensores infrarrojos a cada lado, el cartero dejará un cierto tono de señalización que se da cuenta de que ha atraído la atención del perro de guardia. Entonces, el cartero se copia de seguridad para alejarse del perro ya que se viene hacia el robot. La base de esta parte del código es que el cartero quiere llegar a la fuente de luz; sin embargo, si ve al perro, entonces sabe que la tarea no puede realizarse.
Código para Robot de Mailman:
#include / / include biblioteca servo
Servo servoLeft; Declarar derecho e izquierdo de servos Servo servoRight;
void setup() / bloque de inicialización incorporado {pinMode (10, entrada); / / Set clavijas de potencia de entrada/salida pinMode (9, salida) pinMode (salida 3,) pinMode (2, salida); pinMode (5, entrada); pinMode (salida 12,); tono (11, 3000, 1000); / / juego tono para 1 segundo delay(1000); / retardo para terminar tono servoLeft.attach(13); / / Coloque la señal izquierda al pin 13 servoRight.attach(12); / Coloque señal derecha en pin 12} void loop() / / Main loop auto repite {int irLeft = irDetect (9 10, 39000); Conjunto sensores izquierdos y derecho infrarrojos para detectar movimiento dentro de cierta zona rango int irRight = irDetect (2, 3, 39000); flotador de TIzquierda = float(rcTime(12)); Se quedan luz y flotador flotador tRight = float(rcTime(2)); Obtener la luz correcta y flotador float ndShade; Normalizado el tono diferencial ndShade = tRight / (obligamos + tRight) - 0,5; Calcular y restar 0.5 int speedLeft, speedRight; Declarar variables de velocidad si ((irLeft == 0) || (irRight == 0)) ¿Si las izquierda o la derecha sensores infrarrojos detectan algo, realizan la función de alarma {backward(2000);} else if (ndShade > 0.0) / cortina de derecha? ¿{/ / Desaceleración de la rueda izquierda speedLeft = int (200.0 - (ndShade * 1300.0)); speedLeft = restringir (speedLeft, -200, 200); speedRight = 200; / / completo rueda derecha velocidad} else if (ndShade < 0.0) / cortina izquierda? {/ / Slow down rueda derecha speedRight = int (200.0 + (ndShade * 1300.0)); speedRight = restringir (speedRight, -200, 200); speedLeft = 200; / toda velocidad de la rueda a la izquierda} otra maniobra {} (speedLeft, speedRight, 20); Velocidades de la rueda sistema}
rcTime largo (int pin) / / rcTime mide el decaimiento en el perno {pinMode (pin, salida); / / carga condensador digitalWrite (pin, HIGH); / /... por configuración de pin salida alta delay(5); // .. para 5 ms pinMode (pin, entrada); Conjunto pin para entrada digitalWrite (pin, LOW); // .. con no mucho tiempo de subida = micros(); Marca el while(digitalRead(pin)) del tiempo; Espere a que voltaje < tiempo umbral = micros() - tiempo; Calcular el tiempo de relajación volver a tiempo; Devoluciones del decaimiento tiempo}
irDetect int (int irLedPin, int irReceiverPin, frecuencia largo) {tono (irLedPin, frecuencia, 8); / / IRLED 38 kHz para por lo menos 1 ms delay(1); / / esperar 1 ms int ir = digitalRead(irReceiverPin); / / receptor de infrarrojos -> ir delay(1) variable; / / tiempo antes de ir vuelta revisión; / / 1 volver sin detectar, detectar 0}
maniobra nula de la función de maniobra (int speedLeft, int speedRight, int msTime) {servoLeft.writeMicroseconds(1500 + speedLeft); / / servo sistema izquierda velocidad servoRight.writeMicroseconds (1500 - speedRight); / / Set servo derecho velocidad if(msTime==-1) / / si msTime = -1 {servoLeft.detach(); / parada servo señales servoRight.detach();} delay(msTime); / retardo para msTime}
vacío hacia atrás (int tiempo) / / al revés función {servoLeft.writeMicroseconds(1300); / / izquierda Servo máxima velocidad hacia la derecha servoRight.writeMicroseconds(1700); / / Servo derecho velocidad completa en sentido antihorario delay(time); / retardo de valor declarado tiempo}
void avanzar (int tiempo) {servoLeft.writeMicroseconds (1700); servoRight.writeMicroseconds (1300); delay(time);}