problem rc receiver signal

Can anyone see anything wrong with this simple code. Arduino uno, expect the LED on pin 13 to be on or of dependant on the position of the control stick on the rc transmitter. regardless of the stick position the LED remains on.

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);
  if ((val > 14535) && (val < 14335)) {
    digitalWrite(motpin, LOW);
  }
  else {
    digitalWrite(motpin, HIGH);
  }
}

the value is changing when the rc transmitter switch is operated. mid value is 14435 with the full deflections reading 14072 + or - a couple of points and 14926 + or - respectively

the three stick positions are giving me three values 14072, 14435 and 14925 (plus or minus 1-6)

You have( (val >14335) && (val <14335)) since it cannot be both at once, it will always be false.

KeithRB:
You have( (val >14335) && (val <14335)) since it cannot be both at once, it will always be false.

Typo on the numbers, but nice catch!!

That's why I usually format these things something like:
if ( 14335 < val && val << 14535) {...

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

i'll tryif ( 14335 < val && val << 14535) {...

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.

johncc has a bug. He did not mean << he meant '<'. << is the shift operator.

KeithRB:
johncc has a bug. He did not mean << he meant '<'. << is the shift operator.

True that!

Also, the best way to debug these things is to sit down and "run" the code yourself - even if you have to sit with a C reference book in front of you to sort out just what each operator does and precedence issues.

That is how we can look at your code and find problems without actually running it on the Arduino.

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.