JVM-Electronics

  • Aumentar fuente
  • Fuente predeterminada
  • Disminuir fuente

Controladora 8 servos RS232

E-mail Imprimir PDF

General_300

La controladora de 8 servos RS232 es un pequeño hardware que ha sido diseñado para controlar 8 servos a través de un puerto serie convencional.

Es capaz de manejar los servos estandard del mercado con un ancho de pulso comprendido entre: +/300us hasta +/-2400us.

Esta previsto su funcionamiento con una rutina de comunicación simple que la convierte en muy manejable y sencilla de implementar.

Referente al hardware hay que destacar que no se ha utilizado un conversor TTL de niveles tipo MAX232 para la comunicación serie, hemos preferido implementar dos transistores ya que la velocidad de comunicación no es elevada y no sobrepasara las características de los transistores comunes empleados en el prototipo.

La alimentación de la parte lógica esta protegida contra inversiones de polaridad por un diodo estandard del tipo 1N4007.

También se ha provisto de un switch de reset que fuerza los parámetros iniciales de la controladora en caso de no recordar en que velocidad la teníamos asignada, al poner el switch se establece, por defecto, la velocidad de 9600 baudios y se habilitan todas las salidas PWM.

Dispone de un comando que permite indicar que salidas dispondrán de PWM.

Integrado con el software de control JVM-Servo

CARACTERISTICAS

  • Velocidad RS232: 9600, 19200, 38400 y 57600
  • Switch de configuración
  • Alimentación lógica hasta 20v
  • Protección inversión de polaridad en la alimentación de la lógica
  • Led indicador de datos recibidos

ESQUEMA ELECTRONICO

esquema

 

IMAGEN DE LA PCB

pcb

DOCUMENTOS

PROYECTO

CODIGO FUENTE

program Servos_Serie
'*******************************************************************************
'Controlador de 8 servos por puerto serie (9600,19200,38400,57600 - 8N1)
'
' Implementado por Julio Montagut - www.jvmbots.es Mayo/2009
'
' Mikrobasic 7.0.3 (beta)
'
'Este controlador se basa en las interrupciones creadas por el Timer 0
'trabajando con un prescaler de 1:16 lo que hace que desborde a 2 ms maximo.
'Esto nos proporciona el valor de recorrido maximo para cada Servo, utilizamos
'tambien el timer para generar los +/-0'3 ms necesarios de PWM a cada Servo.
'
' HARDWARE
'
' - PIC16F648 - 8 Mhz (HS - MCLRON)
'
' PORTB.0 --------------> Led Rx
' PORTA.3 --------------> Servo 1
' PORTA.2 --------------> Servo 2
' PORTA.1 --------------> Servo 3
' PORTA.0 --------------> Servo 4
' PORTB.7 --------------> Servo 5
' PORTB.6 --------------> Servo 6
' PORTB.5 --------------> Servo 7
' PORTB.4 --------------> Servo 8
' PORTB.1 --------------> RS232 Rx
' PORTB.2 --------------> RS232 Tx
'
'*******************************************************************************

dim Servo as byte[8]
Salidas as byte
Index as byte
Paso as byte
n_servo as byte
LeeDato as byte
EscribeDato as byte
sRef as byte
sPos as byte
MaskPort as byte
VelRS232 as byte

sub procedure interrupt
'TIMER 0
if INTCON.T0IF=1 then
if paso=0 then
MaskPort=salidas and n_servo ' Mascara para las salidas
PORTA.3=MaskPort.0 ' Servo 1
PORTA.2=MaskPort.1 ' Servo 2
PORTA.1=MaskPort.2 ' Servo 3
PORTA.0=MaskPort.3 ' Servo 4
PORTB.7=MaskPort.4 ' Servo 5
PORTB.6=MaskPort.5 ' Servo 6
PORTB.5=MaskPort.6 ' Servo 7
PORTB.4=MaskPort.7 ' Servo 8
TMR0=230 ' Delay de 0.3ms
Inc(paso)
else
if paso=1 then
TMR0=Servo[index] ' Anchura de pulso del servo
Inc(paso)
else
if paso=2 then
PORTA=0
PORTB=0
TMR0=Servo[index] ' Valor menos periodo de servo
paso=0
n_servo=n_servo<<1 ' Siguiente servo
inc(index)
if n_servo=0 then
n_servo=1
index=0
end if
end if
end if
end if

INTCON.T0IF =0 ' Reseteamos la bandera de la interrupcion
PORTB.0=0 ' Apagamos el LED de Rx
end if
end sub

Sub Procedure Leer_RS232
While PIR1.RCIF=0 ' RCIF=1?
Wend
PORTB.0=1 ' Encendemos el LED de Rx
LeeDato=Usart_Read ' Leer el caracter que ha llegado
End Sub

Sub Procedure Enviar_RS232
While PIR1.TXIF=0 ' Esperamos a poder transmitir TXIF=1?
Wend
Usart_Write(EscribeDato) ' Enviamos el dato
End sub


main:
CMCON=0x07

TRISA=0x00
TRISB=0x04

PORTA=0
PORTB=0

Index=0
Paso=0
N_servo=0

Servo[0]=Eeprom_Read(0) ' Valor inicio servo 1 seteado en la Eemprom
Servo[1]=Eeprom_Read(1) ' Valor inicio servo 2 seteado en la Eemprom
Servo[2]=Eeprom_Read(2) ' Valor inicio servo 3 seteado en la Eemprom
Servo[3]=Eeprom_Read(3) ' Valor inicio servo 4 seteado en la Eemprom
Servo[4]=Eeprom_Read(4) ' Valor inicio servo 5 seteado en la Eemprom
Servo[5]=Eeprom_Read(5) ' Valor inicio servo 6 seteado en la Eemprom
Servo[6]=Eeprom_Read(6) ' Valor inicio servo 7 seteado en la Eemprom
Servo[7]=Eeprom_Read(7) ' Valor inicio servo 8 seteado en la Eemprom

