collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[Hoje às 15:31]


Arame de Estendal por almamater
[Ontem às 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


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


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]

Autor Tópico: [Desenvolvimento] Módulos RFM12-868D (Emissor e Receptor a 866MHz) da HOPERF  (Lida 69869 vezes)

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

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
É 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

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
era para caso de ser necessário mais alguma coisa comprar logo com o arduino para não pagar portes duas vezes...  ::)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
É 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)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Novidades?

Offline Tyran

  • Mini Robot
  • *
  • Mensagens: 293
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

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
pois, estás como eu, agora só para Julho por causa da faculdade.

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.064
  • El RoboSapiens
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

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
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...

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
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.

Código: [Seleccione]
// 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.
« Última modificação: 07 de Junho de 2009, 17:53 por TigPT »

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
GRANDE TigPT
Pelo que vi estava a fazer uma ligação diferente da tua, vou testar logo :) aiiii

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
boa.. :) quem me dera poder brincar com isso já.. :)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
também já consegui :) Finalmente :)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
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

Offline Rebel

  • Mini Robot
  • *
  • Mensagens: 153
    • Raspberry Pi
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.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Porreiraço Tiago :)! Eu ainda ando a escrever o código (às "mejinhas").