TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Dareblix005 en 21 de Marzo de 2016, 22:36:08

Título: Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Dareblix005 en 21 de Marzo de 2016, 22:36:08
Hola, hace días publique pidiendo ayuda con un control infrarrojo pero sin éxito busque otras maneras de controlar a distancia y elegí hacerlo vía bluetooth con un modulo hc-05, uso este programa para hacer encender y apagar un led mediante la aplicación "Blueterm" y funciona
CMCON = 7                     
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

LED var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
pause 1000

PORTB.0 = 1                      '*************************
pause 1000                       'esto es para saber q el pic vive
PORTB.0 = 0                      '*************************
 
inicio:
   
Hserin 100,continuo,[led]

continuo:
if led = "A" then
PORTB.0 = 1
pause 500
endif

if led = "B" then
PORTB.0 = 0
pause 500
endif

goto inicio
END
En los fuses active le oscilador interno,mclr y boden, use una resistencia de 4k7 hacia mclr y una resistencia de 10k en RX del modulo hacia 5v
Este programa funciona perfecto para el led ahora bien luego cree este otro para lograr mover el servomotor:
CMCON = 7                     
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

SERVO var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
 
inicio:
   
Hserin 100,continuo,[SERVO]

continuo:
if SERVO = "a" then
gosub foward
pause 3000
endif

if SERVO = "b" then
gosub back
pause 3000
endif

goto inicio
END
FOWARD:
 PWM PORTB.0,1,50
RETURN
BACK:
 PWM PORTB.0,255,80
RETURN
Pues bien esto funciona rara mente ya que al digitar "b" se mueve pero se mueve en sentido contrario también mediante pulsos como vibrando es decir primero vibra a el sentido contrario y luego se mueve como debería y el cuando digito "a" hace lo mismo, como si el puerto estuviese mandando mas pulsos (solo digito una vez y despacio).
Notase que en el programa quite la parte para saber si el pic vive por que si la pones entonces si vibra como loco sin digitar nada.
Otro problema que tiene es que tarda mucho en recibir la instrucción, tiene un retardo como de 3 seg aproximadamente después de digitar, pero se que es un error de programación, debe de funcionar y aun tengo la esperanza. Los pulsos pwm funcionan correctamente cuando lo hago mediante un pulsador físico, he tratado con distintos PAUSE variandolo pero creo que con 3 segundos vibra menos (al parecer o es imaginación mía) intente poner la pause después del gosub y dentro del gosub después de el pulso pwm pero nada, POR FAVOR espero una respuesta, prometo que si funciona subo un tutorial de este proyecto que es un robot!
Muchas gracias por leer
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: dogflu66 en 22 de Marzo de 2016, 11:35:21
Te recomiendo que leas este pequeño articulo sobre servomotores antes de continuar:
http://www.pickey.es/uso-practico-del-pic12f675--iv-.html
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Stban en 22 de Marzo de 2016, 15:07:51
Hola amigo,

respecto a tu problema, puede estár en el tiempo que esperas para recibir el dato, recuerda que para manejar un servo necesitas enviar los pulsos cada 20 ms. Te recomiendo usar el comando Pulsout:
PulsOut PORTB.0,65 ' Genera pulsos de 650 microsegundos de duración.
pause 20

Solo recuerda que Pulsout es dependiente del oscilador. Intenta con esta pequeña prueba...

CMCON = 7
define osc 4 'defines el oscilador a 4 Mhz                   
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

SERVO var byte
DATO var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
servo = 150 'inicia el servo en posición 0°

inicio: 

Hserin 10,continuo,[dato]

continuo:
if DATO = "a" then servo = 70  'LOS DATOS SON DE EJEMPLO DEPENDE DEL SERVO QUE MANEJAS
if DATO = "b" then servo = 200  'LOS DATOS SON DE EJEMPLO DEPENDE DEL SERVO QUE MANEJAS
pulsout portb.0, servo
pause 8
goto inicio

END

Saludos cualquier duda estamos para servirte...

Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Dareblix005 en 22 de Marzo de 2016, 16:50:38
Stban muchas gracias por tu tiempo, probé tu código y lo que paso fue que al enviar "a" el servo se mueve desde 0 a 180 y si presiono "b" se mueve de 180 hasta 90, busco pasos mas chicos, ademas de esto cuando presiono "a" y después "b" se desconecta la comunicación blueetoth, uso un servo mg90s,ademas de que vibra solo (esto no importa) simplemente hay que jugar con los números no de los datos no?
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Stban en 22 de Marzo de 2016, 17:03:05
ok, lo que entiendo es que necesitas variar la posición, primero necesitas saber los límites de tu servo, y en base a eso lo usas como acondicionante para el incremento o decremento del valor de la variable servo, algo como este:

Inicio:
Hserin 20,continuo,[dato]
continuo:
PulsOut PORTB.0, PULSO ' Genera un pulso en RB0
Low PORTB.0 ' RB0 = 0

If dato = "a" And servo < 260 Then servo = servo + 1 ' lo que tienes que definir son los limites en este caso 260
If dato = "b" And servo > 65 Then servo = servo - 1

goto inicio
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Dareblix005 en 22 de Marzo de 2016, 17:08:33
Alguna teoría del por que se pierde la conexión?
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Dareblix005 en 22 de Marzo de 2016, 17:12:48
Perdona pero otra duda la variable pulso es el limite superior del servo?
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Stban en 22 de Marzo de 2016, 17:19:40
está raro, tendrías que ver la conexión física, yo uso ese módulo y modifiqué los baudios.
comparto el proyecto en la que usé..

http://images.google.de/imgres?imgurl=https://estebanjmz.files.wordpress.com/2015/11/brazo_robc3b3tico1.jpg%3Fw%3D1108&imgrefurl=https://estebanjmz.wordpress.com/&h=341&w=390&tbnid=z0zT7SnKNYwB5M:&tbnh=122&tbnw=140&docid=v_Mhx6WWF64tDM&usg=__dFs93cAGal8VOClQ8xu02uDrl0w=&sa=X&ved=0ahUKEwj54rPvjNXLAhVBoiwKHR9iAOYQ9QEIJjAA

perdón cámbialo por la variable servo..
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Dareblix005 en 22 de Marzo de 2016, 17:29:07
Sin resultado incluso con el programa que me acabas de pasar, use esos limites por esta vez solo para ver si funcionaba pero sin resultado ya que digito a o b y vibra mucho tiempo y después de unos 5 seg se mueve, yo también planeo mover un brazo robotico amigo, mi objetivo es crear un escorpión robot con un hexapodo que tengo y adaptandole este brazo como cola y en la punta del brazo un laser grabador ( que quema ), compre el MeArm kit y esta armado ya, pues bueno deberás aprecio tu tiempo seguire intentando a ver si algún día logro hacerlo. Gracias
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Stban en 22 de Marzo de 2016, 17:53:18
la verdad está raro pero viendo los parámetros de la USART si no me equivoco debería ser 20H:
´ coloque el registro de transmisión en transmisión habilitada
DEFINE HSER_TXSTA 20h

Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Stban en 22 de Marzo de 2016, 18:44:58
ok, mas al rato probaré los programas la verdad estoy en el trabajo, pero en cuanto pueda lo probaré y con gusto te apoyo, tengo ese PIC, el módulo y el servo para probarlos
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Dareblix005 en 22 de Marzo de 2016, 18:46:47
Hermano te pusiera un altar si logras hacer que esto funcione.
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: dogflu66 en 22 de Marzo de 2016, 20:54:11
Seguramente estas desbordando el buffer de la usart y entonces se bloquea en modo Rx.
Habilita el reset automático del modulo mediante:
DEFINE HSER_CLROERR 1 'Borrar error de desbordamiento sobre la ejecución de cada comando HSERIN
Título: Re:Servomotores mediante bluetooth PIC16F628A (Pbp)
Publicado por: Dareblix005 en 22 de Marzo de 2016, 21:18:53
Pero cuando uso este programa para encender un led jamas se desconecta, paso eso con el codigo de stban