PIC + Bluetooth + Celular (con pic basic pro) detallado

Que tal amigos! aqui pego un breve fragmento del Gran Mario Sacco...exNeoteo precisamente hablando sobre enlaces Bluetooth:

"Cada botón estará asociado al simple envío de un texto gracias a la conexión Bluetooth del dispositivo Android que estemos utilizando hacia el PIC “remoto”. Recordemos que para encender un LED necesitábamos enviar un “100” y para apagarlo un “200”. La instrucción HSERIN utilizada en Amicus, necesita recibir (luego del número) un caracter “que no sea numérico” para interpretar que todo lo anterior es el número. Es decir, si le enviamos el 100 solo, se quedará esperando más datos numéricos, porque siempre espera eso, datos numéricos. Cualquier caracter “no numérico” finaliza la recepción y define lo recibido como la información útil. Es decir, si recibe un 100 se queda esperando más números. Si en cambio recibe 100A, detecta que la A es el caracter “no numérico” que cierra la recepción de datos. Por lo tanto, eso enviaremos nosotros."

...y Bueno a mi funciono como sigue:
Utilize un PIC16F628A con USART RX/TX
D@rkbytes me ayudo a configurar el usart para 20 Mhz
Utilize el compilador proton ide 2.0.0.7
Modulo Bluetooth HC-06
APP inventor sobre la plataforma Android
Enseguida envie por el serial comunicator de proton valores numericos ej.100,200 para encender o apagar 3 leds y todo sin problemas excepto que a veces tenia que darle 1 o 2 enter a mi teclado no se si este fallando o sea parte de la comunicacion Bluetooth,bueno lo di por bueno.Despues ya con mi celular envie atravez del diagrama de bloques de APP INVENTOR_ANDROID valores numericos como 100(encender leds),200(apagar leds) y no me funciono,despues envie letras como A,B,C,D (haciendo referencia al codigo ASCII),.y tampoco me funciono,hasta que hice lo que dice el fragmento citado arriba agregar un valor no numerico al final y me funciono,encendi y apague los tres leds,lo que no se es lo siguiente no se si alguien ya lo probo o ya lo soluciono resulta que en el codigo original esta declarada una variable LED del tipo byte (0-255) que es donde se guardan los valores recibidos del diagrama de bloques app inventor via bluetooth(celular),aqui la pregunta es ¿si estamos enviando valores del tipo 100A,200A,o mayores a estos,se tendria que cambiar la variable LED(0-255) a tipo WORD? o no le afectaria? o alguien lo ha probado con valores en decenas de este tipo 10A,20A,digo esto para no cambiar la variable LED tipo Byte...Gracias por su atencion.
 
Que tal a todos!!! Alguien sabe por que me aparecieron estos extraños caracteres hace unos dias me estaba funcionando correctamente y hoy lo volvi a retomar abriendo la consola serial de Proton ide y me sale con esta sorpresa.
Estoy usando lo siguiente: PIC16F628A,Cristal 20 Mhz,modulo bluetooth HC-06,el objetivo es lo siguiente:Con un 100 enciendo 3 leds,con 200 apago 3 leds de echo ya lo habia hecho trabajar con app inventor de Android,ademas cabe decir que el codigo esta en Proton ide,bueno pues sin mas palabras dejo algunas imagenes.
 

Adjuntos

  • Pantalla_02.JPG
    Pantalla_02.JPG
    114.5 KB · Visitas: 130
  • Pantalla_01.JPG
    Pantalla_01.JPG
    110 KB · Visitas: 167
Hola yo quiero trabajar con un modulo bluetooth por lo que pido tu ayuda,e leído que estas trabajando con un modulo bluetooth , tambien utilizo proton.Me gustaria que me digas el código del modulo bluetooth que utilizas y una idea del hardware en fotos .DE ANTEMANO GRACIAS POR TU RESPUESTA
 
Última edición:
Dijo...Hola yo quiero trabajar con un modulo bluetooth por lo que pido tu ayuda,e leído que estas trabajando con un modulo bluetooth , tambien utilizo proton.Me gustaria que me digas el código del modulo bluetooth que utilizas y una idea del hardware en fotos .DE ANTEMANO GRACIAS POR TU RESPUESTA

Estimado Kowart este es el codigo lo realize en Proton IDE y bueno pues lo probe con la consola Serial Com de proton,de lado de la pc compre un adaptador USB dongle Bluetooth para enviar las señales al modulo receptor Bluetooth montado en protoboard y con esto logre activar y desactivar 3 leds.
2.-Tambien logre hacer lo mismo encender y apagar 3 leds esto lo realize con una pequeña aplicacion en La Plataforma Android y el resultado tambien fue okey.

Tips:nada mas hay que fijarse que las velocidades (baudios) sean los mismos al configurar el modulo Bluetooth y la consola serial y el puerto com entre el adaptador usb bluetooth y la consola,ademas yo le puse un cristal de 20Mhz,ademas se me olvidaba hay que conectar el RX del modulo bluetooth con el TX del pic y el TX del modulo con el RX del pic osea al inverso,dejame ver si te encuentro una imagenes es que ya desmonte el mio pero hay unos parecidos...continued


Me gustaria que me digas el código del modulo bluetooth que utilizas y una idea del hardware en fotos .DE ANTEMANO GRACIAS POR TU RESPUESTA
Te anexo en unas imagenes la forma de conexion del modulo bluetooth es sencillisimo un pin a +5v,otro a gnd(tierra),el TX del modulo al RX del pic,el RX del modulo al TX del pic observa bien ese detalle para que te funcione a la primera claro esta que yo no utilize este pic yo utilize el PIC16F628A por que es mas economico y nada mas era para hacer esta practica cuando tengas el pic localizas en su datasheet el RX y TX y ahi conectas el modulo,te repito el 16f628a los trae por eso lo utilize...suerte.
 

Adjuntos

  • Led_Bluetooth.rar
    549 bytes · Visitas: 358
  • PIC.HC-06.png
    PIC.HC-06.png
    12.2 KB · Visitas: 196
  • modulo-de-comunicaco-bluetooth-rs232-ttl-para-arduino-pic_MLB-O-4106879873_042013.jpg
    modulo-de-comunicaco-bluetooth-rs232-ttl-para-arduino-pic_MLB-O-4106879873_042013.jpg
    22.7 KB · Visitas: 152
Última edición por un moderador:
hola amigos, yo tengo una duda, estoy usando un hc 06 un pic y un celular T610 lo que quiero es hacer que el modulo bt le envíe datos al celular (comandos AT para envio de SMS), pero lo que no puedo hacer es enlazar al modulo y el telefono, en el telefono si se agregó el HC06, pero no se enlazan, como puedo solucionar ese problema? espero me puedan ayudar :)
 
hola amigos, yo tengo una duda, estoy usando un hc 06 un pic y un celular T610 lo que quiero es hacer que el modulo bt le envíe datos al celular (comandos AT para envio de SMS), pero lo que no puedo hacer es enlazar al modulo y el telefono, en el telefono si se agregó el HC06, pero no se enlazan, como puedo solucionar ese problema? espero me puedan ayudar :)

gatito11 si posteas tu codigo y tus esquemas yo creo que sera mas facil asesorarte...
 
El problema no lo tengo en el código, de hecho no creo que fuera problema del código, ya que lo único que necesito hacer es enviar por medio de comandos AT instrucciones a un celular, y yo quiero usar el HC-06 para que se conecte vía Bluetooth al celular que recibirá los comandos, pero el problema es que el módulo de Bluetooth no se enlaza con el celular, pero esto no tiene que ver con el código del PIC.

El código que estoy utilizando es:

Código:
#include <16F883.h> 
//#device ICD=TRUE//si no utilizas el debugger debe de ir comentada
#FUSES NOWDT, HS, NOPUT, NOLVP 
#use delay(clock=4000000) 

//Configuración puerto serie
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
#byte TRISB=0x86
#byte PORTB=0x06
#byte TRISC=0x87
#byte PORTC=0x07
//Variables de configuración SMS
#define NUMERO_MENSAJES 1 //Número de mensajes a enviar 
char NUMERO[] = "4646535868"; //Número de teléfono a marcar 
char MENSAJE[] = "Primer prueba de envio tesis\r Emmanuel Razo";//Mensaje a enviar

int flag=0;//variable auxiliar

   #int_EXT 
   void EXT_isr(void){//función de tratamiento a la interrupción externa 
      flag=1; 
      }

//Función para configurar parámetros del modem 
   void configurar_Modem(){ 
      printf("at+cmgf=1\r");
      //configura el tipo de formato de mensaje de texto SMS (formato TEXTO) 
      delay_ms(200); 
   }

//Función para enviar mensajes SMS 
   void Envio_SMS(){ 
      char ctrlz = 26; //combinacion de teclas "ctrl+z" 
      printf("at+cmgs=\"%s\"\r",NUMERO); 
      delay_ms(200); 
      printf("%s",MENSAJE); 
      delay_ms(200); 
      printf("%c",ctrlz); //se envia el mensaje 
      delay_ms(200); 
   }

   void main() { 
      int i;
      //Configuración registros PIC 
      TRISB=0b00000001;
      PORTB=0x00;
      TRISC=0b00000000;
      PORTC=0x00;
      enable_interrupts(GLOBAL);//habilito interrupción global 
      enable_interrupts(INT_EXT);//habilito interrupción externa 
      ext_int_edge(L_TO_H);// flanco de activación ascendente 
      
      delay_ms(1000);//retardo para estabilizar 
      configurar_Modem();//llamada a la función de configuración del modem 
      
         while(true) { //Bucle infinito hasta interrupción 
            if (flag==1){ // si se produce alarma envió mensajes 
               for(i=0;i<NUMERO_MENSAJES;i++){
                   Envio_SMS(); 
                   } 
                flag=0;
             } 
         } 
   }
 
Última edición por un moderador:
y como mover desde labview via bluetooth un servomotor ,que el gráfico en labview actué como un potencio metro se puede,asi seria la programación proton en basic.soy nuevo en labview por lo que pido me ayuden en ese punto.

PHP:
Device 16F88
Xtal 20 

Declare Hserial_Baud =9600
Declare Hserial_RCSTA=%10010000
Declare Hserial_TXSTA=%00100100
Declare Hserial_Clear= On
Declare Adin_Res = 8
Declare Adin_Tad = FRC
Declare Adin_Stime =50
ADCON1=%00000
Dim  a As Byte
DATO VAR Byte 
TRISA=%11111
'TRISB=%00000100
INICIO:
Pot PORTA.0 ,255 ,DATO
 
 'a=ADIn 0
 'HSerout [a]
 ' PORTB.0= a
 HSerOut ["DATO ES  ",Dec dato,13]
 DelayMS 100
GoTo INICIO
 
Hola, una pregunta alguien ha hecho el enlace entre un modulo bluetooth HC-05 y una aplicación hecho en android studio o eclipse? pretendo hacer la aplicacion en android studio ya que app inventor tiene alguna limitacion por ejemplo no permite activar 2 botones en simultaneo. Alguien que haya manejado bluetooth en android studio o eclipse?
 
Hola. Hace días publiqué pidiendo ayuda con un control infrarrojo, pero sin éxito.
Busqué otras maneras de controlar a distancia y elegí hacerlo vía Bluetooth con un Módulo HC-05.

Uso éste programa para hacer encender y apagar un LED mediante la aplicación "Blueterm" y funciona.
PHP:
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 activé el oscilador interno, MCLR y BODEN.
Usé una resistencia de 4k7 hacia MCLR y una resistencia de 10k en RX del módulo hacia 5 V.

