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:
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
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);
}
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.
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
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
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.
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.
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