zendes / SBUS

Arduino library for the Futaba SBUS protocol

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

NANO V3

opened this issue · comments

Hy, it uses fine on Mega, on UNO but seems stucked on NANO V3 (ATmega328p), is it not possible ? I have add Softawre serial to be able to readsome debugs which work on UNO but no possibility to see anything on Arduino Nano. On a program I am making for rc model lighting using SBUS from channel 9, I get running on UNO but not on Nano. Nothing happens.
I am trying since a week now and a good advice if NANO yes or no would be nice.
Otherwise it is a perfect library.
Thanks for reply,
André

Doesn't work reliably on Pro Mini as well. Initializes once in 50 resets.

Found a workaround which seems to work reliably on Pro Mini:
It merely reboots Arduino until it starts capturing valid packets.
Surprisingly enough this code works pretty good and fast.

#define SBUS_WARM_UP_TIME_MS 100

void(* resetArduino) (void) = 0; //declare reset function at address 0

void setup() {
    sbus.begin(false);

    uint32_t ms = millis();
    while(millis() - ms < SBUS_WARM_UP_TIME_MS) {
        sbus.process();
    }

    if (sbus.getGoodFrames() == 0) {
        resetArduino();
    }
    ...

How do you get it to work on nano? @voroshkov did it not work at all for you at first ? when you used pro mini

@eskaflon, yes - didn't work on Pro Mini until I implemented the "hack" described above.
Tried 2 ProMinis with the same result.
At the same time didn't notice an issue on Uno board.
That's weird because both have ATMega328p chip, 16MHz oscillator and 5V voltage

@voroshkov Weird how it doesnt work on these boards, thanks for the hack. Is this how you used it ?

#include <SBUS.h>
#define SBUS_WARM_UP_TIME_MS 100
SBUS sbus(Serial);

void(* resetArduino) (void) = 0; //declare reset function at address 0


void setup()
{
  sbus.begin(false);

  uint32_t ms = millis();
  while(millis() - ms < SBUS_WARM_UP_TIME_MS) {
      sbus.process();
  }

  if (sbus.getGoodFrames() == 0) {
      resetArduino();
  }
  sbus.begin();
  Serial.begin(115200);
  Serial.println("SBUS Status");
}

// this is timer2, which triggers ever 1ms and processes the incoming SBUS datastream
ISR(TIMER2_COMPA_vect)
{
  sbus.process();
}
...

@eskaflon, no.
On proMini you cannot use sbus & Serial, because Serial is used for sbus. Not sure about timer ISR - didn't try that.

My code is as follows:

...
void setup() {
    sbus.begin(false);
    uint32_t ms = millis();
    while(millis() - ms < SBUS_WARM_UP_TIME_MS) {
        sbus.process();
    }
    if (sbus.getGoodFrames() == 0) {
        resetArduino();
    }
    // also setup pins and other stuff as usual...
    ...
}

void loop() {
    sbus.process();
    ...
    // and the loop should not be long to avoid sbus losing packets
}

What about Arduino micro?