Hola a todos.
Leyendo el subforo de Robótica vi hace unas semanas un video de unos bots humanoides luchando entre ellos. Me dejaron alucinando y no he podido resistirme a tener uno de estos juguetes.
Buscando por la red encontré varios bots comerciales a unos precios desorbitados, por lo que decidí diseñar uno desde cero para abaratar
costes.
Conseguidos unos servos, bastante bien de precio en China, ahora faltaba su control. Así que a diseñar una placa capaz de controlar un número elevado de servos.
En principio, mi intención era controlar 16 servos, suficiente para un humanoide tipo Robonova. Metido en faena pense que quizas en un futuro quisiera unas pinzas, garras o algo así como manos para mi bot o aumentar los grados de libertad, asi que había que aumentar el número de servos a controlar.
Tras ver las posibilidades de los pics facilitos de conseguir me decidí por un 16f877 a 20Mhz. Con los puertos que tiene hay para controlar
24 servos y tener comunicación por hardware con el exterior.Aunque esto último he tenido que sacrificarlo para conseguir una mayor velocidad de la rutina de control, redundando en una mayor precisión en el posicionamiento de los servos.
Bien, las características de la placa controladora son:
1. Refresco de las posiciones de los 24 servos cada 20mS.
2. Rango de trabajo desde 500us (-90º) hasta 2500us (+90º).
3. Control de posicion y velocidad independiente de cada servo.
4. Lectura de la posición actual de cada servo.
5. Comunicación por usart e i2c, para controlar los servos desde un pc o desde un PIC.
En este último punto es donde me encuentro ahora; la comunicación.
La usart por software la tengo implementada, eso sí a 115200, ya que a una velocidad inferior, según mis calculos, me sería dificil ordenar
un cambio de posición de todos los servos a la vez cada 20ms, como es mi intención.
Aquí es donde solicito vuestra ayuda para diseñar un protocolo con el menor número de bytes posible por orden.
Mi idea es esta:
Mover-> M(S,P1,P2,V)
- Donde M indica que vamos a mover los servos
- S es el número de servo a mover, de 1 a 24. (1 byte)
- P1 y P2. Estos 2 bytes son la posición a la que debe ir el servo, ejemplo: 0x5DC = 1000us
- V la velocidad a la que se movera el servo (1byte), ejemplo: un valor de 10 correspondería a 10us cada 20ms.
Esta serie de bytes debería repetirse para cada servo.
Así que si queremos ordenar a los 24 servos que inicien un movimiento a la vez, tendríamos que enviar algo como esto:
M(S,P1,P2,V,S,P1,P2,V,S,P1,P2,V,etc...)
No se si esta sería la mejor forma también para el i2c, puesto que desconozco casi todo de este bus.
Bueno, espero haberme expresado con claridad y que podáis ayudarme.
PD: En breve subire el firmware y una simulación en Proteus, para que la vayais probando y entro todos consigamos una buena placa.
Ahora que recuerdo: ¿Alguien me puede decir si hay software para cinemática de robots?