Pages: [1] 2   Go Down
Author Topic: Alguien me ayuda?????Lo que intento es disminuir la velocidad del recorrido del  (Read 2839 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola pues como todos, descubrí este foro  buscando soluciones,  después de dar un vistazo puedo ver que se encuentran respuestas muy fácil.
 pues  mi pregunta puede resultar demasiado fácil para ustedes pero yo no logro descubrirlo por mi cuenta. hay les vas

 este es el código de la libreria
Code:
// Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

#include <Servo.h>
 
Servo myservo;  // create servo object to control a servo
 
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin
 
void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}
 
void loop()
{
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

Lo que intento es disminuir la velocidad del recorrido del servo.
Todos sabemos que si muevo el pot. 180 el servo se va a mover 180 casi a la misma velocidad.
Pues lo que quiero lograr es que si muevo el pot. a 180 el  servo se mueva a 180 pero en unos cuantos minutos de retraso gradualmente.

Al cambiar el ( delay(15) )   a ( delay(1500) )   solo logre que la respuesta fuera tardada, y el recorrido de giro  fue a la misma velocidad


También  me gustaría agregar una lcd para aumentar el tiempo de retardo  sin la necesidad de una  comp.

Alguien me ayuda?????
de antemano Gracias.
Logged

COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola cuchara,

Los servos corrientes solo tiene una resolución de un grado, entonces para mover esos 180º en menos tiempo, tendrías que ir moviendolo grado a grado con delay's. Algo parecido a esto.

Code:
myservo.write(val);
val++;
delay(1000);

De esa manera cada segundo el servo de moverá un grado. Pues seria hacer un código similar con dos variables, una donde guarde el angulo de giro deseado y otra que es angulo instantáneo osea el val.

Espero que te sirva de ayuda.
Logged


Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Utiliza un PID, hay una libreria para utilizarlo. Con los parámetros adecuados lograrás que el movimiento sea paulatino describiendo una curva. se utiliza mucho en regulación automática.

un saludo
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

gracias por tu respuesta Rodri

 el provlema es que este ejemplos  que me das
Quote
Code:
myservo.write(val);
val++;
delay(1000);
No lo puedo agregar al código que muestro,  Ya que el servio lee el potenciometro
si ago como lo muestras tu no puedo controlar manualmente el movimiento. y es eso lo que quiero me gustaría aumentar el retardo con botones
muchas gracias por tu respuesta.


y usted también Sr. dongato  gracias  pero que es el PID? y donde encuentro su librería? ya le di un vistazo a la librería y no lo vi 
la cuchara les agradece por sus respuestas jajaja  a pa nombres que nos ponemos jaja
Logged

COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Es algo parecido a esto lo que te comento no lo he probado con un servo, osea a lo mejor no funciona o no hace lo que quieres  smiley-razz

Quote
#include <Servo.h>
 
Servo myservo;  
int potpin = 0;  
int val;
int position; // posición deseada controlada con el potenciómetro
 
void setup()
{
  myservo.attach(9);
  val = 90;
}
 
void loop()
{
  position = analogRead(potpin);          
  position = map(position, 0, 1023, 0, 179);
  
  if ( position < val ) {  //Posición deseada < Angulo servo
  val--; 
  myservo.write(val);
  delay(980);
  }
  
  if ( position > val ) {  //Posición deseada > Angulo servo
  val++; 
  myservo.write(val);
  delay(980);
  }
  
  delay(20);
}

Un saludo!
« Last Edit: May 29, 2011, 07:03:50 pm by ElRodri » Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 ok, gracias por tu sinceridad jaja ya lo checo
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://blog.bricogeek.com/noticias/arduino/libreria-pid-con-arduino

en los ejemplos ponen muchas oscilaciones pero no tiene por qué oscilar si configuras bien el PID.

si utilizas esto el movimiento que describirá el servo será de forma esponencial o logaritmica. de la forma que lo hace ElRodri será linealmente.
Los PID se utilizan por ejemplo en los climatizadores de los coches, regulan una entrada de aire caliente con un servo para que la mezcla con frio sea una temperatura que se haya fijado con los mandos.

ya depende de la aplicacion que quieras hacer, si es regulacion o un simple movimiento temporizado

un saludo


Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pues busque en el link que me dio srdongato y me dice que no puedo entrar. Probablemente es por que  no soy miembro del sitio.

pues yo buscaba movimiento temporizado  pero ya que tocas el tema de exponencial  creo que me gustaría saber como lograrlo también de esa forma ya que en algunos momento me serviría........ pensando bien definitivamente quiero saber como lograr eso   me diste toda una visión diferente del proyecto.
bueno pues sigo sin entender como funciona  ya que no pude ver el link.


Elrodri. ya prove el cod  funciona muy bien ahora solo tengo encontrar como unirlo con mi actual código a ver como me va

« Last Edit: May 29, 2011, 07:42:46 pm by cuchara » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pues ya estaba uniendo los códigos  cuando me encontré con que  el código no puede trabajar a una velocidad rápida
si hablamos de velocidades lentas ese código me funciona muy bien pero cuando necesite  darle una velocidad  rápida (180° en 2 segundos ) no me funciona  ya que solo me da los 180 como en 6 o 7 segundo,
otra sugerencia?

también encontré que  solo puedo cambiar la velocidad de  una parte del código  y no de la segunda   ya que la segunda  funciona con botones

para que este mas claro  muestro el código
Code:
void loop()
{
   position = analogRead(potpin);              
   position = map(position, 0, 1023, 0, 179);            
    
    
     if ( position < val )
   {
  val--;  
  myservo.write(val);
  delay(masmenos);
  }
  
  if ( position > val )
  {
  val++;  
  myservo.write(val);
  delay(masmenos);
  }
asta esta parte todo bien  el servo se tarda en recorrer la lectura del pot. a la velocidad  que le dice la variable (masmenos)
pero cuando pasa a esta parte,
Code:
if (digitalRead(Bot1) == LOW)            
   {
     if (mem1 == 0)                      
{                                
  mem1 = val;            
}
else                              
{
  val = mem1;            
 }
      }
en la que los botones  mueven al servo  a la posición memorizada  el (masmenos) ya no puede controlar  y provoca el movimiento del servo muy rapido
como agrego una variavle que controle el movimiento del servo  en todas sus ordenes tanto potentiometer como  botones ?????

una bes mas les agradece la cuchara
« Last Edit: May 29, 2011, 09:36:01 pm by cuchara » Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no apareces conectado.
no pinches en el link que dejo, copialo y pegalo en el explorador, no se por que causa si pinchas no se ve la pagina.
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lo que quieres hacer con lo pid lo puedes hacer

http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

hay tienes el autor de la libreria

y el playground

http://www.arduino.cc/playground/Code/PIDLibrary

una vez configurado solo tienes que establecer el valor objetivo que quieres que alcance. imagina que estas en 30º, tu estableces que debe ir a 80º, entonces el valor que manda al servo irá variando poco a poco, promero con más velocidad decreciento esta velocidad conforme se acerca al valor objetivo. los tiempos y demás los configuras con los valores PID

leete un poco como va el tema
hay simuladores tambien conlos qe puedes ver las reacciones segun los valores que pongas

un saludo
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SrDonGato
que gran tema me dio a leer. es todo un mundo gracias, creo que si me meto por ahí me complicare mas de los que ya estoy ya muy confundido ando
espero alguien me ayude
 
Logged

COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

El problema que tienes con los botones es que no tienes que utilizar la variable val para cambiar de posición al servo si no position que lo ara girar hacia un lado o hacia el otro, dependiendo si es más grande o más pequeño que val. Al meterle mem1 a val lo que haces es cambiar de golpe el angulo del servo, en vez de aumentarlo con el ++ o -- en una unidad.  smiley-wink
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

gracias  Rodri creo que debí explicar mas el código  esas función la necesito así.
pues me deje del foro y  encontre  lo que tenia que hacer  mi código ya esta como lo quiero.

pero aun sigue mi segunda pregunta l
Quote
También  me gustaría agregar una lcd para aumentar el tiempo de retardo  sin la necesidad de una  comp.
lo que tengo que lograr es  por medio de unos 4 botones poder escribir en una lcd  (HD44780 1602 16x2)  tiempo.

he visto barios ejemplos de como atreves de un botón (botonA)  un dígito puede ir en aumento (del 0 al 9) y con otro (botonDerecha) cambiar de posición al siguiente dígito y aumentarlo o disminuirlos etc.....
entienden a lo que me refiero?????
mi lcd viene en camino   asi que puedo aprender mientras llega


cren necesario que haga un nuevo topic
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Veamos .. para el movimiento yo lo haria asi

pos_actual = (((pos_mayor-pos_menor)/tiempo_total)*tiempo_transcurrido)+pos_menor


tendras que variar la formula dependiendo si va de mayor a menor , de esa forma cambiara linealmente.


Para lo del LCD ... tendras que hacer un menú. vi el otro dia un pryecto , photoduino, que con solo 2 botones es capaz de moverse por el menu y cambiar parámetros y tiene tambien algun menu de temporizaciones, y verlas en un lcd claro está .... echale un vistazo al codigo por si te puede servir de ayuda

Un saludo
Logged

Pages: [1] 2   Go Up
Jump to: