Need help with IR controlling an servo turret (ON/OFF)

Hey, i want to controll a servo turret with the arduino “IR-Kit”. The turret works just fine, but i cant find out how to Turn the turret movement off / on with the remote control. In the seriall monitor i see “45” if i press the on-button. Thanks for helping.

Here is my code:
#include <Servo.h> //Eine Bibliothek wird benötigt, um die Servos anzusprechen.
#include <IRremote.h>
#define Knopf_An 45
#define Knopf_Aus 47
boolean Schalter = false;
const byte IR_RECEIVE_PIN = 10;
decode_results results;

Servo Servo1;
Servo Servo2;

int ControllerX = 0; //Pin 0 (Analog) für den Wert X des Joysticks
int ControllerY = 1; //Pin 1 (Analog) für den Wert Y des Joysticks

int servo1 = 3; //Pin 3 für Servo 1
int servo2 = 5; //Pin 5 für Servo 2

void setup(){
Servo1.attach(servo1); //Servos werden als Servos deklariert
Servo2.attach(servo2);
Serial.begin(9600);
Serial.println(“IR Receive test”);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
pinMode(13,OUTPUT);
}

void loop(){
IR();
switch(results.value == 45){
case 45:
digitalWrite(13,HIGH);
Bewegung();
break;

case 47:
digitalWrite(13,LOW);
break;

}

//Bewegung(); (nur zum Merken)
}

void Bewegung(){

int WertX = analogRead(ControllerX); //Nimmt den Wert X des Joysticks und setzt ihn als WertX

int WertY = analogRead(ControllerY); //Nimmt den Wert Y des Joysticks und setzt ihn als WertY

WertY = map(WertY, 0, 1023, 5, 180); //Zeichnet den Y-Wert des Controllers auf, um ihn auf den Servo anzuwenden.

WertX = map(WertX, 0, 1023, 5, 180); //Zeichnet den X-Wert des Controllers auf, um ihn auf den Servo anzuwenden.

Servo1.write(WertX); //Aktualisiert den Wert des Servos mit der Position des Controllers. (X-Wert)

Servo2.write(WertY); //Aktualisiert den Wert des Servos mit der Position des Controllers. (Y-Wert)

delay(7); //Damit der Arduino nicht jeden “Tick” den Wert aktualisiert

}

void IR(){
if (IrReceiver.decode())
{
Serial.println(IrReceiver.decodedIRData.command, HEX);
IrReceiver.resume();
}

}

This is not correct.

Please review what, results.value == 45 evaluates to :wink: .

Try printing results.value to see what the value is.


BTW

int ControllerX = 0; //Pin 0 (Analog) für den Wert X des Joysticks
int ControllerY = 1; //Pin 1 (Analog) für den Wert Y des Joysticks
This way of coding will bite you in the butt some day.

This is better:
int ControllerX = A0; //Pin 0 (Analog) für den Wert X des Joysticks
int ControllerY = A1; //Pin 1 (Analog) für den Wert Y des Joysticks

1 Like

switch(results.value == 45)

change to
switch(results.value)

What I was trying to do was teach someone to fish.

Thanks for your quick answer !
I corrected the code now a bit. But if i press any button on the remote control, the LED on pin13 lights up short and nothing else happens. Im quiet new to Arduino, so i dont know the problem… also the library i use “IRremote” was updated.
Here the corrected code:
#include <Servo.h> //Eine Bibliothek wird benötigt, um die Servos anzusprechen.
#include <IRremote.h>
#define Knopf_An 45
#define Knopf_Aus 47
boolean Schalter = false;
const byte IR_RECEIVE_PIN = 10;
decode_results results;

Servo Servo1;
Servo Servo2;

int ControllerX = A0; //Pin 0 (Analog) für den Wert X des Joysticks
int ControllerY = A1; //Pin 1 (Analog) für den Wert Y des Joysticks
int servo1 = 3; //Pin 3 für Servo 1
int servo2 = 5; //Pin 5 für Servo 2

void setup(){
Servo1.attach(servo1); //Servos werden als Servos deklariert
Servo2.attach(servo2);
Serial.begin(9600);
Serial.println(“IR Receive test”);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
pinMode(13,OUTPUT);
}

void loop(){
IR();
Serial.println(results.value);
switch(results.value){
case 45:
digitalWrite(13,HIGH);
Bewegung();
break;

case 47:
digitalWrite(13,LOW);
break;

}

//Bewegung(); (nur zum Merken)
}

