Paso 7: Prueba de microcontrolador
Notas de código: ServoWithFeedback_V1
Este es el primer intento (bueno, no es la primera. No posteo ese lío;), tiene como objetivo tomar una lectura de uno a uno de la posición de retroalimentación servo, guardar todos los 180 puntos en una matriz y luego comparar la matriz de nuevas lecturas como el servo se mueve a ellos. Pruebas para suavizar la funcionalidad y del sensor.
Notas de código: ServoWithFeedback_V2
Aquí estoy simplificando la adquisición inicial de la gama. Tomar una lectura alta y baja en cada extremo de la gama y nos map() para correlacionar con ángulos de grado. Esto funciona muy bien. He creado un barrido que compara las lecturas actuales del sensor del cable de retroalimentación para el valor esperado por map(). El desplazamiento es mínimo (-1 a 1) en el loop de levantamiento. En el bucle de caída, el desplazamiento es más parecido a -4 a -6. Esto es bastante consistente y podría trabajarse alrededor de software. Fue capaz de aplicar presión leve y el cuerno del servo hacia el sentido de la marcha de la oposición y algunos valores agradable que conste mi fuerza aplicada.
Aquí tienes, divertirse.
/ * > servo con Feedback_V1 <
Código de prueba de servo con retroalimentación hackeado del pote interno.
Cable de control del servo conectado al digital 2
Cable de retroalimentación de posición conectado a analógico 0
Construir un divisor de voltaje en el pin ARef con dos resistencias de 10K.
La referencia analógica resultante será ~2.2V (véase 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
*/
Biblioteca de servo //import #include
Servo1 servo; declair servo!
int leer [20];
int respuesta [181];
int servoPin1 = 2;
int prueba; int de propósito general
int desplazamiento = 0;
ruido de int = 50;
int promedio;
int resultado;
Boolean hecho;
void setup() {}
Serial.Begin(9600); inicializar la salida serie
analogReference(EXTERNAL);
pinMode (servoPin1, salida);
Servo1.Attach(servoPin1,570,2400); activar control de servo en el pin digital 2
setRange(); ir a la gama de prueba y ajuste de los valores
}
void loop() {}
Servo1.Write(0);
Delay(2000);
para (int i = 0; i < = 180; i += 10) {}
Servo1.Write(i);
Delay (50);
prueba = getFeedback();
offset = test - comentarios [i];
Serial.Print(i);
Serial.Print ("=");
Serial.Print(test);
Serial.Print("");
Serial.Print(Offset);
Serial.Print("");
Serial.println(feedback[i]);
}
Serial.println("");
}
void setRange() {}
Servo1.Write(0); enviar el servo a la posición de 0 grados
Delay(2000); dar servo tiempo suficiente para llegar allí
para (int i = 0; i < = 180; i ++) {}
Servo1.Write(i); enviar el siguiente pulso de grado a servo
Delay(50); dejar que las cosas dejen de parpadear
Comentarios [i] = getFeedback(); leer los comentarios de servo
Serial.Print(i);
Serial.Print ("=");
Serial.println(feedback[i]);
}
}
int getFeedback() {}
para (int j = 0; j < 20; j ++) {}
lectura [j] = analogRead(0); obtener datos del potenciómetro de servo
Delay(3);
} / / ordenar el array bajo a alto en lecturas
= false; clara clasificación bandera
mientras que (hecho! = true) {/ / intercambio simple ordena números de menor a mayor
= true;
para (int 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;
}
}
}
para (int j = 0; j < 20; j ++) {//un-comment este bucle for para ver la raw pidió datos
Serial.Print(i);
Serial.Print("");
Serial.println(Reading[j]);
// }
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
volver (resultado);
}
FINAL DE SERVO_WITH_FEEDBACK_V1
/ * > servo con Feedback_V2 <
Código de prueba de servo con retroalimentación hackeado del pote interno.
Cable de control del servo conectado al digital 2
Cable de retroalimentación de posición conectado a analógico 0
Construir un divisor de voltaje en el pin ARef con dos resistencias de 10K.
La referencia analógica resultante será ~2.2V (véase 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
*/
Biblioteca de servo //import #include
Servo1 servo; declair servo!
int respuesta; utilizado para sostener el valor de retroalimentación servo
int mappedPulse; utilizado para mantener el valor asignado entre servo y rango de grado
lowEnd int; Comentarios de servo en 0 grados
int High-End; Comentarios de servo en 180 grados
int leer [20];
int servoPin1 = 2;
test1 int; int de propósito general
test2 int;
int desplazamiento = 0;
ruido de int = 50;
Boolean rangeTest = false;
void setup() {}
Serial.Begin(9600); inicializar la salida serie
analogReference(EXTERNAL);
pinMode (servoPin1, salida);
Servo1.Attach(servoPin1,570,2400); activar control de servo en el pin digital 2
setRange(); ir a la gama de prueba y ajuste de los valores
}
void loop() {}
Servo1.Write(0);
Delay(2000); Espere a llegar
para (int i = 0; i < 181; i ++) {/ / bucle subiendo grados
Servo1.Write(i);
Delay(50);
Comentarios = getFeedback(); subrutina suaviza los datos
mappedPulse = map(i,0,180,lowEnd,highEnd); mapa de grados a setRange() lecturas
offset = mappedPulse - regeneración; resolución de mapeado retroalimentación real de V
printData();
}
para (int i = 180; i > 0; i--) {/ / bucle grados bajando
Servo1.Write(i);
Delay(50);
Comentarios = getFeedback();
mappedPulse = map(i,0,180,lowEnd,highEnd);
offset = mappedPulse - regeneración;
printData();
}
}
{} void printData()
Serial.Print(i);
Serial.Print ("=");
Serial.Print(feedBack);
Serial.Print("");
Serial.Print(Offset);
Serial.Print("");
Serial.println(mappedPulse);
}
void setRange() {}
Servo1.Write(0);
Delay(2000); Espere a que servo llegar
lowEnd = getFeedback();
Servo1.Write(180);
Delay(2000); Espere a que servo llegar
High-End = getFeedback();
rangeTest = true;
Serial.Print ("0 =");
Serial.Print(lowEnd);
Serial.Print("");
Serial.Print ("180 =");
Serial.println(highEnd);
}
int getFeedback() {}
int promedio;
int resultado;
int prueba;
Boolean hecho;
para (int j = 0; j < 20; j ++) {}
lectura [j] = analogRead(0); obtener datos del potenciómetro de servo
Delay(3);
} / / 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 (int 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);
}
SERVO_WITH_FEEDBACK_V2 FINAL