Making servo go around while holding a remote button

I have a project I'm working on, and I am struggling to find out how to make a servo go slowly around while I hold a button on the remote control and an IR receiver.

i have tried to write a "for" loop in a while sentence, for example:

while(key==1340)
{
for(byte x=0;x<180;x++)
servo_base.write (10);
}

And I know that doesn't make sense because write the servo base to 10 degrees 180 times, but I have no clue have to make it go slowly around when I'm just holding the button, and then stop when I don't hold the button

So if someone know how to fix this I would severely take the help I can get :slight_smile:

the whole code is:
some of the comments are in norwegian so i can see it can get a bit confusing..

//
/* Viser knappeverdi på SONY IR-fjernkontroll

  • Bruk 9600 BAUD på monitoren.
    */

// ---------------------------------------------------------------------------------
int ir_pin = 2; // Sensor pin 1 wired through a 220 ohm resistor
int led_pin = 10; // "Ready to Recieve" flag, not needed but nice
int debug = 0; // Serial connection must be started to debug
int start_bit = 2000; // Start bit threshold (Microseconds)
int bin_1 = 1000; // Binary 1 threshold (Microseconds)
int bin_0 = 400; // Binary 0 threshold (Microseconds)
int aktivert = 0; // her sier jeg at aktivert = digital 0
#define on 1 // her sier jeg at on = digital 1
#define off 0 // her sier jeg at off = digital 0
#include <Servo.h> // her includerer jeg bibloteket til servoen
Servo servo_base; // her navngir jeg nederste servoen
Servo servo_arm;
// ---------------------------------------------------------------------------------
void setup() //
{ //
pinMode(led_pin, OUTPUT); // This shows when we're ready to recieve
pinMode(ir_pin, INPUT); //
digitalWrite(led_pin, LOW); // Not ready yet
Serial.begin(9600);
servo_base.attach(13); // her sier jeg at pinnen 13 er til servoen
servo_arm.attach(12); // her sier jeg at pinnen 12 er til servoen
servo_base.write(0); // her sier jeg at servoen nede skal stille seg i posisjon 0 grader
servo_arm.write(0); // her sier jeg at servoen oppe skal stille seg i posisjon 0 grader
delay(1000); //
} //
// ---------------------------------------------------------------------------------
void loop() //
{

int key = getIRKey(); // Les av knappen på fjernkontrollen.
Serial.print("Key Recieved: "); //
Serial.println(key); //
if(key==1337)
{
servo_arm.write (180);
delay(1000);
}
while(key==1340)
{
for(byte x=0;x<180;x++)
servo_base.write (100);
}
if(key==1341)
{
servo_base.write(0);
servo_arm.write(0);
}

Welcome to the forum

Please post your complete sketch so that we can see exactly what you are doing

Hi! Welcome to the forum!

Based on the snippet that you´ve posted, I would say it would be better like this:

while(key==1340)
{
  for(int x=0;x<180;x++) {
    servo_base.write (x);
  }
}

But, as @UKHeliBob wrote, in order for having better advice, it´s recommended that you post your whole code. I don´t know, for example, how you´re checking the received key.

Take some time to read this post:

How to get the best of this Forum

Are you using a proper servo or a continuous rotation "servo" ?

1 Like

I'm using a simple servo from aliexpress that only goes 180 degrees around

i have posted the whole code now, the comments made it a bit messy when it got smashed together but i hope it helps

Thank you for posting the whole sketch but please edit it to add code tags as described in

// ---------------------------------------------------------------------------------
int ir_pin = 2;
int led_pin = 10;
int debug = 0;
int start_bit = 2000;
int bin_1 = 1000;
int bin_0 = 400;
int aktivert = 0;
#define on 1
#define off 0
#include <Servo.h>
Servo servo_base;
Servo servo_arm;
// ---------------------------------------------------------------------------------
void setup()
{
  pinMode(led_pin, OUTPUT);
  pinMode(ir_pin, INPUT);
  digitalWrite(led_pin, LOW);
  Serial.begin(9600);
  servo_base.attach(13);
  servo_arm.attach(12);
  servo_base.write(0);
  servo_arm.write(0);
  delay(1000); //
} //
// ---------------------------------------------------------------------------------
void loop()
{
  int key = getIRKey();
  Serial.print("Key Recieved: ");
  Serial.println(key);
  if (key == 1337)
  {
    servo_arm.write (180);
    delay(1000);
  }
  if (key == 1341)
  {
    servo_base.write(0);
    servo_arm.write(0);
  }
  while (key == 1340)
  {
    for (int x = 0; x < 180; x++)
    {
      servo_base.write (x);
    }
  }
}

hope this helps

There are multiple problems with your code
For example

  while (key == 1340)
  {
    for (byte x = 0; x < 180; x++)
      servo_base.write (100);
  }
  • the value of key does not change in this while loop so it will never exit the loop
  • you are repeatedly writing the same value to the servo so it will not move
  • you have nothing in the for loop to slow it down so it will execute in microseconds even if the servo did move

You did not add the code tags
I have done it for you and have Auto Formatted the code in the IDE too to improve its layout

I know, I was just brainstorming when I wrote that code, and it was the best I could come up with, that's why I needed to get some help outside my own expertise

oh, okey, thanks:)

