Módulo Bluetooth SPBT2532C2 (Funcionamiento y conexión a PIC)

Hola amigos del foro

Tengo un modulo bluetooth SPBT2532C2 :D
http://www.st.com/web/en/resource/technical/document/datasheet/CD00243909.pdf
el cual quiero utilizar para domotica en mi casa.
Se que utiliza comunicación UART para con el micro. Ademas de programación por comandos AT para el cambio de configuración del modulo.
Utilizare un LF ya que este se alimenta de vcc de 3.3v.
La 1 pregunta es si alguno de ustedes tiene conocimiento en este tipo de módulos para guiarme en el control total y utilización al 100%.
La 2: Este modulo NO necesita un micro para funcionar? :unsure: Es transceiver?:unsure:

Muchas Gracias :) (y)
 
Mi experiencia es que son sencillos de utilizar. Yo lo utilicé para comunicar el micro con el PC mediante puerte serie (por Bluetooth).
Tan solo conecta los RX y TX de tu micro con los TX y RX del módulo. Para configurar el módulo, envía desde el micro los AT (solo será necesario hacerlo una vez). Para poder comunicarte la primera vez, seguramente tengas que hacerlo a 9600 baudios. Después puedes cambiar esta velocidad a tu gusto, si quieres.
Una vez configurado, sólo envía los datos desde el micro como si de un serial por cable se tratara.
Desde el PC empareja los dispositivos y ya está. Yo usé Linux en su momento, y teniendo instalado los paquetes de blueman y bluez pude emparejarlos (o parearlos, como prefieras decirlo) con facilidad, con dos clics, y la interfaz que crea para la comunicación es /dev/rfcomm0. En Windows no sé como se hace, pero existe alguna forma para crear un COMx.
Para comunicación entre micros nunca lo he probado, pero supongo que será usar los AT adecuadamente.

Curiosidad: en el PC no importa los baudios que pongas, ya que el puerto serie es virtual. Mientras el micro y el módulo vayan a la misma velocidad, todo funcionará en el PC.

Espero que te sirva.

Saludos.



Vale, mirando el documento que has enlazado he visto que la velocidad por defecto es de 115200 baudios.
UART: 115200 baud, no parity, 1 stop bit, 8 data bits
 
Última edición:
Excelente @MikeLunatiko Gracias por tu aporte, he estado averiguando al respecto ya que quiero utilizarlo para un proyecto de domótica, en el cual quiero controlar varios dispositivos de manera inalambrica, a través de un dispositivo android, estoy utilizando Titanium para esto.
 
son muy faciles de usar es como si conectaras directamente el micro al puerto serie.

yo lo use con un bluetooth USB para la PC y el modulito al micro.
en la PC solo conecte el USB la PC me lo reconocio como un puerto serie, en administrador de dispositivos lo reconoce como COM y en avanzado le cambias el puerto ejemplo pasara a COM2

y un programa que hay en internet el PUTTY le mandas comandos

el Rs232 son puros caracteres es literalmente facil.

si el micro es 5v y el modulo a 3.3 usa un zener, aunque luego los conectan directo y no pasa nada si te da miedo solo les pones un zener y tan tan.
 
pueees los modulitos que venden para robots son mas bien unas PCB con unos leds y unos headers para ponerlo al protoboard y estos modulitos traen soldado este modulo que mencionas.

es como cuando venden una LCD 16x4 de 3 lineas lo unico que las hace compactas es que traen soldado un 74hc595 y ya por eso son SPI.

si son buenos, geniales pues evitas los cables no se que tan potente lo quieres pero mas de 1 metro si te da.
 
Vale, mirando el documento que has enlazado he visto que la velocidad por defecto es de 115200 baudios.

Oye una pregunta como configuro esto utilizando pic css:
#use rs232(baud=115200,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8,stream=PORT1)

utilizando aquel stop bit?

Necesito cambiar el nombre del dispositivo pero no me corre algún error ?

