Varias posiciones en servo con boton

Buenas tardes, hace unas semanas que me estoy iniciando en Arduino, a pesar de no poder estar el tiempo que me gustaría para poder aprender voy mirando muchos videos y tutoriales, tengo un proyecto sencillo pero para los novatos como yo todo se hace cuesta arriba, mi idea por el momento es poder controlar un servo en dos posiciones, una a 15º y otra a 40º mediante la pulsación de un botón, a una velocidad de un retardo de 200 milisegundos, he compilado el codigo, pero en la practica el servo no responde como me gustaría, adjunto el codigo a ver si podéis hecharme una mano y ver donde estoy metiendo la gamba?¿ muchas gracias, también pongo el codigo donde el servo si hace los movimientos que quiero, pero sin boton. Graciaaaaaaas :~

El codigo con boton:

#include <Servo.h>

int buttonPin =2;
Servo myservo;
int pos = 0;

int buttonState = 0;
boolean state;

void setup(){
myservo.attach(9);
pinMode(buttonPin,INPUT);
}
void loop(){
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH ){
if (state == false){
state = true;
}
else{
state = false;
}
}

if (state == true){
for(pos = 15; pos < 40; pos += 1)
myservo.write(pos);
delay(200);
}
else{
for(pos = 40; pos>=15; pos-=1)
myservo.write(pos);
delay(200);
}
}

El codigo sin boton y los movimientos que necesito:

#include <Servo.h>

Servo myservo;

int pos = 0;

void setup()
{
myservo.attach(9);
}

void loop()
{
for(pos = 15; pos < 40; pos += 1)
{
myservo.write(pos);
delay(200);
}
for(pos = 40; pos>=15; pos-=1)
{
myservo.write(pos);
delay(200);
}
}

Has puesto resistencia de pulldown en la conexión del botón?

jose:
Has puesto resistencia de pulldown en la conexión del botón?

Si, he puesto una resistencia de 10K
=(

Buenas de nuevo, continuando con el proyecto, he variado completamente el codigo de arduino, ahora hace exactamente lo que necesito al pulsar un pulsador a la velocidad que necesito, pero el problema lo tengo en que al volver a conectar el arduino, el servo vuelve a posicionarse, y necesito que comience desde la posicion en que lo deje, he estado mirando y buscando como grabar en la Eeprom, pero mirando los ejemplos de la web y por todas las respuestas del foro, no logro acertar con el codigo, vuelvo a insistir que soy novato y comenzando, así que agradecería se evitaran los comentarios de los "listillos" tipo, leete los tutoriales, busca en google, etc.. si pregunto es porque no lo entiendo, no porque no quiera buscarlo, gracias.

Aqui el codigo:

#include <Servo.h>

const int servoPin = 9;
const int buttonPin = 2;

int buttonState = 0;
int directionState = 0;

Servo myservo;

int pos = 0;

void setup() {
myservo.attach(9);
pinMode(buttonPin, INPUT);
}

void loop(){

buttonState = digitalRead(buttonPin);

if (directionState == 0){

if (buttonState == HIGH) {
directionState = 1;

for(pos = 15; pos < 40; pos=pos+1)
{
myservo.write(pos);
delay(200);
}
}

} else if (directionState == 1) {

if (buttonState == HIGH) {
directionState = 0;

for(pos = 40; pos>=15; pos=pos-1)
{
myservo.write(pos);
delay(200);
}
}
}
}

Buenas!

Te recomiendo que leas el tuto.. jaja! :wink:

veamos.. puedes grabar cada vez la posicion en la EEPROM (pero que yo sepa, cada vez al finalizar el programa, de modo que cuando vuelvas a conectarlo, lo tendrás disponible, PERO de la manera que te voy a decir yo, cada vez que pase el programa se te grabará una vez y el problema que tiene es que la EEPROM de Arduino te sirve para 100.000 veces entre escribir y borrar (no se si me explico..) en el momento que pases esas 100.000 (puede que sea mas, pero Arduino te garantiza hasta 100.000), la EEPROM casca y deja de funcionar.

a ver si esto te sirve...

#include <EEPROM.h>

void setup()
{
    pos= EEPROM.read(0); // metes en la variable pos el valor de la direccion 0 de la EEPROM
}

void loop()
{
// todo tu programa...
EEPROM.write(0,pos);//aqui guardas en la posicion 0 de la EEPROM el valor de pos
}

Otra opción es la de añadir un pulsador, que al pulsarlo guarde "pos" en la dirección 0 de la memoria, de esa manera se guardará tan sólo cuando tu quieras y no lleagarás a 100.000 veces con tanta facilidad
Despues de esto puedes probar a cambiar de alguna manera esa dirección 0, ya que (según entiendo), el tema de las 100.000 veces es con cada dirección (así suele ser en casi todas las EEPROM).

tifilus:
Buenas!

Te recomiendo que leas el tuto.. jaja! :wink:

veamos.. puedes grabar cada vez la posicion en la EEPROM (pero que yo sepa, cada vez al finalizar el programa, de modo que cuando vuelvas a conectarlo, lo tendrás disponible, PERO de la manera que te voy a decir yo, cada vez que pase el programa se te grabará una vez y el problema que tiene es que la EEPROM de Arduino te sirve para 100.000 veces entre escribir y borrar (no se si me explico..) en el momento que pases esas 100.000 (puede que sea mas, pero Arduino te garantiza hasta 100.000), la EEPROM casca y deja de funcionar.

a ver si esto te sirve...

#include <EEPROM.h>

void setup()
{
    pos= EEPROM.read(0); // metes en la variable pos el valor de la direccion 0 de la EEPROM
}

void loop()
{
// todo tu programa...
EEPROM.write(0,pos);//aqui guardas en la posicion 0 de la EEPROM el valor de pos
}




Otra opción es la de añadir un pulsador, que al pulsarlo guarde "pos" en la dirección 0 de la memoria, de esa manera se guardará tan sólo cuando tu quieras y no lleagarás a 100.000 veces con tanta facilidad
Despues de esto puedes probar a cambiar de alguna manera esa dirección 0, ya que (según entiendo), el tema de las 100.000 veces es con cada dirección (así suele ser en casi todas las EEPROM).

Muchisimas gracias por tu ayuda tifilus !!! :slight_smile: :slight_smile:
Tenía pensado en ampliar la eeprom con un adaptador de tarjeta, he visto algun tuto de como hacerlo y que así la memoria eeprom no llege a su fin, muchas gracias por tu explicación y el codigo, he estado insertandolo en mi codigo pero continúo sin poder guardar la posicion en que el servo estaba, al volver a resetear arduino, el servo se vuelve loco hasta que se para y ya me funciona el boton para hacer lo que necesito, tampoco estoy seguro si lo que quiero se puede hacer, ya que el proyecto lo quiero para poder mover un smart tv de angulo y no quiero quedarme sin tv =(
Lo que necesito es que el servo no se reinicie cada ve que enciendo el arduino, es posible? no he podido conseguirlo con los codigos que me facilitaste , muchas gracias por la ayuda :slight_smile:

tendría que darle una pensada.. estoy con un proyecto que usa un servo, y ahora mismo no recuerdo que hace al iniciar, pero si es posible que vaya al estado inicial...
es decir, en el setup tienes lo siguiente:

int pos = 0;

y es posible que te vaya a esa posicion al iniciar (es asi?).. prueba en vez de eso a poner algo como

int pos;

o

int pos=pos;//esto ya no sé lo que te hará

o

int pos=EEPROM.read(0);

prueba y error! :wink: pero sin tele al principio, claro! jeje! suerte!!