Start with a position variable set to zero
Let the loop() function do the looping for you
Read the input each time through loop() and if it is, for instance 1340 (I assume that is correct) then increment the position variable and write it to the servo
Don't move it again until some time has passed. You could use the delay() function for this but it would be better to use millis() so that program execution is not blocked but that is a whole other subject

See Using millis() for timing. A beginners guide, Several things at the same time and the BlinkWithoutDelay example in the IDE

You´re calling a function that is not defined in your code:

If I can suggest, try making each part work before joining them. Start with just the servo alone, then just IR alone. Doing that will allow you to understand better how each of the sensors/actuators work.

Starting with a higher difficulty project can be frustrating. :wink:

I agree. That is why I highlighted out 3 separate problems and there are more

thank you so much

i have a function that is defined in the code, its just in another tab so the main code doesnt get so "messy" and long, i can show you that too if you want

No, that´s ok for now. But consider that some people that will try to help you in the future might want to compile your code in order to reproduce compiling errors or misbehaviours. This will be impossible if you do not provide the whole code.

There are already some "attention needed" issues pointed out. You can come back with a 2.0 version of the code.

Have fun! :upside_down_face:

1 Like

I have a project with a servo that is supposed to go slowly around while i hold in a key on the remote control, it takes the same code from every button on the remote control until the "for sentence" is done..

Does anyone have a clue on how to fix this..

//
/* Viser knappeverdi på SONY IR-fjernkontroll
 * Bruk 9600 BAUD på monitoren. 
 */
//============================BIBLOTEKER==============================================================
 #include <Servo.h>                   // her inkluderer jeg bibloteket til servoen
