• Welcome to LusoRobótica - Robótica em Português.
 

VirtualWire

Started by microbyte, 18 de February de 2009, 09:47

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

microbyte

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:
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)

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.

DanBar

#1
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
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

DB@G
http://www.facebook.com/daniel.barradas

microbyte

Boas notícias: parece que temos acesso às libs do C.
Então podemos usar a função strcat()

Vou testar e já digo alguma coisa.

ricardo-reis

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?

tr3s

#4
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:

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;
Tr3s
Daniel Gonçalves

DanBar

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 ?


Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

DB@G
http://www.facebook.com/daniel.barradas

microbyte

#6
Quote from: tr3s on 18 de February 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:
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;

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?

tr3s

#7
Exemplo para usar VirtualWire:

Emissor TX:

#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:

#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("");
}
}
Tr3s
Daniel Gonçalves

DanBar

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.
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

DB@G
http://www.facebook.com/daniel.barradas

tr3s

Ish... é muita complicadote fazer isso :S... Não sei mesmo se é possível :s
Tr3s
Daniel Gonçalves

microbyte

@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.

DanBar

Quote from: microbyte on 18 de February 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.

Sim. Estou á espera do material a qualquer momento.

;D
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

DB@G
http://www.facebook.com/daniel.barradas

microbyte

tr3s, isto dá erro:

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

nesta linha:
        msg[0]=dir+0x30;

tr3s

Claro que dá erro :P Cometi um erro mta estúpido :P

O código ja ta corrigido! Tira o * !
Tr3s
Daniel Gonçalves

microbyte

Ok acho que já cheguei lá!  ;D