Comunicación entre módulo bluetooth y un microcontrolador PIC

Acá si funciona con la última versión de Java, pero yo prefiero hacerlo manualmente porque configuro otros parámetros aparte de los básicos. (Esos casi no los toco una vez establecidos)

Gracias por el aporte, christian0123. (y)
 

Adjuntos

  • Prueba comandos AT.jpg
    Prueba comandos AT.jpg
    359 KB · Visitas: 46
error de java

los run time rompidos dice mi laptop


Seguramente tu versión de Java esta desactualizada.

actualizala y me cuentas como te va.



Acá si funciona con la última versión de Java, pero yo prefiero hacerlo manualmente porque configuro otros parámetros aparte de los básicos. (Esos casi no los toco una vez establecidos)

Gracias por el aporte, christian0123. (y)


Si claro. esta es la primera versión. pensada para usuarios básicos que solo le interesa jugar con ese tipo de parámetros.

cuales son los parámetros que frecuentemente configuras?. los agregaré en una nueva versión.
 
Última edición:
¿Cuales son los parámetros que frecuentemente configuras?
Los agregaré en una nueva versión.
Uno básico que no debe faltar: AT+RESET :cool:

Y los que configuro son éstos:
AT+ROLE (Establece el modo)
AT+IAC (Estable el modo de acceso)
AT+CMODE (Estable el modo de conexión)
AT+SENM (Establece el modo de encripción y seguridad)
AT+PAIR (Establece la pareja bluetooth)

Tal vez olvidé otros pero esos son los que más uso.

Cómo los comandos también tienen consulta, te recomiendo que agregues un modo de lectura a la aplicación.

Suerte.
 
Gracias por el aporte christian0123 !!
te hago una consulta,, el bauderate a ingresar es el del HC05 al arduino o el del arduino al PC ? gracias!
 
aver aver me dan ganas de hacer mi editor en C++

como van los comandos AT

¿con salto de linea y retorno de carro ?

AT+ROLE\n\r

seria interesante , ando en un proyecto con blutut y quiero que diga mi marca y que el usuario cambie su contraseña
 
Gracias por el aporte christian0123 !!
te hago una consulta,, el bauderate a ingresar es el del HC05 al arduino o el del arduino al PC ? gracias!
El baudrate a ingresar es el que quieres manejar para tu comunicación serial. Ejemplo: si configuras tu baudrate a 9600 la velocidad del puerto uart de tu microcontrolador debe ser de 9600.

Compártelo con todos tus amigos.

[emoji16] [emoji16] [emoji16] [emoji106] [emoji106] [emoji106]
 
Que tal antes que todo este es un foro que me a ayudado mucho, soy un novato en esto de la programación y micro controladores, agradecería mucho su ayuda.

utilizo un pic16f886 bluetooth HC-05 lo compre por Internet en una tienda que se llama app-tek en México

lo que quiero es controlar el micro-controlador por medio de mi celular utilizo la aplicación BlueTooth Serial Controller para android, lo que quiero hacer es similar a una grúa, pero no logro tener buena comunicación con el modulo que es lo que mas me interesa lo demás lo se hacer, esto es lo que he echo por favor ayúdenme,
use
MIKRO C PRO FOR PIC
Código:

Código:
signed int uart_rd;
void config();
void main(){
   config();

UART1_Init(9600);
delay_ms(100);

while(1){
   PORTC=0;

   
   if (UART1_Data_Ready()) { // Si el dato se ha recibido,
    uart_rd=UART1_Read();   // lea el dato recibido y guardar
   }

   switch(uart_rd){ // puente h L293 d

    case 0x02:{             //avanzar hacia adelante
        PORTC= 0B00001010;
       }
    break;

    case 0x04:    {         //avanzar hacia atrás
        PORTC= 0B00000101;
     }
    break;
    case 0x05:    {         //giro derecha
        PORTC= 0B00000110; //una llanta gira hacia
    }  //delante y la otra  alreves gira mas rápido
    break;

    case 0xFF:    {      //giro izquierda
        PORTC= 0B0001001; //una llanta gira hacia
    }  //delante y la otra  alreves gira mas rápido
    break;
    case 0x05:    {  //giro derecha brazo grúa
        PORTC= 0B00010000;
    }
    case 0x05:    {  //giro izquierda brazo grúa
        PORTC= 0B00010000;
    }        break;

   }

 }
}

void config(){
  ANSEL=0;
  ANSELH=0;
  TRISB=0;
  TRISC=0;
  TRISA=1;
}

me podrían decir que esta mal intente usar ascII pero tampoco puede cual es la forma correcta, si tienen un código que prenda aunque sea un led me seria de mucha ayuda, en el case 0xFF SI FUNCIONA PERO CON CUALQUIER BOTÓN =( . PIENSO agregarle una pantalla lcd pero primero quiero lograr una conexion exitosa con lo del bluetooth, use el oscilador interno a 20 MHZ, RXD LO CONECTE CON TX del micro-controlador y TXD con RX, use puente h L293 D, lo cambie por LEDS porque no me funcionaba para ver que sucedía.
Estará bien mi código o tendrán uno de ejemplo solo quiero saber como usar la librería UART.

cualquier aporte es bien recibido de verdad agradecería mucho su ayuda que tengan buen día y disculpen mis faltas de ortografía. ...
 
Que tal antes que todo este es un foro que me a ayudado mucho, soy un novato en esto de la programación y micro controladores, agradecería mucho su ayuda.

utilizo un pic16f886 bluetooth HC-05 lo compre por Internet en una tienda que se llama app-tek en México

lo que quiero es controlar el micro-controlador por medio de mi celular utilizo la aplicación BlueTooth Serial Controller para android, lo que quiero hacer es similar a una grúa, pero no logro tener buena comunicación con el modulo que es lo que mas me interesa lo demás lo se hacer, esto es lo que he echo por favor ayúdenme,
use
MIKRO C PRO FOR PIC
Código:

Código:
signed int uart_rd;
void config();
void main(){
   config();

UART1_Init(9600);
delay_ms(100);

while(1){
   PORTC=0;

   
   if (UART1_Data_Ready()) { // Si el dato se ha recibido,
    uart_rd=UART1_Read();   // lea el dato recibido y guardar
   }

   switch(uart_rd){ // puente h L293 d

    case 0x02:{             //avanzar hacia adelante
        PORTC= 0B00001010;
       }
    break;

    case 0x04:    {         //avanzar hacia atrás
        PORTC= 0B00000101;
     }
    break;
    case 0x05:    {         //giro derecha
        PORTC= 0B00000110; //una llanta gira hacia
    }  //delante y la otra  alreves gira mas rápido
    break;

    case 0xFF:    {      //giro izquierda
        PORTC= 0B0001001; //una llanta gira hacia
    }  //delante y la otra  alreves gira mas rápido
    break;
    case 0x05:    {  //giro derecha brazo grúa
        PORTC= 0B00010000;
    }
    case 0x05:    {  //giro izquierda brazo grúa
        PORTC= 0B00010000;
    }        break;

   }

 }
}

void config(){
  ANSEL=0;
  ANSELH=0;
  TRISB=0;
  TRISC=0;
  TRISA=1;
}

me podrían decir que esta mal intente usar ascII pero tampoco puede cual es la forma correcta, si tienen un código que prenda aunque sea un led me seria de mucha ayuda, en el case 0xFF SI FUNCIONA PERO CON CUALQUIER BOTÓN =( . PIENSO agregarle una pantalla lcd pero primero quiero lograr una conexion exitosa con lo del bluetooth, use el oscilador interno a 20 MHZ, RXD LO CONECTE CON TX del micro-controlador y TXD con RX, use puente h L293 D, lo cambie por LEDS porque no me funcionaba para ver que sucedía.
Estará bien mi código o tendrán uno de ejemplo solo quiero saber como usar la librería UART.

cualquier aporte es bien recibido de verdad agradecería mucho su ayuda que tengan buen día y disculpen mis faltas de ortografía. ...


Hola! la verdad no conozco las funciones de micro c pro for pic. particularmente te recomendaría usar el MPLABX IDE y el compilador xc8 o el c18 segun los requerimientos de tu microcontrolador. analizado tu codigo encuentro que tehace falta la linea:

default:
break;

para cerrar la estructura de tu switch. ahora viéndolo bien, tienes tu condicional muy mal armada, la estructura es la siguiente:

switch(variable){
case:
lo que vallas a hacer;
break;

case:
lo que vallas a hacer otra vez
break;

default:
lo que vallas a hacer si ninguna condicion es verdadera;
break;

}

corrige esto y cuéntame como te va!
 
muchas gracias por responder, ya le agregue el default pero sigue igual;
switch(uart_rd){ // uart_rd es la variable
case 0x02:{
PORTC= 0B00001010; //es lo que voy a hacer
} //es igual quue tener PORTC.B1=1 Y PORTC.B3=1 Y LOS DEMAS PINES APAGADOS
break;

case 0x04: { //avanzar hacia atras
PORTC= 0B00000101;
}
break;
case 0x05: { //giro derecha
PORTC= 0B00000110; //una llanta gira hacia
} //delante y la otra alreves gira mas rapido
break;

case 0xFF: { //giro izquierda
PORTC= 0B0001001; //una llanta gira hacia
} //delante y la otra alreves gira mas rapido
break;
case 0x06: { //giro derecha brazo grua
PORTC= 0B00010000;
}
case 0x07: { //giro izquierda brazo grua
PORTC= 0B00010000;
} break;
default { PORTC=0;
} break;
PERO SIGUE IGUAL NO FUNCIONA, ESPERO TU RESPUESTA Y GRACIAS DE VERDAD POR AYUDARME O TE REFIERES A QUE DEBO QUITAR LOS PARENTESIS? YA LO HICE PERO FUNCIONA IGUAL.
 
Última edición:
El switch no lleva corchetes "} {" en cada case. Arriba te expliqué la estructura y los sigues poniendo no entiendo el por qué solo los lleva para abrir y cerrar el switch las instrucciones "case" solo van seguidas de dos puntos igual que el default quedando asi:

Switch (variable) {

Case:
Break;

Case:
Break ;

Default :
Break ;

}
 
ya se los quite pero sigue igual, lo que me interesa es como debo conectar el modo bluetooth a mikro c no sabes como es esa parte del código uart o tengo que hace para que funcione con mikro c? gracias por contestar christian0123.
 
Última edición:
La comunicacion entre el micro y el pic es simplemete uart debes configurar el modulo bluetooth para que su uart trabaje a los mismos baudios que tu pic. para configurarlo puedes usa el software que mas arriba compartí. sique el tutorial es muy facil, el tutorial lo puedes esncontra en youtube escribe en el buscador cvr electronic y listo.

otra cosa veo en u código que declaraste la variable como signed int ¿por que?, por que mejor no trabajas con variables que ocupen solo un bye como un char o algo asi? eso también debes tenerlo en cuenta. por lo general lo que hago para saber que está llegando si es que está llegando algo, es mandar el valor que envío a algún puerto y con unos leds verifico si me están llegando los datos correctamente, es lo que puedo recomendar.

asignale otro tipo a la variable y luego me cuentas a ver que pasa!
 
No es obligatorio el uso de "Default" dentro de Switch.
Se usa principalmente para asignar otro parámetro o acción cuando se ingresa un valor no incluido en la sentencia.
Y tampoco es necesario poner un "Break" al final, porque es ahí precisamente cuando se sale de la sentencia y un "Break" ya queda de sobra.

Tienes los siguientes problemas dentro de tu código:
Recuerda siempre tener en cuenta los periféricos del puerto que usarás.
En el puerto C tienes el módulo EUSART y el pin Rx siempre debe ser entrada.
Si lo configuras todo como salidas, tendrás una contención lógica o colisión de datos.
Bajo ciertas circunstancias este conflicto puede dañar las partes conectadas, por corto circuito.
Así que debes tener cuidado en la configuración de los puertos con "TRISX"
En vez de "TRISC = 0;" debes poner "TRISC = 0b10000000;" o "TRISC = 0x80;"
Entonces ya no importará que uses los 8 bits del puerto C porque el pin Rx (Bit 7) será entrada y un 1 o un 0 sobre el pin Tx (Bit 6) no causará efecto, debido al protocolo RS-232.

También elimina la instrucción "PORTC = 0" al inicio del bucle "While"
Eso no permitirá una acción correcta de cambio de estado sobre los pines, porque inmediatamente de que un pin sea puesto en 1, al finalizar la sentencia será puesto nuevamente en 0, y así sucesivamente.

Suerte.
 
muchas gracias por la ayuda D@rkbytes, de verdad, hice otro programa ccs c compiler y en ese si me funciono pero a mi me piden que lo haga en mikro c hare los cambios y les dire como me va de verdad gracias por toda su ayuda
 
YA LO CORREGI Y NADA SIGUE IGUAL =( SOLO ME PRENDE EL CASE 0XFF SI LE MANDO UNA SEÑAL DE HEXA COMO 0X02,0X06,Y MUCHAS MAS Y SE DETIENE SI MANDO UN 0 O 0X05, 0X08. LOS QUE EN BINARIO SON MAS COMPLEJOS SON CON LOS QUE PRENDE OSEA CON MAS UNOS Y CON MENOR COMPLEJIDAD SE APAGA ME LO CUENTA COMO SI FUERA UN 0.

unsigned char uart_rd;
void config();
void main(){
config();

UART1_Init(9600);
delay_ms(100);

while(1){
if (UART1_Data_Ready()) { // Si el dato se ha recibido,
uart_rd=UART1_Read(); // lea el dato recibido y guardar
}
switch(uart_rd){

case 0x02:pORTC= 0B00001010; //avanzar hacia adelante
break;
case 0x04:pORTC= 0B00000101; //avanzar hacia atras
break;
case 0x05:pORTC= 0B00000110; //giro derecha
break;
case 0x07:pORTC= 0B00001000; //giro derecha brazo grua
break;
case 0xFF:pORTC= 0B00000111; //giro izquierda brazo grua
break;
default: PORTC=0;
break;
}
}
}
void config(){
ANSEL=0;
ANSELH=0;
TRISB=0;
TRISC=0B10000000;
TRISA=0;
}

SERA MEJOR MANEJAR ASCII? PERO EN LA FUNCION SWITCH EN LOS CASOS COMO LOS ASIGNO PARA USAR EL CODIGO ASCII, CREI QUE ERA ASI CASE:"A"; PERO ME MARCA ERROR EL COMPILADOR Y SI LE HAGO ASI CASe:'A'; NO LO TOMA EN CUENTA COMO ASCII COMO SERA MEJOR O CUAL SERA EL PROBLEMA EN EL PROGRAMA ACTUAL? DE ANTEMANO MUCHAS GRACIAS

o sera que tambien me genere un error por usar todo el portc en los case

case 0x07:PORTC= 0B00001000; //giro derecha brazo grua
break;

y les dejo el codigo de ccs el cual si funciona y para cualquier persona que le sirva o lo necesite para que vean que el modulo bluetooth esta bien el poblema es mi programa en mikro C.
 

Adjuntos

  • VERSION BLUETOOTG CCS C.rar
    23.9 KB · Visitas: 73
Última edición:
Ya lo logre amigos de verdad muchas gracias; asi me quedo el código lo cambie a 4 mhz,

unsigned char uart_rd;
void config();
void main(){
config();
uart1_init(9600);
delay_ms(100);

while(1){
if (uart1_data_ready()) { // si el dato se ha recibido,
uart_rd=uart1_read(); // lea el dato recibido y guardar
}
switch(uart_rd){

case 0x02:porta= 0b00001010; //avanzar hacia adelante
break;
case 0x08:porta= 0b00000101; //avanzar hacia atras
break;
case 0x06:porta= 0b00000110; //giro derecha
break;
case 0x04:porta= 0b00001001; //giro izquierda
break;
case 0x10:porta= 0b00100001; //giro derecha brazo grua
break;
case 0x0e:porta= 0b00010001; //giro izquierda brazo grua
break;
default: Porta=0;
break;
}
}
}
void config(){
ansel=0;
anselh=0;
trisb=0;
trisa=0;
}

cuando termine les subo el código y unas fotos del proyecto, gracias por su apoyo
 
buenas amigos, estoy aprendiendo a manejar el virtual terminal con el pic 16f877a, conecte el tx del modulo al rx del pic y rx al tx del pic respectivamente como debe ser, hice el programa para que encendiera y apagara un led con valores de 100 para encender y 200 para apagarlo, pero al momento de simularlo en proteus no hace nada el led, copio los valores en la ventana del virtual terminal pero no hace nada, no se si sera un error del simulador o tengo mala la programacion... mas abajo dejo el programa para que me digan si algo esta mal, si me pueden ayudar es para un proyecto de la universidad y se trata sobre domotica

el programa lo realice en proton ide
Device 16F877A
Xtal = 20
All_Digital = True
CMCON=7
TRISA=%00000000
TRISB=%00000010
Declare Hserial_Baud = 9600

Dim LED As Byte
DelayMS 100
Low PORTB.0

Lazo:
HSerIn 50,Lazo,[Dec LED]

If LED = 100 Then
PORTB.7 = 1
end if
if LED = 200 Then
PORTB.7 = 0
EndIf

GoTo Lazo

EnD
 
buenas amigos, estoy aprendiendo a manejar el virtual terminal con el pic 16f877a, conecte el tx del modulo al rx del pic y rx al tx del pic respectivamente como debe ser, hice el programa para que encendiera y apagara un led con valores de 100 para encender y 200 para apagarlo, pero al momento de simularlo en proteus no hace nada el led, copio los valores en la ventana del virtual terminal pero no hace nada, no se si sera un error del simulador o tengo mala la programacion... mas abajo dejo el programa para que me digan si algo esta mal, si me pueden ayudar es para un proyecto de la universidad y se trata sobre domotica

el programa lo realice en proton ide
¿Y cómo envías desde el Virtual Terminal, los números 100 y 200?
Porque no es lo mismo enviar el número 100 como cadena, que como un número entero.

Si desde la terminal RS-232 escribes el número 100, lo envía como tres bytes. "1","0","0"
Y si en el receptor quieres recibir el número 100 como un entero, de esa forma jamás lo identificará.
Todo lo que envías va en ASCII, pero los números enteros se deben procesar de forma diferente.

Y tampoco los puedes recibir de esa forma como cadenas.
O sea que no puedes escribir: If Cadena = "100" Then... Porque sólo se puede recibir y comparar un Byte.

Prueba enviando y comparando una sola letra o símbolo. Por ejemplo "$" o "&"
Y si se pueden recibir cadenas, pero el proceso se realiza de otra forma.
 
Depende del terminal, hay algunos que no envían nada hasta que pulsas un botón. Hay otros que van tecla a tecla.
Luego es cuestión de programar adecuadamente el puerto serie. No es tan difícil aceptar que funcione tecla a tecla o por cadenas
 
Atrás
Arriba