Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenos días, ya que este es mi primer post me presento. Me llamo Jesús y soy de barcelona, desde hace algún tiempo me compré el libro de desarrollo de proyectos pic 16f84 de RA-MA editorial y es lo mejor que he hecho hasta ahora. Pero para mi gusto tiene un punto débil, aunque no por eso es más malo, quizás sea yo el malo, le falta algo de información respecto al tema de servos. Alguien puede colgar algún programilla en ASM con servos para 16f84???? o alguna página que valga la pena.
Muchas gracias, hoy empiezo a pedir pero espero algún día ayudar a otros.
Buenas noches, pues después de mucho tiempo he conseguido que mi bipedo de cuatro servos empiece a andar, aquí os dejo el programa para que le echeis un ojo. Pero tengo un problema muy grave. Al ser secuencial cuando cambio de servo este pierde fueza y no conserva al ángulo hasta el próximo movimiento. Me explico cuando empieza con call_sv_1_50 este servo gira 50 grados pero cuando cambia a SV_0_110 el primer servo pierde fuerza y no sigue a 50º.
No he mirado tu código, pero la forma de funcionar un servo es: debes enviarle unas 50 veces por segundo (es decir cada 20ms) una señal de control (la que suele durar entre 1 y 2ms).
En caso de que quieras controlar más de 1 servo (el ejemplo lo pongo para 8 ) lo que tendrías que hacer es enviar la señal de 1 a 2ms... esperar hasta los 2,5ms, enviar la señal de 1 a 2ms al segundo servo y volver a esperar hasta completar el ciclo de 2,5ms... así los 8 servos habrían recibido su señal y el ciclo de los 8 hubiese durado unos 8*2,5=20ms.
Un ejemplo más o menos sencillo que podría servirte como base podría ser este:
http://ubanov.wordpress.com/2010/02/03/control-de-servos-desde-pinguino-microchip-pic/
(está en C)
Si quieres controlar más de 8-10 servos, entonces la cosa ya se complica un poco más (en los 20ms sólo puedes completar 8-10 servos, con lo que en cada ciclo de 2,5ms debes controlar más servos). Hace tiempo escribí un programa para eso pero al final no lo llegue a probar bien, pero lo haré dentro de poco.... quizás te pueda servir: http://ubanov.wordpress.com/2008/12/17/controladora-32-servos-open-source/
Gracias por responder ubanov, creo que he entendido tu idea y no se me habría ocurrido en la vida. He mirado los links y la verdad es que voy un poco perdido con tanto código, espero que a ti te haya al final salido con tu hexápodo. Este finde me pongo con el tema y a ver si el lunes tengo algo nuevo que contar.
Gracias por responder ubanov, creo que he entendido tu idea y no se me habría ocurrido en la vida. He mirado los links y la verdad es que voy un poco perdido con tanto código, espero que a ti te haya al final salido con tu hexápodo. Este finde me pongo con el tema y a ver si el lunes tengo algo nuevo que contar.
Hola, el de 32 servos ese si es complejo (y encima ya te digo que todavía no está probado al 100%), pero el otro es muy sencillo.... para que lo entiendas hago un resumen rápido de cómo funciona, y si tienes dudas preguntas.
El caso es que para controlar los 8 servos (se podrían controlar hasta 10) lo que se hace es usar el Timer1 de un PIC18F2550. Todo el control de los servos se hace mediante interrupciones, con lo que puedes emplear la CPU para hacer otros cálculos.
El que se encarga de hacer todo el trabajo es la rutina UserInterrupt. Esta rutina es llamada cada cierto tiempo y el tiempo va variando de ciclo a ciclo... ¿cómo cambia? el caso es que la interrupción va a tener 16 ciclos (2 por cada servo, en los ciclos pares pone una salida de un servo a 1, empieza a generar el pulso, y en los impares pone ese servo a 0). El que indica en qué ciclo está es la variable contadorisr, que es incrementado al final de la interrupción. Es decir cuando estamos en el 0 habilitamos la salida de RB7, en el 1 la deshabilitamos, en el 2 ponemos RB6=1, en el 3 a RB6=1, en el 4 RB5=1... hasta llegar al 15 que toca RB0=0. Después de poner el valor correspondiente en la línea de control, lo que hacemos es configurar el timer1 para que la siguiente interrupción se haga en un determinado tiempo.
Los tiempos vienen definidos en la variable servosvalues. Y estas variables son actualizadas desde la rutina SetServo. El caso es que cuando con SetServo queremos poner un determinado servo en una posición, lo que hacemos es actualizar dos entradas de servosvalues. ¿Cómo se hace esto? imaginemos que queremos poner el primer servo a la mitad, digamos que llamaríamos a SetServo(0,TIEMPODE1500ms), lo que hará SetServo es configurar en servovalues[0] el tiempo que va a estar la entrada a 1, y en servosvalues[1] el tiempo que va a estar la entrada a 0. El tiempo que va a estar la entrada a 0 lo hago para que cada servo reciba la información siempre cada 20ms. De esta forma el valor de servosvalues[1] sería (20ms/8servos)-servovalues[0]... en el ejemplo anterior nos daría 2500ms-1500ms=1000ms.
No se si con esto ha quedado más claro o te he liado todavía más... espero haber ayudado aunque sea un poco.
Hola Ubanov,he estado mirando por el libro que tengo de pics (editorial Ra-Ma) pero no acabo de saber como lograr mover varios servos con las interrupciones. Mi robot es bìpedo de cuatro servos y lleva un Pic 16F84A y estoy programando en assembler (o por lo menos lo intento). Lo que más me extraña es que no he econtrado nada de controlar varios servos independientemente con este servo. Si puedes colgarme algún programa más sencillo en ASM me harías un favor enorme, a ver si se me ilumina la cabeza y avanzo con Panchito.
Muchas gracias
Hola Ubanov,he estado mirando por el libro que tengo de pics (editorial Ra-Ma) pero no acabo de saber como lograr mover varios servos con las interrupciones. Mi robot es bìpedo de cuatro servos y lleva un Pic 16F84A y estoy programando en assembler (o por lo menos lo intento). Lo que más me extraña es que no he econtrado nada de controlar varios servos independientemente con este servo. Si puedes colgarme algún programa más sencillo en ASM me harías un favor enorme, a ver si se me ilumina la cabeza y avanzo con Panchito.
Muchas gracias
Hola,
yo no tengo nada para ese micro.... de todas formas ese micro está bastante desfasado... por qué no pruebas algo más moderno... ya puestos por qué no te vas a un pinguino con un 18F2550 y utilizas el programa que te he mostrado.
Si insistes en el 16F84A supongo que el código que te he pasado de la controladora de 32 servos te servirá... pero te toca a ti hacer la limpieza.
Otra alternativa es no utilizar interrupciones, y en hacerlo como lo habías planteado pero multiplexando los servos. Es decir manejas un servo, inmediatamente mandas la señal del segundo, luego el tercero... hasta digamos 8 servos... luego procesas las nuevas posiciones y vuelves a empezar.... el ciclo completo no debería durar más de 20ms.
Por último prueba en google....
Un saludo.