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

[Desenvolvimento] Módulos RFM12-868D (Emissor e Receptor a 866MHz) da HOPERF

Started by metRo_, 19 de May de 2009, 18:04

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

metRo_

Quote from: TigPT on 30 de May de 2009, 18:35
É só os módulos e os arduinos ou outro tipo de micros.

Quando meter mãos à obra, depois posto como fazer ;)

Deu-me vontade rir essa confiança toda como se quando fores por mãos à obrar isso fosse logo funcionar :P :D

amando96

era para caso de ser necessário mais alguma coisa comprar logo com o arduino para não pagar portes duas vezes...  ::)

TigPT

Quote from: metRo_ on 30 de May de 2009, 21:04
Quote from: TigPT on 30 de May de 2009, 18:35
É só os módulos e os arduinos ou outro tipo de micros.

Quando meter mãos à obra, depois posto como fazer ;)

Deu-me vontade rir essa confiança toda como se quando fores por mãos à obrar isso fosse logo funcionar :P :D
Mas duvidas? (eu também, mas a confiança é meio caminho para o sucesso! :P)


Tyran

Ainda nem olhei para os meus lol, não tenho tempo mesmo... se não tiver nenhum projecto para a universidade nem recursos ou melhorias em julho começo a dar nisto  :)

cumpzz

metRo_

pois, estás como eu, agora só para Julho por causa da faculdade.

Fifas

eu ainda não peguei nos meus pq nao tenho microcontrolador para comunicar com o arduino :P

estou a fazer um programador para pic16f84 para ver se os meto a comunicar....mas penso que esta pic nao tem SPI :P

amando96

só uma pergunta, há menira barata de tipo fazer um boost ao sinal destes gajos? tipo para terem alcance de 3000 metros ?  :-\

se não der não há problema... não faço este projecto...

TigPT

Hoje agarrei nisto e tive a ler os datasheets, uns sites, fazer ligações e um bocado de código e já funcionam.

Ainda tenho alguns problemas de ruído mas já consigo mandar dados e receber respostas.

A ver se faço uns esquemas das ligações e o software para partilhar convosco.

Para já fica uma foto para lhe irem ganhado o gosto ;)



Foto do esquema, o modulo é ligado onde estão os pins, com a parte da antena virada para o topo da breadboard.


Na imagem, vermelho é 5V, azul é GND.

// Configure some values in EEPROM for easy config of the RF12 later on.
// 2009-05-06 <jcw@equi4.com> http://opensource.org/licenses/mit-license.php
// $Id: $

#include "RF12.h"
#include <util/crc16.h>
#include <avr/eeprom.h>

typedef struct {
   uint8_t nodeId;
   uint8_t group;
   char msg[RF12_EEPROM_SIZE-4];
   uint16_t crc;
} RF12Config;

static RF12Config config;

char cmd;
uint8_t value, arg;
uint8_t testbuf[RF12_MAXDATA];

static void addCh(char* msg, char c) {
   uint8_t n = strlen(msg);
   msg[n] = c;
}

static void addInt(char* msg, uint16_t v) {
   if (v > 10)
       addInt(msg, v / 10);
   addCh(msg, '0' + v % 10);
}

static void saveConfig() {
   // set up a nice config string to be shown on startup
   memset(config.msg, 0, sizeof config.msg);
   strcpy(config.msg, " ");
   
   uint8_t id = config.nodeId & 0x1F;
   addCh(config.msg, '@' + id);
   strcat(config.msg, " i");
   addInt(config.msg, id);
   if (config.nodeId & 0x20)
       addCh(config.msg, '*');
   
   strcat(config.msg, " g");
   addInt(config.msg, config.group);
   
   strcat(config.msg, " @ ");
   static uint16_t bands[4] = { 315, 433, 868, 915 };
   uint16_t band = config.nodeId >> 6;
   addInt(config.msg, bands[band]);
   strcat(config.msg, " MHz ");
   
   config.crc = ~0;
   for (uint8_t i = 0; i < sizeof config - 2; ++i)
       config.crc = _crc16_update(config.crc, ((uint8_t*) &config)[i]);

   // save to EEPROM
   for (uint8_t i = 0; i < sizeof config; ++i) {
       uint8_t b = ((uint8_t*) &config)[i];
       eeprom_write_byte(RF12_EEPROM_ADDR + i, b);
   }
   
   if (!rf12_config())
       Serial.println("config save failed");
}

static void showHelp() {
   Serial.println();
   Serial.println("Available commands:");
   Serial.println("  <nn> i    - set node ID (standard node ids are 1..26)");
   Serial.println("              (or enter an upper case 'A'..'Z' to set id)");
   Serial.println("  <n> b     - set MHz band (4 = 433, 8 = 868, 9 = 915)");
   Serial.println("  <nnn> g   - set network group (RFM12 only supports 212)");
   Serial.println("  <n> c     - set collect mode (advanced use, normally 0)");
   Serial.println("  <n> a     - send test packet of 5 x <n> bytes, with ack");
   Serial.println("  <n> s     - send test packet of 5 x <n> bytes, no ack");
   Serial.println("Current configuration:");
   rf12_config();
}