Código:
      delay_ms(1500);
      printf ("AT+AB LocalName BTIKONS\n");
                  dato = getc();
       if (dato == "AT-AB LocalNameOk\n")  {
             output_high(PIN_B2);
       } else {
            output_high(PIN_B2);
            delay_ms(500);
            output_low(PIN_B2);
       }
Corriendo a 115200 baud,

Código:
#include <16F628.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=20000000)
#use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )
#use rs232(baud=115200,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)

----------------Solucionado------------------------

Esta vez si me funciono con este codigo

Código:
      portb = 0x00;
      output_low(PIN_B0);
      output_low(PIN_B1);
      output_low(PIN_B2);
      delay_ms(1500);
      printf ("AT+AB LocalName BTIKONS Controller\r");
      printf ("AT+AB DefaultLocalName BTIKONS Controller\r");
      output_high(PIN_B0);
       dato = getc(); 
       if (dato == "AT-AB LocalNameOk\r")  {
             output_high(PIN_B1);
              
       } else {
            output_high(PIN_B2);
            delay_ms(500);
            output_low(PIN_B2);
            delay_ms(500);
            output_high(PIN_B2);
            delay_ms(500);
            output_low(PIN_B2);
            delay_ms(500);
            output_high(PIN_B2);
            delay_ms(500);
            output_low(PIN_B2);
       }
 
Última edición:
es curioso cuando uno esta con el miedo de no saber como algo se resuelve y uno termina auto contestandose :LOL:

es muy natural cuando uno empieza, un consejo nunca dudes de tus habilidades
 
