Paso 18: Código: planificación
Traducir el movimiento en posiciones de Servo
Es fácil describir cómo los brazos necesitan mover mover el zombot remite, pero ¿cómo convertir en movimientos servo?
En primer lugar, permite describir cómo se movería remite si estaban tumbados en el suelo y sólo podían utiliza los brazos.
- Levante el brazo de la tierra
- Extender el brazo lo más adelante posible
- Baje el brazo y la coge del suelo
- Hale nos remite (brazo de tirar hacia atrás)
Podríamos hacerlo con ambos brazos sincronizados (como mariposa de la natación) o con los brazos alternos (como nadar crawl).
Voy a trabajar el ejemplo con la opción de rastreo, usted fácilmente puede utilizar el mismo procedimiento para generateother patrones de movimiento.
Brazo izquierdo | Brazo derecho |
Parte trasera levantada, tirado | Bajado, extendido hacia delante |
Levantó, extendió hacia adelante | Bajado, hacia atrás |
Bajado, extendido hacia delante | Parte trasera levantada, tirado |
Tiró hacia abajo de nuevo | Levantó, extendió hacia adelante |
La manera más lógica que pude pensar en implementar este código era definir una serie de "Marcos" que contenía la posición de los servos en un momento dado. Bucle a través de los marcos a una determinada velocidad nos dará una animación de movimiento.
Aquí estoy pensando en levantar/que se extiende como "máximo" y bajar/contracción como "mínimo".
Marco de la | Hombro a la izquierda | Codo de la izquierda | Hombro derecho | Codo derecho |
1 | Max | Min | Min | Max |
2 | Max | Max | Min | Min |
3 | Min | Max | Max | Min |
4 | Min | Min | Max | Max |
Determinar límites de Servo
Antes de que podemos escribir código para utilizar nuestra lujo nueva animación fotograma a fotograma, debemos determinar el mínimo y máximo para cada servo. Hay dos factores importantes a considerar
- Podría haber una obstrucción física. Si su montaje mecánico no permite su servo girar en cuanto a sus peticiones de software se podría dañar el servo.
- Tenemos que traducir "min" y "max" en milisegundos, y estas son opuestas a ambos lados del cuerpo. Por ejemplo: el servo del hombro en el lado derecho (mirando de frente) tiene que girar a la derecha para levantar el brazo, pero en la mano izquierda lateral derecha bajará el brazo.
Escribí el siguiente pequeño pedazo de código para determinar el rango de movimiento de un servo. Simplemente sube a tu arduino y conectar un servo en el pin especificado (pin 3 en el ejemplo).
- Utilice un terminal serie (yo prefiero masilla) conectarse a Arduino (9600 baudios).
- Pulse 'q' para enviar el servo a min (1000 microsegundos)
- Pulse el botón 'w' para centrar el servo
- Pulse 'e' para enviar el servo al máximo (2000 microsegundos)
- Uso ' o ' y 'p' incrememnt o decremento de la posición actual de 5 microsegundos
- Tome nota de cuántos microsegundos corresponden a retraído/baja
- Tome nota de cuántos microsegundos corresponden a extendido/levantado
Una vez que ha determinado cuántos microsegundos corresponden a retraído/baja y extendida/creció, lo mismo para todos los servos.
// By Jason Suter 2014 // This example code is in the public domain. #include <Servo.h> //pin details int servoPin = 3; static int minMicros = 1000; static int midMicros = 1500; static int maxMicros = 2000; Servo servoUnderTest; // create servo object to control a servo int posMicros = 1500; // variable to store the servo position void setup() { servoUnderTest.attach(servoPin); //configure serial port Serial.begin(9600); } void loop() { if (Serial.available() > 0) { char inByte = Serial.read();; //incoming serial byte if (inByte == 'q') { posMicros = minMicros; } else if (inByte == 'w') { posMicros = midMicros; } else if (inByte == 'e') { posMicros = maxMicros; } else if (inByte == 'o') { posMicros = max(posMicros-5,minMicros); } else if (inByte == 'p') { posMicros = min(posMicros+5,maxMicros); } } //report current position Serial.print(posMicros); servoUnderTest.write(posMicros); }