From 024304493fda5a82e8951b0b0640992ebf00bcfa Mon Sep 17 00:00:00 2001 From: Ingo Haschler Date: Mon, 18 May 2015 15:08:41 +0200 Subject: [PATCH 1/8] Updated pinout label. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20d5afb..c71fd37 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ RFM pin - Pi pin DIO0 - 18 (GPIO24) MOSI - 19 MISO - 21 -CLK - 23 +CLK - 23 (=SCK) NSS - 24 Ground - 25 From 00df89d9fa96930ca2c836b364480cf7a408d442 Mon Sep 17 00:00:00 2001 From: Ingo Haschler Date: Fri, 20 Nov 2015 12:47:59 +0100 Subject: [PATCH 2/8] Fritzing file for wiring the RFM to the RasPi. --- wiring.fzz | Bin 0 -> 12403 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 wiring.fzz diff --git a/wiring.fzz b/wiring.fzz new file mode 100644 index 0000000000000000000000000000000000000000..a669c4b86634a53a78eec5078a8cdd66c4757ff2 GIT binary patch literal 12403 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 literal 0 HcmV?d00001 From 91da6428427224424c65d62d3df30509bfba5d03 Mon Sep 17 00:00:00 2001 From: MaxBellc Date: Thu, 12 Apr 2018 18:51:33 -0600 Subject: [PATCH 3/8] Update RFM69.py --- RFM69.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RFM69.py b/RFM69.py index c2910d7..3bb7dbe 100755 --- a/RFM69.py +++ b/RFM69.py @@ -6,7 +6,7 @@ import time class RFM69(object): - def __init__(self, freqBand, nodeID, networkID, isRFM69HW = False, intPin = 18, rstPin = 28, spiBus = 0, spiDevice = 0): + def __init__(self, freqBand, nodeID, networkID, isRFM69HW = False, intPin = 24, rstPin = 25, spiBus = 0, spiDevice = 0): self.freqBand = freqBand self.address = nodeID @@ -30,7 +30,7 @@ def __init__(self, freqBand, nodeID, networkID, isRFM69HW = False, intPin = 18, self.DATA = [] self.sendSleepTime = 0.05 - GPIO.setmode(GPIO.BOARD) + GPIO.setmode(GPIO.BCM) GPIO.setup(self.intPin, GPIO.IN) GPIO.setup(self.rstPin, GPIO.OUT) From 43b207e68ea92f9225691bccbe971a2e6ce21a6a Mon Sep 17 00:00:00 2001 From: MaxBellc Date: Thu, 12 Apr 2018 18:53:59 -0600 Subject: [PATCH 4/8] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e4a1ab6..1f505b7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Main repo +# Original repo * https://github.com/etrombly/RFM69 @@ -19,7 +19,7 @@ Attach the RFM69 as follows: | CLK | 23 | NSS | 24 | Ground | 25 -| RESET | 28 +| RESET | 22 *here I change it to another GPIO pin, which is GPIO 25 You can change the interrupt pin (GPIO24) in the class init. From 7761c81a35735a5d956af4f480fe6f6aad659891 Mon Sep 17 00:00:00 2001 From: MaxBellc Date: Thu, 12 Apr 2018 18:54:31 -0600 Subject: [PATCH 5/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f505b7..563fda5 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Attach the RFM69 as follows: | CLK | 23 | NSS | 24 | Ground | 25 -| RESET | 22 *here I change it to another GPIO pin, which is GPIO 25 +| RESET | 22 You can change the interrupt pin (GPIO24) in the class init. From 872b8e4cb81a37071b558197254aeeb679c19ae0 Mon Sep 17 00:00:00 2001 From: Ingo Haschler Date: Mon, 11 Nov 2019 15:54:07 +0100 Subject: [PATCH 6/8] +=extensions from study project. --- RFM69.py | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/RFM69.py b/RFM69.py index 3bb7dbe..1bd0d35 100755 --- a/RFM69.py +++ b/RFM69.py @@ -379,3 +379,133 @@ def shutdown(self): self.setHighPower(False) self.sleep() GPIO.cleanup() + + + def listenModeSendBurst(self, toAddress, buff): + + self.setMode(RF69_MODE_STANDBY) + self.writeReg(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_WHITENING | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON ) + self.writeReg(REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF) + self.writeReg(REG_SYNCVALUE1, 0x5A) + self.writeReg(REG_SYNCVALUE2, 0x5A) + self.writeReg(REG_FRFMSB, self.readReg(REG_FRFMSB) + 1) + self.writeReg(REG_FRFLSB, self.readReg(REG_FRFLSB)) + + #listenModeApplyHighSpeedSettings + self.writeReg(REG_BITRATEMSB, RF_BITRATEMSB_200000) + self.writeReg(REG_BITRATELSB, RF_BITRATELSB_200000) + self.writeReg(REG_FDEVMSB, RF_FDEVMSB_100000) + self.writeReg(REG_FDEVLSB, RF_FDEVLSB_100000) + self.writeReg( REG_RXBW, RF_RXBW_DCCFREQ_000 | RF_RXBW_MANT_20 | RF_RXBW_EXP_0 ) + + Duration = 1 + StartDuration = Duration + StartTime = time.time() + + while(Duration > 0): + + # DIO0 is "Packet Sent" + self.writeReg(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_00) + + if (len(buff) > RF69_MAX_DATA_LEN): + buff = buff[0:RF69_MAX_DATA_LEN] + + ack = 0x40 + + if isinstance(buff, basestring): + self.spi.xfer2([REG_FIFO | 0x80, len(buff) + 3, toAddress, self.address, ack] + [int(ord(i)) for i in list(buff)]) + else: + self.spi.xfer2([REG_FIFO | 0x80, len(buff) + 3, toAddress, self.address, ack] + buff) + + self.DATASENT = False + self.setMode(RF69_MODE_TX) + slept = 0 + while not self.DATASENT: + time.sleep(self.sendSleepTime) + slept += self.sendSleepTime + if slept > 1.0: + break + + + Duration = StartDuration - (time.time() - StartTime) + + self.setMode(RF69_MODE_STANDBY) + + + self.setFreqeuncy(self.freqBand) + self.init() + + + def init(self): + + frfMSB = {RF69_315MHZ: RF_FRFMSB_315, RF69_433MHZ: RF_FRFMSB_433, + RF69_868MHZ: RF_FRFMSB_868, RF69_915MHZ: RF_FRFMSB_915} + frfMID = {RF69_315MHZ: RF_FRFMID_315, RF69_433MHZ: RF_FRFMID_433, + RF69_868MHZ: RF_FRFMID_868, RF69_915MHZ: RF_FRFMID_915} + frfLSB = {RF69_315MHZ: RF_FRFLSB_315, RF69_433MHZ: RF_FRFLSB_433, + RF69_868MHZ: RF_FRFLSB_868, RF69_915MHZ: RF_FRFLSB_915} + + self.CONFIG = { + 0x01: [REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY], + #no shaping + 0x02: [REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00], + #default:4.8 KBPS + 0x03: [REG_BITRATEMSB, RF_BITRATEMSB_55555], + 0x04: [REG_BITRATELSB, RF_BITRATELSB_55555], + #default:5khz, (FDEV + BitRate/2 <= 500Khz) + 0x05: [REG_FDEVMSB, RF_FDEVMSB_50000], + 0x06: [REG_FDEVLSB, RF_FDEVLSB_50000], + + 0x07: [REG_FRFMSB, frfMSB[self.freqBand]], + 0x08: [REG_FRFMID, frfMID[self.freqBand]], + 0x09: [REG_FRFLSB, frfLSB[self.freqBand]], + + # looks like PA1 and PA2 are not implemented on RFM69W, hence the max output power is 13dBm + # +17dBm and +20dBm are possible on RFM69HW + # +13dBm formula: Pout=-18+OutputPower (with PA0 or PA1**) + # +17dBm formula: Pout=-14+OutputPower (with PA1 and PA2)** + # +20dBm formula: Pout=-11+OutputPower (with PA1 and PA2)** and high power PA settings (section 3.3.7 in datasheet) + #0x11: [REG_PALEVEL, RF_PALEVEL_PA0_ON | RF_PALEVEL_PA1_OFF | RF_PALEVEL_PA2_OFF | RF_PALEVEL_OUTPUTPOWER_11111], + #over current protection (default is 95mA) + #0x13: [REG_OCP, RF_OCP_ON | RF_OCP_TRIM_95], + + # RXBW defaults are { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_5} (RxBw: 10.4khz) + #//(BitRate < 2 * RxBw) + 0x19: [REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 | RF_RXBW_EXP_2], + #for BR-19200: //* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_3 }, + #DIO0 is the only IRQ we're using + 0x25: [REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01], + #must be set to dBm = (-Sensitivity / 2) - default is 0xE4=228 so -114dBm + 0x29: [REG_RSSITHRESH, 220], + #/* 0x2d */ { REG_PREAMBLELSB, RF_PREAMBLESIZE_LSB_VALUE } // default 3 preamble bytes 0xAAAAAA + 0x2e: [REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0], + #attempt to make this compatible with sync1 byte of RFM12B lib + 0x2f: [REG_SYNCVALUE1, 0x2D], + #NETWORK ID + 0x30: [REG_SYNCVALUE2, self.networkID], + 0x37: [REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_OFF | + RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON | RF_PACKET1_ADRSFILTERING_OFF], + #in variable length mode: the max frame size, not used in TX + 0x38: [REG_PAYLOADLENGTH, 66], + #* 0x39 */ { REG_NODEADRS, nodeID }, //turned off because we're not using address filtering + #TX on FIFO not empty + 0x3C: [REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | RF_FIFOTHRESH_VALUE], + #RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent) + 0x3d: [REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF], + #for BR-19200: //* 0x3d */ { REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF }, //RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent) + #* 0x6F */ { REG_TESTDAGC, RF_DAGC_CONTINUOUS }, // run DAGC continuously in RX mode + # run DAGC continuously in RX mode, recommended default for AfcLowBetaOn=0 + 0x6F: [REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0], + 0x00: [255, 0] + } + + #write config + for value in self.CONFIG.values(): + self.writeReg(value[0], value[1]) + + self.writeReg(REG_LNA, (self.readReg(REG_LNA) & ~0x3) | RF_LNA_GAINSELECT_AUTO) + self.setHighPower(self.isRFM69HW) + + + + From d47022a5f44babfb9a767ebadd8ed9b76b220f29 Mon Sep 17 00:00:00 2001 From: Ingo Haschler Date: Fri, 25 Dec 2020 20:20:09 +0100 Subject: [PATCH 7/8] Added listenmode sending --- RFM69.py | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/RFM69.py b/RFM69.py index 5e52ee0..a0de4d6 100755 --- a/RFM69.py +++ b/RFM69.py @@ -379,3 +379,124 @@ def shutdown(self): self.setHighPower(False) self.sleep() GPIO.cleanup() + + def listenModeSendBurst(self, toAddress, buff): + + self.setMode(RF69_MODE_STANDBY) + self.writeReg(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_WHITENING | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON ) + self.writeReg(REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF) + self.writeReg(REG_SYNCVALUE1, 0x5A) + self.writeReg(REG_SYNCVALUE2, 0x5A) + self.writeReg(REG_FRFMSB, self.readReg(REG_FRFMSB) + 1) + self.writeReg(REG_FRFLSB, self.readReg(REG_FRFLSB)) + + #listenModeApplyHighSpeedSettings + self.writeReg(REG_BITRATEMSB, RF_BITRATEMSB_200000) + self.writeReg(REG_BITRATELSB, RF_BITRATELSB_200000) + self.writeReg(REG_FDEVMSB, RF_FDEVMSB_100000) + self.writeReg(REG_FDEVLSB, RF_FDEVLSB_100000) + self.writeReg(REG_RXBW, RF_RXBW_DCCFREQ_000 | RF_RXBW_MANT_20 | RF_RXBW_EXP_0 ) + + Duration = 1 + StartDuration = Duration + StartTime = time.time() + + while(Duration > 0): + + # DIO0 is "Packet Sent" + self.writeReg(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_00) + + if (len(buff) > RF69_MAX_DATA_LEN): + buff = buff[0:RF69_MAX_DATA_LEN] + + ack = 0x40 + + if isinstance(buff, basestring): + self.spi.xfer2([REG_FIFO | 0x80, len(buff) + 3, toAddress, self.address, ack] + [int(ord(i)) for i in list(buff)]) + else: + self.spi.xfer2([REG_FIFO | 0x80, len(buff) + 3, toAddress, self.address, ack] + buff) + + self.DATASENT = False + self.setMode(RF69_MODE_TX) + slept = 0 + while not self.DATASENT: + time.sleep(self.sendSleepTime) + slept += self.sendSleepTime + if slept > 1.0: + break + + Duration = StartDuration - (time.time() - StartTime) + + self.setMode(RF69_MODE_STANDBY) + self.setFreqeuncy(self.freqBand) + self.init() + + def init(self): + + frfMSB = {RF69_315MHZ: RF_FRFMSB_315, RF69_433MHZ: RF_FRFMSB_433, + RF69_868MHZ: RF_FRFMSB_868, RF69_915MHZ: RF_FRFMSB_915} + frfMID = {RF69_315MHZ: RF_FRFMID_315, RF69_433MHZ: RF_FRFMID_433, + RF69_868MHZ: RF_FRFMID_868, RF69_915MHZ: RF_FRFMID_915} + frfLSB = {RF69_315MHZ: RF_FRFLSB_315, RF69_433MHZ: RF_FRFLSB_433, + RF69_868MHZ: RF_FRFLSB_868, RF69_915MHZ: RF_FRFLSB_915} + + self.CONFIG = { + 0x01: [REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY], + #no shaping + 0x02: [REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00], + #default:4.8 KBPS + 0x03: [REG_BITRATEMSB, RF_BITRATEMSB_55555], + 0x04: [REG_BITRATELSB, RF_BITRATELSB_55555], + #default:5khz, (FDEV + BitRate/2 <= 500Khz) + 0x05: [REG_FDEVMSB, RF_FDEVMSB_50000], + 0x06: [REG_FDEVLSB, RF_FDEVLSB_50000], + + 0x07: [REG_FRFMSB, frfMSB[self.freqBand]], + 0x08: [REG_FRFMID, frfMID[self.freqBand]], + 0x09: [REG_FRFLSB, frfLSB[self.freqBand]], + + # looks like PA1 and PA2 are not implemented on RFM69W, hence the max output power is 13dBm + # +17dBm and +20dBm are possible on RFM69HW + # +13dBm formula: Pout=-18+OutputPower (with PA0 or PA1**) + # +17dBm formula: Pout=-14+OutputPower (with PA1 and PA2)** + # +20dBm formula: Pout=-11+OutputPower (with PA1 and PA2)** and high power PA settings (section 3.3.7 in datasheet) + #0x11: [REG_PALEVEL, RF_PALEVEL_PA0_ON | RF_PALEVEL_PA1_OFF | RF_PALEVEL_PA2_OFF | RF_PALEVEL_OUTPUTPOWER_11111], + #over current protection (default is 95mA) + #0x13: [REG_OCP, RF_OCP_ON | RF_OCP_TRIM_95], + + # RXBW defaults are { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_5} (RxBw: 10.4khz) + #//(BitRate < 2 * RxBw) + 0x19: [REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 | RF_RXBW_EXP_2], + #for BR-19200: //* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_3 }, + #DIO0 is the only IRQ we're using + 0x25: [REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01], + #must be set to dBm = (-Sensitivity / 2) - default is 0xE4=228 so -114dBm + 0x29: [REG_RSSITHRESH, 220], + #/* 0x2d */ { REG_PREAMBLELSB, RF_PREAMBLESIZE_LSB_VALUE } // default 3 preamble bytes 0xAAAAAA + 0x2e: [REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0], + #attempt to make this compatible with sync1 byte of RFM12B lib + 0x2f: [REG_SYNCVALUE1, 0x2D], + #NETWORK ID + 0x30: [REG_SYNCVALUE2, self.networkID], + 0x37: [REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_OFF | + RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON | RF_PACKET1_ADRSFILTERING_OFF], + #in variable length mode: the max frame size, not used in TX + 0x38: [REG_PAYLOADLENGTH, 66], + #* 0x39 */ { REG_NODEADRS, nodeID }, //turned off because we're not using address filtering + #TX on FIFO not empty + 0x3C: [REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | RF_FIFOTHRESH_VALUE], + #RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent) + 0x3d: [REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF], + #for BR-19200: //* 0x3d */ { REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF }, //RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent) + #* 0x6F */ { REG_TESTDAGC, RF_DAGC_CONTINUOUS }, // run DAGC continuously in RX mode + # run DAGC continuously in RX mode, recommended default for AfcLowBetaOn=0 + 0x6F: [REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0], + 0x00: [255, 0] + } + + #write config + for value in self.CONFIG.values(): + self.writeReg(value[0], value[1]) + + self.writeReg(REG_LNA, (self.readReg(REG_LNA) & ~0x3) | RF_LNA_GAINSELECT_AUTO) + self.setHighPower(self.isRFM69HW) From 0dec96fbf03b39f21da3cd5ecfe812a8f81c04a7 Mon Sep 17 00:00:00 2001 From: Ingo Haschler Date: Mon, 28 Dec 2020 17:20:43 +0100 Subject: [PATCH 8/8] Tidied up. --- RFM69.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/RFM69.py b/RFM69.py index a0de4d6..511be13 100755 --- a/RFM69.py +++ b/RFM69.py @@ -380,7 +380,14 @@ def shutdown(self): self.sleep() GPIO.cleanup() - def listenModeSendBurst(self, toAddress, buff): + # + # Sends data in a special manner (cf. https://lowpowerlab.com/forum/low-power-techniques/low-power-radio-wakeup/) + # Parameters: + # toAddress: nodeId of the recipient + # buff: data buffer to send + # burstDurationSec: duration of burst transmission in seconds + # (should match the setting on the receiver side) + def sendBurst(self, toAddress, buff, burstDurationSec = 1.0): self.setMode(RF69_MODE_STANDBY) self.writeReg(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_WHITENING | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON ) @@ -422,16 +429,16 @@ def listenModeSendBurst(self, toAddress, buff): while not self.DATASENT: time.sleep(self.sendSleepTime) slept += self.sendSleepTime - if slept > 1.0: + if slept > burstDurationSec: break Duration = StartDuration - (time.time() - StartTime) self.setMode(RF69_MODE_STANDBY) self.setFreqeuncy(self.freqBand) - self.init() + self.resetToNormalMode() - def init(self): + def resetToNormalMode(self): frfMSB = {RF69_315MHZ: RF_FRFMSB_315, RF69_433MHZ: RF_FRFMSB_433, RF69_868MHZ: RF_FRFMSB_868, RF69_915MHZ: RF_FRFMSB_915}