problem rc receiver signal

Tried this no joy

int rcpin =7;
int motpin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(rcpin, INPUT);
  pinMode(motpin, OUTPUT);
  
}

int val;

void loop()

{
  val = pulseIn(rcpin, INPUT);
  Serial.println(val);
  delay(1000);
   Serial.println(val);
 // if ((val > 14535) && (val < 14335))
 if ( 14335 < val || val < 14535) {
    digitalWrite(motpin, LOW);
  }
  else {
    digitalWrite(motpin, HIGH);
  }
}
 if ( 14335 < val || val < 14535) {

Can be simplified to

if ( val != 14335) {

So you want the LED to be off at that value, and on otherwise? Seems a bit loft to expect it to be EXACTLY that value.

KeithRB:
You have an && there when you want an || (or).

And says if either is false, the result is false.
Or says if either is true, the result is true.

mustang493:
in mid position it is neither therefore the else statement is true??

if ( 14335 < val && val < 14535) // means "if val is between 14335 and 14535
if ( val > 14535) || (val < 14335) ) // means "if val is NOT between 14335 and 14535
if ( 14535 < val || val < 14335) // ditto: "if val is NOT between 14335 and 14535

yes but the mid value is not stable and can range a few points around 14435

mustang493:
yes but the mid value is not stable and can range a few points around 14435

So you need to change it to something like:

const int THRESHOLD = 5;
...
if ( (val > 14435 - THRESHOLD) && (val < 14435 + THRESHOLD) )
{
  // At the midpoint
}

Then you need something like (14330 < val) || (val < 14340))

or (abs (val-14335) < 5)

Arrch i'll give that a go

This thread is a comedy of errors :slight_smile:

Guys, Arrch this worked.

int rcpin =7;
int motpin = 13;
const int THRESHOLD = 5;

void setup() {
  Serial.begin(9600);
  pinMode(rcpin, INPUT);
  pinMode(motpin, OUTPUT);
  
}

int val;

void loop()

{
  val = pulseIn(rcpin, INPUT);
  Serial.println(val);
  delay(1000);
   Serial.println(val);
 // if ((val > 14535) && (val < 14335))
 //if ( 14335 < val || val > 14535) 
 if ( (val > 14435 - THRESHOLD) && (val < 14435 + THRESHOLD) )
 {
    digitalWrite(motpin, LOW);
  }
  else {
    digitalWrite(motpin, HIGH);
  }
}

trying to understand why it worked and not the previous code. could it have something to do with the values continually moving slightly.

exactly. All the other code required the servo to read exactly 14335.

Again, run the code yourself!

sorry guys i can't get my head round this.. i thought if i use val > 14335 it would work for any value greater than 14335 regardless of wether the value moves slightly.

pulseIn(rcpin, INPUT);

shouldn't this be

pulseIn(rcpin, LOW);

I think INPUT is defined as 0 anyway but just to clarify the code shouldn't it be LOW?

KeithRB:
exactly. All the other code required the servo to read exactly 14335.

I never saw any code of the OPs of the form ( (14335 ? val) ?? (val ? 14335)), other than your reply to OP which I thought was a typo and Arrch's misreading of it. Did OP edit his 14335/14535s in the original post?

Again, run the code yourself!

Agreed

Guys thanks for all your help on this, it's late here in the UK so calling it a day. i'll run the code and try and get a better understanding. fantastic forum and thanks for helping me out.

Cheers

mustang493:
sorry guys i can't get my head round this.. i thought if i use val > 14335 it would work for any value greater than 14335 regardless of wether the value moves slightly.

Hard to get your head around because you've gotten a lot of ideas, and some from every one of us has been wrong in one way or the other :slight_smile:
You could probably understand better if you broke it up like this?

  if (val > 15555){
     // joystick is FORWARD
  }
  else if (val < 14444) {
     // joystick is REARWARD
  }
  else {
     // joystick is NEUTRAL
  }

I changed the numbers so we would quit misreading 14335/14535 :slight_smile:

I changed the numbers so we would quit misreading 14335/14535

Actually, this is a perfect illustration of why magic numbers are a bad idea.

#define LOW_VAL 14335
#define HIGH_VAL 14535

if(val < LOW_VAL)
{
}
else if(val > HIGH_VAL)
{
}
else
{
}

means you correct an error/erroneous value in one place, and the logic is far easier to see.

Arrch:

 if ( 14335 < val || val < 14535) {

Can be simplified to

if ( val != 14335) {

So you want the LED to be off at that value, and on otherwise? Seems a bit loft to expect it to be EXACTLY that value.

Actually I think that code simplifies to

if (val < 14535) {

Which is still in error, but not that error :slight_smile:

PaulS:
Actually, this is a perfect illustration of why magic numbers are a bad idea.

Absolutely!