void setup() {
   Serial.begin(57600);
   Serial.print("\n[RF12DEMO]");

   if (rf12_config()) {
       config.nodeId = eeprom_read_byte(RF12_EEPROM_ADDR);
       config.group = eeprom_read_byte(RF12_EEPROM_ADDR + 1);
   } else {
       config.nodeId = 0x41; // node A1 @ 433 MHz
       config.group = 0xD4;
       saveConfig();
   }
   
   for (uint8_t i = 0; i < sizeof testbuf; ++i)
       testbuf[i] = i;
       
   showHelp();
}

void loop() {
   if (Serial.available()) {
       char c = Serial.read();
       if ('0' <= c && c <= '9')
           value = 10 * value + c - '0';
       else if ('a' <= c && c <='z') {
           Serial.print("> ");
           Serial.print((int) value);
           Serial.println(c);
           switch (c) {
               default:
                   showHelp();
                   break;
               case 'i': // set node id
                   config.nodeId = (config.nodeId & 0xE0) + (value & 0x1F);
                   saveConfig();
                   break;
               case 'b': // set band: 4 = 433, 8 = 868, 9 = 915
                   value = value == 8 ? RF12_868MHZ :
                           value == 9 ? RF12_915MHZ : RF12_433MHZ;
                   config.nodeId = (value << 6) + (config.nodeId & 0x3F);
                   saveConfig();
                   break;
               case 'g': // set network group
                   config.group = value;
                   saveConfig();
                   break;
               case 'c': // set collect mode (off = 0, on = 1)
                   if (value)
                       config.nodeId |= 0x20;
                   else
                       config.nodeId &= ~0x20;
                   saveConfig();
                   break;
               case 'a': // send test packet of 5 x N bytes, request an ack
               case 's': // send test packet of 5 x N bytes, no ack
                   cmd = c;
                   arg = value < 9 ? 5 * value : sizeof testbuf;
                   break;
           }
           value = 0;
       } else if ('A' <= c && c <= 'Z') {
           config.nodeId = (config.nodeId & 0xE0) + (c & 0x1F);
           saveConfig();
       } else if (c > ' ')
           showHelp();
   }

   if (rf12_recvDone()) {
       Serial.print(rf12_crc == 0 ? "OK" : " ?");
       for (uint8_t i = 0; i < rf12_len + 2 && i < 20; ++i) {
           Serial.print(' ');
           Serial.print((int) rf12_buf[i]);
       }
       Serial.println();
       
       if (rf12_crc == 0 && (rf12_hdr & ~RF12_HDR_MASK) == RF12_HDR_ACK) {
           Serial.println(" -> ack");
           uint8_t addr = rf12_hdr & RF12_HDR_MASK;
           rf12_sendStart(RF12_HDR_CTL | RF12_HDR_DST | addr, 0, 0);
       }
   }

   if (cmd && rf12_canSend()) {
       Serial.print(" -> ");
       Serial.print((int) arg);
       Serial.println(" b");
       rf12_sendStart(cmd == 'a' ? RF12_HDR_ACK : 0, testbuf, arg);
       cmd = 0;
   }
}


Depois de fazer upload deste código, fazer ligação por serial e enviar o comando "<1>i" para o arduino por serial, seguido do comando "<8>b" para que este fique configurado como defice 1 na frequência de 868Mhz

De seguida fazer upload para o segundo arduino do mesmo código e configurar com "<2>i" e "<8>b" para ficar como device 2 e a mesma frequência.

Depois disto, e de tudo ligado, basta enviar o comando de teste "<2>a" ao que o outro dispositivo de ve de responder com "10"

Se isto acontecer é porque tem tudo bem ligado e os módulos a funcionar.

Depois disto vamos fazer um código nosso para podermos enviar e receber dados à vontade, mas já dá para ver se está tudo ok.

Ahh em anexo está a biblioteca.

metRo_

GRANDE TigPT
Pelo que vi estava a fazer uma ligação diferente da tua, vou testar logo :) aiiii

ricardo-reis


metRo_


metRo_

Tive a fazer um teste de distancia e embora não saiba distancias certas, aqui dentro do apartamento apanhou sempre :)
O apartamento tem cerca de 12 metros entre os pontos mais distantes o que já é bom e fui para as divisões e deu sempre. Depois abrir a porta e fui pelo corredor com uns 35 metros e deu sempre. Depois subi para o andar de cima e deixou de dar, uma placa de um prédio não é pequena lol, no entanto quando me aproximei do apartamento por cima do apart onde vivo voltou embora com alguns erros a conseguir fazer algumas comunicações.

GOSTEI :D

Rebel

Tenho lá os 2 módulos e os dois Arduinos mas ainda não fiz nenhum teste porque não arranjo fichas para os módulos e não queria estar a soldar.

Njay

Porreiraço Tiago :)! Eu ainda ando a escrever o código (às "mejinhas").