Paso 8: Ajuste de Auto rango
También hay un bonito bloque que genera servo suave aceleración y desaceleración en base a la función coseno. Me encanta trig.
¡ Disfrute!
/ * > Auto_Set_Range <
Código de prueba de servo con retroalimentación hackeado del pote interno.
Cable de control del servo conectado a digital 10 y 11
Cable de retroalimentación de posición conectado a analógico 0 y 1
Servos son declarado en una matriz para la fácil adición de servos más.
Construir un divisor de voltaje en el pin ARef: + 5V--4,7 K--Aref--K 3,3--GND
Con una tensión regulada de 4.78V dando por resultado Referencia analógica será ~1.85V
(ver http://arduino.cc/en/Reference/AnalogReference)
Esto aumentará la resolución del potenciómetro de la lectura.
Utilice los siguientes comandos para toggel entre leer los comentarios de servo
y la lectura de cualquier otro pin analógico que necesita ver a 5V como referencia
analogReference(EXTERNAL); establece 1023 analógica en voltaje en el pin ARef
analogReference(DEFAULT); sistemas analógicos 1023 a 5V o 3.3V dependiendo de la fuente de alimentación
ESTE CÓDIGO VIENE EN 8,9 K EN LA MEMORIA. SIN TODOS LOS COMENTARIOS DE LA SERIE ES 8,3 K
PODÍA REDUCIRSE POR ALGUIEN MÁS INTELIGENTE QUE YO, ESTOY SEGURO!
*/
#include < Servo.h > //import biblioteca de servo
Biblioteca EEPROM //import #include < EEPROM.h >
const int numServos = 2; ¿cuantos servos tienes?
const int sPin [numServos] = {10, 11}; ¿Qué pines son coincidentes a?
Servo servo [numServos]; declare la matriz de servo
int highPulse [numServos]; anchura de pulso alta
int lowPulse [numServos]; anchura de pulso bajo
int [numServos]; lectura de comentarios lowPulse
int B [numServos]; lectura de comentarios highPulse
int aquí [numServos]; ángulo de movimiento de
int allí [numServos]; ángulo hacia
Float x [numServos]; convertidas a radianes para derivar la onda coseno del ángulo
int h;
int t;
int respuesta; utilizado para sostener el valor de retroalimentación servo
int tecla = 2;
int e = 1; Dirección de la EEPROM para empezar a almacenar/recuperar los datos de servo
int ángulo; ángulo de deriva de la función coseno. envía al servo en bucle
int btwReadings = 20; tiempo de retardo entre
int whlReading = 3; tiempo de retardo entre lecturas analógicas de la olla interna
Boolean rangeTest = false;
Boolean doneMove [numServos];
void setup() {}
Serial.Begin(19200); inicializar la salida serie
Serial.println ("es!");
analogReference(EXTERNAL);
pinMode (botón, entrada);
para (int i = 0; i < numServos; i ++) {}
pinMode (sPin[i],OUTPUT);
}
int n = EEPROM.read(0);
Si (n == 20) {}
callRange();
}
Si (rangeTest == false) {}
para (int i = 0; i < numServos; i ++) {}
setRange(i); ir a la gama de prueba y ajuste de los valores
doneMove [i] = true;
}
rangeTest = true;
EEPROM.write(0,20); indicar el futuro startups que hemos hecho esto!
}
Delay(1000);
}
void loop() {}
para (int i = 0; i < numServos; i ++) {}
Si (doneMove [i] == true) {}
doneMove [i] = false;
aquí [i] = se [i];
allí [i] = al azar (180.1) + 0,5;
Si (allí [i] == here[i]) {allí [i] = al azar (180.1) + 0.5;}
Si (aquí [i] < there[i]) {x [i] = 0;} Else {x [i] = 180;}
Serial.Print ("movimiento servo");
Serial.Print(i);
Serial.Print ("desde");
Serial.Print(here[i]);
Serial.Print ("a");
Serial.println(There[i]);
}
}
calcCos (posición actual, posición, paso, posición de matriz de servo)
para (int i = 0; i < numServos; i ++) {}
ángulo = calcCos(here[i],there[i],1.5,i);
Si (doneMove [i] == false) {}
servo[i].Write(Angle);
Delay(5);
}
}
} / / FINAL DE BUCLE VACÍO
/*
ESTE FUNCIÓN AUTO-AJUSTA LA GAMA DE SERVOS
ASUME PULSADOR EN PIN 2
*/
void setRange(int x) {//parameter pasado es la matriz posición de servo
int pb = 0; utilizado para sostener el botón lectura
int prueba; variable de uso general
int h;
int t;
pulso de int = 1500; primero que nos pulso utilizado en la prueba de rango
Serial.Print ("Pulse el botón para ajustar la gama de Servo[");
Serial.Print(x);
Serial.println("].");
{while(!PB)}
PB = digitalRead(Button);
}
PB = 0;
Serial.Print ("ajuste gama límites en... 3");
para (int i = 2; i > = 0; i--) {//count por tres segundos
Delay(1000);
Serial.Print("..");
Serial.Print(i);
}
Serial.println();
servo[x].Attach(sPin[x]);
Delay(20);
servo[x].writeMicroseconds(pulse); enviar servo a mediados de gama
Delay(2000); Espere a llegar
{}
pulso += 10; incriment nos anchura de pulso
readMove(x,pulse);
} while(h > t); condición para mantener la gama de prueba
highPulse [x] = pulso-20; mantenerse alejado de gama extrema
B [x] = h-10; ajustar la feedback de extremo
Serial.println();
servo[x].writeMicroseconds(highPulse[x]);
pulso = highPulse [x];
Delay(500);
{}
pulso-=10;
readMove(x,pulse);
} while(h < t);
lowPulse [x] = pulso + 20;
[X] = t + 10;
servo[x].writeMicroseconds(lowPulse[x]);
Comentarios = getFeedback(x); toma actual de lectura de la olla
allí [x] = map(feedBack,A[x],B[x],0,180); ajustar la feedback a la salida de grado
servo[x].Attach(sPin[x],lowPulse[x],highPulse[x]); Fije este servo
servo[x].Write(There[x]); envía impulsos de donde estamos
doneMove [x] = true;
prueba = [x] >> 8;
writeE(test); almacenar lectura baja retroalimentación
writeE(A[x]);
prueba = B [x] >> 8;
writeE(test); almacenar lectura alta regeneración
writeE(B[x]);
prueba = lowPulse [x] >> 8;
writeE(test); almacenar el pulso bajo control
writeE(lowPulse[x]);
prueba = highPulse [x] >> 8;
writeE(test); almacenar el pulso de control de la alta
writeE(highPulse[x]);
Serial.println ("gama de comentarios:");
Serial.Print(A[x]);
Serial.Print ("<>");
Serial.println(B[x]);
Serial.println ("nos gama del pulso:");
Serial.Print(lowPulse[x]);
Serial.Print ("<>");
Serial.println(highPulse[x]);
Serial.Print("servo[");
Serial.Print(x);
Serial.println ("] adjunto, los datos guardados en la EEPROM");
} //end setRange()
void writeE (byte b) {}
EEPROM.write(e,b);
e += 1;
}
void readMove (int n, int p) {}
t = getFeedback(n);
servo[n].writeMicroseconds(p);
Delay(btwReadings);
h = getFeedback(n);
Serial.println(h);
} //END CONJUNTO GAMA
/*
ESTA FUNCIÓN LEE EL POTENCIÓMETRO INTERNO DEL SERVO
*/
int getFeedback(int a) {}
int j;
int promedio;
int resultado;
int prueba;
int leer [20];
Boolean hecho;
para (j = 0; j < 20; j ++) {}
lectura [j] = analogRead(a); obtener datos del potenciómetro de servo
Delay(whlReading);
} / / ordenar el array bajo a alto en lecturas
= false; clara clasificación bandera
mientras que (hecho! = true) {/ / clase de intercambio simple, ordena números de menor a mayor
= true;
para (j = 0; j < 20; j ++) {}
Si (lectura [j] > lectura [j + 1]) {/ / aquí los números de clasificación
prueba = lectura [j + 1];
la lectura [j + 1] = lectura de [j];
lectura [j] = prueba;
= false;
}
}
}
significa = 0;
para (int k = 6; k < 14; k ++) {//discard los 6 mayores y 6 lecturas más bajas
significa += leyendo [k];
}
resultado = media/8; media lecturas útiles
Return(Result);
} / / FIN OBTENER RETROALIMENTACIÓN
/*
ESTA FUNCIÓN LLAMA PREVIAMENTE SET GAMA DE EEPROM
ASUME PULSADOR EN PIN 2
*/
void callRange() {}
int prueba;
Serial.Print ("a guardado gama pulse botón reset en el pin 2");
para (int i = 5; i > = 0; i--) {}
Serial.Print("..");
Serial.Print(i);
para (int j = 0; j < 100; j ++) {}
Si (digitalRead(Button) == 1) {}
Serial.println();
Delay(1000);
retorno;
}
Delay(10);
}
}
Serial.println();
Serial.println ("al recuperar servo datos");
para (int i = 0; i < numServos; i ++) {}
prueba = readE();
[I] = prueba << 8; obtener una lectura almacenada baja retroalimentación
[I] = A [i] + readE();
prueba = readE();
B [i] = prueba << 8; obtener lectura de retroalimentación alta almacenados
B [i] = B [i] + readE();
prueba = readE();
lowPulse [i] = prueba << 8; conseguir el pulso de control de baja storeed
lowPulse [i] = lowPulse [i] + readE();
prueba = readE();
highPulse [i] = prueba << 8; Haz almacenado control alto pulso
highPulse [i] = highPulse [i] + readE();
Comentarios = getFeedback(i); toma actual de lectura de la olla
allí [i] = map(feedBack,A[i],B[i],0,180); ajustar la feedback a la salida de grado
servo[i].Attach(sPin[i],lowPulse[i],highPulse[i]); Fije este servo
servo[i].Write(There[i]); envía impulsos de donde estamos
doneMove [i] = true; configurar para realizar primero mover
Serial.println ("gama de comentarios:");
Serial.Print(A[i]);
Serial.Print ("<>");
Serial.println(B[i]);
Serial.println ("nos gama del pulso:");
Serial.Print(lowPulse[i]);
Serial.Print ("<>");
Serial.println(highPulse[i]);
Serial.Print("servo[");
Serial.Print(i);
Serial.println ("] adjunto, obtenido datos de EEPROM");
Serial.Print ("servo");
Serial.Print(i);
Serial.Print ("posición actual =");
Serial.println(There[i]);
Serial.println();
}
rangeTest = true; establece el indicador rangeTest
} //end callRange()
byte readE() {}
byte E = EEPROM.read(e);
e += 1;
E retorno;
} //END LLAMADA GAMA
/*
ESTA FUNCIÓN CREA LISO (COSENO) MOVIMIENTO DE AQUÍ PARA ALLÁ
*/
int calcCos (int h, int XX, flotador s, int n) {}
int r;
int a;
if(h < th) {}
x [n] += s;
Si (x [n] > = 181) {doneMove [n] = true;}
r = (cos(radians(x[n]))*100);
un = map(r,100,-100,h,t);
}
if(h > TH) {}
x [n] = s;
Si (x [n] < = -1) {doneMove [n] = true;}
r = (cos(radians(x[n]))*100);
un = map(r,-100,100,h,t);
}
volver a;
} //END CALC COS