Una de las principales características de LibreServo, es que no sólo valga para mis Hitec 5990TG, sino para otros servomotores de tamaño estándar. Con la idea de que éstos sean potentes y baratos y LibreServo los haga precisos e inteligentes.
Banco de pruebas, servomotores
Con dicha idea en mente, decidí comprar posibles servos baratos de características mecánicas similares a mis hitec. La idea es:
- No gastar más de 30-35€ en cada servo (los hitec rondaban los 100€ y los Dynamixel MX-28T, del mismo par pero inteligentes... ¡250€ a día de hoy!).
- 30Kg/cm de fuerza o más.
- De tamaño estándar.
- Engranajes de titanio. Esta característica encarece mucho el precio...
- Motores coreless. Los motores brushless que ahora se empiezan a usar, son un tanto complicados de manejar, y por otro lado, los motores normales de escobillas tienen una vida útil bastante limitada, así que los coreless serán nuestra elección.
Teniendo todo esto en cuenta nos encontramos con los JX CLS6336HV o los 6036HV. Los cuales son muy potentes con unos ¡impresionantes 36Kg/cm de fuerza! (al menos en ficha), baratos (28-30€) y coreless... pero no tienen engranajes de titáneo. El Turnigy TGY-R30 sería la opción más barata que reune todas las características y tiene además engranajes de titanio. Pero nos vamos a los 40€ fácilmente, y eso que son menos potentes que los JX, algo más pesados y realmente no usan titáneo en el 100% de los engranajes. Compré el 6036HV y el Turnigy R30, además, en mi casa tengo un montón de servos chinos de diferentes marcas, con lo que tengo una selección bastante variada.
Sensor de posición
Es uno de los principales y más "complicados" componentes a elegir por varios motivos.
Es uno de los componentes más caros de nuestro LibreServo.
Dependiendo del modelo elegido cambiará el resto de electrónica y mecánica.
Existen varios modelos de diferentes tecnologías, cada uno con sus ventajas e inconvenientes.
Necesitamos un sensor de posición que permita girar 360 grados y además que nos de una posición "absoluta". Ósea, queremos saber cuántos grados hemos girado, pero además, que al alimentar por primera vez el servomotor nos de la posición en la que está. Es por ello que descartamos los encoder ópticos, pero aún tenemos enoders magnéticos y encoders "resistivos" (el típico potenciómetro, pero algo especial que permite girarse 360 grados).
Encóder magnético y encóder "resistivo"
La ventaja del uso del encóder magnético es que no tiene desgaste mecánico, es algo más "preciso" que el potenciómetro y da una lectura en todo el rango de 360 grados. Por contra, es mucho más caro y el montaje del imán que tiene que estar a cierta distancia del sensor complica bastante su uso para estandarizarlo a todos los sensores. Por otro lado, el potenciómetro es bastante más barato, ha sido ampliamente utilizado por Dynamixel (con lo que se le presupone cierta fiabilidad), y su montaje en servos que ya usan un potenciómetro es más directo, por contra, pueden sufrir desgaste con el paso del tiempo y además hay una zona "muerta" donde no dan lectura (aproximadamente 30 grados) a pesar de que se pueden girar los 360 grados.
La decisión no ha sido sencilla... pero por temas de compatibilidad, cierta sencillez y precio, he decidido utilizar el poteciómetro murata sv-01. A día de hoy es ampliamente utilizado en todo tipo de Servos inteligentes y para una primera versión, creo que será más que suficiente.
Sensor de corriente
Hay varios modelos, pero el más sencillo y ampliamente utilizado es el ZXCT1009. He cogido el ZXCT1010 ya que es igual que el ZXCT1009 pero actualizado. Pequeño, barato y sencillísimo su uso.
Conectores
A primera vista parecería algo sencillo de elegir... pero conlleva muchas decisiones mecánicas y electrónicas. El mayor problema que hay es el tamaño de los servos estándar, en concreto su ancho, ¡son muy estrechos! Recordemos que queremos que LibreServo permita conectividad en cadena, por lo tanto necesitaremos dos conectores. Además, tienen que ser todo lo "grandes" que podamos, ya que al tener conexión en cadena, la línea de alimentación se puede "sobrecargar" con varias decenas de amperios. Debido a que el ancho de un servo es de tan sólo 20mm (lo típico en servos inteligentes es de 30mm o más), necesitamos que el conector tenga un "footprint" menor a 10mm (9mm realmente). Por temas de estandarización, los más normales son los conectores JST, y dentro de ellos, el que nos encaja es el JST-PH. Se puede conseguir extremadamente barato en china, además, los cables de alimentación los sustituiremos, pasando de 26AWG a unos más que adecuados 22AWG.
Conector JST-PH-4
Microcontrolador
¡El cerebro de la bestia! Tengo que admitir que llevo muchos años usando los microncontroladores de ST, con lo que me siento bastante cómodo con ellos con su software y su electrónica, así que el fabricante será ST. Por ejemplo, los Dynamixel usan el STM32F103. Es un cortex M3 de ST que he usado en más de una ocasión. Iré a por algo más potente, en concreto un Cortex-M4. El motivo es que en los M4 el microcontrolador ya incluye una unidad de cálculo en punto flotante, con lo que los cálculos matemáticos que necesiten manejar decimales serán infinitamente más rápidos. Por otro lado, seguimos teniendo un serio problema de espacio, ¿he mencionado ya que los servos estándar son muy estrechos? Así que me veo obligado a utilizar un modelo con un footprint muy pequeño y que va a ser un dolor de cabeza soldarlo, el STM32F302K8. Eso sí, no os engañéis, es pequeño pero rápido como un demonio.
STM32F302 y una moneda de 2 euros
Mosfets
Pasamos del cerebro, al músculo de la bestia. Los Hitec 5990 usaban los irf7389, que eran unos mosfet de doble canal N/P y manejaban unas corrientes de 5,3A en su canal P y 7,3A en su canal N, con lo que se podría decir que el puente en H era de 5,3A. Aquí tampoco me he contenido, y he ido a por unos más que holgadísimos FDS8858CZ, mosfets también de doble canal N/P y del mismo footprint que los irf, pero esta vez manejando 8,6A en el canal N y unos abultados 7,3A en el canal P. Además, serán activados con el FAN3227TMPX, con lo que nos debería de quedar un puente en H muy robusto capaz de manejar cualquier servomotor sin despeinarse.
Regulador de tensión
Si quisiéramos que LibreServo sólo funcionara hasta 8,4V (como la grandísima mayoría de servos), no habría problema alguno en usar un regulador lineal. Pero al querer que funcione hasta a 18V la cosa se complica. Lo suyo sería un step-down por ejemplo a 4V y luego seguido un regulador lineal a 3,3V, pero desgraciadamente no tenemos tanto espacio... así que nos vemos obligados a usar un regulador lineal, eso sí, cogemos uno de tipo DPAK para máxima disipación, el NCP1117DT33G.
Comunicación
Queremos crear un bus de comunicaciones, compatible con arduino y electrónica a 5V y además que no se necesite harware externo para poder hablar con los servos... La cosa tiene un poco de complicación.
Nuestra electrónica funciona a 3,3V así que no vendría mal un chip que adaptase esos 5V a 3,3V (aunque no es imprescindible porque usamos pines que soportan 5V). Desgraciadamente a la inversa (pasar de 3,3 a 5V), no será posible ya que requeriríamos otra fuente de alimentación que nos generase esos 5V, así que queda descartado. Gracias a Dios, casi toda la electrónica que funciona a 5V (desde luego todos los arduinos), 3,3V también lo detectan como un 1 digital, así que no hay problema alguno.
Por otro lado está el tema de bus... la solución tomada por otros fabricantes es hacer uso del protocolo RS485, el cual con dos cables sólo puede ser half-duplex a parte de requerir electrónica externa en el lado del usuario. I2C queda también completamente descartado, es muy lento. Así que he optado por una solución un tanto... fuera del estándar. En la línea en el que el usuario transmite las instrucciones están todos los servos escuchando, con una impedancia "infinita" y un capacitancia de sólo 3,5pF por servomotor no debería de ser mayor problema comunicar para una decena o más servos en una misma línea sin hardware alguno. Por ejemplo, un arduino basado en el atmega328 podría comunicarse con algo más de 100 servos a la vez a 115.200bps (máxima velocidad en arduino). En cambio, el STM32F302, el microcontrolador del servomotor, podría comunicarse (si no tuviera hardware externo, que sí lo tiene), con más de 15 servomotores a 9Mbps, o con más de 30 a 4,5Mbps o con más de 120 a 1Mbps. De necesitarlo, casi cualquier circuito de la familia SN74 valdría para comunicar (hay iteralmente cientos de modelos). En la línea en el que el usuario escucha no supone problema alguno para el usuario, a menos que quiera subir de 3,3V a 5V la entrada (que seguramente no sea necesario). Es realmente en la parte servo donde viene la injundia, ya que podría darse el caso, si algo va mal, de que dos sermotores intenten hablar a la vez, lo cual generaría cortocircuito en la línea. Se ha solucionado dicho problema con una resistencia en salida y otra de pull up para mantener la línea alta si ningún servo habla. El circuito escogido para la comunicación es el SN74LVC2G125DCUR.
Podríamos hablar de muchos más componentes, pero considero estos los más importantes. En otros muchos componentes la dificultad radicó en conseguir componentes que hicieran lo que quería a muy bajo precio y con un footprint mínimo.