LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: microbyte em 18 de Fevereiro de 2009, 09:47

Título: VirtualWire
Enviado por: microbyte em 18 de Fevereiro de 2009, 09:47
Boas pessoal.
Já tenho o DuemilaNove a comunicar com o Diecimila por RF, usando os módulos RF e a lib VirtualWire.

Tenho um comando de uma Polystation que gostava de experimentar antes de introduzir o nunchuck. Está tudo a funcionar perfeitamente de ambos os lados (receptor, emissor).

A minha questão é: como construír uma string para enviar depois?

Imaginem que tenho 1 caracter de direcção (parado - 0, frente - 1, tras - 2) e dois on/off (off - 0, on - 1)

A minha ideia era fazer algo deste género:

Emissor:
Código: [Seleccione]
100
Receptor:
Lia os caracteres um a um e agia consoante aquilo que lia.
Neste caso, ia apenas andar para a frente.

Agora o problema é como construír aquela string a enviar para depois ser enviada.
Tinha pensado em algo assim: (pseudo-codigo)
Código: [Seleccione]
se (botao_cima){ dir = 1 }
se (botao_a) { a = 1 } senão { a = 0 }
se (botao_b) { b = 1 } senão { b = 0 }

enviar (dir + a + b)

Mas o Arduino parece que não se dá muito bem com as Strings.
Título: Re:VirtualWire
Enviado por: DanBar em 18 de Fevereiro de 2009, 11:43
Estou com o mesmo problema.

Eu envio numeros 0 a 255 é o máximo  ::)

Fica aqui o código que estou a escrever para o sensor Geral:

Compilado em IDE 0013  ;D
Título: Re:VirtualWire
Enviado por: microbyte em 18 de Fevereiro de 2009, 13:43
Boas notícias: parece que temos acesso às libs do C.
Então podemos usar a função strcat() (http://www.cplusplus.com/reference/clibrary/cstring/strcat.html)

Vou testar e já digo alguma coisa.
Título: Re:VirtualWire
Enviado por: ricardo-reis em 18 de Fevereiro de 2009, 13:51
já pensaste em:

o emissor envia 3 numeros ou um numero de 3 algarismos, que são sp (a menos k tenhas código pra isto n acontecer) enviados um a um..

e no receptor teres um vector que recebe esses 3 algarismos e para cada posição desse vector fazeres corresponder uma acção?
Título: Re:VirtualWire
Enviado por: tr3s em 18 de Fevereiro de 2009, 13:57
Se vais enviar sempre 3 caracteres, [dir],[a],
Podes ter um array de chars, como buffer, de 4 posições em que para cada indice metes o que queres:

Código: [Seleccione]
char  buffer [4];
buffer[0] = dir;
buffer[1] = a;
buffer[2] = b;
buffer[3] = '\0';  //fim de string

Como este array de chars é uma string, (está nesse formato pois acaba com o caracter '\0'), podes enviá-la pelo TX :D

Não te esqueças que se fizeres:

char a = 1;

não estás a enviar o caracter 1
terás de fazer:

char a = '1';

ou entao:

char a = 1 + 0x30;
Título: Re:VirtualWire
Enviado por: DanBar em 18 de Fevereiro de 2009, 14:07
E para o meu problema. Como só necessito de enviar 1 caracter posso enviar como se fosse numeração ASCII assim ?

Serial.print("A", BYTE);  // ASCII = 65
Serial.print("D", BYTE); // ASCII = 68

Depois na recepção converto ao contrário. Certo ??

Como estou a utilizar os pinos 2 e 3 para comunicar com o Transmissor e Receptor RF 434 não posso enviar caracteres (string). Estou certo ou errado ?


Título: Re:VirtualWire
Enviado por: microbyte em 18 de Fevereiro de 2009, 14:16
Se vais enviar sempre 3 caracteres, [dir],[a],
Podes ter um array de chars, como buffer, de 4 posições em que para cada indice metes o que queres:
Código: [Seleccione]
char  buffer [4];
buffer[0] = dir;
buffer[1] = a;
buffer[2] = b;
buffer[3] = '\0';  //fim de string

Como este array de chars é uma string, (está nesse formato pois acaba com o caracter '\0'), podes enviá-la pelo TX :D

Não te esqueças que se fizeres:

char a = 1;

não estás a enviar o caracter 1
terás de fazer:

char a = '1';

ou entao:

char a = 1 + 0x30;

Código: [Seleccione]
char  buffer [4];
buffer[0] = dir;
buffer[1] = a;
buffer[2] = b;
buffer[3] = '\0';  //fim de string

Depois como envio para TX? Mesmo Serial.println(buffer) ???

E nesse caso como descodifico do lado do receptor? Com o Virtwalwire?
Título: Re:VirtualWire
Enviado por: tr3s em 18 de Fevereiro de 2009, 15:09
Exemplo para usar VirtualWire:

Emissor TX:
Código: [Seleccione]
#include <VirtualWire.h>
#define TAMANHO 4
void setup(){
vw_setup(2000); // Bits por seg
}

void loop(){
char msg [TAMANHO] ;
        char a = 1;
        char b= 0;
        char dir = 1;
       
        msg[0]=dir+0x30;
        msg[1]=a+0x30;
        msg[2]=b+0x30;
        msg[3]='\0';

vw_send((uint8_t *)msg, TAMANHO);
delay(400);
}
Receptor RX:
Código: [Seleccione]
#include <VirtualWire.h>
void setup(){
Serial.begin(9600);
Serial.println("setup");
vw_setup(2000); // Bits por segundo
vw_rx_start(); // começar
}

void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)){
int i;
Serial.print("Recebi: ")
for (i = 0; i < buflen; i++){
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println("");
}
}
Título: Re:VirtualWire
Enviado por: DanBar em 18 de Fevereiro de 2009, 15:24
Estou safo. não conhecia essa libraria.

