Autor Tema: relantizar un servo  (Leído 2225 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado EA7LN

  • PIC10
  • *
  • Mensajes: 36
relantizar un servo
« en: 05 de Mayo de 2012, 06:28:55 »
Hola amigos, sigo peleandome con Pic Simulator para contralar servos.
El motivo es que soy aficionado al aeromodelismo, y los Pic's me ofrecen infinitas posibilidades para el control de mis maquetas.
En esta ocasion os pido ayuda, para poder hacer que el movimiento de un servo sea mas lento del habitual.
Desde un canal de la emisora, tengo que controlar el tren de aterrizaje. Al abrir el tren, primero un servo tiene que abrir las trampillas, pero este movimiento debe de ser lento, unos 3 segundos y a continuación, mover el servo que despliega las ruedas. Al cerrarlo el movimiento es al contrario, primero entran las ruedas, y despues cierra las trampillas con el mismo movimiento de unos 3 segundos.
Tengo hecho el programa pero no consigo darle ese retardo, he probado haciendo un contador, tambien con For-Next y no lo consigo. No se que hago mal.
Debo deciros que no tengo grandes conocimientos en programacion, por eso me ayudo de Servoin y Servoout, en vez de generar yo mismo los pulsos.
Os adjunto el codigo que actualmente funciona pero sin hacer el retardo.
¿Podeis ayudarme para terminar el proyecto?
Gracias a todos.
Cada dia aprendo algo nuevo. ¡Cuanto me queda por aprender!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: relantizar un servo
« Respuesta #1 en: 05 de Mayo de 2012, 11:19:01 »
A ver si te sirve esto:

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 8
'--- Variables
Dim cnt As Word
Dim n As Byte
Dim x As Word
cnt = 0
n = 100  'Inicializa n
'-------------------
For x = 0 To 100
ServoOut GP5, 200
ServoOut GP2, 100
WaitMs 50
Next x
'--- Rutina programa
main:
'Movimiento a una velocidad dada
While n <= 200  'De izquierda a derecha
ServoOut GP5, 200  'Servo que no se utiliza se mantiene en posición
ServoOut GP2, n  'Servo a posicionar
cnt = cnt + 1
If cnt >= 2 Then  'Velocidad 2
cnt = 0
n = n + 1
Endif
WaitMs 50
Wend

While n >= 100  'De derecha a izquierd
ServoOut GP5, 200  'Servo que no se utiliza se mantiene en posición
ServoOut GP2, n  'Servo a posicionar
cnt = cnt + 1
If cnt >= 5 Then  'Velocidad 5
cnt = 0
n = n - 1
Endif
WaitMs 50
Wend
Goto main  'Retorna a principal, bucle infinito
End

PD: Probado en un Pic12F683 con reloj interno a 8Mhz
« Última modificación: 05 de Mayo de 2012, 11:34:03 por dogflu66 »
Saludos desde Granada, España.

Desconectado EA7LN

  • PIC10
  • *
  • Mensajes: 36
Re: relantizar un servo
« Respuesta #2 en: 05 de Mayo de 2012, 16:53:39 »
Gracias dogflu66, voy a probarlo a ver si lo puedo adaptar a mi programa.
Os contare resultados
Cada dia aprendo algo nuevo. ¡Cuanto me queda por aprender!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: relantizar un servo
« Respuesta #3 en: 05 de Mayo de 2012, 18:08:19 »
Aquí dejo otra versión:

Código: [Seleccionar]
'******************************* WWW.PICKEY.ES ****************************
'**************************************************************************
'NOMBRE: MnEBasic Ejemplo Basico Servo 03
'MICRO: PIC12F683
'LENGUAJE: Basic del PSI
'DESCRIPCIÓN: Trabajando con servos
'AUTOR: By COS (dogflu66, www.pickey.es, info@pickey.es)
'FECHA: 05/12
'**************************************************************************
'VERSIÓN 1.3:
'Controlando la velocidad del servomotor Futaba S3003
'Función para control del servomotor con selección del pin y velocidad
'**************************************************************************
'Configuración del módulo ADC
'Comfiguración del Timer1
'Habilitación de un puerto RS232 optoacoplado, por software (simulacion)
'Trabajando con el reloj interno.
'Programación del microcontrolador en placa (ICSP)
'RS232: Los datos los recibirá el programa hyperterminal del Windows
'También se puede utilizar cualquier otra consola de datos serie para el PC
'Configuración del hyperterminal del Pc:
'Bits por segundo: 2400
'Bits de datos: 8
'Paridad: Ninguno
'Bits de parada: 1
'Control de flujo: Ninguno
'Fin configuración hyperterminal de Windows
'**************************************************************************
Define CONF_WORD = 0x31c4  '/* _CPD_OFF, _CP_OFF, _BODEN_ON, _MCLRE_OFF,
'_wdt_off, _intrc_osc_noclkout */
Define CLOCK_FREQUENCY = 4  'Frecuencia cristal oscilador del micro en Mhz.
'Define SEROUT_DELAYUS = 1 'Solo para simulación
'************* Configuracion modulos generales (E/S) **********************
'cmcon = 0x07  'Comparator off
VRCON = 0x00  'Vref off, comparador
ANSEL = %00011000  'Fosc/8 (4Mhz=2uSeg.), AN3 mode analogico, resto digitales
ADCON0 = %00001101  'Adc a 8bit, vdd reference, CH3, adc On
'osccal = 0x50  'Calibracion del oscilador interno (cada chip es diferente)
TRISIO = 0xff  'Se definen los pin como entradas
'TRISIO.4 = 1  'GP4 pin, AN3 como entrada, lectura de la resistencia ajustable
TRISIO.5 = 0  'GP5 pin, como salida, Tx puerto serie
TRISIO.2 = 0  'GP2 pin, como salida, Control del servomotor
GPIO.2 = 0  'Valor inicial a cero
TRISIO = 0
'********************* Configuracion del Timer1 ***************************
T1CON.TMR1ON = 1  'Bit de habilitacion del temporizador timer1
T1CON.TMR1CS = 0  'Bit de seleccion de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 0  'Bit de seleccion del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0  'Bit de seleccion del prescaler para el reloj del timer1
TMR1H = 0xfc  'Carga el byte alto del registro del tiemr1 (1mSeg)
TMR1L = 0x18  'Carga el byte bajo del registro del timer1 (1mSeg)
PIE1.TMR1IE = 1  'Activa la interrupcion del timer1 por rebose
'********************* Habilitacion Interrupciones ************************
'INTCON.PEIE = 1  'habilitacion de interrupciones de perifericos
'Enable  'intcon.GIE = 1, habilita las interrupciones generales
'************* Rutina del programa ****************************************
'----Asignaciones de nombres
Symbol rs232tx = GP5  'Salida de datos puerto serie tipo RS232
Symbol c_servo = GP2  'Control del servo
'--- Variables
Dim n As Word  'Se declara entero de 2Bytes
n = 400  'Inicializa n con valor 400
'--- Rutina programa
'Posición inicial del servo
For n = 0 To 100
Call servo(2, 2200, 100)  'Full speed
Next n
main:
'Movimiento a una velocidad dada
ServoOut GPIO.3, 200  'Se mantiene la posición del servo que no se usa
Call servo(2, 400, 1)  'Servo a controlar la velocidad
Goto main  'Retorna a principal, bucle infinito
End                                              
'Función para control de velocidad de servomotor (Futaba S3003)
'x = Posición del servo
'pin = pin de la señal de control del servo
'vlc = velocidad servo
'Máximo izquierda 2200uSeg., máximo derecha 400uSeg., periodo 15000+x
Proc servo(pin As Byte, x As Word, vlc As Byte)
Const lde = 400  'Limite derecha
Const liz = 2200  'Limite izquierda
Const llow = 15000  'Señal low
Dim pst As Word  'Posición actual del servo
If pst < x Then pst = pst + vlc
If pst > x And pst > vlc Then pst = pst - vlc
If pst > x And pst < vlc Then pst = lde
If pst > liz Then pst = liz
If pst < lde Then pst = lde
If pin = 0 Then GPIO.0 = 1  '/* Pin de control a On
If pin = 1 Then GPIO.1 = 1
If pin = 2 Then GPIO.2 = 1
If pin = 4 Then GPIO.4 = 1
If pin = 5 Then GPIO.5 = 1  '*/
WaitUs pst  'Señal de control a On
If pin = 0 Then GPIO.0 = 0  '/* Pin de control a Off
If pin = 1 Then GPIO.1 = 0
If pin = 2 Then GPIO.2 = 0
If pin = 4 Then GPIO.4 = 0
If pin = 5 Then GPIO.5 = 0  '*/
WaitUs llow
End Proc
« Última modificación: 05 de Mayo de 2012, 18:14:14 por dogflu66 »
Saludos desde Granada, España.