lo he conectado a la placa con una resistencia de 220 ohmios , pero el servo actua deprisa , sin el led hace la funcion despacio
Puede ser que se esté reseteando. Monitoriza por serial a ver si cuando da el salto es porque entra de nuevo en el setup. Si además dices que sólo pasa con el led puesto, me imagino que sea por caída de alimentación, pero ahí mejor que te aconseje otro, que yo con Ohm no tengo mucho trato.
tranquilo hombre gracias de todo , una cosa mas si pongo otro led verde todo igual que el otro se me apagara cuando encienda el verde y viceversa ?
tambien se queda el servo haciendo ruido
este es el codigo pero ahora con el led hace cmo si se resetease a veces y el servo se queda haciendo ruido como dije
#include <Servo.h>
const int LED =4;
Servo myservo;
const int SERVO = 9;
const int BUTTON = 7;
int val = 0;
int old_val = 0;
int state = 0;
int pos = 0;
void setup(){
pinMode(LED, OUTPUT);
myservo.attach(SERVO);
pinMode(BUTTON,INPUT);
myservo.write(45);
}
void loop()
{
val = digitalRead(BUTTON);
if((val ==HIGH) && (old_val == LOW)){
state = 1 -state;
}
old_val = val;
if (state == 1){
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
val = digitalRead(BUTTON);
if ((val == HIGH) && old_val)
{
if (state)
{
state = 0;
for(pos = 0; pos < 45; pos += 1)
{
myservo.write(pos);
delay(20);
}
}
else
{
state = 1;
for(pos = 45; pos>=1; pos-=1)
{
myservo.write(pos);
delay(20);
}
}
old_val = 0;
}
if (val == LOW)
{
old_val = 1;
}
}
mirad ya lo tengo , pero he puesto cuatro leds, pero sigue fallando algunas veces cuando pulsas mirad que podria ser por favor, este codigo es bueno para modelistas de trenes para hacer cambios de via con un servo de aeromodelismo y leds para semaforo, rojo ,verde una pasada , gracias a todos
#include <Servo.h>
const int LED =4 ,LED2 = 3,LED3 = 2,LED4 = 1;
Servo myservo;
const int SERVO = 9;
const int BUTTON = 7;
int val = 0;
int old_val = 0;
int state = 0;
int pos = 0;
void setup(){
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
myservo.attach(SERVO);
pinMode(BUTTON,INPUT);
myservo.write(45);
}
void loop()
{
val = digitalRead(BUTTON);
if((val ==HIGH) && (old_val == LOW)){
state = 1 -state;
}
old_val = val;
if (state == 1){
digitalWrite(LED, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, HIGH);
} else {
digitalWrite(LED,LOW);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,LOW);
}
val = digitalRead(BUTTON);
if ((val == HIGH) && old_val)
{
if (state)
{
state = 0;
for(pos = 0; pos < 45; pos += 1)
{
myservo.write(pos);
delay(20);
}
}
else
{
state = 1;
for(pos = 45; pos>=1; pos-=1)
{
myservo.write(pos);
delay(20);
}
}
old_val = 0;
}
if (val == LOW)
{
old_val = 1;
}
}
mirad os paso un video de lo que hace , y porque lo hace ?
VID_20131031_212902.mp4 (2.28 MB)
Si el problema fuera de soft, creo que el código quedaría menos farragoso así. Mira a ver si lo entiendes:
#include <Servo.h>
const int LED =4 ,LED2 = 3,LED3 = 2,LED4 = 1;
Servo myservo;
const int SERVO = 9;
const int BUTTON = 7;
int val = 0;
int old_val = 0;
bool state = false;
void toleft(){
digitalWrite(LED, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, HIGH);
for(int pos = 45; pos>0; pos--)
{
myservo.write(pos);
delay(20);
}
}
void toright(){
digitalWrite(LED,LOW);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,LOW);
for(int pos = 0; pos < 45; pos ++)
{
myservo.write(pos);
delay(20);
}
}
void setup(){
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
myservo.attach(SERVO);
pinMode(BUTTON,INPUT);
toleft();
}
void loop()
{
val = digitalRead(BUTTON);
if((val ==HIGH) && (old_val == LOW)){
state = !state;
if (state){
toright();
} else {
toleft();
}
}
old_val = val;
}
Si el problema es hardware, ya te dije que no estoy muy puesto, pero por decir algo ¿no habrás conectado el pulsador directamente al arduino sin resistencias?
el codigo funciona de P.M........pero en una posicion el servo hace ruido
esto que es , que significa , para que sirvre? perdona pero no las habia visto a un
bool state = false;
toleft ();
toright();
void toright
Hola. Siento no poderte ayudar con el tema del ruído del servo. Como te dije, en hardware estoy muy verde, y nunca he tratado con servos. Como no sé la causa que provoca ruído en un servo, no sé si la solución será hardware o software.
En cuanto a lo que preguntabas después, se trata de funciones. He definido una función llamada toleft, que realiza el giro del servo y el encendido de luces correspondiente, y otra que se llama toright que realiza el otro giro y encendido. La ventaja de usar funciones es que se mejora la legibilidad del código, y que evitan el código repetitivo.
Donde pongo
void toleft()
{
código de la función....
}
defino una función que realiza su trozo de código, que luego puedo llamar cuantas veces quiera, y desde donde quiera, sencillamente "nombrándola":
toleft();
Imaginate que quieres realizar una secuencia con las vías, de mover a izquierda, esperar x segundos, mover a derecha, esperar y segundos, mover a izquierda, esperar z segundos... sería un poco absurdo volver a repetir el mismo código de semáforos y servo entre los delays. Sin embargo, si ponemos
moveleft();
delay(x);
moveright();
delay(y);
moveleft();
delay(z);
Ahorramos memoria y el código es más legible.
En tu caso, no se nota mucho el "ahorro" de código, porque sólo una de las funciones es llamada en más de un sitio, pero si "confiamos" en que las funciones realizan correctamente su tarea, el loop es mucho más legible.
En cuanto a bool, es una forma de usar un int como un "verdadero o falso". Falso es 0 y verdadero 1, pero es más legible usar true y false.
Vuelve a poner un vídeo de cómo te funciona con el último código que te ha hecho noter por si sabemos ver algo.
si os fijais vereis que al encender arduino el servo se mueve loco hasta que regresa a la posicion 0º eso por que podria estar pasando?
VID_20131101_143551.mp4 (3.62 MB)
Según veo yo funciona bien , ¿no?
Sobre el movimiento del servo al inicio lo que tienes que hacer es quitar las subrrutinas "void toleft()" y "void toright()" de donde están y colocarlas al final del programa, fuera del "void loop()".
Es porque en el setup llamamos a la función toleft. Sustituye en setup la instrucción toleft(); por myservo.write(0). Lo hará bruscamente, pero sólo será un movimiento, en lugar de un movimiento brusco y un barrido.
tengo los motores Pap que puse una foto mas arriba , y si probara el codigo con ellos a ver si es menos brusco pues estuve probando un poco y el movimiento es mas suave que un servo,pues nosotros husamos muchos en aeromodelismo y cuando conectas el receptor del avion da un pequeño salto-movimiento pero aqui ya veis , probare lo que me habeis dicho y ya comento porque no estoy en casa
ya se lo que pasa porque lo hace es porque regresa a la posicion 0º, si apagas cuando el servo esta en el cambio de via que queda a 45º cuando vuelves a encender el arduino regresa a la posicion de 0ºos pongo un video porque una imagen vale mas que mil palabrasest ees con la instruccion toleft()
VID_20131101_222216.mp4 (2.69 MB)
y este con myservo.write(0)
VID_20131101_222803.mp4 (2.53 MB)
Efectivamente, eso era lo que pasaba. Ahora lo que debes preguntarte es: ¿cómo quiero que se comporte el servo al arrancar?
Veo que en la librería también existe el método read, así que supongo que también se pueden tomar decisiones partiendo de la posición actual del servo.
En realidad no, un servo no puede decirte en qué posición está. La instrucción read te dice cuál es la última posición que la librería le envió al servo. Si venimos de estar apagado Arduino no sirve para nada.