¿Esto es correcto?
PHP:
dato = getc();
if (dato == "AT-AB LocalNameOk\r")  {
Me temo que la comparación solo se hace con la primera "A", ya que con getc(), entiendo que solo lee un carácter.

Quedaría entonces
PHP:
dato = getc();
if (dato == "A")  {
 
es cierto no lo vi

cuando trabajas con CCS puedes obtener una cadeda con GETS();
pero esta es leida cuando el que envia el mensaje da un retorno de carro '\r' diferente al salto de linea '\n'

esto significa que cuando pisas enter al enviar una cadena de texto puede que no obtenga la cadena pues aveces enter no da el retorno de carro aveces

con gets(); quedaria algo asi

char *cadena;

gets(cadena);

y una vez obtenida la cadena puedes compararla imprimirla o guardarla
 
sii tienes razon @JoaquinFerrero estuve investigando y me aparece que con strcmp comparo dos string pero lo he utilizado y siempre me da verdadero no importa el string.
 
Hay que poner un

#include <strings.h>

pero... esto depende del C que estés usando.

En Linux, la página de manual de strcmp() dice:
La función strcmp() compara las dos cadenas de caracteres s1 y s2. Devuelve un entero menor, igual o mayor que cero si se encuentra que s1 es, respectivamente, menor que, igual a (concordante), o mayor que s2.
Para ver si dos cadenas de caracteres son iguales, sería así:
PHP:
if (strcmp(cadena1, cadena2)  == 0) {
pero, lo dicho: debes consultar antes la documentación de tu compilador y bibliotecas que le acompañan.

En Arduino, por ejemplo, puedes crear una cadena de caracteres como un arreglo de caracteres: char cadena1[] = "Hola"; Pero también puedes usar la clase String y usar el método compareTo() para hacer la comparación.
 
no estoy muy seguro pero creo que en el CCS lo hace con un 1
el STRCMP eso lo supe cuando no me comparaba nada y para estar seguro mande al puerto lo que me devolvia la comparacion
 
Hay que tener cuidado con los caracteres de fin de línea.

Si estás en DOS/Windows, los finales de línea son "\r" seguido de "\n".
Si estás en Mac OSX, sólo "\r".
Si estás en Linux/UNIX, sólo "\n".

Más información.

Eso es importante, porque a la hora de hacer la comparación, hay que incluir esos caracteres en la cadena.

O quitarlos, antes de hacer la comparación.

Esto no deja de ser un rollo (el lenguaje C es muy prolijo en el tratamiento de cadenas de caracteres).

El propio compilador CSS recomienda el uso de una función, get_string() (localizada en Drivers/input.c) para hacer esa operación.

Las ventajas son: permite pasar un máximo de caracteres a leer, y deja fuera al carácter de nueva línea.

Yo no tengo el CCS, así que no sé qué aspecto tiene, pero en otro foro he encontrado este código:
PHP:
void get_string(char* s, unsigned int8 max) {
   unsigned int8 len;
   char c;

   --max;
   len=0;
   do {
     c=getc();
     if(c==8) {  // Backspace
        if(len>0) {
          len--;
          putc(c);
          putc(' ');
          putc(c);
        }
     } else if ((c>=' ')&&(c<='~'))
       if(len<=max) {
         s[len++]=c;
         putc(c);
       }
   } while(c!=13);
   s[len]=0;
}
La línea del while la cambiaría por
PHP:
   } while(c!=13 && c!=10);
y así tenemos la seguridad de que funcionará independiente del sistema operativo que envía las cadenas.

Ejemplo de uso:
PHP:
get_string(cadena1, 11); // Lee una cadena y la guarda en cadena1, con un máximo de 11 caracteres
Y si sacas la salida de strcmp() por una salida digital, saldrá un '1' en caso de las cadenas sean distintas, y un '0' cuando sean iguales.

Edito: La documentación de gets() dice que lee una cadena de texto, y reemplaza el "\n" final con un "\0", así que también se puede usar para luego hacer la comparación. Su desventaja es que no controla el largo de lo que lee.

El código quedaría así:
PHP:
char dato[20];
//...
dato = gets();                                // Leer hasta nueva línea
if (strcmp(dato,"AT-AB LocalNameOk\r") == 0)  { // Ver si son iguales
Aquí tengo la duda de si gets() eliminará también el "\r" final.

Cuestión de hacer pruebas...
 
Última edición por un moderador:
Excelente Información amigos, he tenido problemas con el paso de strings de mi android a el modulo, a través de terminales bluetooth instalados, no me lee los caracteres correctamente.
Los string enviados del modulo a la terminal los lle perfectamente pero los que envió no los procesa correctamente:
Tengo este codigo de prueba
Código:
d = getc();
printf("\r\n");
printf("Este es en hexa: %x, este en decimal: %U",d,d)

Lo que consigo intentando con varios caracteres:
Código:
i
Este es en hexa: 00, este en decimal: 00
//repito
i
Este es en hexa: 69, este en decimal: 00
w
Este es en hexa: 00, este en decimal: 00

Acaso no reconoce los strings correctamente utilizando getc?
 
Para pintar números decimales con signo se usa %d. %U no lo conozco. En cambio, %u (en minúsculas), es para sacar un decimal sin signo.
 
Amigos soluciones el problema utilizando el UART Tool, tuve que pasar el baud a un rango menor: 19200, ya que estuve viendo el datasheet del pic y en 115200 tiene una tolerancia de error mas amplia que a 19200 o 9600, probé con este baud y me sincroniza bien el modulo bluetooth el pic y el UART Tool
---No solo eso---
También de faltar le en los pines de rx y tx una conexión con el ground para que no estuvieran al aire.
A Través de un condensador de 1 nano desde el terminal rx a tierra.
 
Última edición:
Hola compañeros.
Ya he mejorado mucho el proyecto aumentado la señal de transmisión y demás, pero tengo una pregunta; ¿Puedo conectar varios dispositivos a mi modulo bluetooth?
He leído que en modo maestro es posible controlar hasta 7 esclavos, denominados piconets.
¿Alguno tiene conocimiento en esa parte?
 
Última edición por un moderador:
Atrás
Arriba