Este programa funciona perfecto para el LED. Ahora bien, luego creé éste otro para lograr mover el servomotor:
PHP:
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 raramente, ya que al digitar "b" se mueve pero se mueve en sentido contrario, también mediante pulsos como vibrando, es decir, primero vibra en el sentido contrario y luego se mueve como debería y el cuando digito "a" hace lo mismo, como si el puerto estuviese mandando más pulsos (solo digito una vez y despacio).

Notase que en el programa quité la parte para saber si el PIC vive, porque 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 segundos aproximadamente después de digitar, pero sé que es un error de programación.
Debe de funcionar y aún tengo la esperanza.

Los pulsos PWM funcionan correctamente cuando lo hago mediante un pulsador físico.
He tratado con distintos PAUSE variándolo, pero creo que con 3 segundos vibra menos (al parecer o es imaginación mía)
Intenté poner la pausa después del GoSub y dentro del GoSub, después del 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.
 
Última edición por un moderador:
Si usas la instrucción "HSERIN" (Recepción RS-232 por hardware), entonces también deberías usar la interrupción por recepción del módulo USART.
Notase que en el programa quité la parte para saber si el PIC vive, porque si la pones, entonces si vibra como loco sin digitar nada.
Eso es lógico porque la ejecución de instrucciones estará afectada por los retardos de encendido y apagado del LED.
Otro problema que tiene, es que tarda mucho en recibir la instrucción, tiene un retardo como de 3 segundos aproximadamente después de digitar, pero sé que es un error de programación.
Este otro problema también es debido a los retardos de 3 segundos que pusiste cada vez que se recibe la orden correcta.
He tratado con distintos PAUSE variándolo, pero creo que con 3 segundos vibra menos (al parecer o es imaginación mía)
Intenté poner la pausa después del GoSub y dentro del GoSub, después del pulso PWM, pero nada.
No uses retardos cuando necesites una ejecución continua de las instrucciones.
El uso de retardos siempre detendrá la correcta ejecución del programa.
Para eso tienes los timers del microcontrolador.

Tampoco uses la instrucción "PWM" porque está condicionada por tiempos.
Es mejor que uses el módulo CCP y cambies a la instrucción "HPWM"
 
Hola antes que nada gracias por responder, pues la verdad nunca he usado y no conocía la instrucción CPP y la instrucción HPWM supongo que solo la cambio por la instrucción pwm en el código, podrías escribir un ejemplo de como quedaría en este programa por favor?
 
CCP no es una instrucción, es un módulo del microcontrolador dedicado especialmente a la captura y generación de pulsos. CCP = Capture Compare PWM
HPWM si es una instrucción nativa de PICBasic. HPWM = Hardware Pulse Width Modulation
¿Podrías escribir un ejemplo de cómo quedaría en este programa, por favor?
Nunca lo he hecho de esa forma, yo lo hago usando el Timer 0.
 
Hola gente del foro, tengo un problema y quiero que me ayuden con PBP. Estoy trabajando con un modulo HC-05 y un pic16f628A, utilizo las instrucciones SERIN y SEROUT. logro tener comunicacion con el celular esto es que desde el pic mando un HOLA MUNDO y es recibido en el celular. El problema surge cuando del celular mando el hola mundo al pic este lo quiero mostrar en una lcd 16x2 y me muestra puros caracteres raros y nunca los mismos, he probado enviando dos veces el mismo caracter y estos no llegan igual, tambien he probado mostrar el caracter en decimal (LCDOUT,$FE,$80,DEC DAT, donde dat es la variable que guarda los datos recibidos) y este tampoco es el mismo. La instruccion es: SERIN portb.1,T9600,DATO espero de su ayuda
 
Última edición:
A 4MHz compañero D@rbytes. He intentado con el oscilador interno y tambien el externo, estoy pensando que tal vez el problema es en la configuracion de fabrica del HC-05 que este configurado a 3840 baudios y las instrucciones SERIN Y SEROUT solo soportan hasta T9600, tambien en mi desesperacion :D he probado con T2400, N9600, N2400 y nada. estoy viendo la posibilidad de conseguir un convertidor usb a RS232 para poder ingresar a los comandos AT.
 
