Autor Tema: Problema con modulo Bluethoot HM-10  (Leído 219 veces)

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

Desconectado iscume

  • PIC10
  • *
  • Mensajes: 8
Problema con modulo Bluethoot HM-10
« en: 12 de Enero de 2017, 13:38:22 »
Hola,

Estoy usandoen MPLAB con XC8,  y necesito configurar un modulo Bloethoot HM-10!

En concreto quiero cambiarle el nombre y ponerle una contraseña.

Mirando el datasheet  se supone que si desde mi programa le envío lo siguiente debería cambiar el nombre del dispositivo a microchip y acto seguido pedir una contraseña al dispositivo con el que se quier vincular ¿no es así?

          printf("AT+NAMEMICROCHIP");
          // aquí introduzco un delay de un segundo
          printf("AT+PIN1111");


El caso es que no logro cambiar ninguna de la dos cosas.

¿Alguien ha utilizado este módulo y puede decirme en que estoy fallando?

Gracias de antemano.

« Última modificación: 12 de Enero de 2017, 13:58:44 por iscume »

Desconectado iscume

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con modulo Bluethoot HM-10
« Respuesta #1 en: 15 de Enero de 2017, 14:05:53 »
He estado jugando con el modulo y un arduino y lo consigo programar, pero esto no es lo que estoy realmente buscando, lo que me gustaria es saber que instrucciones o como se mandan los comandos AT  desde el propio micro, para ponerlo en el código y sea el el que programe el modulo, sin necesidad de utilizar un hiperterminal ni nada.


En el sketch de arduino utiliza dos instrucciones,
Serial.print(c);  que seria para enviar el dato por el modulo bluethoot
BT1.print(c);  que utiliza para pasar los comandos AT.



¿¿Alguien podría decirme como se hace esto con el XC8????


Muchas gracias
 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5322
Re:Problema con modulo Bluethoot HM-10
« Respuesta #2 en: 15 de Enero de 2017, 14:27:56 »
Tendrias que mandar letra por letra. No recuerdo exactamente si XC8 provee alguna funcion para esto, pero supongamos que queres hacer una funcion:

UART_envio("AT+NAMEMICROCHIP");


Código: C
  1. void UART_envio( const char * ptr)
  2. {
  3.         while(*ptr)                                                     // Esto ejecuta hasta llegar al fin del string que es 0
  4.         {
  5.                 while(!TXSTAbits.TRMT);                 // Aca reviso si tengo lugar en el buffer de salida de la UART, si no hay lugar espero aca
  6.                 TXREG = *ptr;                                   // Envio el caracter a enviar
  7.                 ptr++;                                                  // Apunto al proximo caracter
  8.         }
  9. }

Solo aclarar que esta funcion es BLOQUEANTE, ¿que quiere decir esto?, que hasta que no se envie todo el string no va a salir de alli, la recepcion deberias hacerla por interrupcion en la cual vas a recibir letra a letra.
Y 2 ejemplos de uso, uno con un string en la misma linea y otro con una "variable".

Código: C
  1. const char pin[] = "AT+PIN1234";
  2.  
  3. UART_envio("AT+NAMEMICROCHIP");
  4. UART_envio(pin);

El tema es que Arduino utiliza C++,donde tenes Clases, y en el que cada clase ( Serial, BT1 ) puede posee su propio print, o tal ves BT1 sea una clase derivada de Serial, y print sea de este clase base ( Serial ). La cual por dentro hace el codigo que puse al comienzo.
« Última modificación: 15 de Enero de 2017, 14:30:47 por KILLERJC »

Desconectado iscume

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con modulo Bluethoot HM-10
« Respuesta #3 en: 15 de Enero de 2017, 14:52:19 »
Hola KILLERJC, gracias por tu respuesta,