Vou já actualizar o meu código.


Outra coisa é improssivel testar os 2 RF só com arduino. Certo ?  Pois ainda só tenho um.

E gostaria de testar os emissor e o receptor.
Título: Re:VirtualWire
Enviado por: tr3s em 18 de Fevereiro de 2009, 15:34
Ish... é muita complicadote fazer isso :S... Não sei mesmo se é possível :s
Título: Re:VirtualWire
Enviado por: microbyte em 18 de Fevereiro de 2009, 15:39
@tr3s: como falaste do TX, pensei que esse método não utilizasse o VirtualWire. My misunderstanding...  :P Obrigado...

@Icar Não foste tu que mandaste vir da Sparkfun a ATMega com o Bootloader? Podes fazer um arduino Standalone e testar os módulos assim.
Título: Re:VirtualWire
Enviado por: DanBar em 18 de Fevereiro de 2009, 16:01
@tr3s: como falaste do TX, pensei que esse método não utilizasse o VirtualWire. My misunderstanding...  :P Obrigado...

@Icar Não foste tu que mandaste vir da Sparkfun a ATMega com o Bootloader? Podes fazer um arduino Standalone e testar os módulos assim.

Sim. Estou á espera do material a qualquer momento.

 ;D
Título: Re:VirtualWire
Enviado por: microbyte em 18 de Fevereiro de 2009, 16:10
tr3s, isto dá erro:

"error: invalid conversion from 'int' to 'char*'"

nesta linha:
        msg[0]=dir+0x30;
Título: Re:VirtualWire
Enviado por: tr3s em 18 de Fevereiro de 2009, 16:23
Claro que dá erro :P Cometi um erro mta estúpido :P

O código ja ta corrigido! Tira o * !
Título: Re:VirtualWire
Enviado por: microbyte em 18 de Fevereiro de 2009, 16:42
Ok acho que já cheguei lá!  ;D
Título: Re:VirtualWire
Enviado por: tr3s em 18 de Fevereiro de 2009, 16:55
Claro que dá erro :P Cometi um erro mta estúpido :P

O código ja ta corrigido! Tira o * !

Eu hoje não estou bem ...

"... Tira o *  na declaração do char buffer [TAMANHO];" !

Devia ter ido assim!
Título: Re:VirtualWire
Enviado por: DanBar em 18 de Fevereiro de 2009, 17:20
Como eu já uso IDE 0013 tens que inserir a linha no topo do projecto

#include <WProgram.h>

Se não dá erro  :D
Título: Re:VirtualWire
Enviado por: microbyte em 18 de Fevereiro de 2009, 17:45
Como eu já uso IDE 0013 tens que inserir a linha no topo do projecto

#include <WProgram.h>

Se não dá erro  :D

Não me parece...  ;D Está a funcar perfeitamente sem isso...
Título: Re:VirtualWire
Enviado por: DanBar em 18 de Fevereiro de 2009, 18:01
Pois o meu dá erro  ???