RCSTA=%10010000 ' Habilitar receptor y configurarlo para
' recepcion continua
TXSTA=%00100100 ' BRGH=1 Configurar transmisor a alta velocidad
' y habilitarlo

OPTION_REG=%10000011 ' Prescaler 1:16, PORTB pull-up deshabilitado

INTCON.T0IF=0 ' TOIF=0 borra flag interrupcion del timer
INTCON.T0IE=1 ' TOIE=1 activa interrupciones del timer 0
INTCON.RCIE=1 ' Activar interrupcion de recepcion
INTCON.PEIE=1 ' Activar interrupción de periféricos

IF PORTA.4=1 then ' Este switch es el de reset, fuerza a 9600
VelRS232=0 ' y activa las salidas
salidas=0xff
Eeprom_write(8,salidas) ' Escribe los datos de salidas en eeprom (Pos 8)
Eeprom_Write(9,VelRS232) ' Escribe la velocidad RS232 en eeprom (Pos 9)
Else
salidas=Eeprom_Read(8) ' Leee los datos de salidas en eeprom (Pos 8)
VelRS232=Eeprom_Read(9) ' Lee la velocidad RS232 en eeprom (Pos 9)
End if

Select case VelRS232 ' Seleccionamos la velocidad RS232 (hasta 57600 baud)
Case 0x01
Usart_init(19200)
Case 0x02
Usart_init(38400)
Case 0x03
Usart_init(57600)
Case else
Usart_init(9600)
End Select

TMR0 = 0 ' Reset del Timer0
INTCON.GIE=1 ' Interrupciones globales

While true
Inicio:
Leer_RS232
'Leemos la "P" (0x50) del USart (enviar la posicion de un Servo)
If LeeDato=0x50 then Goto Enviar_Posicion End if
'Leemos la "S" (0x53) del USart (recibir la posicion de un Servo)
If LeeDato=0x53 then Goto Posicion_Servo End if
'Leemos la "T" (0x54) del USart (recibir la poscion de todos los servos)
If LeeDato=0x54 then Goto Posicion_Todos End if
'Leemos la "I" (0x49) del USart (establecer el inicio)
If LeeDato=0x49 then Goto Establecer_Inicio End if
'Leemos la "E" (0x45) del USart (Detener el PWM del servo)
If LeeDato=0x45 then Goto Enable_Disable End if
'Leemos la "F" (0x46) del USart (Envia el paso de las salidas)
If LeeDato=0x46 then Goto Envia_Salidas End if
'Leemos la "A" (0x41) del USart (Cambio de velocidad)
If LeeDato=0x41 then Goto Velocidad_Puerto End if
wend

Enviar_Posicion:
Leer_RS232 ' Leer el numero de servo
sRef=LeeDato
sPos=Servo[sRef]
EscribeDato=sPos ' Envia la posicion del servo
Enviar_RS232
EscribeDato=0x0D ' Enviar el caracter 13 de fin de envio
Enviar_RS232
Goto Inicio

Posicion_Servo:
Leer_RS232 ' Leer el numero de servo
sRef=LeeDato
Leer_RS232 ' Leer la posición del servo
Servo[sRef]=LeeDato
Goto Inicio

Posicion_Todos:
Leer_RS232 ' Leer la posición del Servo 0
Servo[0]=LeeDato
Leer_RS232 ' Leer la posición del Servo 1
Servo[1]=LeeDato
Leer_RS232 ' Leer la posición del Servo 2
Servo[2]=LeeDato
Leer_RS232 ' Leer la posición del Servo 3
Servo[3]=LeeDato
Leer_RS232 ' Leer la posición del Servo 4
Servo[4]=LeeDato
Leer_RS232 ' Leer la posición del Servo 5
Servo[5]=LeeDato
Leer_RS232 ' Leer la posición del Servo 6
Servo[6]=LeeDato
Leer_RS232 ' Leer la posición del Servo 7
Servo[7]=LeeDato
Goto Inicio

Establecer_Inicio:
Leer_RS232 ' Leer el numero de servo
sRef=LeeDato ' Almacenamos la posicion que corresponde
' al Nº de servo
Leer_RS232 ' Leer el valor de la posicion del servo enviada por el PC
sPos=LeeDato ' Posicion
Eeprom_write(sRef,sPos) ' Grabamos la posicion en la Eeprom
EscribeDato=0x0D ' Enviar el caracter 13 de fin de envio
Enviar_RS232
Goto Inicio

Enable_Disable:
Leer_RS232 ' Leer máscara que llega del PC
salidas=LeeDato ' Actualizar máscara
Eeprom_Write(0x08,salidas)' Escribimos la eeprom con la mascara e n la direccion 8
EscribeDato=0x0D ' Enviar el caracter 13 de fin de envio
Enviar_RS232
Goto Inicio

Envia_Salidas:
EscribeDato=salidas ' Cargar el valor de salidas
Enviar_RS232 ' Enviar el dato
EscribeDato=0x0D ' Enviar el caracter 13 de fin de envio
Enviar_RS232
Goto Inicio

Velocidad_Puerto:
Leer_RS232 ' Lee la velocidad
sRef=LeeDato ' Valor del dato (0=9600,1=19200,2=38400,3=57600)
Eeprom_Write(9,sRef) ' Escribimos la eeprom con el valor de velocidad
EscribeDato=0x0D ' Enviar el caracter 13 de fin de envio
Enviar_RS232 ' Enviar el dato
Goto Inicio

end.
Última actualización el Jueves, 04 de Noviembre de 2010 08:10  
English Spanish