Paso 5: Programa y disfrute su nuevo Robot!
Abajo está el código evitando obstáculo para OmniWorm! No dude en adaptar en consecuencia.
------------------------------------------------------------------------------------
Lo que usted necesita cambiar:
------------------------
CÓDIGO de SERVO: Dos servos pueden resultar diferentes direcciones para cada ángulo
enviado a él. Por ello, pruebe cada servo seperatly. Establecido en el
máximo ángulo antes de montar para asegurarse el robot se tirarán en
una caja y que los servos no empujará separan las direcciones. También,
puede que necesite utilizar el sexto servo (servoFront2) dependiendo de la
peso de su diseño. Mina es total sólo 3 libras por lo que no lo necesito: P
SERVOS: 313WP servos van desde 20 hasta 160 grados sin editar el
Biblioteca de servo. 140 grados es suficiente para esta aplicación
sin embargo. Si utilizas servos diferentes, usted puede conseguir más o menos que
140 grados. Si el servo está clasificado para 180 grados y obtienes un
mucho menos, usar pwm o tratar de cambiar la pulsewidths de min y max
en la biblioteca del servo (servo.h). Editar el archivo, descargamos Notepad ++
MOTOR código: estoy usando un conductor del motor robusto medio roto de resistente
circuitos. La etiqueta del perno EM se suelda a Dir2 en el escudo como la
perno normal no cambiaba de dirección. Si está utilizando el mismo
Escudo, luego borrar EM y llevar a cabo! Si usted está usando un puente h,
entonces no dude en utilizar pernos 3, 11-13 o elegir su propio. Ten cuidado
no para dominar el circuito aunque! A continuación se muestran enlaces a tutoriales.
El último eslabón es donde se puede comprar el escudo que utilizo!
http://ITP.nyu.edu/physcomp/Labs/DCMotorControl
http://www.ECS.umass.edu/ECE/M5/tutorials/H-Bridge_tutorial.html
http://www.societyofrobots.com/schematics_h-bridgedes.shtml
http://www.ruggedcircuits.com/motor-control/Rugged-motor-driver
MOTORES: No su cartera un gran favor y no destrozar namebrand
Parallex servos para funcionar como motores de la C.C. (a menos que si se rompieron
como el mío fueron). Si hackearles, desatornille la parte posterior,
Tire de los tres cables apagado, ponga los tornillos de nuevo en para mantener la
caja de engranajes junto (algunos hotglue podría ayudar) y la soldadura con cuidado un
cable a cada extremo del motor DC solamente. Soldadura exceso podría colar la configuración.
Pero simplemente compraba robot amarillo ruedas/gearboxs fuera de ebay.
La búsqueda para "robots rueda" y se abrirá. Alternativly, uso
lo 360 grados servos como... bueno... servos! Usted puede Agregar o
restar ángulos de movimiento adelante/atrás.
FUNCIONES: Tienes que editar las funciones (o jugar con cables)
para llegar a trabajar con su diseño. Algunos viejos buen ensayo y error
hará el truco!
Unas palabras de Consejo:
----------------------
Si está utilizando una fuente de energía externa para tus servos, conecte
de tierra el suelo para arduino. También, tenga cuidado de no conectar
la batería en backwords o corto hacia fuera... fácilmente puede matar
tus servos. Además, si usted dominar un servo puede morir. Inicio
sus servos de baja potencia y trabajan su manera para arriba. Mi setup es
empujando it... > :)
Yo sugeriría que usted encontrar (o hacer) tu propio puente h para control de
sus motores. Además, conectar la tierra a arduino. Tenga cuidado de
no sobrecargar su instalación! Por último, una función de reset mantiene la configuración
de un cortocircuito.
No olvide que usted necesita inclinar sensores si vas a dejar del lado
ruedas de movimiento al dibujo actual.
No se sienten limitados a los pines que estoy usando. Elija su propia digital
alfileres!!!
Mi código está adaptado de:
------------------------
http://www.ruggedcircuits.com/Rugged-motor-driver
http://Arduino.CC/en/Reference/ServoWrite
http://arduinobasics.blogspot.com/2012/11/arduinobasics-HC-sr04-Ultrasonic-sensor.html
*/
#include < Servo.h >
Incluir la librería Servo para que no tengamos que usar PWM
Servo servoFront;
Servo servoFront2;
Servo servoTail;
Servo servoTail2;
Servo servoBack;
Servo servoBack2;
Esto define nuestros nombres del servo (servoFront etc..)
Habilitar salidas (PWM) (escudo resistente)
#define EN1_PIN 3
#define EN2_PIN 11
Dirección salidas (escudo resistente)
#define DIR1_PIN 12
#define DIR2_PIN 13
#define EM 10 //Cause 13 no quieren trabajar. Número de mala suerte! =/
#define echoPin 8 / / Echo Pin (para sensor ultrasónico)
#define trigPin 9 / / pasador de gatillo (para sensor ultrasónico)
int maximumRange = 200; Rango máximo necesario (puede cambiar)
int minimumRange = 0; Rango mínimo necesario (puede cambiar)
larga duración, distancia; Duración permite calcular la distancia
void setup() {}
servoFront.attach(6);
servoTail.attach(1);
servoTail2.attach(2);
servoBack.attach(4);
servoBack2.attach(5);
pinMode (EN1_PIN, salida);
digitalWrite (EN1_PIN, bajo);
pinMode (EN2_PIN, salida);
digitalWrite (EN2_PIN, bajo);
pinMode (DIR1_PIN, salida);
digitalWrite (DIR1_PIN, bajo);
pinMode (DIR2_PIN, salida);
digitalWrite (DIR2_PIN, bajo);
pinMode (trigPin, salida);
pinMode (echoPin, entrada);
Configurar las entradas y salidas para motores, servos, sensor
Closed();
retrasar (1000);
Mantiene el robot doblado antes de que comience el bucle.
}
void loop() {}
rearme;
Delay(50);
Closed();
Scan(); medidas de distancia por ultrasonidos
Delay(90);
Si (distancia < = 20 & & distancia > = 0) {//if la distancia es de menos de 15 cm
opened();
Delay(1000);
RESET();
Delay(50);
spin_right();
opened();
Delay(1500);
Closed();
Delay(1000);
Scan();
Delay(800);
Si (distancia < = 15 & & distancia > = 0) {}
opened();
Delay(1000);
RESET();
Delay(50);
spin_left();
opened();
Delay(2200);
}
Else {}
RESET();
Delay(50);
inch();
inch();
inch();
inch();
inch();
}
}
else {//if la distancia es mayor que 15 cm
RESET();
Delay(50);
Closed();
Forward();
Delay(1000);
}
}
/*
A continuación se presentan funciones que clama a través de nuestro bucle. Te hace la vida mucho
más fácil, como se puede controlar múltiples pasadores y servos a la vez!
*/
void closed() {}
servoFront.write(20);
servoTail.write(20);
servoTail2.write(160);
servoBack.write(20);
servoBack2.write(160);
}
void opened() {}
servoFront.write(140);
servoTail.write(20);
servoTail2.write(160);
servoBack.write(100);
servoBack2.write(80);
}
void inch() {}
Closed();
Delay(1000);
servoTail.write(160);
servoTail2.write(20);
Delay(1000);
servoTail.write(160);
servoTail2.write(20);
servoBack.write(160);
servoBack2.write(20);
Delay(1000);
servoTail.write(20);
servoTail2.write(160);
servoBack.write(160);
servoBack2.write(20);
Delay(1000);
servoFront.write(140);
Delay(1000);
}
void spin_right() {}
digitalWrite (DIR1_PIN, alto);
analogWrite (EN1_PIN, 255);
digitalWrite (DIR2_PIN, alto);
analogWrite (EN2_PIN, 255);
digitalWrite (EM, alto);
}
void spin_left() {}
digitalWrite (DIR1_PIN, bajo);
analogWrite (EN1_PIN, 255);
digitalWrite (DIR2_PIN, alto);
analogWrite (EN2_PIN, 255);
digitalWrite (EM, bajos);
}
void backward() {}
digitalWrite (DIR1_PIN, alto);
analogWrite (EN1_PIN, 255);
digitalWrite (DIR2_PIN, bajo);
digitalWrite (EM, alto);
analogWrite (EN2_PIN, 255);
}
{} void forward()
digitalWrite (DIR2_PIN, alto);
analogWrite (EN2_PIN, 255);
digitalWrite (DIR1_PIN, bajo);
analogWrite (EN1_PIN, 255);
digitalWrite (EM, alto);
}
{} void reset()
analogWrite (EN2_PIN, 0);
analogWrite (EN1_PIN, 0);
Delay(15);
}
{} void scan()
digitalWrite (trigPin, LOW);
delayMicroseconds(2);
digitalWrite (trigPin, HIGH);
delayMicroseconds(10);
digitalWrite (trigPin, LOW);
duración = pulseIn (echoPin, HIGH);
Calcular la distancia (en cm) basada en la velocidad del sonido.
distancia = duración/58.2;
Delay(50);
}