Controlador para 84 servos USB SD84
SD84 es un circuito controlador de servos de 84 canales capaz de controlar hasta 84 servos de radio control con un refresco de 20 ms con independencia del número de servos conectados.
El circuito controla tanto la posición como la velocidad de los servos mediante comandos enviados a su puerto USB.
Cada canal puede ser utilizado como una entrada digital, una salida digital, o una salida de servo y adicionalmente, 36 de los canales pueden ser utilizados como entradas analógicas de 10 bits.
Más información
SD84 es un circuito controlador de servos de 84 canales capaz de controlar hasta 84 servos de radio control con un refresco de 20 mS. con independencia del numero de servos conectados. El circuito controla tanto la posición como la velocidad de los servos mediante comandos enviados a su puerto USB. Además, cada canal puede ser utilizado como una entrada digital, una salida digital, o una salida de servo y adicionalmente, 36 de los canales pueden ser utilizados como entradas analógicas de 10 bits, convirtiéndolo en un gran controlador para animatrónica. La parte lógica del circuito se alimenta directamente del bus USB, por lo que solo hay que proporcionar tensión para los servos o los circuitos que se quieran conectar. Cada grupo de 8 servos tiene su propio conector de alimentación independiente permitiendo usar diferente tensiones en cada caso. Desde el punto de vista de la programación, el circuito se controla como si fuese un puerto serie, por lo que es muy fácil de controlar desde aplicaciones como visual Basic, visual C, etc. Con este circuito puede controlar toda clase de dispositivos desde un PC.
Características
Hasta 84 canales de entradas digitales
Hasta 84 canales de salidas digitales
Hasta 84 canales de salidas de servo
Hasta 36 canales de entradas analógicas de 10 bit
Controlado y alimentado desde el bus USB
Drivers disponibles para Windows, Apple, Linux y Open BSD
Conexiones
Diagrama de Conexión del SD84
El SD84 tiene 84 juegos de cabezales de 3 pin, en grupos de 4. En todos los casos, el pin más cercano al lado de fuera del PCB es Tierra 0v. El pin del medio +V es alimentado por el servo desde la terminal de tornillo asociada de 2 pin. El pin interior, es la señal pin más cercana al CPU.
Alimentación
El circuito lógico en el modulo SD84 es alimentado desde el bus USB y no necesita ninguna alimentación externa. Deberá proporcionar alimentación externa para los servos o para algunos de los otros circuitos que quiera conectar a la Entrada/Salida. Los servos se alimentan en grupos de 8 servos. PL1 proporciona la alimentación para los servos del 1 al 8 en el canal 1 al 8. La única excepción es PL5 el cual alimenta a 12 servo del canal 33 al canal 44 inclusive. Las líneas de barras del diagrama superior indica que servos están alimentados y desde que terminal de tornillos. Cada grupo puede ser alimentado desde diferentes voltajes, pero tenga en cuenta que los 0v tierras son comunes y están conectados juntos en el PCB.
Conexiones de los servos
Los servos están conectados directamente en el SD84, con el pin tierra ( cable negro en un servo hitec) conectado a la parte más cercana del borde del circuito.
Paso primero - Obtención drivers
El módulo USB-RLY08 utiliza el chip SFTDI FT232R para controlar los protocolos USB. Lo primero que debe hacer para conectar el USB-RLY08 a un puerto USB es bajarse los drivers del puerto virtual Com directamente de la página web FTDI, estos están disponibles para Windows, Apple, Linux y sistemas Open BSD. Antes de conectar el USB-RLY08 a su ordenador debería tener los drivers instalados.
Puerto COM asignado
Después de instalar los drivers y conectarlos en el modulo USB-RLY08 para un puerto USB adicional necesita saber que puerto COM se le ha asignado. Para ello solo tendrá que entrar en "Mi PC" y seleccionar el "Dispositivo Principal" abriendo después el "Puerto COM&LPT" y verá el Puerto COM2. Si desea cambiar el número del puerto solo debe seleccionarlo , elegir propiedades, selecciones avanzadas y cambiarlo al puerto serie que desee sabiendo que siempre estos deben transmitir a 19200 baudios, 8 bits de datos, no paridad y dos bits de parada.
Con los drivers instalados puede conectar el SD84 y Windows registrará los drivers.
Registros internos
Hay tres registros internos asociados con cada uno de los 84 canales:
Un registro “Mode” (1 byte) que define el modo de trabajo del canal, INPUT, OUTPUT_LOW,OUTPUT_HIGH, SERVO o ANALOGUE ( ENTRADA, SALIDA BAJA, SALIDA ALTA, SERVO O ANALOGICA)
Un registro “Servo” ( 2 byte) que define la posición del servo en µS. El registro “Servo” es un número entero (dos bytes). que representa la posición en formato byte bajo/alto.
Un registro “Speed” (1 byte) que define la velocidad a la que el servo cambia de posición.
Comandos
Dec | Hex | Comando | Descripción | Respuesta |
1 | 0x01 | SET_SERVO | Establece la posición en µS de 1 a 84 servos | 1 Byte, código de error - ver Códigos de Error |
2 | 0x02 | GET_SERVO | Devuelve la posición actual ( en µS) de un único servo | 2 Bytes, Posición del servo Byte bajo primero y luego byte alto. |
3 | 0x0 | SET_SPEED | Configura la velocidad de movimiento de 1 a 84 servo. | Ver Códigos de Error |
4 | 0x04 | SET_MODE | Configura el modo de los canales 1 al 84,no analógicos-vea el comando SET AD CNT | 1 Byte, código de error - ver Códigos de Error |
5 | 0x05 | GET_MODE | Devuelve el modo actual de un canal único | 1 Byte, Modo |
6 | 0x06 | SET_AD_CNT | Configura el número de canales analógicos desde el 0 al 36. Esta también configura el Modo para el canal a analógico | 1 Byte, código de error - ver Códigos de Error |
7 | 0x07 | GET_AD_CNT | Devuelve los números de la configuración de los canales analógicos actuales | 1 Byte, Números de canales analógicos. |
8 | 0x08 | GET_INPUT | Devuelve el estado de una única entrada | 1 Byte, 0x00 para bajo , 0xFF para alto |
9 | 0x09 | GET_ADC | Devuelve el valor actual de un canal analógico | 2 Bytes, primero byte bajo, y luego el byte alto |
10 | 0x0A | GET_VERSION | Devuelve el número versión del chip del procesador seleccionado | 2 Bytes, primero el tipo de módulo y luego el número de versión |
21 | 0x15 | GET_BULK | Utilizado para test de calidad - devuelve 21 entradas codificadas | 3 Bytes, 21 entradas de la CPU seleccionada |
22 | 0x16 | TEST | Utilizado para test de calidad |
SET_SERVO 0x01
Este comando configura la posición de los servos en µS. El rango normal para un servo es 1000µS a 2000µS siendo la posición central 1500µS. Aunque la mayoría de los servos irán más allá. En un servo Hitec HS422 podemos configurar la posición desde 800 a 2200 para dar un amplio rango de movimiento. Tenga cuidado pues es fácil de hacer que el servo se tope con su parada interna si le da impulsos amplios a los extremos superior o inferior. El lugar SD84 no restringe los valores escritos, así que sea cuidadoso. Cada valor de servo es un número entero de 16 bit, envié primero el byte bajo y luego envié el byte alto. Para configurar el canal 1 a 1500µS (Centro el Servo). El comando formado es:
Sinc1 | Sinc2 | Sinc3 | Comando | Primer Canal | Nº Bytes | Byte Bajo | Byte Alto |
0xAA | 0xA | 0x55 | 0x01 | 0x01 | 0x02 | 0xDC | 0x05 |
Los primeros tres bytes son bytes sincronizados y los necesitan todos los formatos de comandos.
El siguiente es el SET_SERVO “CONFIGURACIÓN DE SERVOS” comandos 0x01
El siguiente es el Número del canal del Primer Servo. En este caso canal 1.
El siguiente es el contador de byte. 2 bytes por canal para la configuración de la posición del servo.
El siguiente es el byte más bajo de la posición. 1500 decimal es 0x05DC en hexadecimal, así se envía 0xDC
Finalmente nosotros enviamos el byte más alto, 0x05
Algunos números de canales continuos pueden ser configurados con un comando SET_SERVO(Configuración de Servos). Por ejemplo para configurar los canales 37 y 38 para 1000uS (0x03E8) y 2000uS (0x07D0), deberá enviar:
Sync1 | Sync2 | Sync3 | Comando | Primer Canal | Nº Bytes | Byte bajo Canal 37 | Byte alto Canal 37 | Byte bajo Canal 38 | Byte alto canal 38 |
0xAA | 0xA0 | 0x55 | 0x01 | 37 | 4 | 0xE8 | 0x03 | 0xD0 | 0x07 |
Si quiere hacer lo mismo en los canales 37 y 51, deberá enviar dos formatos de comandos. No puede hacerlo todo en un formato porque los canales no son continuos. Después que el byte final es enviado, el SD84 responderá con un código de error de un byte simple. Si todo está correcto este será Ok. Vea código de errores para los detalles.
GET_SERVO 0x02
Este comando obtiene la posición del servo en µS.
Sync1 | Sync2 | Sync3 | Comando | Canal | Nº Bytes |
0xAA | 0xA0 | 0x55 | 0x02 | 23 | 0x00 |
El ejemplo de arriba devolverá la posición del servo del canal 23. Tenga en cuenta que el contador del byte debe ser cero (0x00) porque no está enviando ninguna información al SD84. La respuesta desde el SD84 será dos bytes, el byte bajo primero y después el byte alto. Por ejemplo si tiene configurada la posición en 1500uS (0x05DC en hex) deberá recibir 0xDC, 0x05. Al contrario que el comando SET SERVO, el GET SERVO solo puede trabajar con un canal único. Para recuperar la posición de múltiples canales deberá obtenerlos individualmente.
SET_SPEED 0x03
Configura la velocidad a la que el servo se moverá a la nueva posición.
Sync1 | Sync2 | Sync3 | Comando | Primer Canal | Nº Bytes | Velocidad |
0xAA | 0xA | 0x55 | 0x03 | 71 | 1 | 10 |
El ejemplo de arriba configura la velocidad del canal 71 a 10.
Este es el registro de velocidad a la cual los servos se mueven a su nueva posición. Los impulsos de los servos son enviados automáticamente cada 20mS. Si la velocidad del registro es cero (0x00) entonces el servo está configurado a la máxima velocidad. Al encender el circuito los registros de velocidad están configurada a cero para dar plena velocidad, por eso al menos que necesite disminuirlos la velocidad de los registros pueden ser ignorada. Si la Velocidad registro está configurada a un valor diferente de cero entonces el valor es añadido a la posición actual cada 20mS hasta que se alcanza la posición deseada. Si desea moverse desde el 1000 a 2000 y la velocidad de registro está configurada a 10, entonces le llevará 2 segundos alcanzar la posición final. La fórmula para el calculo del tiempo que tarda en hacer el movimiento es la siguiente:
(Posición deseada-Posición de partida ) / Registro de velocidad)*20mS
Aquí hay algunos ejemplos:
Posición Inicial | Posición Final | Velocidad | Duración Movimiento |
2000 | 1000 | 10 | 2000mS (2Sec) |
1000 | 2000 | 10 | 2000mS (2Sec |
1000 | 2000 | 1 | 20000mS (20Sec) |
1000 | 2000 | 100 | 200mS (0.2Sec) |
1234 | 1987 | 69 | 220mS (0.22Sec) |
Como con el Comando SET SERVO, el comando SET SPEED permite configurarse de 1 a 84 canales de forma simultanea.
Sync1 | Sync2 | Sync3 | Comando | Primer Canal | Nº Canales | Canal 1 | Canal 2 | Canal 3 |
0xAA | 0xA0 | 0x55 | 0x03 | 71 | 3 | 9 | 10 | 11 |
El ejemplo superior configura el canal 71 a velocidad de 9, canal 72 a velocidad 10 y canal 73 a velocidad 11. No olvide asegurarse que el Nº de bytes es el mismo que el número de bytes de información que se envían, en este ejemplo es 3 bytes.
SET_MODE 0X04
Este comando se utiliza para configurar el Modo de funcionamiento de los 84 canales. ¡ATENCION! Este comando no puede utilizarse con los canales que esten seleccionados como analógicos, para hacer eso deberá utilizar el comando SET_AD_CNT. Este comando seleccionará entre los modos INPUT (Entrada), OUTPUT_LOW (Salida a nivel 0), OUTPUT_HIGH (Salida a nivel Alto) o modo SERVO (Modo servo para controlar servomotores).
El siguiente ejemplo configurará el canal 1 para INPUT_MODE, canal 2 para OUTPUT_MODE 0, canal 3 para OUTPUT_MODE 1 y canal 4 para SERVO_MODE.
Sync1 | Sync2 | Sync3 | Comando | Primer Canal | Nº de Bytes | Modo1 | Modo2 | Modo3 | Modo4 |
0xAA | 0xA0 | 0x55 | 0x04 | 1 | 4 | 23 | 21 | 22 | 25 |
Como siempre, asegúrese que la cantidad del Nº de bytes concuerda con la cantidad de bytes de información que se envía. Después que se envía el byte final, el SD84 responderá con un código de error de un único byte. Si todo está correcto este será OK. Vea códigos de error para más detalles.
GET_MODE (0x05)
Este comando obtiene el Modo de funcionamiento actual para un único canal. Vea Modos de Canal.
Sync1 | Sync2 | Sync3 | Comando | Canal | Nº de byte |
0xAA | 0xA0 | 0x55 | 0x05 | 15 | 0x00 |
El ejemplo de arriba devuelve el modo actual de canal 15. Tenga en cuenta que el Nº de byte debe ser cero (0x00) porque no está enviando ninguna información al SD84. La respuesta del SD84 será 1 byte. A diferencia del comando SET_MODE, el GET MODE solo puede trabajar con un canal único cada vez. Para recuperar el modo actual de canales múltiples deberá obtenerlos individualmente.
SET_AD_CNT (0x06)
Este comando configura el número de canales analógicos disponibles. El SD84 utiliza 4 procesadores PIC18F2520, cada uno proporciona 21 canales de los cuales 9 pueden ser alternativamente entradas analógicas. Estos 9 canales analógicos aparecen dispersados por el SD84, (ver diagrama de conexión), porque los números de los pines del procesador en los cuales aparecen está fijado. Una limitación del chip procesador es que estos pins no pueden ser entradas analógicas al azar, sino que tienen que ser asignados en orden ascendente empezando por AN1. Si AN8 es analógica entonces las entradas AN1 a AN7 deben serlo también. Esto significa que al cambiar un canal a analógico, es posible que también se cambien otros canales. Este es la razón de porque se impide escribir al modo analógico desde el Modo Registro.
El comando SET_AD_CNT configura los chips del procesador para el número de canales analógicos deseados, empezando por AN1. Si selecciona 5 canales analógicos entonces se configuran AN1 a AN5 como analógicos. El Modo de Registro para los canales 21, 22, 20, 18 y 28 serán configurados a analógico. Si ha seleccionado previamente 10 canales como analógicos (AN1 a AN10), y después selecciona 5 canales (AN1 a AN5) los canales 27,29,26,30 y 11 (AN6- AN10) serán vueltos a cambiar a modo de entradas digital.
En la siguiente tabla se muestra la correspondencia cruzada entre canales analógicos y digitales:
AN | CH | AN | CH | AN | CH | AN | CH | |||
1 | 21 | 10 | 11 | 19 | 84 | 28 | 73 | |||
2 | 22 | 11 | 10 | 20 | 83 | 29 | 72 | |||
3 | 20 | 12 | 9 | 21 | 82 | 30 | 71 | |||
4 | 18 | 13 | 7 | 22 | 80 | 31 | 69 | |||
5 | 28 | 14 | 38 | 23 | 48 | 32 | 58 | |||
6 | 27 | 15 | 37 | 24 | 47 | 33 | 57 | |||
7 | 29 | 16 | 39 | 25 | 49 | 34 | 59 | |||
8 | 26 | 17 | 36 | 26 | 46 | 35 | 56 | |||
9 | 30 | 18 | 40 | 27 | 50 | 36 | 60 |
Para configurar un canal analógico utilice el siguiente comando:
Sync1 | Sync2 | Sync3 | Comando | Canal | Contador de Byte | Nº Canales Analógicos |
0xAA | 0xA0 | 0x55 | 0x06 | 0 (ignorado) | 1 | 10 |
El comando superior configurará AN1 a AN10 como entradas análogas. El modo de los canales correspondientes 21,22, 20,18,28,27,29,26,30 y 11 será configurado al Modo Analógico. El SD84 responderá con un código de error de byte único. Si todo está bien este será OK. Vea la sección de códigos de error más detalles.
El procedimiento normal de iniciación del circuito consistirá en configurar primero el número de canales analógicos requeridos mediante el comando SET_AD_CNT, y entonces configurar los canales digitales restantes como entrada, salida o modo servo con SET_MODE. Esto puede ser realizado para todos los canales con un simple comando de modo. El comando SET_ MODE no afecta a los canales analógicos, así que no hay problemas con el modo en que estén configurados, sin embargo obtendrá de vuelto un código WARNING en vez de un código Ok.
GET_AD_CNT (0x07)
Este comando devuelve la cantidad de canales analógicos seleccionados actualmente.
Sync1 | Sync2 | Sync3 | Comando | Canal | Contador de byte |
0xAA | 0xA0 | 0x55 | 0x07 | 0 (ignorado) | 0 |
El SD84 responderá con el número de canales analógicos actuales 0-36.
GET_INPUT (0x08)
Devuelve el estado de un único canal de entrada.
Sync1 | Sync2 | Sync3 | Comando | Canal |
Contador de Byte |
0xAA | 0xA0 | 0x55 | 0x08 | 12 | 0 |
El ejemplo de arriba devolverá 1 Byte, 0 (0x00) si la entrada del canal 12 es bajo o 255 (0xFF) si la entrada es alta. GET_INPUT puede trabajar solo con un único canal cada vez. Para recuperar el estado de múltiples canales deberá obtenerlos individualmente.
GET_ADC (0x09)
Devuelve el valor analógico del canal seleccionado. Tenga en cuenta que el número de canal es el número analógico AN, no el número del canal digital. En el ejemplo de abajo este es el canala analógico 21 que se corresponde con el canal digital 82.
Sync1 | Sync2 | Sync3 | Comando | Canal | Contador Byte |
0xAA | 0xA0 | 0x55 | 0x09 | 21 | 0 |
El ejemplo de arriba devolverá 2 bytes, el byte bajo primero y después el byte alto. El SD84 utiliza conversión 10-bit AD así que obtendrá un número en el rango 0-1023. Los resultados son validos para canales analógicos que hayan sido previamente configurados en modo analógico utilizando el comando SET_AD_CNT.
GET_VERSION (0x0A)
Este comando se utiliza para devolver el número de versión del firmware del SD84. Hay 4 CPU’s en el SD84 y puedes especificar que número de versión CPU quiere obtener aunque todos ellos serán el iguales.
Sync1 | Sync2 | Sync3 | Comando | Número CPU | Contador de Byte |
0xAA | 0xA0 | 0x55 | 0x0A | 2 | 0 |
El comando está formado como se muestra arriba. En este ejemplo devolverá el número de versión de la CPU 2. El comando devolverá 2 byte. El primero es el tipo modulo, este siempre será 84 para el SD84. El segundo byte es el número de revisión del firmware, actualmente 4 en el momento de escritura. Los número de CPU validos son 1-4.
GET_BULK (0x15)
Este comando se utiliza para test de calidad del SD84. Este devuelve 3 bytes los cuales codifican las 21 entradas d el procesador seleccionado. Si está acostumbrado a utilizar el procesador PIC, estos 3 bytes son puertos A, B, y C ( en ese orden) del mismo. El formato del comando es:
Sync1 | Sync2 | Sync3 | Comando | Numero CPU | Contador de Byte |
0xAA | 0xA0 | 0x55 | 0x15 | 1 | 0 |
En este ejemplo los 3 bytes devueltos vendrán desde la CPU 1. Los números de CPU validos son 1-4.
La tabla siguiente muestra que canal representa cada bit.
Byte 1 – Puerto A | Byte 2 – Puerto B | Byte 3 – Puerto C | ||||||||||||||||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
CPU1 | 17 | 16 | 18 | 19 | 20 | 22 | 21 | x | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | x | x | 31 | 32 | 12 | 13 | 14 | 15 |
CPU2 | 6 | 5 | 7 | 8 | 9 | 10 | 11 | x | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | x | x | 41 | 42 | 1 | 2 | 3 | 4 |
CPU3 | 79 | 78 | 80 | 81 | 82 | 83 | 84 | x | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | x | x | 51 | 52 | 74 | 75 | 76 | 77 |
CPU4 | 68 | 67 | 69 | 70 | 71 | 72 | 73 | x | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | x | x | 61 | 62 | 64 | 63 | 65 | 66 |
El bit será alto si la entrada es alta.
TEST (0x16)
Este comando es utilizado, junto con el anterior GET_BULK, para realizar el control de calidad del SD84. Este comando no tiene otros usos, pero lo documentamos aquí.
Sync1 | Sync2 | Sync3 | Comando | Canal | Contador de Byte |
0xAA | 0xA0 | 0x55 | 0x16 | 67 | 0 |
Este primero configura el número de canales análogos a cero, para que todo sea digital
Después configura cada canal en modo salida baja. (0)
Después configura cada canal como entrada.
Después configura el canal seleccionado en modo salida alta. (1)
Y para finalizar devuelva el código OK. La secuencia está desarrollada sin ningún retraso, tan rápido como vaya el procesador.
Modos de canal
Los modos disponibles para los canales son:
Decimal | Hex | Modo | Descripción |
21 | 0x15 | OUTPUT_MODE0 | Salida baja, Lógica 0 |
22 | 0x16 | OUTPUT_MODE1 | Salida alta, Lógica 1 |
23 | 0x17 | INPUT_MODE | Entrada |
24 | 0x18 | ANALOG_MODE | Analógica 0-1023 (10-bit conversión) |
25 | 0x19 | SERVO_MODE | Salida de pulso de control de servo, con una tasa de repetición de 20 mS. |
Códigos de error
El SD84 puede responder con siguientes códigos de error:
Decimal | Hex | Código de Error |
Descripción |
0 | 0x00 | OK |
Comandos procesados OK |
1 | 0x01 | WARNING |
Se ignoran los intentos de escribir el modo de funcionamiento de los canales analógicos. |
2 | 0x02 | RANGE |
El Rango de canales es menor que 1 o más que 84 |
3 | 0x03 | MODE |
Modo de recepción desconocido |
Programa de demostración
Hay un pequeño programa de demostración que le permite evaluar rápidamente el SD84.
Este permite configurar el número de canales análogos, modos de configuración, movimiento de los servos y lectura digital o entradas análogas. El programa está escrito en Visual C++V6. Puede descargar solo el sd84.exe, o el código fuente completo .
Dimensiones del SD84