Pages: [1] 2   Go Down
Author Topic: ¿Cómo podría programar un servomotor que se mueva de 0 a 180 y de 180 a 0 grados  (Read 6055 times)
0 Members and 1 Guest are viewing this topic.
México
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Estudiante de Ingeniería Mecatrónica
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Polytechnic University.

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

myservo.write(180);
delay(500);
myservo.write(0);
delay(500);

¿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"

for(pos = 0; pos < 180; pos += 1)
  {
    myservo.write(pos);
    delay(15);
  }
  for(pos = 180; pos>=1; pos-=1)
  {
    myservo.write(pos);
    delay(15);
  }

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.
Logged


Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

calibrate = map(sensorValue,0,1023,5,180);
Logged


Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

http://www.youtube.com/watch?v=GFsFEODigzQ&feature=youtu.be

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
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pon el esquema de cómo has conectado ese pulsador.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);                  
 
    }                    
  }
 


muchas grácias

« Last Edit: July 26, 2012, 02:33:35 am by M0DE » Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)smiley-wink 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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: July 20, 2012, 06:02:33 am by M0DE » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);     
« Last Edit: July 25, 2012, 12:22:28 pm by M0DE » Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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.
Logged


Pages: [1] 2   Go Up
Jump to: