Ir ao conteúdo

Comunicação PIC <Bluetooth> Android


Ir à solução Resolvido por Pedro S.M,

Posts recomendados

Postado

Hello World!

Galero, sou novo aqui e este é o meu primeiro tópico, então já peço desculpas adiantado em caso de qualquer vacilo.

Pois bem, estou concluindo meu técnico em eletrônica e em meu TCC preciso transferir informações da PIC 18f77.a para um aplicativo para android que desenvolvi no app inventor. Basicamente preciso enviar o valor de uma variável da programação em C da minha PIC até o aplicativo, que vai recebê-lo e executar certas funções. O problema é que estou bastante perdido quanto a como fazer essa integração da pic com o módulo bluetooth. 

Eu estou utilizando um módulo HC-06 com seu terminal TX conectado diretamente no RX da PIC e vice-versa. O módulo aparentemente funciona corretamente, pareia com o celular ao ser alimentado.

A minha grande dúvida está no software, pois não encontro em lugar algum um exemplo de biblioteca Bluetooth para incluir no meu Main.C, e sou bastante inexperiente quanto à programação.

Estou usando o CCS como compilador, se alguém conseguir me ajudar com a biblioteca, serei bastante grato. valeu :)  

  • Membro VIP
Postado

amigo, 1ªmente não tive contato ainda com este mundo android e tal (*). Penso não haver sentido num bluetooh.h no compilador do mc que se comunica pela serial. Penso cá com meus botões que o mc só vê o mundo pela serial mesmo. Portanto você deve receber/enviar dados de forma tradicional e a interface (que também decsconheço) se vira pra fazer a ponte. Talvez tenha que 'abrir as portas' do outro lado.. sei lá

 

(*)off-on topic... tenho intenção de a qualquer momento num futuro não muito distante, fazer alguma brincadeira intermundos mc-android exatamente como você. Peço a gentileza de compartilhar suas aventuras pois pode não me ser totalmente inútil na ocasião. Agradeço de antemão

Postado

 Penso não haver sentido num bluetooh.h no compilador do mc que se comunica pela serial. Penso cá com meus botões que o mc só vê o mundo pela serial mesmo. Portanto você deve receber/enviar dados de forma tradicional e a interface (que também decsconheço) se vira pra fazer a ponte. 

 

 

  É exatamente isso, o modulo HC-06 é praticamente transparente, o que você manda pela serial de um lado sai do outro e vice-versa....

 

@Pedro S.M  Baixe um apk chamado Blueterm, crie um programinha para o PIC que escreva qualquer coisa pela serial, depois de parear com o HC-06 com o blueterm aberto, tudo que o PIC mandar deve aparecer no console do Blueterm, isto serve para saber se a informação que sai do PIC esta chegando no Tablet/Celular... Se estiver tudo OK, qualquer eventual problema que venha a aparecer, vai ser no código de seu aplicativo e não na parte de comunicação  PIC -> Android.

Postado

Pessoal, primeiramente obrigado pela atenção. Como vocês devem ter notado, eu estava bastante perdido.
Bem, fiz o que disseram mas infelizmente não funcionou. Criei um programa de testes só pra mandar o valor de uma variável qualquer pela serial e já mostrar o mesmo valor em um display conectado à PIC, para ter certeza que a programação está correta:

#include "C:\Users\pedro.junior\Desktop\PICC\Devices\16f877a.h"#use delay (clock=20000000)#use RS232(baud=9600, parity=E, bits=8, xmit=PIN_C6,rcv=PIN_C7)#include "C:\Users\pedro.junior\Desktop\TCC_Passado\lcd_flexible.c"#include "C:\Users\pedro.junior\Desktop\PICC\Drivers\string.h"void main()  {    output_high(PIN_E1);  char c;  lcd_init();  while(1)    {    c=(1+0x30);    putc(c);     lcd_putc("\f");    lcd_putc(c);     delay_ms(1000);    }  }

Acredito que a programação está correta. Ela deveria enviar o valor "1" via serial, e o valor chega a ser mostrado no meu display. Porém , absolutamente nada aparece no Blueterm. Ele até encontra e se conecta ao meu dispositivo, mas o valor enviado não aparece, fica só na tela azul inicial. Também já tentei fazer o caminho oposto, enviando algo do Blueterm para a PIC usando o comando c=getch(); e mandando dar um printf no display, mas novamente nada aparece.
Caso eu esteja cometendo algum erro besta ou tenha alguma sugestão que vocês possam me dar, será de grande ajuda. Novamente, obrigado ;)

  • Membro VIP
Postado

1/2 que dei um ctrl-c ctrl-v num post de hoje...(!)

 

isso é tão óbvio que quase não publico... veja se os baudrates estão coerentes

 

Isso, nem tanto... dê um curto nos pinos 2 e 3 do conector com um minishunt e abra o hyperteminal (ou algum de sua preferência - o tal blue term) e veja se o que tecla ecoa

 

Va eliminando os supostos problemas...

Tente enviar por fio mesmo o sinal tx do mc no rx do pc e verifique com o terminal se está chegando.

E vice versa, envie por fio do pc pra aparecer no display do mc

 

Gostei daquele módulo. Acho que vou comprar 1

Postado

1/2 que dei um ctrl-c ctrl-v num post de hoje...(!)

 

isso é tão óbvio que quase não publico... veja se os baudrates estão coerentes

 

Isso, nem tanto... dê um curto nos pinos 2 e 3 do conector com um minishunt e abra o hyperteminal (ou algum de sua preferência - o tal blue term) e veja se o que tecla ecoa

 

Va eliminando os supostos problemas...

Tente enviar por fio mesmo o sinal tx do mc no rx do pc e verifique com o terminal se está chegando.

E vice versa, envie por fio do pc pra aparecer no display do mc

 

Gostei daquele módulo. Acho que vou comprar 1

O baudrate está de acordo com as informações que peguei no datasheet.

Testei minha programação comunicando com o PC com um cabo serial usando o MagistrumsTerminal, e os dados que eu queria enviar chegaram. Só através do HC-06/Blueterm ele parece não receber.

Amanhã testarei dar o curto nos pinos do conector e posto o resultado aqui. valeu ;)  

Postado

Olá Pedro,

 

Posso te ajudar pois já trabalhei com esses módulos no meu projeto

Inclusive ainda tenho ele montado no protoboard

 

Inclusive também posso lhe ajudar com APPinventor 

Acredite é super tranquilo e funciona muito bem com a serial

 

Nos testes que eu fiz eu consegui um alcance de mais de 20 metros

Se você precisar dá pra enviar string do PIC pra o Aplicativo também

 

O código abaixo liga/desliga LEDs nos pinos A0 e A1 sempre que o PIC recebe a string correspondente ao comando

#include <16F877a.h>#fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOLVP #use delay (clock=4000000)#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)char serial;#int_rdavoid serial_isr(){serial=getc();switch (serial)      {         case 'a':         Output_toggle(PIN_A0);      break;                      case 'b':         Output_toggle(PIN_A1);               break;      }}void main(){set_tris_A(0b00000000);  enable_interrupts(global);enable_interrupts(int_rda); }    
Postado

@Microdesign, obrigado pela ajuda. Testei sua programação na minha PIC, mas não sei se entendi direito. Compilei o seu código e baixei na PIC, mas quando mando o comando pelo blueterm nada acontece.
De qualquer modo, tudo o que eu preciso é enviar um dado qualquer da PIC pro celular, mas o terminal não recebe nada. Estou usando a programação como se fosse enviar os dados via serial normalmente através de um cabo (o que funciona pra mim). Talvez eu não esteja fazendo certo. Se você tiver parte da programação do seu projeto que faça isso, talvez pudesse me ajudar. 
Sinto que estou cometendo algum erro besta. Alterei a paridade de Even para None, mas nada mudou.

Postado

Pedro,

 

O RX do HC-06 não deve ser ligado direto ao TX do PIC por que o nivel de tensão é 3.3v. você tem que usar um divisor de tensão. O TX você pode ligar direto, o RX NÃO 

 

x3ls0.jpg

 

Bom vamos começar fazendo o seguinte:

 

1) Com o código que te passei gravado no PIC envie um caracter "a" (minúsculo e sem as aspas) pelo Blueterm. Deverá acender o LED no pino A0. Repetindo o comando o LED apaga.

 

2) Se isto funcionar então nós vamos fazer agora o inverso, enviar um comando do PIC para o APP que é isso que você quer. Para isso preciso ver o código que você fez no APPinventor. Coloque ele aqui.

 

obs: você sabe se o HC-06 está configurado com baudrate 9600bps?

 

Faça isso eu aguardo os testes

Postado

