rfm69 and atc

  • Hardware Contributor


    I have played a little bit with atc examples from lowpowerlab which work well πŸ™‚
    but I have some trouble to include it in mysensors 😳

    Here description of atc for rfm69 : http://lowpowerlab.com/blog/2015/11/11/rfm69_atc-automatic-transmission-control/
    What I like is :

    • "green" rf (no scream level)
    • autoadjust rssi when fresh made node, or you move it (rare)
    • optimized low power as it adjust rssi
    • dynamic

    Very basic setup I am trying to compile:

    //#include "drivers/RFM69/RFM69.h"
    #include "drivers/RFM69/RFM69_ATC.h" 
    // RFM69 _radio(MY_RF69_SPI_CS, MY_RF69_IRQ_PIN, MY_RFM69HW, MY_RF69_IRQ_NUM);
    RFM69_ATC _radio(MY_RF69_SPI_CS, MY_RF69_IRQ_PIN, MY_RFM69HW, MY_RF69_IRQ_NUM);```
    • still in transportrfm69.cpp, in transport.init:
    _radio.enableAutoPower(-70); // fixed for tests

    That would need some define conf like for example

    • MY_ENABLE_ATC to enable atc mode
    • MY_ENABLE_ATC_LEVEL_RFM69 for target rss level

    I'm getting this really dumb errors!

    sketch\SensebenderMicro.ino.cpp.o: In function `transportInit()':
    C:\Users\scalz\Documents\Arduino\libraries\MySensors/core/MyTransportRFM69.cpp:42: undefined reference to `RFM69_ATC::initialize(unsigned char, unsigned char, unsigned char)'
    sketch\SensebenderMicro.ino.cpp.o: In function `transportReceive(void*)':
    C:\Users\scalz\Documents\Arduino\libraries\MySensors/core/MyTransportRFM69.cpp:84: undefined reference to `RFM69_ATC::sendACK(void const*, unsigned char)'
    collect2.exe: error: ld returned 1 exit status
    exit status 1

    Looking at each rfm, rfm_atc or rfmtransport I don't understand why it's undefined..rfm69_atc class is simply derived from rfm69 class. I am thinking about bad linking, bad inheritance declaration, or something not "in sync" with some params of core class methods (but I don't see where or why)?? Can you explain me? I'm feeling blind, and would like to learn..
    @Hek, I'm sure you know what's wrong. don't laugh πŸ˜†
    I will add more things I need when I will understand my mistake here πŸ˜‰

    thx πŸ˜ƒ

  • Admin

  • Hardware Contributor

    @hek no I didn't see this place! thx. I have just added but still same errors. I am still looking..
    Edit: I am using dev branch of course! and for the test, I am trying to compile sensebender sketch.

  • Hardware Contributor

    @hek: sorry, it's oki for cpp. I added .h instead 😳 So now I have a small lot of errors due to the addition , I will look how to fix it and report here if I have another problem or success. thx

  • Admin

    You might need to include both...

  • Hardware Contributor

    both in mysensors.h ? I will try. I need to understand well how it is organized I think.

  • Admin

    Yes, include both .cpps, looks like the new class inits the old:


  • Hardware Contributor

    yes I kept the too. but if I remove rfm69.cpp or not, it still have these new errors I'm looking after

    In file included from C:\Users\scalz\Documents\Arduino\libraries\MySensors/MySensor.h:265:0,
                     from C:\Users\scalz\AppData\Local\Temp\arduino_modified_sketch_741351\SensebenderMicro.ino:65:
    C:\Users\scalz\Documents\Arduino\libraries\MySensors/drivers/RFM69/RFM69_ATC.cpp: In member function 'void RFM69_ATC::sendFrame(uint8_t, const void*, uint8_t, bool, bool, bool, int16_t)':
    C:\Users\scalz\Documents\Arduino\libraries\MySensors/drivers/RFM69/RFM69_ATC.cpp:111:18: error: 'RFM69_CTL_SENDACK' was not declared in this scope
         SPI.transfer(RFM69_CTL_SENDACK | (sendRSSI?RFM69_CTL_RESERVE1:0));  // TomWS1  TODO: Replace with EXT1
    C:\Users\scalz\Documents\Arduino\libraries\MySensors/drivers/RFM69/RFM69_ATC.cpp:118:32: error: 'RFM69_CTL_REQACK' was not declared in this scope
         SPI.transfer(_targetRSSI ? RFM69_CTL_REQACK | RFM69_CTL_RESERVE1 : RFM69_CTL_REQACK);
    C:\Users\scalz\Documents\Arduino\libraries\MySensors/drivers/RFM69/RFM69_ATC.cpp:129:66: error: 'RF69_TX_LIMIT_MS' was not declared in this scope
       while (digitalRead(_interruptPin) == 0 && millis() - txStart < RF69_TX_LIMIT_MS); // wait for DIO0 to turn HIGH signalling transmission finish
    exit status 1```

  • Admin

    Too much for my brain at this hour. You should probably start looking for the missing RFM69_CTL_REQACK define.

    Good night πŸ’€

  • Hardware Contributor

    yep. thank you very much
    good night πŸ™‚

  • Hardware Contributor

    cool it compiles after updated rfm69 lib. I do some define and tests, and I will try my first PR πŸ˜‰ I also need to check what are all diff between old and new lib. can't wait to try listenmode now...

  • I will keep a very close eye on this!
    Listen mode is very interesting, but also the possible prolonged battery life from the other sensors!!!

    Big thumbs up! πŸ‘

  • Hardware Contributor

    thx. so far so good πŸ˜‰
    I had a little bit time last night...I think I will rename this topic "improvements for our mysensors rfm69 lib" lol πŸ™‚

    I diff checked with mysensors rfm69 driver lib: latest lowpowerlab rfm69 lib (master+spi transaction version) + few others variant I found to see if something could be missing. So I started from mysensors rfm69 driver one and added step by step the changes, and of course not forgot to keep boards define (atsam, esp, 328...) + checked the purpose of these changes.

    The list of improvements I noticed:

    • ATC, Automatic Transfer Power Control : merged, working (not the biggest part)
    • small improvements on spi transaction part : merged but not full tested. I don't use ethernet shield, so just tested with eeprom but I think this change was mostly made for things like w5100 shield...if I have time I will try to make more tests on this..
    • ListenMode : still, in progress but in a good way I think πŸ™‚ Almost merged but not tested yet (was too late!!). For the moment it compiles. It will need some tests I think to see if all properly works, power consumption..At lowpowerlab they get very few ua (1-2ua order) in listenmode. sounds great I hope to have same success. I need register to their forum at least to thx them. not done. booo 😳
    • with this listenmode, I plan to use gammon sketch J. I already did tests and noticed a better low consumption than lowpowerlab sleep of mysensors. but I will check if it's still the same case
    • still about sleep mode, I will look if it's possible to improve wakeup time, I read interesting things.
    • when all this will be ok, I will try to see if it's interesting to use sort of WDT Listenmode : a wdt done by rssi using listenmode. but that's at the end of the list! and needs to see then if it's better or not than common wdt power consumption. but that looks tempting because common wdt don't do listenmode...

    Files impacted for those interested to know:

    • rfm69 libs updated
    • rfm69_atc added
    • myTransportRFM69 updated
    • one cpp include in mysensor.h
    • few define in myconfig.h
    • mysensorscore, transport, hw..to add a SleepWithListenMode method ...For the moment I add my own sleep method to not break anything and keep mysensors archi...

    Some stuff, I hope I will have everything ok! But I'm very happy doing this as now I am a lot lot more confident with mysensors archi. very cool πŸ™‚

    see you soon πŸ™‚

  • very good work ! especially for ATC and Listenmode.

  • Is the code mods on Github for us to look at??


  • @scalz how is atc working on the rfm69?

  • Hardware Contributor

    @Francois sorry this work is still in progress, I will work on it this week.
    This is handled in the rfm69 lib. And lowpowerlab explains this well: copied from Lowpowerlab

    • "The basic idea behind this extension is to allow your nodes to dial down transmission power based on the received signal strength indicator (RSSI)."
    • "with RFM69_ATC this is done automatically for you, you just need to indicate a target RSSI. On each packet sent and ACK received (using sendWithRetry(…) is required), the node analyzes the actual RSSI and continuously adjusts its own transmission power level of the RFM69 transceiver to attempt to match the target RSSI (+ or -)"

    Require some small changes in libs, but for the moment I have to check/think few things for the listenmode to have everything well packaged with mysensors..not finished yet.

  • have you tested the code enough to release it for our use and testing??


  • Hardware Contributor

    no, not yet. sorry for delay. I have no time actually..and I think perhaps lowpowerlab team is preparing few changes in their lib. so I am delaying a bit to finish other things in the mean time, and to see if they add new features. then, if nothing new, I will finish this if someone didn't beat me on this πŸ˜‰
    but I will try to do my best πŸ™‚

  • @scalz
    I have it working to some extent, send me what you have and I will add your changes to what I've done to make sure I did not miss anything...

    Then I will post the changes to the development branch


    tom --at-- lafleur --.-- us

  • I have all this working now and have 7 devices on it to a serial gateway...
    Using new RFM69 driver and RFM69_ATC...

    Its interesting to see the power levels change as packets flow...

    If I can figure out how to do a PULL request, I will make it happen to 2.0b development branch...


  • Hardware Contributor

    sorry for delayed answer, a bit busy, I have actually no time to look at/share my experiments πŸ˜•
    I found this interesting too, seeing powerlevels change. btw I didn't finish the listenmode part, I'm on other things for the moment, so that's great if your are doing the job πŸ™‚
    thx πŸ˜‰

  • Hardware Contributor

    hi guys.

    just a little update to say that I'm back on this 😊
    it's still a wip so I will share/release a bit later πŸ˜‰
    I have this working in mysensors dev for the moment.

    • I can get rssi value.
    • atc power mode.
    • listenmode : an mqtt esp8266 GW is peridocially waking up a proto node which is in deepsleep (the node is woken up by INT0 triggered by the radio of course). I will mainly use this for sort of remote watchdog for some of my nodes etc..

  • @scalz, good work ! Nice features.

  • @scalz As you noticed I have just started with rfm69 and thanks for your help in the other thread. Really looking forward to your work as ATC is something I am missing in MySensors.

  • Hardware Contributor

    @alexsh1 : thx. i know i have not pr this yet..it's still working local but have not done extended tests as I'm busy improving mqtt wifi gw..but i will do my best

  • Hi Scalz,

    any progress here? Cant wait to use ATC and the rssi-value for my nodes πŸ˜„
    Thanks for your work πŸ‘


  • @Fleischtorte So I am not the only one David waiting for ATC and RSSI πŸ˜‰


  • @carlierd Yeah Davids FTW πŸ˜„

  • @lafleur @scalz
    Hi guys,
    Have one of you succed with the PR, so we can enjoy at least the ATC feature.

    This is really the down side with the RFM69HW, power consumption so your work could be really helpfull !

    Really thank you for that

  • @frencho

    I have it all working, but my development environment and Jenkins are not in alignment, so my PR was rejected by the development team. They provide me NO help in resolving the issue... They tend to favor and support only the older NRF24L01 radio and have little interests in the newer, better preforming RFM69 or RFM95 radios. So have a look at my code changes in the close PR. It was not hard to implement. I have move on.....

  • Admin


    I'm sorry if your feelings got hurt. But you simply wouldn't do what the team instructed you in PR #440 to get it merged.


    trlafleur created this issue in mysensors/MySensors

    closed Update RFM69 drivers #440

  • Thanks @lafleur, found your PR, I will try to do my own thing based on your work. Shouldn't be a big deal.

  • I did exactly what you ask, but it continued to fail in building the examples... In another PR, you pointed out that there were issue in building the examples under IDE 1.6.9.

    My feeling were not hurt, but I did NOT want to wast anymore time in dealing with Jenkins with out guidance.... Also there is NO guide on what Jenkins expect to see in its development environment. it all trial and error...

    FYI... I have developed RFM95 and TTN transport layers for my snapshot of your code.

  • Hardware Contributor

    @frencho @lafleur
    sorry for this delay. i'm busy, running..sometimes i refresh myself doing some sw but I admit i spent more time on hw than looking how to cleanly do this PR. ouch πŸ˜“ but for me it has to be hobby even if I'm always rushing myself.
    you're not true πŸ˜‰ in fact mysensors team is not nrf24 only πŸ™‚

    as soon as i can, i will look. it could be a bit time consuming as it would be my first PR, why i always delay..boo lazy i am 😊 The best way I think (as, now, I'm not up to date with dev branch, I will need diffchecking my stuff):

    • I would start/improve PR437 with minor changes needed. As mysensors drivers compiles ok, i would do in this way than taking lowpowerlab lib first (all warnings enabled of course)
    • then a separated for ATC + or another one for ListenMode. to have a better history and not breaking anything.

    so, I would separate the PR. I don't know if you tried like this (if i'm overhead), or what were your PR issue. I will look a bit later for curiosity or in case I would run in similar issue hihi.

    Cool if you have it working πŸ™‚

  • @lafleur thanks for your work! On the weekend i was able to upgrade the driver and enable ATC with RSSI-Report. With the instructions from PR440 it was very easy πŸ‘

  • It's great to see that you got it all working from the PR440. I hope others will find your work useful....

    I'm my test,it works very well.....

  • @Fleischtorte would you accept to share the work ? I started to play with the RFM69, but didn't get to the ATC part yet. It could save me a couple of hours, and debug ^^

  • @lafleur @Fleischtorte @frencho I think I'm a bit dense today. I don't understand where the code currently sits in terms of something that could be tested. I see that PR440 was closed and referenced to go back to PR437 or open a new PR? I'd love to give ATC code a go on my RFM69HW's. Is it being integrated into the development branch? How would I go about testing at this time? I did a quick look at the codebase in git and there is no mention of ATC in the MySensors dev branch... A quick diff of the RFM69.cpp code from Felix and MySensors shows a few differences, so they are not 100% in sync. Alas, I'm at a loss on how to apply the work already done to test.. I can "git clone" like a banshee, but beyond that I'm lost with Jenkins. Sorry, again, dense today...

    Any advice on how I can help is appreciated. I can test pretty easily. All of my nodes are Moteino's with RFM69HW radios.

    Thanks again for everyone's efforts and work to make ATC a reality in the MySensors codebase!

  • @frencho @BenCranston
    This is my implementation of PR440

    first download new RFM69 driver from LowPowerLab https://github.com/LowPowerLab/RFM69/archive/master.zip
    Replace the files from libraries\MySensors\drivers\RFM69 (copy all and replace)

    Change in file RFM69.cpp line 31-32

    #include <RFM69.h>
    #include <RFM69registers.h>


    #include "RFM69.h"
    #include "RFM69registers.h"

    in RFM69_ATC.cpp line 32-34

    #include <RFM69_ATC.h>
    #include <RFM69.h>   // include the RFM69 library files as well
    #include <RFM69registers.h>


    #include "RFM69_ATC.h"
    #include "RFM69.h"   // include the RFM69 library files as well
    #include "RFM69registers.h"

    i think this was the driver..

    next was mysensors

    in file libraries/MySensors/MySensor.h line 268

    #include "drivers/RFM69/RFM69_ATC.cpp"

    in file libraries/MySensors/core/MyTransportRFM69.cpp
    first in line 24

    #include "drivers/RFM69/RFM69_ATC.h"

    line 25-26

    RFM69 _radio(MY_RF69_SPI_CS, MY_RF69_IRQ_PIN, MY_RFM69HW, MY_RF69_IRQ_NUM);
    uint8_t _address;


    #ifdef MY_RFM69_Enable_ATC
       RFM69_ATC 	_radio(MY_RF69_SPI_CS, MY_RF69_IRQ_PIN, MY_RFM69HW, MY_RF69_IRQ_NUM);
       RFM69 		_radio(MY_RF69_SPI_CS, MY_RF69_IRQ_PIN, MY_RFM69HW, MY_RF69_IRQ_NUM);	
    uint8_t _address;

    and line 53 idk if this is necessary

    return _radio.sendWithRetry(to,data,len);


    	return _radio.sendWithRetry(to,data,len,5);

    btw i use not the dev version

    https://github.com/mysensors/MySensors/pull/440 see comment from trlafleur

    there is my testing node (molgan PIR )

     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     * Version 1.0 - Henrik Ekblad
     * Motion Sensor example using HC-SR501 
     * http://www.mysensors.org/build/motion
    // Enable debug prints
    #define MY_DEBUG
    // Enable and select radio type attached
    #define MY_NODE_ID 4
    #define MY_RADIO_RFM69
    #define MY_RFM69_FREQUENCY RF69_868MHZ
    #define MY_RFM69_NETWORKID 121
    #define MY_RFM69_Enable_ATC
    #include <SPI.h>
    #include <MySensors.h>
    unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
    #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    #define CHILD_ID 1   // Id of the sensor child
    #define CHILD_ID_RSSI 7 // Id for RSSI Value
    // Initialize motion message
    MyMessage msg(CHILD_ID, V_TRIPPED);
    // Initialize RSSI message
    MyMessage rssiMsg(CHILD_ID_RSSI,V_TEXT);
    void setup()  
      #ifdef MY_RFM69_Enable_ATC
        Serial.println("ATC Aktiviert");
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Molgan-PIR", "1.0");
      // Register all sensors to gw (they will be created as child devices)
      present(CHILD_ID, S_DOOR);
      present(CHILD_ID_RSSI, S_INFO);
    void loop()     
      // Read digital motion value
      boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
      send(msg.set(tripped?"1":"0"));  // Send tripped value to gw 
      int var1 = _radio.RSSI;
      send(rssiMsg.set(var1));  // Send RSSI value to gw
      // Sleep until interrupt comes in on motion sensor. Send update every two minute.
      sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);

    i hope this helps πŸ™‚ im just learing mysensors & co πŸ˜‘


    trlafleur created this issue in mysensors/MySensors

    closed Update RFM69 drivers #440

  • @Fleischtorte Sweet!! This I can do. I'll make the changes and start testing tonight. thanks for the explicit help.


  • @Fleischtorte
    thanks for the details, I'll look into it, as soon as I have my RFM69 GW talking to my RFM69 node

  • @Fleischtorte is your code example working ? I mean do you see the RSSI going down to -70 ?
    Cause on this page https://lowpowerlab.com/2015/11/11/rfm69_atc-automatic-transmission-control/ Felix says we must use a radio.sendwithretry ?!
    I'm a little confused it not working so I'm digging

  • @BenCranston did you get it to work ?

  • @Frencho radio.sendwithretry is used (see line 53 in libraries/MySensors/core/MyTransportRFM69.cpp) and ATC must be enabled on GW/Node (use _radio.enableAutoPower(-70); only on the node side).
    It seems you need continous traffic to see the effect of ATC (i use a simple relay sketch which reports the rssi with every switch command).

  • How is the ATC working out? I think it is a neat feature, but am reluctant to mess with the core MySensors libraries.

  • hi ,

    it works but not very stable... after a while the sensors become offline so i revert to the stable version of MySensors.

  • how is the status now?? Works the ATC now?

  • Hardware Contributor

    it is not included in Mysensors yet as it breaks compatibility with current packet protocol.
    It's planned in an upcoming release, and working well πŸ˜‰

Log in to reply

Suggested Topics

  • 1
  • 16
  • 1
  • 3
  • 5
  • 5