void Bewegung(){

int WertX = analogRead(ControllerX); //Nimmt den Wert X des Joysticks und setzt ihn als WertX
int WertY = analogRead(ControllerY); //Nimmt den Wert Y des Joysticks und setzt ihn als WertY

WertY = map(WertY, 0, 1023, 5, 180); //Zeichnet den Y-Wert des Controllers auf, um ihn auf den Servo anzuwenden.

WertX = map(WertX, 0, 1023, 5, 180); //Zeichnet den X-Wert des Controllers auf, um ihn auf den Servo anzuwenden.

Servo1.write(WertX); //Aktualisiert den Wert des Servos mit der Position des Controllers. (X-Wert)

Servo2.write(WertY); //Aktualisiert den Wert des Servos mit der Position des Controllers. (Y-Wert)

delay(7); //Damit der Arduino nicht jeden “Tick” den Wert aktualisiert

}

void IR(){
if (IrReceiver.decode()){
Serial.println(IrReceiver.decodedIRData.command, HEX);
IrReceiver.resume();
}

}

. . .
Serial.println(results.value); // what do you see on your serial monitor (must be set to 9600)

I see the numbers “45”(on) and “47” (off). Ive got it like this now.
If you meant that…

void setup(){
Servo1.attach(servo1); //Servos werden als Servos deklariert
Servo2.attach(servo2);
Serial.begin(9600);
Serial.println(results.value);
Serial.println(“IR Receive test”);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
pinMode(13,OUTPUT);
}

Just to be sure, when you try the examples that come with the library, do these examples work ?

BTW
In the Arduino IDE, use Ctrl T to format your code then copy the complete sketch. Use the </> button from the ‘reply menu’ to attach the copied sketch.

You mean like this ? I tried to load in the “MinimalReceiver” from the Github… i dont know, what should happen but i got his in the seriall monitor “tX⸮p⸮ZhX⸮⸮⸮”

#include <Servo.h> //Eine Bibliothek wird benötigt, um die Servos anzusprechen.
#include <IRremote.h>
#define Knopf_An 45
#define Knopf_Aus 47
boolean Schalter = false;
const byte IR_RECEIVE_PIN = 10;
decode_results results;

Servo Servo1;
Servo Servo2;

int ControllerX = A0;    //Pin 0 (Analog) für den Wert X des Joysticks
int ControllerY = A1;    //Pin 1 (Analog) für den Wert Y des Joysticks
int servo1 = 3;         //Pin 3 für Servo 1
int servo2 = 5;         //Pin 5 für Servo 2


void setup() {
  Servo1.attach(servo1); //Servos werden als Servos deklariert
  Servo2.attach(servo2);
  Serial.begin(9600);
  Serial.println(results.value);
  Serial.println("IR Receive test");
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  pinMode(13, OUTPUT);
}

void loop() {
  IR();

  switch (results.value) {
    case 45:
      digitalWrite(13, HIGH);
      Bewegung();
      break;

    case 47:
      digitalWrite(13, LOW);
      break;

  }

  //Bewegung(); (just to remember)
}



void Bewegung() {

  int WertX = analogRead(ControllerX); //Nimmt den Wert X des Joysticks und setzt ihn als WertX
  int WertY = analogRead(ControllerY); //Nimmt den Wert Y des Joysticks und setzt ihn als WertY

  WertY = map(WertY, 0, 1023, 5, 180); //Zeichnet den Y-Wert des Controllers auf, um ihn auf den Servo anzuwenden.

  WertX = map(WertX, 0, 1023, 5, 180); //Zeichnet den X-Wert des Controllers auf, um ihn auf den Servo anzuwenden.

  Servo1.write(WertX);  //Aktualisiert den Wert des Servos mit der Position des Controllers. (X-Wert)

  Servo2.write(WertY);  //Aktualisiert den Wert des Servos mit der Position des Controllers. (Y-Wert)

  delay(7); //Damit der Arduino nicht jeden "Tick" den Wert aktualisiert

}

void IR() {
  if (IrReceiver.decode()) {
    Serial.println(IrReceiver.decodedIRData.command, HEX);
    IrReceiver.resume();
  }

}

What is your actual serial monitor set to ?

Bautrate is set to 9600. (COM 5)

And please link us to your hand remote.

I use the starter kit from Elegoo.com. There is no specific produkt name for the remote control. I´ve been able to use my remote conrtrol from my TV (Samsung). There i got the numbers 2,7,… on my screen. I changed the UNO board and although the IR-receiver.

This one ?

2021-04-21_9-52-24

This one

I am trying to set up hardware here to see how things interact.

Does this sketch work with your remote ?

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 10;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

im sorry, but it does not really work. Im getting this "The function decode(&results)) is deprecated and may not work as expected! Just use decode() - without any parameter.
"
I have to go now, i will look at it tomorrow.

BTW, where did you get the IR library from? LINK please.
and
What version of the Arduino IDE are you running ?

1 Like

Iam currently running version 1.8.12 of the IDE. The “IRremote” library i use, is directly from the library function inside the IDE… i have no direct link to an download by side the Github (GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols). The version of the library i use is 3.1.0

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.