collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: VirtualWire  (Lida 9316 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
VirtualWire
« 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.

Offline DanBar

  • Mini Robot
  • *
  • Mensagens: 685
    • iCAR Lusorobotica Blog
Re:VirtualWire
« Responder #1 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
« Última modificação: 18 de Fevereiro de 2009, 11:47 por iCAR »
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

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

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re:VirtualWire
« Responder #2 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()

Vou testar e já digo alguma coisa.

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:VirtualWire
« Responder #3 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?

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:VirtualWire
« Responder #4 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;
« Última modificação: 18 de Fevereiro de 2009, 16:23 por tr3s »
Tr3s
Daniel Gonçalves

Offline DanBar

  • Mini Robot
  • *
  • Mensagens: 685
    • iCAR Lusorobotica Blog
Re:VirtualWire
« Responder #5 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 ?


Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

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

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re:VirtualWire
« Responder #6 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?
« Última modificação: 18 de Fevereiro de 2009, 16:23 por tr3s »

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:VirtualWire
« Responder #7 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("");
}
}
« Última modificação: 18 de Fevereiro de 2009, 16:23 por tr3s »
Tr3s
Daniel Gonçalves

Offline DanBar

  • Mini Robot
  • *
  • Mensagens: 685
    • iCAR Lusorobotica Blog
Re:VirtualWire
« Responder #8 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.
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

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

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:VirtualWire
« Responder #9 em: 18 de Fevereiro de 2009, 15:34 »
Ish... é muita complicadote fazer isso :S... Não sei mesmo se é possível :s
Tr3s
Daniel Gonçalves

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re:VirtualWire
« Responder #10 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.

Offline DanBar

  • Mini Robot
  • *
  • Mensagens: 685
    • iCAR Lusorobotica Blog
Re:VirtualWire
« Responder #11 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
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

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

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re:VirtualWire
« Responder #12 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;

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:VirtualWire
« Responder #13 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 * !
Tr3s
Daniel Gonçalves

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re:VirtualWire
« Responder #14 em: 18 de Fevereiro de 2009, 16:42 »
Ok acho que já cheguei lá!  ;D