// ---------------------------------------------------------------------------------
int ir_pin = 2;                       // Sensor pin 1 wired through a 220 ohm resistor
int led_pin = 10;                     // "Ready to Recieve" flag, not needed but nice
int debug = 0;                        // Serial connection must be started to debug
int start_bit = 2000;                 // Start bit threshold (Microseconds)
int bin_1 = 1000;                     // Binary 1 threshold (Microseconds)
int bin_0 = 400;                      // Binary 0 threshold (Microseconds)
int aktivert = 0;                     // her sier jeg at aktivert = digital 0
#define on 1                          // her sier jeg at on = digital 1
#define off 0                         // her sier jeg at off = digital 0
Servo servo_base;                     // her navngir jeg nederste servoen 
Servo servo_arm;                      // her navngir jeg overste servoen
Servo servo_griper;                    //her navngir jeg servoen som griper tak i ting (ikke i bruk atm)
//===============================SETUP STARTER HER=========================================================
void setup()                          // 
{                                     //
 pinMode(led_pin, OUTPUT);            // her setter jeg LED lyse som en utgang
 pinMode(ir_pin, INPUT);              // her setter jeg IR mottakeren som en input
 digitalWrite(led_pin, LOW);          // Not ready yet
 Serial.begin(9600);                  // her sier jeg at monitoren star starte 
 servo_base.attach(13);               // her sier jeg at pinnen 13 er til servoen
 servo_arm.attach(12);                // her sier jeg at pinnen 12 er til servoen
 servo_griper.attach(11);             // her sier jeg at pinnen 11 er til servoen
 servo_base.write(90);                 // her sier jeg at servoen nede skal stille seg i posisjon 0 grader
 servo_arm.write(90);                  // her sier jeg at servoen oppe skal stille seg i posisjon 0 grader
 delay(1000);                         // her setter jeg et delay på 1 sekund (1000ms) 
}                                     //  her slutter setupen
//=================================LOOP STARTER HER========================================================
void loop()                           //
{                                     //
                                      //
 int key = getIRKey();                // Leser hvilken knapp som blir trykket på fjernkontrollen. 
 Serial.print("Key Recieved: ");      // her skriver monitoren "Key Recieved"
 Serial.println(key);                 // her skriver monitoren hvilken knapp som blir trykket på kontrolleren
 if(key==1337)                        // her er en if "sløyfe" som sier
  {                                   // at hvis knapppen som har koden 
    servo_arm.write (180);            // 1337 blir trykket så vil servoen som er øverst stilles seg i posisjon 180 grader
    delay(10);                        // her er et delay på 10ms slik at servoen rekker og stille seg i posisjon
  }                                   // her slutter if setningen
     if(key==1291)                    // her starter en ny IF "sløyfe"
 {                                    //  i denne if "sløyfen" så sier jeg at når de trykker den midteste knappen
  servo_base.write(90);                // på fjernkontrollen så skal  hele armen stille seg i grund posisjon
  servo_arm.write(90);                 // som er 0 grader
 }                                    // og her slutter IF "sløyfen"
 if(key==1404)                        // her starter en while "sløyfe" der 
  {                                   // hvis knappen med kode 1340 holdes inne
   int key = getIRKey();              // så vil  servoen som er nederst gå sakte til høyre
   for(byte x=x;x<180;x++)             // her er en for "sløyfe" som gjør det muligt for variablen å gå oppover i verdi
    {                                 // denne variablen er det som sier hvilken grad servoen skal stå i
      servo_base.write (x);           // og her sier jeg at servoen skal skrive ut den variablen
      int key = getIRKey();           // her leser jeg av fjernkontrolleren
    }                                 // her er for "sløyfen" ferdig
  }                                   // her er while "sløyfen" ferdig
 if(key==1403)                        // her starter en while "sløyfe" der
  {                                   // hvis knappen med kode 1338 holdes inne
   int key = getIRKey();              // så vil  servoen som er nederst gå sakte til venstre
   for(byte b=180;b>b;b--)             // her er en for "sløyfe" som gjør det muligt for variablen å gå nedover i verdi
    {                                 // 
      int key = getIRKey();           // denne variablen er det som sier hvilken grad servoen skal stå i 
      servo_base.write (b);           // og her sier jeg at servoen skal skrive ut den variablen
                                      // her så leser den av om knappen fortsatt holdes inne
    }                                 // her er for "sløyfen" ferdig
  }                                   // her er while "sløyfen" ferdig
   if (key==1280)
   {
    for(byte i=0;i<10;i++)
    servo_arm.write (30);
    delay(50);
    servo_arm.write (110);
    delay(50);   
                                       
   }
}                                     // her er loopen ferdig og den starter fra top igjen
//================================LOOP FERDIG HER================================================
int getIRKey() 
{
 int data[12];
 digitalWrite(led_pin, HIGH);         //Ok, i'm ready to recieve
 while(pulseIn(ir_pin, LOW) < 2200)   //Wait for a start bit
 {}
 data[0] = pulseIn(ir_pin, LOW);      //Start measuring bits, I only want low pulses
 data[1] = pulseIn(ir_pin, LOW);
 data[2] = pulseIn(ir_pin, LOW);
 data[3] = pulseIn(ir_pin, LOW);
 data[4] = pulseIn(ir_pin, LOW);
 data[5] = pulseIn(ir_pin, LOW);
 data[6] = pulseIn(ir_pin, LOW);
 data[7] = pulseIn(ir_pin, LOW);
 data[8] = pulseIn(ir_pin, LOW);
 data[9] = pulseIn(ir_pin, LOW);
 data[10] = pulseIn(ir_pin, LOW);
 data[11] = pulseIn(ir_pin, LOW);
 digitalWrite(led_pin, LOW);
 
 if(debug == 1) 
 {
   Serial.println("-----");
 }
 
 for(int i=0;i<11;i++)                //Parse them
  {
   if (debug == 1) {
       Serial.println(data[i]);
   }            
   if(data[i] > bin_1) {              //is it a 1?
     data[i] = 1;
   }  else {
     if(data[i] > bin_0) {            //is it a 0?
       data[i] = 0;
     } else {
      data[i] = 2;                    //Flag the data as invalid; I don't know what it is!
     }
   }
 }
 
 for(int i=0;i<11;i++)               //Pre-check data for errors
  {
   if(data[i] > 1) {                
     return -1;                       //Return -1 on invalid data
   }
 }
 int result = 0;  
 int seed = 1;                                      
 
 for(int i=0;i<11;i++)               //Convert bits to integer
  {
   if(data[i] == 1) 
   {
     result += seed;
   }
   seed = seed * 2;
 }
 
 return result;                       //Return key number
}

i have a video of it but Arduino won't let me post it because I'm new on the forum

    for (byte x = x; x < 180; x++)

Whatever else is going on that is a very strange way to initialise the loop variable of a for loop

Did you perhaps mean to use

    for (byte x = 0; x < 180; x++)