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
-
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.
-
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
-
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.
-
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?
-
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;
-
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 ?
-
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?
-
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("");
}
}
-
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.
-
Ish... é muita complicadote fazer isso :S... Não sei mesmo se é possível :s
-
@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.
-
@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
-
tr3s, isto dá erro:
"error: invalid conversion from 'int' to 'char*'"
nesta linha:
msg[0]=dir+0x30;
-
Claro que dá erro :P Cometi um erro mta estúpido :P
O código ja ta corrigido! Tira o * !
-
Ok acho que já cheguei lá! ;D
-
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!
-
Como eu já uso IDE 0013 tens que inserir a linha no topo do projecto
#include <WProgram.h>
Se não dá erro :D
-
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...
-
Pois o meu dá erro ???