Bom dia! Perdão pela demora pra responder, tive alguns contratempos.
Primeiramente, vamos eliminar os erros que eu já corrigi. Eu estava usando uma placa já pronta com um chip max232 pra comunicação serial, o que de acordo com o meu instrutor, não permitia que o módulo se comunicasse. Retirando ele obtive sucesso em alguns testes. Agora fiz o divisor de tensão que você me disse também.
Quanto aos testes, fiz o que me pediu e funcionou, os LEDs acenderam. Também fiz outro teste mandando o comando pelo PC através do MagistrumsTerminal via serial, diretamente pro módulo HC-06, sem a PIC, e recebi corretamente no celular. Joinha, o módulo funciona!
Porém, quando ponho a PIC com a minha programação, as coisas simplesmente não funcionam... O módulo pareia com o celular, mas não recebo nada tanto no meu aplicativo quando no blueterm. Estou mandando em anexo as imagens dos blocos da programação do meu aplicativo.
O HC-06 também está configurado corretamente (chequei isso ontem); o baud rate é 9600, paridade None, 8 bits, 1 Stop Bit.   
Acredito que o erro está na minha programação, entretanto não consegui encontrar o erro. Vou colocar ela aqui também, talvez você consiga encontrar.  O que eu estou tentando enviar via serial é o valor da variável sinal
 

#include "C:\Users\pedro.junior\Desktop\TCC_Futuro\16f877a.h"#use delay (clock=20000000)#use RS232(baud=9600, parity=N, bits=8,stop=1, xmit=PIN_C6,rcv=PIN_C7)#include "C:\Users\pedro.junior\Desktop\TCC_Futuro\lcd_flexible.c"#include "C:\Users\pedro.junior\Desktop\PICC\Drivers\string.h"void main()  {    output_high(PIN_E1);  char c;  float Valor = 0;  long int duracao=0;  long int cm=0;  int sinal=0;set_tris_a(255);set_tris_d(0b00001110);set_tris_c(0b00000110); //Cotrigset_tris_e(255);lcd_init();printf(lcd_putc, "\fMedidor" "\nde Distancia");delay_ms(3000);output_high(PIN_E1);output_low(PIN_D0);duracao=0;while (1){    c=(sinal+0x30);       putc(c); // manda c de volta para pc            lcd_putc("\f");    lcd_putc(c); // imprime c no LCD    delay_ms(1000);output_low(PIN_D0);delay_us(4);output_high(PIN_D0);delay_us(20);output_low(PIN_D0);duracao=0;while (!input(PIN_D1)){}while (input(PIN_D1)){duracao++;delay_us(130);}duracao = duracao*130;cm=(duracao/29)/2;printf(lcd_putc,"\fCentimetros:\n= %lu",cm);delay_ms(1000);if(cm<90){delay_ms(100);if(cm<90){sinal="e";}} if((cm>=90)&&(cm<=110)){delay_ms(100);if((cm>=90)&&(cm<=110)){sinal="a";}}if((cm>=190)&&(cm<=210)){delay_ms(100);if((cm>=190)&&(cm<=210)){sinal="b";}}if((cm>=290)&&(cm<=310)){delay_ms(100);if((cm>=290)&&(cm<=310)){sinal="c";}}if(cm>390){delay_ms(100);if(cm>390){sinal="d";}}}  }

Novamente, obrigado pela ajuda ;)

post-785826-0-11188800-1446745785_thumb.

post-785826-0-88326500-1446745786_thumb.

post-785826-0-18274900-1446745788.png

Postado

Bom Pedro,

 

você não explicou o que o seu projeto irá fazer, de qualquer forma você pode usar o seguinte exemplo como modelo para receber os dados

 

2m5mcls.jpg

 

Nesse exemplo a variável "global Recebe_dado" irá receber o dado que chega na Serial do HC-06

Se receber a string "A" e o estado da variável "global estado1" for "OFF" ENTÃO mudo a aparencia (imagem) de um botão e escrevo no Label1 "LED1 LIGADO"

Seto para "ON" o estado da variável "global estado1"

Mostro no Label3 o que chegou na Serial do HC-06 neste caso a string "A"

 

você pode fazer as adaptações para o seu projeto usando este como base

Qualquer coisa é só chamar

  • Solução
Postado

Bom dia amigos. Problemas resolvidos!
Como o @Microdesign lembrou, eu ainda não tinha citado sobre o que se tratava o meu projeto, então vamos lá: Se trata de um sensor de distância para deficientes visuais. Estou utilizando um sensor ultrassônico hc-sr04 para medir a distância até qualquer obstáculo, e minha PIC mandará uma string via bluetooth pro app de acordo com a distância calculada. O aplicativo, de acordo com a string recebida, vai "dar play" em uma fala dizendo "1 metro" ou "2 metros" e assim em diante.
Quanto aos erros, eu estava utilizando comandos errados na minha programação ( c=(sinal+0x30); putc(c); ao invés de simplesmente putc('string')) e também tinha definido o TX da PIC como entrada no "set_tris".
Enfim consegui comunicar a PIC com o meu aplicativo usando o HC-06. Brigadão a todos que comentaram aqui. Qualquer coisa, estou à disposição ;)
}

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!