cualquier respuesta puede ser de ayuda

hola estoy en búsqueda de respuestas
para poder construir un follow focus
que es lo que quiero lograr?: es generar un valor con un potentiometer, Y registrarlo en un botón
después generar un segundo valor con el mismo potentiometer, Y registrar el segundo valor en un segundo botón, Para que posteriormente cuando precione el button1, el servo lea el valor de boton1 y se mantiene en esa posición, Y cuando presiono el button 2, El servo lee el button2 y se mantiene en esa posicion
y de esa manera poder designar valores en los botones sin la necesidad de una computadora

ejemplo de lo que quiero lograr:
pongo el potentiometer en el valor 90 (lo que hace que el servo valla a 90°)

yo preciono el boton1 (el arduino lee el valor y lo almacena)

pongo el potentiometer en el valor 70 (lo que hace que el servo valla a 70°)

yo preciono el boton2 (el arduino lee el valor y lo almacena)

después cada vez que yo empuje el boton1 el arduino manda el servo a la posición 90°
y lo mismo para el boton 2

y quiero poder cambiar los valores de cada boton todo el tiempo después de ejecutarlos varias veces

suena bonito
pero mi conocimiento no me es suficiente para poder hacerlo yo solo

leo mucho
pero mi ingles es muy pobre
estoy pidiendo ayuda cualquiera que sea tu conocimiento me puede servir .
cualquier respuesta puede ser de ayuda

yo no busco hacerlo únicamente de esta forma, si existe otra forma de hacer el mismo resultado mas fácil me gustaría saberla
gracias por sus respuestas
que código necesito?

Para controlar servos échale un vistazo al siguiente tutorial http://arduino.cc/es/Tutorial/Knob

Se me ocurre que para configurar los botones hagas una función que los configure. En esta función muevas el potenciómetro a la posición que deseas y cuando aprietes uno de los botones se guarde en la variable del botón, esto lo haces 2 veces (ya que tienes 2 botones). La llamada a esta función deberías de definir como la quieres, podrías utilizar otro botón, llamarla cada x veces que ejecutes los otros botones, llamarla si tienes un botón pulsado x tiempo ... Esto lo debes definir según te convenga.

Una vez configurados los botones lo que tienes que hacer es cuando los pulses escribir la variable que tiene ese botón asignada al servo.

Los tutoriales básicos de arduino en español los tienes en el siguiente enlace: http://arduino.cc/es/Tutorial/HomePage

Saludos chato_sat.

gracias por tu respuesta
pues publique este mismo post en ingles y me mandaron a checar la Escritura de EEPROM (Guarda los valores leídos desde la entrada analógica 0 en la memoria EEPROM. Estos valores quedarán en la EEPROM cuando la placa se apague y pueden ser leídos mas tarde por otro programa)

pero el problema es que nunca he echo un código y no se como poner la lectura de EEPROM en un botón
al igual que no se como poner el borrado de EEPROM en un botón, para así poder usar los botones con nuevos valores

Te animo a que intentes hacer el código tu misma, en el enlace que te he puesto de tutoriales hay bastantes ejemplos sencillos y te explican muy bien el código. Te será de gran ayuda para empezar a programar.

Si los datos los quieres guardar de forma permanente tendrás que hacer uso de la EEPROM, ya que esta memoria es no volátil. Para saber como leer y escribir en la EEPROM échale un vistazo a los siguientes enlaces:

Escribir EEPROM: http://arduino.cc/es/Tutorial/EEPROMWrite
Leer EEPROM: http://arduino.cc/es/Tutorial/EEPROMRead

Saludos chato_sat

ok ami tambien me gustaría crear el código
pero encuentro unas palabras o símbolos que no bienes definidos en el (vocabulario aduino), puedo hacer especulaciones de lo que significan pero me gustaría saber real mente a que se refiere por ejemplo

estoy leyendo el código de (Escritura de EEPROM) y me encuentro que dise:

#include <EEPROM.h>

// la direccion actual en la EEPROM A QUE SE REFIERE CON ( la direccion actual en la EEPROM )
// (p.e. cual es el siguiente byte a escribir) QUE SIGNIFICA ( p.e )
int direccion = 0;

void setup()
{
}

