Go Down

Topic: problem rc receiver signal (Read 2340 times) previous topic - next topic

Jan 23, 2013, 11:50 pm Last Edit: Jan 24, 2013, 12:16 am by mustang493 Reason: 1
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.

Code: [Select]
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

#1
Jan 24, 2013, 12:09 am Last Edit: Jan 24, 2013, 12:17 am by mustang493 Reason: 1
the three stick positions are giving me three values 14072, 14435 and 14925 (plus or minus 1-6)

KeithRB

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

johncc


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) {...

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.

KeithRB

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

johncc


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


True that!

KeithRB

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

Code: [Select]
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);
  }
}

Arrch

Code: [Select]

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


Can be simplified to

Code: [Select]
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.

johncc


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.

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

Arrch


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:

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

Go Up