-
Módulos RFM12-868D (Emissor e Receptor a 866MHz) da HOPERF
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.hoperf.com%2Fproimg%2F200672745448.jpg&hash=f00e220a3ae7302e403569e573dfeb475be140b8)
O TigPT conseguiu comunicar com os módulos, podem ver a informação aqui (http://lusorobotica.com/index.php/topic,885.msg8817.html#msg8817)
Biblioteca RFM12 (http://jeefiles.equi4.com/RF12.zip)
Características do Produto
Página do Produto (http://www.hoperf.com/pro/rfm12.html)
Datasheet (http://www.hoperf.com/pdf/RFM12.pdf)
RFM12 programming guide (http://www.hoperf.com/pdf/RF12_code.pdf) - Há um utilizador no fórum que já se disponibilizou para fazer um tutorial e que tem experiência com este módulo.
RF12 datasheet (http://www.hoperf.com/pdf/RF12.pdf)
Features:
* Distance > 100m
* low costing, high performance and price ratio
* tuning free during production
* PLL and zero IF technology
* fast PLL lock time
* high resolution PLL with 2.5KHz step
* high data rate (up to 115.2 kbps with internal demodulator)
* differential antenna input
* automatic antenna tuning
* Programmable TX frequency deviation (15 to 240 KHz)
* programmable receiver bandwidth (67 - 400 kHz)
* analog and digital signal strength indicater(ARSSI/DRSSI)
* AFC
* DQD
* Internal data filtering and clock recovery
* RX synchron pattern recognition
* SPI interface
* clock and reset signal output for external MCU use
* 16 bit RX Data FIFO
* Two 8 bit TX data registers
* 10MHz crystal for PLL timing
* wakeup timer
* 2.2V - 5.4V power supply
* low power consumption
* stand by current less than 0.3µA
Links com Informação Adicional, projectos externos, etc
http://electronics-diy.com/electronic_schematic.php?id=725 (http://electronics-diy.com/electronic_schematic.php?id=725)
Arduino + RFM12 (1) (http://jeelab.equi4.com/2008/12/11/good-rf-with-rfm12b/)
Arduino + RFM12 (2) (http://jeelab.equi4.com/2009/02/10/rfm12b-library-for-arduino/)
http://blog.everythingrobotics.com/2008/01/08/rfm12-tutorial-part1/ (http://blog.everythingrobotics.com/2008/01/08/rfm12-tutorial-part1/)
Artigo da Elektor sobre RFM12 em português! (http://www.lusorobotica.com/ficheiros/RFM12_Elektor.pdf)
PCB's
Placa PCB por HyugaTS (http://lusorobotica.com/index.php?action=dlattach;topic=885.0;attach=170) - Post (http://lusorobotica.com/index.php/topic,885.msg7916.html#msg7916)
Eu criei este tópico na parte de Projecto colectivos para que toda a gente possa participar no desenvolvimento de ferramentas para se usarem estes módulos por isso todas as informações úteis que tenham serão bem-vindas como links para projectos com estes módulos, os vossos testes, resultados, etc.
EDIT: mudei o link para a biblioteca, que o antigo já não dava nada. (ricardo-reis)
-
Aqui estão algumas fotos embora isto ainda não tenha dado nada :S e não liguem à qualidade das fotos.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_i2teYMYP9C0%2FSg3v6p6v1kI%2FAAAAAAAAAeU%2FJF9v_GJsAn0%2Fs144%2Fimg_0424.jpg&hash=bc17218a377ede9e2ba7ae03cfa41bf9685c5387) (http://picasaweb.google.com/josescxavier/Rfm12#5336184924467615298)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh4.ggpht.com%2F_i2teYMYP9C0%2FSg3v_FKa5wI%2FAAAAAAAAAeY%2FEvmOaXJ0Xro%2Fs144%2Fimg_0426.jpg&hash=a22ac663712fb9a48e91973cecc7c75f3ec1c11f) (http://picasaweb.google.com/josescxavier/Rfm12#5336185000500586242)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_i2teYMYP9C0%2FSg3wE8xuqYI%2FAAAAAAAAAec%2FVMljFD6zXyo%2Fs144%2Fimg_0428.jpg&hash=f9cbd45f25fd101832903502d9fd0828404b5fe5) (http://picasaweb.google.com/josescxavier/Rfm12#5336185101328755074)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh5.ggpht.com%2F_i2teYMYP9C0%2FSg3wJkvVqlI%2FAAAAAAAAAeg%2FDCwfsr-yfw4%2Fs144%2Fimg_0429.jpg&hash=58c269d213198131b671d4279475e08254736128) (http://picasaweb.google.com/josescxavier/Rfm12#5336185180775623250)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh6.ggpht.com%2F_i2teYMYP9C0%2FSg3wOtimWmI%2FAAAAAAAAAek%2FQWvnpaTXpzg%2Fs144%2Fimg_0430.jpg&hash=1ba95f09d29a8b49f663f951495c9614d5a16c3b) (http://picasaweb.google.com/josescxavier/Rfm12#5336185269037455970)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_i2teYMYP9C0%2FSg3wT40iRQI%2FAAAAAAAAAeo%2FWK-s8_PKmlA%2Fs144%2Fimg_0431.jpg&hash=871729fdf1a2263340e51ff5e7bf189c7294c83d) (http://picasaweb.google.com/josescxavier/Rfm12#5336185357964821762)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh4.ggpht.com%2F_i2teYMYP9C0%2FSg3wY1FHBhI%2FAAAAAAAAAes%2FnnfHVF3u1-w%2Fs144%2Fimg_0433.jpg&hash=eaa2f1940bb4c6c880bd239ac2d51cd173290b11) (http://picasaweb.google.com/josescxavier/Rfm12#5336185442859943442)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh4.ggpht.com%2F_i2teYMYP9C0%2FSg3wdwFv-JI%2FAAAAAAAAAew%2FdqzApMJYFsI%2Fs144%2Fimg_0434.jpg&hash=7fd1298d1b4299b4c4d8683509755d592e4421fb) (http://picasaweb.google.com/josescxavier/Rfm12#5336185527419795602)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh5.ggpht.com%2F_i2teYMYP9C0%2FSg3wibBOy5I%2FAAAAAAAAAe0%2FRoYsml4CA-c%2Fs144%2Fimg_0435.jpg&hash=5716f0ebf1d2d7bb6d724cb2250e61ab67904269) (http://picasaweb.google.com/josescxavier/Rfm12#5336185607663045522)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh6.ggpht.com%2F_i2teYMYP9C0%2FSg3wnatfPRI%2FAAAAAAAAAe4%2Fs0Vmy7bfXA8%2Fs144%2Fimg_0437.jpg&hash=ccbe91dfa7da494f6862f8f1ea186c2fb0a34930) (http://picasaweb.google.com/josescxavier/Rfm12#5336185693479582994)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_i2teYMYP9C0%2FSg3wptU_0FI%2FAAAAAAAAAfA%2F-X_BWX9_43M%2Fs144%2F1.jpg&hash=2e3ecfafc6c34809cbbd88df30eee063d9558770) (http://picasaweb.google.com/josescxavier/Rfm12#5336185732836872274)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_i2teYMYP9C0%2FSg3wsP6lWwI%2FAAAAAAAAAfE%2FbWwMrKAso1k%2Fs144%2F2.jpg&hash=70c73683c3626775cf19a8291c2c49b31401c60a) (http://picasaweb.google.com/josescxavier/Rfm12#5336185776481065730)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh5.ggpht.com%2F_i2teYMYP9C0%2FSg3wuvkJsHI%2FAAAAAAAAAfI%2FVutBvFR5y1k%2Fs144%2F3.jpg&hash=fc6fff70b3c29de90e9d1a318e3d630f8fd667b7) (http://picasaweb.google.com/josescxavier/Rfm12#5336185819336650866)
-
metRo_ tenho uma duvida.....qual dos buracos é a antena? ;D é que no datasheet so vejo 1 :P
-
Isso tem dois buracos, um gnd e outro antena, vou tirar uma foto e ja posto mas é facil de ver. Pois o que esta a gnd ve-se bem qual é.
-
Comecei a ler o guia de programação para comunicar com os módulos e tenho algumas duvidas.
#define DDR_IN 0
#define DDR_OUT 1
#define PORT_SEL PORTB
#define PIN_SEL PINB
#define DDR_SEL DDRB
#define PORT_SDI PORTB
#define PIN_SDI PINB
#define DDR_SDI DDRB
#define PORT_SCK PORTB
#define PIN_SCK PINB
#define DDR_SCK DDRB
#define PORT_SDO PORTB
#define PIN_SDO PINB
#define DDR_SDO DDRD
#define PORT_DATA PORTD
#define PIN_DATA PIND
#define DDR_DATA DDRD
#define PB7 7//--\
#define PB6 6// |
#define RFXX_SCK 5// |
#define RFXX_SDO 4// |RF
#define RFXX_SDI 3// |
#define RFXX_SEL 2// |
#define NC 1// |
#define PBO 0//--/
#define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
#define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
#define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)
#define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
#define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
#define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)
#define SDO_INPUT() DDR_SDO&=~(1<<RFXX_SDO)
#define SDO_HI() PIN_SDO&(1<<RFXX_SDO)
#define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK)
#define HI_SCK() PORT_SCK|= (1<<RFXX_SCK)
#define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK)
#define RF12_DATA 4//PD4
#define DATA_OUT DDR_DATA|=1<<RF12_DATA
#define HI_DATA PORT_DATA|=1<<FR12_DATA
#define LEDG_OUTPUT() DDRD|=~(1<<6)
#define LEDR_OUTPUT() DDRD|=~(1<<7)
#define LEDG_ON() PORTD&=~(1<<6)
#define LEDG_OFF() PORTD|=~(1<<6)
#define LEDR_ON() PORTD&=~(1<<7)
#define LEDR_OFF() PORTD|=~(1<<7)
Suponho que tenha a ver com configuraçõs do SPI mas para que é que ele faz varias vezes PORT_SEL, PORT SDO, PORT_SDI e lhes atribui PORTb?
Ou por exemplo isto: #define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
#define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
#define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)
#define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
#define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
#define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)
o que faz?
-
Uma vez que o RFM12 não é breadboard Friendly decidi fazer uma PCB para poder adaptar na breadboard. E como não encontrei sitio melhor decidi "pedir" emprestado o tópico do metRo_ ;)
os ficheiros feitos em Eagle (http://www.cadsoft.de/) estão em anexo.
Pus também algumas imagens. Não liguem ao estado da solda. Sou mau em trabalhos manuais :P
Enjoy ;D
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi133.photobucket.com%2Falbums%2Fq70%2FHyugaTS%2FSNC00027.jpg&hash=c1c557e25441b8805d87283f19ca501155be51c9)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi133.photobucket.com%2Falbums%2Fq70%2FHyugaTS%2FSNC00028.jpg&hash=df2c6f0f3ccd5dd4aa515492e84e184b05d69006)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi133.photobucket.com%2Falbums%2Fq70%2FHyugaTS%2FSNC00029.jpg&hash=1d9a324ac1c84dc4fdb6ea5fbf50fb39fbe48cb0)
-
Muito bom, obrigado por partilhares HyugaTS.
-
Adicionado ao primeiro post e parece que os conectores smd já deram jeito a alguém :)
-
metRo_ mi duvida...mi duvida ;D
nesta foto ve-se a antena no buraco de dentro
http://blog.everythingrobotics.com/wp-content/uploads/2008/06/2146382426_ce95ba0034_o.jpg (http://blog.everythingrobotics.com/wp-content/uploads/2008/06/2146382426_ce95ba0034_o.jpg)
no teu tens na de fora
aqui so tem 1 buraco
http://blog.everythingrobotics.com/wp-content/uploads/2008/06/image001.jpg (http://blog.everythingrobotics.com/wp-content/uploads/2008/06/image001.jpg)
tirem a minha duvida pf :P
-
Eu diria que era na de dentro pois a de fora é massa.
Se calhar é por isso que o metRo_ não os consegue meter a falar :P
Quando testar os meus posto ;)
-
Na altura em que tirei as fotos ainda nao tinha soldado as antenas, confirma-se que é na de dentro pois a de fora é massa, foi assim que soldei!
-
Comecei a ler o guia de programação para comunicar com os módulos e tenho algumas duvidas.
#define DDR_IN 0
#define DDR_OUT 1
#define PORT_SEL PORTB
#define PIN_SEL PINB
#define DDR_SEL DDRB
(...)
Suponho que tenha a ver com configuraçõs do SPI mas para que é que ele faz varias vezes PORT_SEL, PORT SDO, PORT_SDI e lhes atribui PORTb?
É como estares a dizer que o pino SEL está no porto X, o pino SDO está no porto Y, etc. Por acaso, neste caso, todos estes pinos são no mesmo porto (PORTB), mas podia não ser. Desta forma, usando as constantes, podes facilmente mudar a localização de um pino, alterando apenas a respectiva constante e deixando o resto do código inalterado.
Ou por exemplo isto: #define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
#define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
#define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)
#define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
#define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
#define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)
o que faz?
Constantes como por exemplo RFXX_SEL têm o nº (ou indice) do bit. Quando fazes 1 << RFXX_SEL estás a criar uma "máscara" (um valor) em que apenas o bit índice RFXX_SEL activo (= 1). Por exemplo, se RFXX_SEL for 2 (que por acaso ;) até é), 1 << RFXX_SEL = 1 << 2 = 100b (em binário) = 4 (decimal).
As macros que têm o pipe | (ou-lógico bit-a-bit) estão a colocar no registo respectivo um bit a 1, as que usam o & (e-lógico bit-a-bit) estão a zerar um bit.
Examplos:
#define DDR_SEL DDRB // o registo DDRB define se cada bit do porto B é um input ou output
#define RFXX_SEL 2
#define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
SEL_OUTPUT() -> coloca a 1 o bit índice 2 do registo DDRB
Como? Vamos ver os passos que dá o compilador na interpretação do código:
SEL_OUTPUT()
DDR_SEL |= (1 << RFXX_SEL)
DDRB = DDRB | (1 << RFXX_SEL)
DDRB = DDRB | (1 << 2)
DDRB = DDRB | 4
DDRB = DDRB | 100b (note-se o "b" que indica que o nº esta no formato binário)
Portanto, fazendo um OR (OU) do registo DDRB com o valor 100b (binário) resulta sempre num valor em que o bit 2 fica a 1 e os restantes ficam inalterados.
No caso das macros com o & (AND, ou em pt, E), o que se faz é um AND com a máscara invertida. Isto resulta sempre em zerar o bit porque a máscara invertida é um valor em que todos os bits são 1 excepto o nosso bit de interesse (como o RFXX_SEL). Fazendo um AND com outro valor (neste caso, o valor do registo), resulta em que o nosso bit fica a zero e todos os outros ficam inalterados.
Tenho a certeza que a net tá cheia de tutoriais sobre isto, façam uma pesquisazita.
-
Muito obrigado :)
-
metRo_, na mensagem original do tópico falta um link para um doc importante:
http://www.hoperf.com/pdf/RF12.pdf (http://www.hoperf.com/pdf/RF12.pdf)
O RFM12 é o nome do módulo, que é baseado num chip chamado RF12 que a HOPE fabrica. O link acima é a datasheet do chip. Estava agora a dar uma olhada nos docs para começar a "atacar" este módulo e estava a ver que faltava alguma informação nos docs que aí tens (como por exemplo os timmings da interface SPI).
-
Obrigado Njay, já adicionei ;)
-
metRo_, pelos printscreen parece que tens a configuração a 433MHz, mas os nossos módulos são de 868MHz...
-
Vou deixar aqui o código que tentei utilizar, não liguem aos comentários. Depois de tudo o que andei a ver e a investigar parece ser um código básico e que deveria funcionar, pode servir para alguem tirar ideias.
Está em anexo.
-
No TX tenta
rf12_xfer(0x8239) em vez de rf12_xfer(0x8209)
E no RX tenta:
rf12_xfer(0x82D9) em vez de rf12_xfer(0x8209)
-
No TX tenta
rf12_xfer(0x8239) em vez de rf12_xfer(0x8209)
E no RX tenta:
rf12_xfer(0x82D9) em vez de rf12_xfer(0x8209)
Se reparares eu tenho esses comandos quando inicializo a transferencia ou a recepção.
-
Há uns dias atrás mandei um email para a hoperf para tirar algumas duvidas sobre o guia de programação, as minhas perguntas encontram-se no pdf que está em anexo e as respostas foram as seguintes:
Question 1) Page: 3;
Yes,
Question 2) Page: 4;
typo of the document,
s = 0 for digital filter,
s = 1 for analog RC filter,
Question 3) Page: 4;
choose f = 8.
Question 4) Page: 5;
choose rl1 = rl0 = 1;
Question 5) Page: 5;
mp
Question 6) Page: 5;
please select the deviation according to the data rate and bandwidth.
Question 7) Page: 6;
Yes
Question 8) Page: 6;
That bit is in the power management command,
Yes, you can use the default value.
Question 9) Page: 6;
Zero.
Question 10) Page: 8;
to control that bit in power management command,
Pode dar jeito alguém.
-
Vou deixar aqui o código que tentei utilizar, não liguem aos comentários. Depois de tudo o que andei a ver e a investigar parece ser um código básico e que deveria funcionar, pode servir para alguem tirar ideias.
Está em anexo.
eu não o consigo abrir...?
alguem poderia fazer copy paste, e colar no topico, ou enviar-me uma PM por favor?
-
http://paginas.fe.up.pt/~ee06091/RF12_code.rar (http://paginas.fe.up.pt/~ee06091/RF12_code.rar)
-
http://paginas.fe.up.pt/~ee06091/RF12_code.rar (http://paginas.fe.up.pt/~ee06091/RF12_code.rar)
que programa abre ficheiros .rar?
-
winrar? ;D
-
ou uma soluçao gratuita: 7-zip ;)
-
não se pode dizer que a versão gratuita do winrar não chegue, pelo menos não tem o aviso do winzip lol
-
já tenho :)
e agora .pde???
:-X :-[ :-X :-[ :-X :-[
desculpem lá estive fora uns tempos ando maluco...
-
.pde são os ficheiros do arduino, mas podes abrir também com notepad ;)
-
.pde são os ficheiros do arduino, mas podes abrir também com notepad ;)
opbrigado :) tentei com o IDE do arduino mas não deu ??? mas com o notepad deu :)
bem só preciso doutro arduino pa por mão á obra ;D
então e é necessário mais alguma coisa para por os modulos interfacing com o arduino? ou mesmo só
arduino> modulo > modulo >arduino?
-
É só os módulos e os arduinos ou outro tipo de micros.
Quando meter mãos à obra, depois posto como fazer ;)
-
É 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
-
era para caso de ser necessário mais alguma coisa comprar logo com o arduino para não pagar portes duas vezes... ::)
-
É 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)
-
Novidades?
-
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
-
pois, estás como eu, agora só para Julho por causa da faculdade.
-
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
-
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...
-
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 ;)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_Lt0JkvwRIwE%2FSivnqSgG16I%2FAAAAAAAAAeM%2FM5zYobHj6Yk%2Fs640%2FDSC00854.JPG&hash=08bff8fa4cce6f5a73795e7a14fcbf8bad96de7f) (http://picasaweb.google.pt/lh/photo/1oZfXTSVHcc9-5eItyfiug?feat=directlink)
Foto do esquema, o modulo é ligado onde estão os pins, com a parte da antena virada para o topo da breadboard.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh4.ggpht.com%2F_Lt0JkvwRIwE%2FSivsBqcSt4I%2FAAAAAAAAAeU%2FQBT_XL-GEM4%2Fs800%2Frfm12.png&hash=2d0f5f94b0adf1d8f960877269c9dfd1f82f8d07)
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.
-
GRANDE TigPT
Pelo que vi estava a fazer uma ligação diferente da tua, vou testar logo :) aiiii
-
boa.. :) quem me dera poder brincar com isso já.. :)
-
também já consegui :) Finalmente :)
-
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
-
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.
-
Porreiraço Tiago :)! Eu ainda ando a escrever o código (às "mejinhas").
-
Quem quizer adquirir este módulos onde se compram ?
-
http://www.digicontrole.com/ (http://www.digicontrole.com/)
-
Mais ninguem tem desenvolvimentos dos módulos?
-
Mais ninguem tem desenvolvimentos dos módulos?
Época de exames... não deves de ver novidades nos próximos dias. :(
-
se eu já tivesse o outro arduino já estava ;D não tenho exames...
é posivel comunicar com o arduino atraves de circuitos logicos num dos modulos, e o arduino no outro? é que assim não tinha de gastar mas 30 €... :P
-
não, pois os dados são enviados através de comunicação SPI.
Eu digo não a menos que consigas criar um circuito logico para fazer comunicação SPI.
-
Tive a fazer mais uns testes,
Desta vez em casa e não no apartamento.
Coloquei um modulo ao pe do pc onde tenho o router e assim e apanhei em todos os cantos da casa, quando fui para fora se andar à volta da casa apanho, quando me afasto cerca de 2/3 metros começa a ser deixar de apanhar bem, ainda não tinha testado aqui em casa mas fiquei contente pois serve para o que quero :)
Andei a ver melhor a biblioteca e tal e fazer mais uns testes e aquilo da para enviar bastantes dados, mando cerca de 200 caracteres instantâneos e se calhar até dá mais, embora a biblioteca só permita enviar 66bytes de cada vez.
Quando acabar os exames vou começar a fazer a fazer os projectos que tenho em mente usando os módulos RFM12 até lá vou parar :(
-
Ora vamos lá começar a estudar a coisa xD
-
Começa a aliviar os exames, começa o ataque.. estou a ver que estas férias vão ser mt activas :D
-
Modulo interessante para o meu robo
-
Estes ultimos dias tenho andado a brincar um bocadinho com os módulos. Tenho usado a biblioteca que se encontra na net do jeelab. Tenho ver como será a melhor maneira para transferir texto com cerca de 250 caracteres, tenho dividido enviado, do outro lado recebe e vai guardando num vector, etc...
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh4.ggpht.com%2F_i2teYMYP9C0%2FSlP-QeUviWI%2FAAAAAAAAAi0%2Fv7RbWc9nu4g%2Fs400%2FUntitled-122.jpg&hash=3d73dcba62d4a278c90383c7400c21e1791f0923) (http://picasaweb.google.com/josescxavier/Rfm12#5355903940845078882)
Têm notas a vermelho.
-
metRo_ , mete lá uma pic com mais qualidade.. n se vê nd..
-
metRo_ , mete lá uma pic com mais qualidade.. n se vê nd..
Clica nela, e depois no picasa clica na lupa no canto superior direito ;)
Muito bem metro... qualquer dia o teu robot já anda atrás de ti a ler-te os mails :D
-
ahh chegaram os megas com bootloader, montei o breduino, e tive a ver o código de teste dos módulos, e reparei que preciso de ligar dois arduinos ao PC, mas o breaduino não pode ser ligado... e agora? lol
-
fazes um programa para acender 1 led ao receber dados.....simples :)
-
ahh chegaram os megas com bootloader, montei o breduino, e tive a ver o código de teste dos módulos, e reparei que preciso de ligar dois arduinos ao PC, mas o breaduino não pode ser ligado... e agora? lol
No que está ligado ao pc para testar podes enviar "2a" por exemplo na consola do Arduino, se receberes OK quer dizer que o outro recebeu, mas se leres o readme da biblioteca explica melhor.
-
ahh, eu pensei que o outro recebia OK, obrigado por esclareceres :)
-
Mas le o readme porque agora não tenho a certeza se é o "a" ou o "s"
-
falta-me o readme, devo ter apago sem quere :S
então ponho o xmit, no que está ligado ao PC?
e o recv no ''breaduino'' que não está ligado ao PC?
-
coloca o RF12demo nos dois, depois ligas um e configuras-me como diz o readme, o readme está no site da biblioteca, ligas o outro configuras e tentas mandar.
-
http://code.google.com/p/jeelabs/source/browse/trunk/libraries/RF12/examples/RF12demo/README
-
Não está a ir muito bem :(
porque não percebi muito do site... outro dia repito, estou ligeiramente desatento hoje.
mais alguem conseguio comunicar?
poderia alguem dizer-me o que se envia a cada um dos módulos, por ordem. Por favor??
obrigado.
EDIT: sei porque não deu... configurei para comunicar a 433Mhz, não é possivel pois não?
depois pensei em muda-los de banda, consegui mudar um para os 866Mhz, mas o outro não me deixa mudar... porque?
-
A minha linha nIRQ não está a querer baixar no receptor lol O problema pode ser do emissor que não envia logo no receptor não baixa pois não tem nada para sinalizar... vou tentar outro aprouch amanhã que hoje já só vejo fios lol
-
pessoal afinal da para funcionar a 433mhz ou nao?se nao porque q tem essa opção?
-
O módulo pode funcionar nas três frequências, no entanto o circuito da antena foi concebido para funcionarem numa determinada frequência e no nosso caso é em 868, há países em que as antenas foram concebidas para outras frequências devido às leis locais.
-
O integrado que está no módulo permite trabalhar a 4 frequências diferentes. Contudo, a frequência usada depende dos valores de dois condensadores e duas bobines que estão no módulo. Resumindo.. nesse módulo só podem usar uma frequência, apesar de o integrado ser feito para suportar quatro frequências diferentes: 315, 433, 868 e 915 MHz
-
O módulo pode funcionar nas três frequências, no entanto o circuito da antena foi concebido para funcionarem numa determinada frequência e no nosso caso é em 868, há países em que as antenas foram concebidas para outras frequências devido às leis locais.
ok ja percebi, entao para trabalhar a 433 tinha que para alem de mudar a antena mudar os condensadores e bobines :-\
-
exactamente :) Já li em alguns blogs pessoal que usando outras frequências consegue mas isso da no máximo para meia dúzia de metros se muito
-
esta aqui uma tabela com as peças e frequancias quem quiser mudar..
-
Bem, tá mau isto lol
O receptor recebe sempre zeros lol
Mas é estranho que mesmo tirando o emissor da placa, desligando e voltando a ligar a energia ele tmb recebe, isto é, a linha de irq baixa na mesma :| e tenho os códigos de inicialização etc tal como vejo de projectos já feitos...
Será o módulo que tá marado?? :S
EDIT: que interessante lol, mesmo metendo o SS a alto a linha baixa na mesma lol, só se os valores por defeito estiverem ok, mas acho que por defeito nem tem transmissão nem recepção ligadas...
-
Tens a ligação tal e qual como esta http://lusorobotica.com/index.php/topic,885.msg8817.html#msg8817 ?
Estás a testar o RF12demo?
Tens ambos os módulos na frequência 868?
Leste o readme e fizeste o teste que está lá?
-
Sim tenho essa ligação e ainda meto o RES e o DATA a 1...
Pois quanto ao código não, não estou a usar arduinos...
Estou com um attiny26 e atmega8 para emissor e receptor, respectivamente... a maneira que tenho para debug como não tenho porta série a funcar é com led's e o atmega8 tmb vai mandando para um lcd o que recebe...
Sim tenho 868 ambos, já tentei várias configurações, do guia hoperf, de um zip que foi aqui postado e mesmo de outros sites...
-
Fiz um adaptador e depois um cabo para simplificar a ligação dos módulos ao RFM12. Como podem ver na primeira imagem aqueles 5pinos juntos encaixam no Arduino todos seguidos :D
Tem também um foto de uns testes de transferência de um texto de um lado para o outro.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh6.ggpht.com%2F_i2teYMYP9C0%2FSnRpm5G2YoI%2FAAAAAAAAArM%2FTJu-2bm5SLI%2Fs288%2Fimg_0268_info.jpg&hash=97a30bb1ee5b9a9cc675d2e46853e1cb7f54075c) (http://picasaweb.google.com/josescxavier/RFM12#5365029172990599810)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh6.ggpht.com%2F_i2teYMYP9C0%2FSnRpgH9VUTI%2FAAAAAAAAAq0%2F2Qm9XUU4GzQ%2Fs288%2Fimg_0267.jpg&hash=69ee6c75ff0d435c57cc368ab950384919765daa) (http://picasaweb.google.com/josescxavier/RFM12#5365029056718131506)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_i2teYMYP9C0%2FSnRph5RPFRI%2FAAAAAAAAAq4%2Fz2qf0MhsxTs%2Fs288%2Fimg_0268.jpg&hash=877b0ebecc55065f69ca706c60df9ba64b2a95f4) (http://picasaweb.google.com/josescxavier/RFM12#5365029087134815506)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh6.ggpht.com%2F_i2teYMYP9C0%2FSnRpjINZP7I%2FAAAAAAAAAq8%2FjL6tqwMkdYo%2Fs288%2Fimg_0269.jpg&hash=a44eee4c425afce59d9b7d57e2dd322ea0cbbc90) (http://picasaweb.google.com/josescxavier/RFM12#5365029108325105586)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F_i2teYMYP9C0%2FSnRpkAyqzLI%2FAAAAAAAAArA%2FXenR7RRTeXU%2Fs288%2Fimg_0271.jpg&hash=638d433474f3f05709c5e0a019b5f54816a5f974) (http://picasaweb.google.com/josescxavier/RFM12#5365029123513830578)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh4.ggpht.com%2F_i2teYMYP9C0%2FSnRplh_1W-I%2FAAAAAAAAArI%2FJ9B0kGdPRpw%2Fs288%2Fimg_0272.jpg&hash=fe5057e4b59e3e3253ba76a41b7af5151dbdf06b) (http://picasaweb.google.com/josescxavier/RFM12#5365029149607287778)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Flh5.ggpht.com%2F_i2teYMYP9C0%2FSnRoM_ZteiI%2FAAAAAAAAAqw%2FzxCHLINnHJo%2Fs288%2Frfm12info.jpg&hash=475f58e9a8db40027e7fbcd3040c0fb7d827c679) (http://picasaweb.google.com/josescxavier/RFM12#5365027628492093986)
-
Como vai em termos de software? Temos que começar a descascar isto à séria :D
-
Tá fixe ;D
Eu ainda não saio da cepa torta lol
Ontem consegui apanhar qualquer coisa, mas dava caracteres estranhos, mas tmb não enviava sempre, mas como eu tava a enviar número hexadecimais à sorte até pensei ser disso... então desfiz a breadboard toda e voltei a montar, desta vez com todo o cuidado... e agora a linha de nIRQ não volta a baixar de novo loool, mas verifico os contactos todos e tal e tá tudo como devia estar estar acho...
quando ganhar mais paciência vou rever de novo o código todo lol embora pense não ser disso, pelo menos a parte 'técnica' tenho a enviar os comandos igual ao guia de programação excepto na freq que meti a 868...
-
Tu estás-te a referir ao facto do pino 13 estar sempre ligado, ne?
Eu quando isso acontece desligo a fixa da USB(isto é o mesmo que desligar a alimentação) ligo e dá.
Se calhar algum daqueles pinos que não ligamos deviam estar ligados algures.
-
O módulo não tem só 12 pinos?
-
eu queria dizer o led do pino13 do Arduino estar ligado, não era por ai que vias que a nIRQ estava em baixo ou nao?
-
Ah!!! não, eu não tenho um arduino... vejo que essa linha não baixa pelos dados que vejo no lcd que servem de output da zona do programa onde estou...
mas o problema pode ser do emissor, se não enviar nada a linha de irq provavelmente não se encontra numa situação de descer a low...
mas tenho notado que por vezes o no módulo emissor a linha não baixa tal como dizes e tenho de desligar e volta a ligar... mas isso acontece logo ao ligar a energia e por acaso ultimamente não tem ocorrido....
EDIT: hmm estou a analisar o conteúdo do número de 16bits que recebemos ao enviar em comando 0x0 e estou a tirar conclusões... o sinal forte suficiente e fifo empy vem sempre ambos a 1 (estou a verificar isto mesmo antes de do wait_irq_low...) mas é estranho porque mesmo sem o outro modulo ligado ele detecta sempre sinal forte?? :S
e mais, aparentemente a linha irq acaba por baixar, é preciso é esperar um bocado bem bom lol só que ao mostrar isto como 0's e 1's depois nao consigo ver qual a letra recebida lool, vou ter de limpar o lcd antes, depois vê-se no que dá...
-
já dá lol :D :D
Já ao fazer o código emissor tinha a ideia da maneira usada pela application note da atmel para spi por usi era de duvidar.... e o problema era mesmo de lá lol
EDIT: mas.... só me recebe 2 bytes aquilo loool tipo envio 'T' ''i' 'a' 'g' 'o' e tou smp a receber 'T' 'i' 'T' 'i' lol mas já foi um começo receber algo :)
-
Tu estás a fazer o código de novo em vez de usares a biblioteca jee-lab, certo?
-
Sim, guiei-me pelo guia de programação, as diferenças notórias que tenho em relação a esse guia são o facto de usar o protocolo spi implementado por hardware spi no atmega e por usi no attiny e depois as funções de lidar com os dados fiz as minhas próprias tipo usar union's para poder aceder ao byte directamente para transparência e tal de resto a estrutura óssea está lá...
Mas penso que já topei o problema, ao mudar a velocidade que se define com o comando C6xx em vez de C606 ->57.6kb/s meti C647 -> 7.2kb/s e já recebo 'T''i''a''g', terá sido só coincidência?? Não alterei mais nada no código!! Vou fazer mais testes... E sim tenho definida a mesma velocidade em ambos os módulos...
EDIT: Usei agora C671 -> 4.8 Kb's e já recebi 'Tiago!', só ficou o checksum perdido pelo caminho hehe, mas tira-se o '!' e resulta xD vou ver se descubro porque acontece isto :S
-
Ora finalmente já dá!!!!!!
Agora que recebi o programador avrisp mkII, verifiquei mesmo que o attiny afinal estava bom de saude lol, o programador caseiro é que já falhava, então também meti o cristal (baixo, tou a usar de 4Mhz que era um valor pequeno para tentar a programação com o programador caseiro) no receptor e não é que deu logo looool
Afinal o código estava direito, tantas dores de cabeça ao matutar naquilo hehe
Cumprimentos
-
Isto quer dizer que tens o teu próprio código para fazer comunicar os módulos? Será que dava para utilizar em C? é que o outro esta muito martelado para o que o gajo quer fazer com eles e se calhar o teu está melhor para quem quer perceber o código e coisas mais simples como enviar e receber dados só.
PS: Parabéns ;) É que eu uma vez tentei fazer o meu código e nada :(
-
Obrigado :)
Deves estar a fazer alguma coisa mal, às vezes até pode ser na própria inicialização do módulo ou assim, se quiseres posso dar uma olhadela a ver se tá tipo o meu.
O meu está feio e sem comentários quase lol já tantas voltas lhe tinha dado à conta de não funcionar xD
Vou ver se sei colocar aqui um rar...
-
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.
-
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
-
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?
-
é 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 :-\
-
Troca de resistencia.
-
Já troquei :(
Parece que o pino está configurado para output :-\
-
estou :S
-
Hmm, será algum fio pelo meio da breadboard a fazer a algum shunt? Vou ver... :o
-
É 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.
-
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...
-
é 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
-
poderá 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).
-
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 :)
-
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
-
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
-
Diria que o primeiro erro que está a dar cabo de tudo é ele não encontrar o Ports.h , depois é uma cascata de tralha que acontece por causa de ele não encontrar esse mesmo .h
-
pois, por isso postei os ficheiros que tenho na biblioteca.. mas suponho que estejam todos (da biblioteca) já que fiz o download no site da jeelabs. o ports.h fará parte desta biblioteca ou é preciso mais alguma?
EDIT: faltava-me a biblioteca Ports.. obrigado kast, pelo envio.. ;)
-
Estando com 3 módulos na gaveta resolvi pegar neles já que os paguei.
Consegui esta semana pô-los a comunicar após alguma guerra entre linguagens, lá ficou em arduino por enquanto, depois mudo.
Segui os códigos desta página: https://github.com/LowPowerLab/RFM12B (https://github.com/LowPowerLab/RFM12B)
Quanto às ligações não houve problemas, o @TigPT tinha colocado aqui umas fotos mas desapareceram...
http://lusorobotica.com/index.php/topic,885.msg8817.html#msg8817 (http://lusorobotica.com/index.php/topic,885.msg8817.html#msg8817)
Então coloquei-os afastados 10metros com duas paredes a 115.2 kbps e CRC.
Não funcionou, depois aproximei um pouco só com uma parede e já deu bem.
A minha dúvida é que no manual diz poder ir até 200metros numa zona aberta, porque não aceita 10metros numa zona fechada, a potência de emissão é configurável ?!
ps: o módulo RFM12b trabalha com 3.3V mas pode ser alimentado a 5V sem o avariar (não vai funcionar), li isso na página oficial sobre versões.
-
Reduz o baud-rate, e tem atenção á configuração, que esses módulos têm muitas, muitas opções, e tens as antenas com o devido tamanho?
-
Boas.
Eu tenho um projecto que usa 20 modulos desses. Não percebendo nada sobre antenas, li um pouco sobre o assunto e vi que era normal usar um fio especifico como antena, e que o comprimendo do fio deveria ser proporcional ao comprimento de onda (já n me lembro da fórmula). Com o tamanho certo o alcance aumentou um bocado, mas daí aos 200m... Nem perto disso, consegui praí uns 50 max. reduzindo a data rate imagino que seja jácil aumentar a distancia, mas nunca sequer mexi nisso porque nunca precisei...
-
Sim, deve aumentar a distância baixando o baud-rate.
A antena está para 1/4 de onda (82.2mm), foram os fios que vieram juntamente.
As configurações até metem medo, então o que é preciso fazer antes de enviar ou receber...
@tarquinio, que linguagem usaste no teu projecto, tentei vários exemplos em bascom mas sem sucesso?
-
Como na maioria dos meus projectos, foi em C num arduino... Com a library dos Jeelabs.
-
Pessoal tenho um arduino Leonardo e não consigo de jeito nenhum fazer um código para ler um sinal rf434, alguém poderia me ajudar com um código que funcione no Arduino Leonardo com as bibliotecas e tudo mais??
Primeiramente queria tentar ler o sinal de um equipamento que envia sinais nesta frequencia, e depois queria montar um transmissor e um receptor mais não tenho tanto conhecimento assim estou apanhando demais, comprei a mais de 1 ano, assim que comprei tentei por mais de 1 mês, não consegui então os guardei, agora estou precisando memo, e já faz 2 mees que tento comunicar e não consigo, alguém poderia me ajudar????
-
Abre um tópico novo e explica BEM o que queres fazer e especifica o que é que realmente queres ler e com que sensores e afins.