void loop()
{
// Necesita dividir la lectura entre 4 porque el valor analogico estará entre 0 t 1023
// y cada byte de la EEPROM puede contener valores entre 0 y 255
int valor = analogRead(0) / 4;

// Escribe cada valor en la posición apropiada de la EEPROM.
// Estos valores quedarán en la EEPROM cuando la placa se apague. ok me parese claro pero como puedo designar botones, para que cuando lo presioné comience a leer el valor
EEPROM.write(direccion, valor)

// incrementa "direccion" en 1 para avanzar a la siguiente dirección de la EEPROM si me responden la primer pregunta creo que también se aclara esta cual es la siguiente dirección
direccion = direccion + 1;

// Solamente hay 512 bytes de EEPROM, desde 0 hasta 511 lo que entiendo aquí es que se ejecuta en automático cada función por orden
// Si estamos en la direccion 512, volvemos a la dirección 0 como designo las funciones en botones
if (direccion == 512)
direccion = 0;

delay(100);
}

// la direccion actual en la EEPROM A QUE SE REFIERE CON ( la direccion actual en la EEPROM )
// (p.e. cual es el siguiente byte a escribir) QUE SIGNIFICA ( p.e )

La EEPROM es una memoria que no es volátil y como tal se pueden almacenar datos de manera permanente (que no se borren cuando apagamos el arduino). El arduino uno contiene 1KB de memoria EEPROM, lo que quiere decir que podemos escribir hasta 1024 bytes en ella.

Con la dirección se refiere en cuál de los bytes que contiene la EEPROM queremos escribir. Por ejemplo si queremos escribir en el primer byte de la EEPROM pondremos direccion=0.

p.e. es la abreviación de "por ejemplo"

// Estos valores quedarán en la EEPROM cuando la placa se apague. ok me parese claro pero como puedo designar botones, para que cuando lo presioné comience a leer el valor

Esta pregunta se puede resolver de muchas formas, yo te aconsejo que al principio del programa (Si ya tienes los valores guardados en la EEPROM) leas ese valor y lo asignes a una variable y cuando pulses un botón escribas la variable en el servo.

// incrementa "direccion" en 1 para avanzar a la siguiente dirección de la EEPROM si me responden la primer pregunta creo que también se aclara esta cual es la siguiente dirección
direccion = direccion + 1;

Aquí lo que se hace es decir que se quiere escribir el siguiente byte de la EEPROM

/ Solamente hay 512 bytes de EEPROM, desde 0 hasta 511 lo que entiendo aquí es que se ejecuta en automático cada función por orden
// Si estamos en la direccion 512, volvemos a la dirección 0 como designo las funciones en botones

Efectivamente este programa lo que hace es guardar los valores que leemos desde el pin analógico 0 en la EEPROM de forma secuencial desde el 0 hasta el 512 y cuando llega a este volvemos a empezar.

Intentaré crear un pequeño programilla y lo comentaré lo máximo posible para intentar ayudarte lo máximo posible, pero te aconsejo que le eches un vistazo a los tutoriales e intentes comprender línea a línea todo el código de cada uno de los ejemplos.

Saludos chato_sat.

muchas gracias chato_sat

tu explicación es mas clara que el agua

por su puesto estoy checando los tutoriales pero como ya dije la primera vez que escuche la palabra arduino fue hace 4 semanas cuando descubri lo que se puede hacer no lo pensé 2 veces y lo compre, rápidamente hice el follow focus (es un sistema para enfocar lentes (de cámaras de vídeo) muy precisos con una precisión y selección exacta ) con el código de la librería de servo es por eso que no tuve problemas con el código pero ahora necesito algo mas avanzado.
publique mi problema en ingles y alguien me izo este código
lo cual es genial pero también quiero poder hacer mis propios códigos
quiero lograr entender este para aplicarlo a mis necesidades me puedes ayudar a entenderlo

a qui esta

//
// FILE: test.pde
// AUTHOR: rob tillaart
// VERSION: 0.1.00
// PURPOSE: servo test app
//
// HISTORY:
// 0.1.00 - 2011-05-15 initial version
//

#include <Servo.h>

#define BUTTON1 4
#define BUTTON2 5
#define POTPIN A0
#define SERVOPIN 9

int pot = 0;
int servoValue;

Servo myservo;

// two memories to hold servo positions
int mem1 = -1;
int mem2 = -1;