Si enviarlo lo envia, lo que pasa que el modulo no me lo detecta como un caracter AT... y lo reenvia por el bluethoot como si fueran datos a mandar en vez de comandos AT   :(



Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5322
Re:Problema con modulo Bluethoot HM-10
« Respuesta #4 en: 15 de Enero de 2017, 15:59:47 »
Supuestamente el AT+MODE0 es el default, que seria el recibir comandos AT por la UART, pero por si algun motivo se cambio y esta en AT+MODE2, vas a tener que conectarte y de alli enviarle los comandos AT.

Recuerdo que otros modulos suelen tener un pin para hacerlos entrar en modo AT, pero este parece ser que se configura unicamente de esa forma.
Al menos es lo que lei buscando en algunas paginas.

Desconectado iscume

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con modulo Bluethoot HM-10
« Respuesta #5 en: 26 de Enero de 2017, 14:25:42 »
Hola!

El modulo Bluethoot esta en MODE0,   
el problema no es que no pueda enviar por el bluethoot, ya que envió y recibo a la perfección.

El problema que tengo es que quiero configurar el modulo para poder cambiarle el nombre al dispositivo, pero quiero hacerlo desde el programa en C, sin necesidad de utilizar un puerto serie.

Es decir, que al iniciar el programa por primera vez, yo pueda mandarle un comando AT al dispositivo bluethoot y cambiar lo que necesite. Aqui es donde estoy atascado, ya que no se como debo enviarle la instrucción para que el modulo detecte que es un comando ATy lo procese, en vez de texto y lo envíe...
Ya que ahora envió:
printf("AT+NAMEMICROCHIP");
y en vez de cambiar el nombre, lo que sucede es que envío esto como texto.

Alguien me puede orientarme sobre el envío de comandos AT???

Mil gracias de antemano

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5322
Re:Problema con modulo Bluethoot HM-10
« Respuesta #6 en: 26 de Enero de 2017, 18:16:54 »
Por eso mismo te decia.. Hay modulos que requieren de un pin para pasar a modo AT, y por lo que lei de ese necesitas cambiar el MODE, si no te da importancia desde el PIC, trata de modificarlo desde el bluetooth enviandole algo, y trata de cambiar el modo a uno en que el PIC pueda enviarle comandos AT.

Desconectado iscume

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con modulo Bluethoot HM-10
« Respuesta #7 en: 27 de Enero de 2017, 04:36:02 »
 Hola KILLERJC

Creo que no es eso porque si lo conecto a un arduino, con un sketch de ejemplo que hay si le pongo comandos AT si que  puedo configurarlo.
concretamente con este codigo:
Código: [Seleccionar]
#include <SoftwareSerial.h>
SoftwareSerial BT1(4,2);      // RX, TX recorder que se cruzan
//EN EL PIN 4 TENEMOS TX
//EN EL PIN 2 TENEMOS RX
void setup()
   { Serial.begin(9600);
     Serial.println("Enter AT commands:");
     delay(2000);
     BT1.begin(9600);
     
   }

void loop()
   {  if (BT1.available())
          Serial.write(BT1.read()); 

      if (Serial.available())
         { char c = Serial.read() ;
           Serial.print(c);
           BT1.print(c);
           BT1.print("AT+NAMETODOPIC");
         }
   }



El problema viene creo a la hora de enviar los paramettros por lo que acabo de ver, estoy enviando:
printf("AT+NAMEMICROCHIP");

e igual tendría que  enviar :
printf("AT+NAMEMICROCHIP;\r\n");

No lo se... voy a probar cosas  a ver si puedo solucionarlo.


Gracias!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5322
Re:Problema con modulo Bluethoot HM-10
« Respuesta #8 en: 27 de Enero de 2017, 07:29:44 »
Citar
El problema viene creo a la hora de enviar los paramettros por lo que acabo de ver, estoy enviando:
printf("AT+NAMEMICROCHIP");

e igual tendría que  enviar :
printf("AT+NAMEMICROCHIP;\r\n");

Deberias pero lo que me parece raro es que en Arduino no te lo agrega a eso por si solo. El string se va a guardar de la misma forma sea cual sea el compilador. Y el envio en arduino no hay nada que le agregue, El envio como podes observar en esta parte que voy a poner a continuacion, no es simple de encontrar por que la clase SoftwareSerial es derivada de Stream y Stream es derivada de Print, Por lo tanto el write (con una string de parametro) termina perteneciendo a la clase Print

Código: C++
  1. //Print.h
  2.     virtual size_t write(const uint8_t *buffer, size_t size);
  3.     size_t write(const char *buffer, size_t size) {
  4.       return write((const uint8_t *)buffer, size);
  5.     }
  6.  
  7. //Print.cpp
  8. size_t Print::write(const uint8_t *buffer, size_t size)
  9. {
  10.   size_t n = 0;
  11.   while (size--) {
  12.     if (write(*buffer++)) n++;
  13.     else break;
  14.   }
  15.   return n;
  16. }

Como ves es un simple envio por UART y no le agrega nada. Por eso lo primero que me vino a la mente es un problema con el printf, Y realize un programa casi igual al de Arduino para el envio de las cosas.

Todo me parece muy raro iscume lo que estas planteando. Porque se descartaron todos los posibles problemas.

- En Arduino funciona, por lo cual el modulo funciona correctamente.
- En PIC podes escribir y te lo toma como texto a enviar... Por lo cual quiere decir que el PIC esta bien configurado la UART (baudrate/stopbit/etc) y puede comunicarse.
- Se esta enviando lo mismo en ambos casos, no se le agrega nada de nada.

La unica que queda sera ese delay de 2 segundos antes de iniciarlo. Otra diferencia no hay por lo que planteas. BT1.begin simplemente llama al constructor de la clase que completa las variables para la comunicacion por software en caso de hacerse.
La otra diferencia es que estas enviando 1 caracter antes ademas del comando AT (Sin contar que si envias 10 caracteres estas 2 instrucciones se realizan 10 veces):

Código: C++
  1.            BT1.print(c);
  2.            BT1.print("AT+NAMETODOPIC");

Si ninguna de estas 2 es la solucion, ya no se que mas decirte. Ya que estariamos haciendo exactamente lo mismo.
« Última modificación: 27 de Enero de 2017, 07:34:56 por KILLERJC »


 

anything