Tengo un servomotor que se va moviendo por pulsos tanto por izquierda y derecha, pero quiero que por otra tecla se mueva de esa posición hasta 180° y de ahi a 0° y de 0° a 180°...
Solo me interesa el ciclo for creo que sería así.. alguna sugerencia.
Hay que tratar de concretar más los problemas y a poder ser poner el código que se tiene ya que en ocasiones según lo que se tenga se plantea la solución.
¿Qué programación hace que se mueva por pulsos? Si añadimos la opción que indicas, ¿cómo sabemos si interfiere con el movimiento que tienes ahora por pulsos, es decir, cómo lo anulamos? Lo que hay que añadir podría interpretarlo de manera tan sencilla como un bucle for con las repeticiones que quieras y dentro metes
¿Es eso lo que quieres?
También podría ser que lo quisieras hacer por pasos. En ese caso es tan sencillo como abrir los ejemplos del IDE y concretamente "Sweep"
Pero según lo que precises tampoco te valdrá ya que mientras se está moviendo el servo no podrás hacer otra cosa ni podrás cambiar por ejemplo al movimiento que tenías por pulsos (sólo cambiarías después de ejecutarse todo el bucle for).
Hay que tener muy claro qué es lo que se quiere hacer y a continuación plasmarlo para que las respuestas puedan dar con la solución de forma rápida.
Un servo siempre se conecta de la misma manera independientemente del código de programación. GND, alimentación y señal (el PIN de salida en Arduino).
El temblor del servo pueden ser varias cosas. Puede ser que tenga que estar haciendo más fuerza que para la que está preparado, si es el caso hay que poner un servo mayor. Según la magnitud del temblor tal vez podría apañarse un poco bloqueándolo en otra posición cercana, si estás en 180 pues ponerlo en 179,5º ó 179º, probar no cuesta nada.
Por otra parte el código que has puesto tiene varias pequeñas cosas que conviene acostumbrarse a hacer de otra manera, un código bien estructurado y siguiendo siempre las mismas normas es mucho más fácil de entender y seguir, también para ti cuando lo retomes o quieras hacer cambios en otra ocasión. O simplemente reutilizarlo insertándolo en otro programa.
float potPin=2; --> mal, estás asignando un pin a un float, podría dar problemas además de la memoria que estás desperdiciando. Además de utilizar int está bien nombrarlo como una constante tal y como haces después con buttonPin. Sería --> const int potPin = 2;
Si nombras constantes para los pines del potenciómetro y del pulsador deberías de hacer lo mismo para el pin del LED. Así tendrás al inicio --> const int LedPin = 11;
Y después en el setup() --> pinMode(LedPin, OUTPUT);
Y en el loop() --> digitalWrite(LedPin, HIGH)
Más tarde haces un mapeo entre 5 y 1024 para convertirlo a 5 - 240. Varias cosas... la señal de entrada varía entre 0 y 1023. La de salida al servo son valores entre 0 y 180. No sé exactamente lo que quieres obtener pero intuyo que el mapeo que tienes que hacer es:
Pues nada, te comento unas cuantas cosas y haces caso omiso a todas ellas.
Me pones un código sobre el que te comento y ahora me dices que el que estás usando es otro que te funciona pero que el servo vibra. Debe de ser para indicarme que las apreciaciones que te hago te dan igual puesto que ya te funciona como quieres, que no me ande por las ramas y te diga el secreto que me guardo para quitar la vibración.
Además de hacer caso omiso a mis apreciaciones me zampas otro código que has visto en algún sitio que milagrosamente te va a quitar las vibraciones si un alma caritativa te lo inserta en el programa que estás haciendo (perdón, "utilizando" porque ya veo que tú hacer el programa más bien poco). Pues bien, ya te adelanto que en el último código que dices usar, el "obturador_15_5.ino", no te sirve para nada meter el código mágico de supresión de ruido ya que no estás haciendo ninguna lectura analógica.
Y los vídeos que pones parece que los hayas grabado y después los hayas colgado sin verlos porque la verdad que no sé cómo quieres que alguien vea algo. Yo he llegado a ver un servo totalmente desenfocado y un trozo de pala que se movía por fuera de la imagen.
Perdona que parezca que saco las cosas de quicio pero si preguntas algo sobre un código y te doy unas pautas para mejorarlo y hacer una prueba por lo de la vibración y en lugar de hacer nada de eso me sales con otro código.
Además lo siento pero créeme que yo no veo la vibración en ningún vídeo. No digo que no la haya, es que no se ve en el vídeo.
Otra cosa, ¿cómo alimentas el servo?
es un temblor que no se aprecia más que nada es el ruido que hace, en este video creo que se aprecia mejor el ruido al abrir y cerrar el interruptor
lo alimento con cable usb y tambien he probado con un transformador de las dos maneras hace ruido,
he probado con el otro servo que tengo un hb 3001 que es un poco más potente y no me ha hecho ruido esta vez pero es aleatorio
alguna vez me lo ha hecho y al forzar un poquito el eje deja de hacerlo
te agradezco el código y me pondré a ello pero con más calma ya que soy nuevo en esto de Arduino y todavia me cuesta
gracias
Pues creo que no es nada. De hecho si te lo hace en vacío será que el encoder interno le pilla la posición intermedia y estará corrigiendo ligeramente. Piensa que un servo cuando le indicas una posición no va allí y se "desconecta", la posición se le está enviando continuamente (cada 20 ms, lo hace la librería) y una pequeña desviación hará que esté corrigiendo ligeramente.
Gracias, pero lo que me tiene mosca es que le he preguntado a la chica y su servo no le hace ruido, he hecho el circuito tal y como lo tiene ella, he probado a hacerlo en una protoboard y tambien me hace el ruido ella a utilizado otro modelo de servo
HD1160A
Corriente en vacío @ 6V: 180 mAh
Corriente máxima @ 6V: 800 mA
Velocidad @ 6V: 0.11 sec/60°
Par máximo @ 6V: 2.7 kg·cm
Velocidad @ 4.8V: 0.12 sec/60°
Par máximo @ 4.8V: 2.0 kg·cm
HS-311
Control System: +Pulse Width Control 1500usec Neutral
Required Pulse: 3-5 Volt Peak to Peak Square Wave
Operating Voltage: 4.8-6.0 Volts
Operating Temperature Range: -20 to +60 Degree C
Operating Speed (4.8V): 0.19sec/60° at no load
Operating Speed (6.0V): 0.15sec/60° at no load
Stall Torque (4.8V): 42 oz/in (3.0 kg/cm)
Stall Torque (6.0V): 51 oz/in (3.7 kg/cm)
Current Drain (4.8V): 7.4mA/idle, 160mA no load operating
Current Drain (6.0V): 7.7mA/idle, 180mA no load operating
Dead Band Width: 5usec
Operating Angle: 45° one side pulse traveling 450usec
Direction: Multi-directional
este es el que utilizo yo y si no se me escapa nada son similares, bueno este es algo más potente
pero como ya digo tambien tengo un hb3001 que es aún un poco más potente y hace ruido pero aletoriamente, ayer cuando grabé un video no le dió la gana hacer ruido
no sé estoy por comprar el servo que utiliza ella y salir de dudas pero bueno si me dices que no se puede quitar el ruido será cuestión de ponerle el que servo que menos hace
ya te contaré
muchas gracias
Cheyenne, gracias modifiqué el codigo como me dijiste y me funciona, el potenciometro actúa perfectamente cuando lo abro y lo cierro, lo que tengo problemas es con el pulsador
que lo conecto a la salida 13 el positivo y negativo a gnd en la protoboard, el caso es que si que abre y cierra el servo pero se le va la pinza cuando quiere y deja de abrir o abre y cierra el solo, le he puesto un potenciometro de 100k y no sé si tiene algo que ver
gracias
Hola, el código quedaría así como tú me corregiste ,
//BASADO EN EL EJEMPLO DE ARDUINO/////////////////////////////////////////
//Controlling a servo position using a potentiometer (variable resistor)//
// by Michal Rinott http://people.interaction-ivrea.it/m.rinott ////////
//////////////////////////////////////////////////////////////////////
#include <Servo.h>
Servo myservo;
const int potPin = 2;
const int LedPin = 11;
int sensorValue;
float calibrate;
const int buttonPin = 13;
void setup()
{
myservo.attach(3); //Pin de señal para el servo
pinMode(buttonPin, INPUT); // Pin de entrada para el boton
pinMode(LedPin, OUTPUT); // Pin de salida para el led
}
void loop()
{
digitalWrite(LedPin, HIGH); //Enciende el led que indica que el aparato est´ encendido.
sensorValue=analogRead(potPin); //Lee el porcentaje asignado en el potenciometro.
calibrate = map(sensorValue,0,1023,5,180);
if(digitalRead(buttonPin)){ //Si hay señal del boton
myservo.write(calibrate); //Mueve el servo los grados necesarios
} else{ //Si no, vuelve a la posicin inicial.
myservo.write(5);
En el circuito alimentas el servo desde el Arduino. No sé si esto lo haces así realmente pero conviene que lo alimentes directamente con otra fuente externa.
El pulsador lo tienes en la D13. Ésta lleva en placa un LED lo que la hace un poco particular. De hecho no sé la razón exacta pero en el vídeo se ve que te falla el interruptor. Yo pondría el interruptor en otra patilla activando la pull-up.
El LED con el que indicas que el aparato está encendido es mejor que pongas su instrucción (digitalWrite(LedPin, HIGH) en el setup() ya que en el loop() está repitiendo todos los ciclos la instrucción que nunca va a cambiar.
Cuando haces el mapeo mezclas dos tipos de variables, un int y un float. Alguien más experto nos lo podrá confirmar pero esto puede dar problemas. Puedes convertir primero la variable sensorValue a float.
Si, lo que da problemas es el interruptor, probaré a ver que tal vá con una alimentación externa que realmente es como quiero que vaya
y luego cambiar el pin que es cuestión de hacerlo en el sketch y activando una pull up que tambien se hace por código cambiando el pin 13 por otro y activando pull up "digitalWrite(pin, HIGH);"verdad?
muchas gracias y ya te contaré cuando lo termine
Hola. creo que el motivo de que fallara el interruptor es que hacía mal contacto los pines del interruptor y al "bailar" un poco este hacía malcontacto
lo de activar la pull up como sería ?
en setup ahora mismo tengo const int buttonPin = 13;
sería así si lo cambio al pin 12 por ejemplo: const int buttonPin = 12;?
gracias
sería asi si cambio al 12 y levanto la pull up?
#include <Servo.h>
Servo myservo;
float potPin=2;
int sensorValue;
float calibrate;
const int buttonPin = 12;
void setup()
{
myservo.attach(3); //Pin de señal para el servo
pinMode(buttonPin, INPUT); // Pin de entrada para el boton
pinMode(11, OUTPUT); // Pin de salida para el led
digitalWrite(12, HIGH);
}
void loop()
{
digitalWrite(11, HIGH); //Enciende el led que indica que el aparato est´ encendido.
sensorValue=analogRead(potPin); //Lee el porcentaje asignado en el potenciometro.
calibrate=map(sensorValue,5,1024,5,240);
if(digitalRead(buttonPin)){ //Si hay señal del boton
myservo.write(calibrate); //Mueve el servo los grados necesarios
} else{ //Si no, vuelve a la posicin inicial.
myservo.write(5);
@MODE pa matarte tío, has hecho la modificación sobre el primer código que tenías con unos pequeños fallos y que ya habías corregido y nos habías enseñado aquí.
El cambio al pin 12 y activación de la pull up está bien.
Ha sido una confusión que no cunda el pánico , este sería el código definitivo
#include <Servo.h>
Servo myservo;
const int potPin = 2;
const int LedPin = 11;
int sensorValue;
float calibrate;
const int buttonPin = 12;
void setup()
{
myservo.attach(3); //Pin de señal para el servo
pinMode(buttonPin, INPUT); // Pin de entrada para el boton
pinMode(LedPin, OUTPUT); // Pin de salida para el led
digitalWrite(12, HIGH);
}
void loop()
{
digitalWrite(LedPin, HIGH); //Enciende el led que indica que el aparato est´ encendido.
sensorValue=analogRead(potPin); //Lee el porcentaje asignado en el potenciometro.
calibrate = map(sensorValue,0,1023,5,180);
if(digitalRead(buttonPin)){ //Si hay señal del boton
myservo.write(calibrate); //Mueve el servo los grados necesarios
} else{ //Si no, vuelve a la posicin inicial.
myservo.write(5);
Jejejeje me ha costado no te creas, yo y mi puta manía de empezar la casa por el tejado pero bueno ya lo voy entendiendo
muchas gracias por tu ayuda, de verdad
con que transformador podría alimentar la placa arduino uno y el servo?
ahora mismo le tengo puesto uno de 7,5 voltios y 1000a pero no sé si es la adecuada o me puedo cargar el servo
estas son las características del servo
Required Pulse: 3-5 Volt Peak to Peak Square Wave
Operating Voltage: 4.8-6.0 Volts
Operating Temperature Range: -20 to +60 Degree C
Operating Speed (4.8V): 0.19sec/60° at no load
Operating Speed (6.0V): 0.15sec/60° at no load
Stall Torque (4.8V): 42 oz/in (3.0 kg/cm)
Stall Torque (6.0V): 51 oz/in (3.7 kg/cm)
Current Drain (4.8V): 7.4mA/idle, 160mA no load operating
Current Drain (6.0V): 7.7mA/idle, 180mA no load
Han solucionado el problema del compañero MODE pero no el mio...
Mi problema está así:
Yo envío pulsos con unos botones que he programado en mi interfaz de C#, justamente cuando envío una letra "a" esta envía al servo por puerto serial el pulso y se mueve tal como lo he programado...
#include <Servo.h>
Servo nazza;
Servo galaxia;
int nazzaPos = 90;
int galaxiaPos = 90;
void setup() {
Serial.begin (9600);
nazza.attach(10);
galaxia.attach(9);
nazza.write(nazzaPos); // Colocamos el servomotor a 90° para tomarlo de 0-90 por izquierda, y 90-180 por derecha.
galaxia.write(galaxiaPos);
}
void loop () {
if (Serial.available () > 0) {
int jul = Serial.read();
int san = Serial.read();
if (jul == 'a'){ // asignamos una variable "a" para mover posiciones a derecha
nazzaPos -= 20;
nazza.write(nazzaPos);
}
if(san == 'w'){ // asignamos una variable "w" para mover posiciones abajo
galaxiaPos -= 20;
galaxia.write(galaxiaPos);
}
if (jul == 'b'){ // asignamos una variable "b" para mover posiciones a izquierda.
nazzaPos += 20;
nazza.write(nazzaPos);
}
if (san == 's'){ // asignamos una variable "s" para mover posiciones arriba
galaxiaPos +=20;
galaxia.write(galaxiaPos);
}
if (jul == 'z'){ // ciclo For de recorrido izquierda derecha.
for(nazzaPos = 0; nazzaPos < 180; nazzaPos += 20) // movemos de posición el servomotor de 0 grados a 180°
{ // en pasos de 20 grados
nazza.write(nazzaPos); // hacemos que el servo vaya a la posición "pos"
delay(15); // espera 15 milisegundos al servo para reiterar su posición
}
for(nazzaPos = 180; nazzaPos>=1; nazzaPos-=20) // movemos el motor de
{
nazza.write(nazzaPos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
if (san == 'x'){
for(galaxiaPos = 0; galaxiaPos < 180; galaxiaPos += 20) // movemos de posición el servomotor de 0 grados a 180°
{ // en pasos de 20 grados
galaxia.write(galaxiaPos); // hacemos que el servo vaya a la posición "pos"
delay(15); // espera 15 milisegundos al servo para reiterar su posición
}
for(galaxiaPos = 180; galaxiaPos>=1; galaxiaPos-=20) // movemos el motor de
{
galaxia.write(galaxiaPos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
if (jul== 'h'){
nazza.write(nazzaPos);
}
}
delay (15);
}
El problema que tengo, es que necesito que cuando mi servo esté en cualquier posición, primero se regrese a 90° en la parte central del servomotor, luego que gire de derecha a izquierda y regrese a los 90° originales.. tanto para mi servo NAZZA como para mi servo GALAXIA..