void setup()
{
Serial.begin(9600);
Serial.println("Start ..");

pinMode(BUTTON1, INPUT);
pinMode(BUTTON2, INPUT);
digitalWrite(BUTTON1, HIGH); // internal pullup
digitalWrite(BUTTON2, HIGH); // internal pullup

myservo.attach(9);
myservo.write(90); // set servo to mid-point
}

void loop()
{
// READ POT
pot = analogRead(POTPIN)/4; // 0..1023
servoValue = pot/4;

// CHECK BUTTONS PRESSED
if (digitalRead(BUTTON1) == LOW) // pressed
{
if (mem1 == -1) // not pressed before
{
mem1 = servoValue; // remember current value
}
else
{
servoValue = mem1; // use remembered value
}
}
if (digitalRead(BUTTON2) == LOW)
{
if (mem2 == -1)
{
mem2 = servoValue;
}
else
{
servoValue = mem2;
}
}

// SET SERVO
Serial.print("SERVO: ");
Serial.println(servoValue);

myservo.write(servoValue);
delay(10);
}

Cualquier duda que tengas estaré encantado de ayudarte.

En principio veo que el código es correcto, sólo me mosquea un poco esta parte:

// READ POT
pot = analogRead(POTPIN)/4; // 0..1023
servoValue = pot/4;

En ella hace que el servoValue tenga valores desde 0 hasta 63 y la librería servo.h admite los valores de 0 a 180 (que son supuestamente los grados máximos del servo) con lo cual está limitando el servo a 63 grados.

La primera vez que pulsas un botón se guarda el valor en una variable para que las sucesivas pulsaciones de ese botón el servo vaya hacia esa posición. Lo que pasa es que si sueltas el botón el servo volverá a la posición que le marque la resistencia. No se si esto es lo que quieres o que cuando pulses el botón y mientras no pulses otro botón el servo se mantenga en la posición del último botón pulsado (no se si me he explicado).

Los botones una vez pulsados la primera vez, no puedes volver a cambiarles el valor, a no ser que reinicies el arduino.

También al no usar la EEPROM todo lo que guarda es volátil, es decir que cada vez que inicies el arduino deberás configurar los 2 botones de nuevo.

Todo esto que he dicho ha sido desde la teoría ya que yo no he probado el código. Para cualquier modificación no dudes en postearlo y estaré encantado de ayudarte.

Saludos chato_sat.

claro pues si te entiendo lo que dices

es correcto eso no es exactamente lo que busco aunque se acerca mucho. por el día de hoy ya no pude probar el código en la placa por que no tengo botones pero mañana los compro

lo que quiero es presionar el botón1 y que el servo mantenga la posición que se le dio al botón1 asta que presione otro botón, como el botón2 entonces el servo abandona la posición del boton1 y se va a la posición que se le dio al boton2 incluso quiero poner 3 o mas botones que hagan eso mismo. Entonces despues de que los botones fueron utilizados para registrar el valor del potentiometro y pulsados para ejecutar la orden
devo poder borrar sus valores y poder volver a otorgar nuevos valores una infinidad de veces. al igual que variar la velocidad en la que va de boton1 a boton2 o boton3
el código que me permita hacer eso seria el código perfecto

una vez mas gracias chato_sat me estas abriendo las puertas a todo un mundo
la verdad es que ya no sabia en donde buscar ayuda intente en muchos lados nunca con exito

entonces para lograr lo que quiero es necesario hacer unas modificaciones a este código o es mejor empezar de cero?

Hola myriam.

Este código puede ser un buen comienzo ya que utiliza botones, potenciómetro y servo que es lo que tú quieres. Intenta entender línea a línea que es lo que hace y hazle modificaciones poco a poco hasta conseguir lo que quieres.

Un consejo utiliza Serial.print para ver por la consola del arduino que es lo que está haciendo el programa en todo momento. En este código no las utiliza, pero te aconsejo que declares funciones que tengan una finalidad concreta, ya que así el código se te quedará más legible (como puede ser configurar los botones, leer la configuración inicial, mover servo, ...).

Saludos chato_sat.

y si pones un interruptor que active el modo grabación y el modo reproducción?

algo tipo:

if (grabación on)
si aprieto botoón grabo la lectura del pot en la memoria del boton
else(grabación off)
si aprieto botón mando el valor de la memoria al servo

claro aero_yo gracias
eso me gustaría mucho es justo lo que quiero
gracias por tu cooperación

