• 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_

Eu neste momento não tenho o meu, mas era muito baseado na biblioteca do gajo pois nunca consegui colocar a comunicar um dispositivo SPI com código feito por mim e depois acabo por ir buscar as bibliotecas. Esse código que tens é em C, certo?

Tenho que ver se encontro isso para dares uma vista de olhos. Mas tenho que tentar o teu aumentando a velocidade se funciona aqui. Isso visto estar em C deve funcionar sem grandes alterações no Arduino e sempre dá para aprender.

Tyran

Por spi tens duas maneiras de comunicar, ou implementas tu próprio spi em "quaisquer" pinos através de software sendo que tens de controlar manualmente tudo ou usas spi por hardware que é só usares os registos já para o efeito que fazem tudo por ti, basicamente só tens de programar o modo e ao carregar o registo de dados ele manda tudo automaticamente.

EDIT: ora que coisa, o meu attiny agora só funciona ligar directamente o pino de reset a 5v, se meter 5v->R->pino, o pino fica a 0,3v :S

metRo_

Essa R é de que valor? é mais por curiosidade que por efeitos práticos :p Pois o mais certo é ser uma resistencia de valores normais à volta dos k.

Isso é muito estranho, de certeza que o pino não está a curto-circuitar com nada?

Tyran

é de 10k.

Não está, so tenho aquilo no reset, é estranho porque foi de repente... deixou de dar o micro! andei a verificar e reparei que o reset que tá marado  :-\


Tyran



Tyran

Hmm, será algum fio pelo meio da breadboard a fazer a algum shunt? Vou ver...  :o

metRo_

É o que me parece a mim :S

Já vi o código mt mt por alto. Vou assim que tiver um tempo analisar com muita calma e obrigado por disponiblizares.

Tyran

De nada, é verdade tmb meti nem disse nada, o tiny emite, o mega8 recebe. Como demorei muito tempo para meter a dar nem sei se vou ter tempo agora para meter os dois a fazer ambas as coisas  :(

Ora não me parece haver contacto algum por baixo da bread...

Tyran

é mesmo do tiny... meti outro, um tiny461 no mesmo sitio de encaixe e tá ok... poderá ter sido eu sem querer desabilitar do pino a função reset? se assim for, talvez só com high voltage parallel programming acho ou qualquer coisa assim... mas isso já só com uma dragon ou assim é que consigo fazer  :-\
vou ter de ir aos labs pedir para usar uma...

cumpzz

Njay

Quote from: Tyran on 24 de September de 2009, 21:19poderá ter sido eu sem querer desabilitar do pino a função reset?

Sim, isso pode acontecer, às vezes até se ocorrer um erro na programação (devido por exemplo a um cabo que se solta ou um mau contacto num pino enquanto ele está a ser programado).

amando96

Quote from: TigPT on 07 de June de 2009, 17:16
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 ;)

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

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

o meu responde 10 b, é isso que devo receber?? obg :)

Tyran

Bem andei a enviar umas coisitas por RF com o arduino com o código do jeelabs e deparo-me com a minha falha em configurar o arduino 0017 ou então o terminal de comunicações dele está básico demais que resulta em não conseguir converter para hexa por exemplo o que lá vejo e como não ser ler "Tiago" em decimal  ;D

Fica em anexo uma programa que fiz para ver, sei que existe aos pontapés mas assim tmb treinei o dedo  :)

Nota: Quem confiar tem o exe quem não confiar (e fazem muito bem!  ;D) tem o código também  :D

ricardo-reis

venho pedir uma dica sobre um erro que me está a dar ao compilar o programa rf12demo, na versão 21 do ide do arduino.


C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:5:19: error: Ports.h: No such file or directory
In file included from C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:7:
C:\Program Files\arduino-0021\libraries\RF12/RF12sio.h:8: error: 'MilliTimer' does not name a type
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp: In member function 'void RF12::send(uint8_t)':
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:100: error: 'sendTimer' was not declared in this scope
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp: In member function 'uint8_t RF12::poll()':
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:136: error: 'ackTimer' was not declared in this scope
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:153: error: 'ackTimer' was not declared in this scope
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:153: error: 'sendTimer' was not declared in this scope
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:155: error: 'sendTimer' was not declared in this scope
C:\Program Files\arduino-0021\libraries\RF12\RF12sio.cpp:172: error: 'ackTimer' was not declared in this scope

este aqui acima é o output do erro que dá ao tentar compilar, alguma sugestão acerca de como contornar isto?

a biblioteca foi copiada pra dentro da pasta libraries do ide. dentro da pasta da biblioteca rf12 estão os ficheiros: (como era suposto)
RF12.cpp
RF12.h
RF12sio.cpp
RF12sio.h