//Designs/duckweed_collector/SW/RF01/RF01.pde |
---|
0,0 → 1,49 |
/* |
connections arduino RF01 and RF02 |
in arduino version 018 |
(not yet tested in more recent arduino versions) |
tested with ATmega 328 |
on frequency 433 |
no range test done yet, just in one room |
*/ |
//connections RF01: (receiving) |
#define SDI 5 // RF01 SDI, arduino 13 cannot be changed |
#define SCK 4 // RF01 SCK, arduino 12 cannot be changed |
#define CS 3 // RF01 nSEL, arduino 11 cannot be changed |
#define SDO 2 // RF01 SDO, arduino 10 cannot be changed |
//--------------------- // RF01 niRQ, arduino 02 cannot be changed |
//----------------------// RF01 nFFS: 1-10k Pullup too Vcc |
// receiving words with RF01 |
#include <RF01.h> |
int serialTesting = 1; |
void setup() { |
Serial.begin(9600); |
Serial.println("\nRF02 receive"); |
delay(250); |
rf01_prepAll(); |
delay(250); |
Serial.println("startup"); |
} |
void loop() { |
rf01_receive(); |
char* buf = (char*) rf01_data; |
Serial.println(buf); |
Serial.println(" done"); |
delay(500); |
} |
//Designs/duckweed_collector/SW/RF02/RF02.pde |
---|
0,0 → 1,94 |
/* |
connections arduino RF01 and RF02 |
in arduino version 018 |
(not yet tested in more recent arduino versions) |
tested with ATmega 328 |
on frequency 433 |
no range test done yet, just in one room |
*/ |
//connections RF02: (sending) |
#define SDI 0 // SDI, -> RF02 Atmega PB0 Arduino 8 cannot be changed |
#define SCK 1 // SCK, -> RF02 Atmega PB1 Arduino 9 cannot be changed |
#define CS 2 // nSEL, -> RF02 Atmega PB2 Arduino 10 cannot be changed |
#define IRQ 4 // nIRQ, <- RF02 Atmega PB4 Arduino 12 cannot be changed |
//------------------// FSK: Pullupto VCC |
// RF02 sending words |
// tested with lib, november 2010 |
#include <RF02.h> |
#include <stdint.h> |
int wissel = 0;//wissel means change in dutch |
void setup() { |
Serial.begin(57600); |
Serial.print("hello" ); |
Serial.println("init" ); |
rf02_prepAll434(); |
Serial.println("done" ); |
pinMode(4, OUTPUT); //testing leds |
pinMode(5, OUTPUT); |
ledBlink(4); |
ledBlink(5); |
} |
void ledBlink(int num){ |
digitalWrite(num, HIGH); |
delay(100); |
digitalWrite(num, LOW); |
delay(100); |
} |
void loop() { |
ledBlink(4); |
delay(1550); |
Serial.print(wissel ); |
Serial.println(" send: "); |
switch ( wissel) |
{ |
case 0: |
{ |
unsigned char buf[] = { "hello World! \n" }; |
rf02_changeText( buf, sizeof buf); |
Serial.println("hello World! \n"); |
rf02_sendData(); |
wissel = 1; |
break; |
} |
case 1: |
{ |
unsigned char buf[] = { "Goodbye Life! \n" }; |
Serial.println("Goodbye Life! \n"); |
rf02_changeText( buf, sizeof buf); |
rf02_sendData(); |
wissel = 2; |
break; |
} |
case 2: |
{ |
unsigned char buf[] = { "Bless all! \n" }; |
Serial.println("Bless all! \n"); |
rf02_changeText( buf, sizeof buf); |
rf02_sendData(); |
wissel = 0; |
break; |
} |
} |
} |
//Designs/duckweed_collector/SW/library/RF01/RF01.cpp |
---|
0,0 → 1,220 |
/********************************************* |
* |
* draft version v 0.1, experimental |
* |
* code based on the code of "benedikt k." |
* this was an avr project from the site: http://www.mikrocontroller.net/topic/65984#541030 |
* |
* |
* code should be matched with RF01 |
* |
* up to now no transmission between the RF12 modules and Jeelabs.com RF12 lib |
* |
* this code has worked: transmitting using atmega168 and atmega328 in combination with RF01s and RF02s |
* |
* arduino 18 |
* |
* five march, contrechoc.com, june 2010 , october 2010 |
* |
* |
*********************************************/ |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include <avr/pgmspace.h> |
#include <avr/eeprom.h> |
#include <stdlib.h> |
#include "rf01.h" |
#define F_CPU 16000000UL |
#include <util/delay.h> |
#define RF_PORT PORTB |
#define RF_DDR DDRB |
#define RF_PIN PINB |
#define SDI 5 // RF01 SDI, arduino 13 cannot be changed |
#define SCK 4 // RF01 SCK, arduino 12 cannot be changed |
#define CS 3 // RF01 nSEL, arduino 11 cannot be changed |
#define SDO 2 // RF01 SDO, arduino 10 cannot be changed |
//----------------- // RF01 niRQ, arduino 02 cannot be changed |
//------------------// RF01 nFFS: 1-10k Pullup too Vcc |
#define LED_PORT PORTD |
#define LED_DDR DDRD |
#define LED_PIN PIND |
#define LED0 5 |
#define LED1 6 //not used |
// nFFS: 1-10k Pullup an Vcc !!! |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef cLED0 |
#define cLED0() (LED_PORT &= ~(1<<LED0)) |
#endif |
#ifndef sLED0 |
#define sLED0() (LED_PORT |= (1<<LED0) ) |
#endif |
#ifndef cLED1 |
#define cLED1() (LED_PORT &= ~(1<<LED1)) |
#endif |
#ifndef sLED1 |
#define sLED1() (LED_PORT |= (1<<LED1) ) |
#endif |
// maximum receive buffer |
#define RF_MAX 32 |
unsigned char rf01_buf[RF_MAX]; // recv buf |
#include <util/delay.h> |
void rf01_receive(){ |
rf01_rxdata(rf01_data, 32); |
} |
void rf01_prepAll(){ |
rf01_init(); // ein paar Register setzen (z.B. CLK auf 10MHz) |
rf01_setfreq(RF01FREQ(434)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen |
rf01_setbandwidth(4); // 4 200kHz Bandbreite |
rf01_setreceiver(2,4); //2,4 -6dB Verstärkung, DRSSI threshold: -79dBm |
rf01_setbaud(57600); // 19200 Baud |
} |
static unsigned char sdrssi, sgain; |
void rf01_trans(unsigned short wert) |
{ unsigned char i; |
cbi(RF_PORT, CS); |
for (i=0; i<16; i++) |
{ if (wert&32768) |
sbi(RF_PORT, SDI); |
else |
cbi(RF_PORT, SDI); |
sbi(RF_PORT, SCK); |
wert<<=1; |
_delay_us(0.2); |
cbi(RF_PORT, SCK); |
} |
sbi(RF_PORT, CS); |
} |
void rf01_init(void) |
{ unsigned char i; |
RF_PORT=(1<<CS); |
RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS); |
for (i=0; i<11; i++) |
_delay_ms(10); // wait until POR done |
rf01_trans(0xC2E0); // AVR CLK: 10MHz |
rf01_trans(0xC42B); // Data Filter: internal |
rf01_trans(0xCE88); // FIFO mode |
rf01_trans(0xC6F7); // AFC settings: autotuning: -10kHz...+7,5kHz |
rf01_trans(0xE000); // disable wakeuptimer |
rf01_trans(0xCC00); // disable low duty cycle |
LED_DDR= 0xFF;//(1<<LED0)|(1<<LED1); |
blinkLED(); |
} |
void rf01_setbandwidth(unsigned char bandwidth) |
{ |
rf01_trans(0x8970|((bandwidth&7)<<1)); |
} |
void rf01_setreceiver(unsigned char gain, unsigned char drssi) |
{ |
sdrssi=drssi; |
sgain=gain; |
} |
void rf01_setfreq(unsigned short freq) |
{ if (freq<96) // 430,2400MHz |
freq=96; |
else if (freq>3903) // 439,7575MHz |
freq=3903; |
rf01_trans(0xA000|freq); |
} |
void rf01_setbaud(unsigned short baud) |
{ |
if (baud<336) |
return; |
if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7) |
rf01_trans(0xC880|((43104/baud)-1)); |
else |
rf01_trans(0xC800|((344828UL/baud)-1)); |
rf01_trans(0xC806); |
} |
void rf01_rxdata(unsigned char *data, unsigned char number) |
{ unsigned char i,j,c; |
rf01_trans(0xC0C1|((sgain&3)<<4)|((sdrssi&7)<<1)); // RX on |
rf01_trans(0xCE89); // set FIFO mode |
rf01_trans(0xCE8B); // enable FIFO |
cbi(RF_PORT, SDI); |
for (i=0; i<number; i++) |
{ cbi(RF_PORT, CS); |
while (!(RF_PIN&(1<<SDO))); // wait until data in FIFO |
for (j=0; j<16; j++) // read and discard status register |
{ sbi(RF_PORT, SCK); |
asm("nop"); |
cbi(RF_PORT, SCK); |
} |
c=0; |
for (j=0; j<8; j++) |
{ c<<=1; |
if (RF_PIN&(1<<SDO)) |
c|=1; |
sbi(RF_PORT, SCK); |
_delay_us(0.2); |
cbi(RF_PORT, SCK); |
} |
*data++=c; |
sbi(RF_PORT, CS); |
} |
//blinkLED(); |
rf01_trans(0xC0C0|((sgain&3)<<4)|((sdrssi&7)<<1)); // RX off |
} |
void blinkLED(void){ |
for (unsigned char i=0; i<15; i++) |
_delay_ms(5); |
sLED1(); |
for (unsigned char i=0; i<15; i++) |
_delay_ms(5); |
cLED1(); |
} |
void makePulse(int numberOfPulses){ |
if ( numberOfPulses > 0) |
{ |
for (unsigned char i=0; i<numberOfPulses; i++) |
{ |
_delay_ms(20); |
sLED0(); |
_delay_ms(20); |
cLED0(); |
} |
_delay_ms(50); |
} |
} |
//Designs/duckweed_collector/SW/library/RF01/RF01.h |
---|
0,0 → 1,26 |
#ifndef RF01_h |
#define RF01_h |
#include <stdint.h> |
#define rf01_data (rf01_buf + 2) |
extern unsigned char rf01_buf[]; // recv/xmit buf including hdr & crc bytes |
extern void rf01_prepAll(); |
extern void rf01_receive(); |
extern void rf01_trans(unsigned short wert); |
extern void rf01_init(void); |
extern void rf01_setbandwidth(unsigned char bandwidth); |
extern void rf01_setreceiver(unsigned char gain, unsigned char drssi); |
extern void rf01_setfreq(unsigned short freq); |
extern void rf01_setbaud(unsigned short baud); |
extern void rf01_rxdata(unsigned char *data, unsigned char number); |
#define RF01FREQ(freq) ((freq-430.0)/0.0025) |
extern void blinkLED(void); |
extern void makePulse(int numberOfPulses); |
#endif |
//Designs/duckweed_collector/SW/library/RF02/RF02.cpp |
---|
0,0 → 1,242 |
/********************************************* |
* |
* draft version v 0.1, experimental |
* |
* code based on the code of "benedikt k." |
* this was an avr project from the site: http://www.mikrocontroller.net/topic/65984#541030 |
* |
* |
* code should be matched with RF01 |
* |
* up to now no transmission between the RF12 modules and Jeelabs.com RF12 lib |
* |
* this code has worked: transmitting using atmega168 and atmega328 in combination with RF01s and RF02s |
* |
* arduino 18 |
* |
* five march, contrechoc.com, 2010, june |
* |
* |
*********************************************/ |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include <stdlib.h> |
#include <avr/pgmspace.h> |
#include <avr/eeprom.h> |
#include <string.h> |
#include "rf02.h" |
#include <util/delay.h> |
#define F_CPU 16000000UL |
#define RF_PORT PORTB |
#define RF_DDR DDRB |
#define RF_PIN PINB |
#define LED_PORT PORTD |
#define LED_DDR DDRD |
#define LED_PIN PIND |
#define LED0 4 -- PD4 |
#define LED1 2 -- PD2 |
#define SDI 0 // SDI, -> RF02 Atmega PB0 Arduino 8 |
#define SCK 1 // SCK, -> RF02 Atmega PB1 Arduino 9 |
#define CS 2 // nSEL, -> RF02 Atmega PB2 Arduino 10 |
#define IRQ 4 // nIRQ, <- RF02 Atmega PB4 Arduino 12 |
//------------------// FSK: Pullupto VCC |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef cLED0 |
#define cLED0() (LED_PORT &= ~(1<<LED0)) |
#endif |
#ifndef sLED0 |
#define sLED0() (LED_PORT |= (1<<LED0) ) |
#endif |
#ifndef cLED1 |
#define cLED1() (LED_PORT &= ~(1<<LED1)) |
#endif |
#ifndef sLED1 |
#define sLED1() (LED_PORT |= (1<<LED1) ) |
#endif |
unsigned char test[32]=" 55555 \n"; |
void rf02_changeText( unsigned char* ptr, uint8_t number){ |
if (number> 32)number = 32; |
memcpy( test, ptr, number); |
} |
void rf02_prepAll434(){ |
rf02_init(); // ein paar Register setzen (z.B. CLK auf 10MHz) |
rf02_setfreq(RF02FREQ(434)); // 433,92MHz |
rf02_setpower(1); // -12dBm Ausgangangsleistung |
rf02_setmodfreq(3); // 120kHz Frequenzshift |
rf02_setbaud(19200); // 19200 Baud |
}// |
void rf02_prepAll(unsigned short freq, uint8_t setPower,uint8_t modFreq,unsigned short baudRate){ |
rf02_init(); // ein paar Register setzen (z.B. CLK auf 10MHz) |
rf02_setfreq( RF02FREQ(freq) ); // Sende/Empfangsfrequenz auf 433,92MHz einstellen |
if ( setPower < 0 ) setPower = 0; |
if ( setPower > 4 ) setPower = 4; |
rf02_setpower(setPower); // -12dBm Ausgangangsleistung |
if ( modFreq < 0 ) modFreq = 0; |
if ( modFreq > 8 ) modFreq = 8; |
rf02_setmodfreq(modFreq); // 120kHz Frequenzshift |
rf02_setbaud(baudRate); // 19200 Baud |
}// |
void rf02_sendData(){ |
rf02_txdata( test, sizeof test); |
} |
void rf02_trans(unsigned short value) |
{ uint8_t i; |
cbi(RF_PORT, CS); |
for (i=0; i<16; i++) |
{ if (value&0x8000) //0x8000 |
sbi(RF_PORT, SDI); |
else |
cbi(RF_PORT, SDI); |
sbi(RF_PORT, SCK); |
value<<=1; |
_delay_us(0.3); |
cbi(RF_PORT, SCK); |
} |
sbi(RF_PORT, CS); |
} |
void rf02_init(void) |
{ |
RF_PORT=(1<<CS); |
RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS); |
for (unsigned char i=0; i<15; i++) |
_delay_ms(10); // wait until POR done |
rf02_trans(0xC0E0); // power settings |
rf02_trans(0x8A75);// fsk in rfm02 = afc in rf12 |
// rf02_trans(0x80C7); |
rf02_trans(0xC2A0); // enable tx sync bit, disable low bat detector |
//LED_DDR= 0xFF; |
} |
void rf02_setmodfreq(uint8_t bandwidth) |
{ |
rf02_trans(0x8F80|(bandwidth&7)); |
//rf02_trans(0x8F70); |
} |
void rf02_setfreq(unsigned short freq) |
{ if (freq<96) // 430,2400MHz |
freq=96; |
else if (freq>3903) // 439,7575MHz |
freq=3903; |
rf02_trans(0xA000|freq); |
//rf02_trans(0xA640); //= 434 MHz |
} |
void rf02_setpower(uint8_t power) |
{ |
rf02_trans(0xB000|((power&7)<<8)); |
} |
void rf02_setbaud(unsigned short baud) |
{ |
if (baud<1345) |
baud=1345; |
if (baud<19000) |
rf02_trans(0xD240); // 25% PLL current |
else if (baud<37000) |
rf02_trans(0xD2C0); // 33% PLL current |
else |
rf02_trans(0xD200); // 50% PLL current |
//rf02_trans(0xC800|((344828UL/baud)-1)); // Baudrate= 344827,59/(R+1) |
rf02_trans(0xC806); |
} |
void rf02_txdata( unsigned char * data, uint8_t number) |
{ |
uint8_t i,value; |
value=0xC6; //1100 0110 |
cbi(RF_PORT, CS); //nSel |
for (i=0; i<8; i++) |
{ if (value&0x80) //1000 0000 = 80 |
sbi(RF_PORT, SDI); |
else |
cbi(RF_PORT, SDI); |
sbi(RF_PORT, SCK); |
value<<=1; |
_delay_us(0.2); |
cbi(RF_PORT, SCK); |
} |
rf02_shiftout(0xAA);//10101010 |
rf02_shiftout(0xAA); |
rf02_shiftout(0xAA); |
rf02_shiftout(0x2D);//00101101 |
rf02_shiftout(0xD4);//11010100 |
// no checkbit, in experimenting some letters were transmitted wrong! |
for (i=0; i<number; i++) |
rf02_shiftout(*data++); |
sbi(RF_PORT, CS); |
while(RF_PIN&(1<<IRQ)); // wait until transfer done |
rf02_trans(0xC464); // TX off after 10us |
} |
void rf02_shiftout(unsigned char value) |
{ uint8_t j; |
for (j=0; j<8; j++) |
{ while(RF_PIN&(1<<IRQ)); |
while(!(RF_PIN&(1<<IRQ))); |
if (value&128) //100101000 |
sbi(RF_PORT, SDI); |
else |
cbi(RF_PORT, SDI); |
value<<=1; |
} |
} |
//Designs/duckweed_collector/SW/library/RF02/RF02.h |
---|
0,0 → 1,26 |
#ifndef RF02_h |
#define RF02_h |
#include <stdint.h> |
extern void rf02_prepAll434(); |
extern void rf02_prepAll(unsigned short freq, uint8_t setPower, uint8_t modFreq, unsigned short baudRate); |
//extern void rf02_prepAll(unsigned short freq, uint8_t setPower, uint8_t modFreq, unsigned short baudRate); |
extern void rf02_sendData(); |
extern void rf02_changeText( unsigned char* ptr, uint8_t number); |
extern void rf02_trans(unsigned short value); |
extern void rf02_init(void); // init functions |
extern void rf02_setmodfreq(uint8_t bandwidth); // set modulation deviation |
extern void rf02_setfreq(unsigned short freq); // set tx frequency |
extern void rf02_setpower(uint8_t power); // set power (0-7) |
extern void rf02_setbaud(unsigned short baud); // set baudrate |
extern void rf02_txdata(unsigned char* ptr, uint8_t number); // tx data |
extern void rf02_shiftout(unsigned char value); |
#define RF02FREQ(freq) ((freq-430.0)/0.0025) |
#endif |