A 4MHz compañero D@rbytes. He intentado con el oscilador interno y también el externo, estoy pensando que tal vez el problema es en la configuración de fabrica del HC-05 que esté configurado a 3840 baudios y las instrucciones SERIN Y SEROUT solo soportan hasta T9600
Tal vez quisiste decir; 38400 Baudios. Y sí, esa velocidad es con la que viene por defecto.
Necesitas entrar al modo de configuración por comandos AT y ver que velocidad tiene.
Porque se usan dos velocidades, en modo de configuración y en modo de operación.
En modo de configuración la velocidad siempre es de 38400 Baudios.
Estoy viendo la posibilidad de conseguir un convertidor usb a RS232 para poder ingresar a los comandos AT.
Si, esa es la forma más común de entrar al modo de configuración, pero también se puede hacer con el microcontrolador.
Pero como debes usar una velocidad de 38400 Bps, necesitas usar un cristal de 12 a 20 MHz.
 
Muchas gracias compañero D@rbytes estaba pasando por alto el cristal :) , ya lo estoy probando con oscilador a 20MHz y he cambiado las instrucciones SERIN y SEROUT por HSERIN y HSEROUT para trabajar a 38400 con lo que ha mejorado mucho ya se muestran letras en la LCD sin embargo aun en ocasiones no muestra la letra enviada adjunto los archivos para ser mas claro, el envio del pic al celular sigue funcionando perfecto. Gracias por su ayuda
 

Adjuntos

  • BLUETOOTH 2.rar
    20.6 KB · Visitas: 216
OK. Las configuraciones sobre el BPRG están mal, y es que no debes colocar valores al azar tomados de la hoja de datos, porque son valores de ejemplo tomados para otros Baud rates.
Para generar los valores correctos, debes utilizar las fórmulas.
Aunque como ésto te puede resultar complicado, aquí te dejo los valores para 38400 Bps.

En PBP como puedes trabajar directamente con los registros, los puedes ingresar de dos formas.
Así usando las sentencias nativas:
; Configuración USART: (38400bps @ 20MHz. 37879 Bps reales -1.3% Error.)
PHP:
Define HSER_SPBRG    20h
Define HSER_BAUD    38400
Define HSER_TXSTA    24h
Define HSER_RCSTA    90h
O así, utilizando la configuración de registros:
PHP:
SPBRG =    $20    ; 00100000
TXSTA =    $24    ; 00100100
RCSTA =    $90    ; 10010000
También te recomiendo que incluyas la palabra de configuración:
Código:
[COLOR=Blue];*******************************************************************************[/COLOR]
[COLOR=DarkGreen]@ Device PIC16F628A[/COLOR]    ; Microcontrolador utilizado
; Palabra de configuración:
[COLOR=DarkGreen]@ Device HS_OSC,WDT_OFF,MCLR_OFF,PWRT_ON,LVP_OFF[/COLOR]
[COLOR=Blue];*******************************************************************************[/COLOR]
Y algo importante:
Por RS-232 y en PBP, no puedes recibir ni transmitir 16 bits, sólo 8 bits.
Así que la variable "LED" debe ser del tipo "Byte" y no "Word"
También debes considerar lo que recibas, ya que debe formatearse para poder ser mostrado en LCD.
 
Última edición:
Compañero D@rbytes las configuraciones sobre el BPRG son correctas 20h=dec 32.
Es cierto la variable puede ser tipo BYTE :)
En cuanto a la palabra de configuración no la incluyo debido a que al compilar me arroja un error asi que los cambios los realizo directamente en el archivo 16F628A.INC de la carpeta pbp en disco C alli esta la palabra de configuración y de esa manera ya no tengo errores al compilar
Esperare a tener un convertidor usb-RS232 para continuar con la practica, en cuanto lo adquiera les cuento como me fue :D . Gracias por su ayuda, volveré pronto jejejeje
 
Atrás
Arriba