de nada! Si cojo un rato entro hoy y mañana te escribo algo más claro, es que me ando un poco liado :frowning:

estoy a punto de ir a comprar los botones a una tienda muy cerca de mi casa, la cosa es que no me gustaría comprarlos ya que estoy en espera de un lote de botones que compre por internet en eBay muy baratos ,
la razón por la que no quiero comprar en la tienda es por que por el precio de 2 botones es el mismo precio con el que puedo comprar 10 en internet. bueno y mirando en mis cosas encontré un teclado muy viejo
y me gustaría saber si puedo rescatar estos botones y utilizarlos para el arduino

a qui la foto




lo puedo usar?

Sí, claro que los puedes usar. Lo que pasa es que tendrás que ingeniartelas para conectar esos conectores de la placa a tu arduino (supongo que soldando cables o pines sobre ellas con cuidado se podrá hacer). Por lo que se aprecia en la ultima foto que has subido la patilla de la derecha parece ser el común y cada una de las otras salidas corresponde a uno de los switch. Para comprobar que switch es cada patilla puedes seguir su pista o utilizar un multímetro para medir continuidad.

En el caso del programa que has puesto el común debería de ir conectado al gnd del arduino para que al pulsarlos te de el valor LOW.

Ánimo y saludos chato_sat.

pues listo de pues de una soldadura complicada (por que fue muy difícil que la soldadura se pegara) ya tengo mi linea de botones y ....
efectivamente como lo dijo chato_sat el servo solo se mueve 63°
entonces probare cambiar los valores.... bueno pues ya lo probé ahora si da los 180
pero todavía no se cono cambiar la velocidad al y igual que lo que ya explique anteriormente (que se quede en la posición de los botones asta la siguiente orden)

Con cambiar velocidad a que te refieres??

Si te refieres a la velocidad con que se mueve de un punto a otro para que no cambie tan brúscamente puedes probar a hacer una función del tipo:

void moverA(int posicionActual, int posicionFinal) {
if (posicionFinal > posicionActual) {
for (int i=posicionActual; i<posicionFinal; i++) {
myservo.write(i);
delay(100);
}
} else {
for (int i=posicionActual; i>posicionFinal; i--) {
myservo.write(i);
delay(100);
}
}
}

i++ e i-- sería el paso de grados que quieres, aquí está establecido de 1 en 1 grado. También puedes hacer con delay que se espere más o menos tiempo.

Para que se quede en la posición anterior hasta la siguiente orden puedes hacer lo que dijo el compañero aero_yo: Poner otro interruptor que indique en que modo estás, es decir, si lo pulsas entras en modo grabación y si no envías los valores de los botones.

Espero que te sirva.

Saludos chato_sat

Con cambiar velocidad a que te refieres??

Si te refieres a la velocidad con que se mueve de un punto a otro para que no cambie tan brúscamente puedes probar a hacer una función del tipo:

me refiero a poder aumentar la velocidad con botones para poder cambiar las posiciones del servo de b1 a b2 en 3 velocidades diferentes

ejemplo
después de haber registrado las posiciones del servo en los botones

b1 manda el servo a 90
b2 manda el servo a 110
b3 manda el servo a 120
presiono otros botónes como b6y b7 y aumenta o disminuir la velocidad de rotación del servo
entonces puedo ejecutar nueva mente
b1 y mandar a 90 en una velocidad mas lenta
etc.etc

estas velocidades no tienen que borrarse cada vez que se RST la placa pueden ponerse una ves y ya
por lo pronto tengo que ir al mundo real y salir a comprar comida
en cuanto a el nuevo codigo que me mandaste muchas gracias lo checo regresando

en cuanto a esto

y si pones un interruptor que active el modo grabación y el modo reproducción?

algo tipo:

if (grabación on)
si aprieto botoón grabo la lectura del pot en la memoria del boton
else(grabación off)
si aprieto botón mando el valor de la memoria al servo

juro que ya intente hacerlo pero no lo logre por que no lo comprendo completamente
como pongo esto en código ?
encanto al código principal ya me queda mucho mas claro

Hola myriam, puedes colocar el código que llevas hasta ahora?? así podré hacer las modificaciones sobre tu código y ayudarte.

Lo de escribir en mayúsculas te sugiero que no lo hagas en futuros post, ya que las mayúsculas no dan mucho gusto en los foros porque dan la sensación de que estás gritando.

Saludos chato_sat