Bueno durante una gran faena la de cambiar liquidcrystal a i2c ,no e parado de hacer cosas una solucionada a gracias a varios "profesionales" y estos me disculpen por entre comillarlos...al lio...despues de seguir varios tutoriales y seguir el foro e podido juntar dos códigos en uno y funcionan,pero mi problema es que el servo con el código original hace el retorno de 180º de ida y vuelta sin paros..... al fuccionar los dos códigos el servo se para unos largos segundos en hacer el retorno...y no doy con ello... y quiero que haga los 180º grados con el paron minimo ,un reto mas para mi en seguir aprendiendo esto es peor que una droga...me a engachado...
Gracias aquí el código fuccionado:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup()
{
pinMode (2,OUTPUT);
pinMode (3,OUTPUT);
pinMode (4,OUTPUT);
digitalWrite(3,HIGH);
digitalWrite (4,HIGH);
digitalWrite (2,HIGH);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}
void loop()
{
for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(10);
}
digitalWrite (2,LOW);
delay (4000);
digitalWrite (2,HIGH);
for (int cuenta = 0;cuenta <5;cuenta++)
{
digitalWrite (3,LOW);
delay (1000);
digitalWrite (3,HIGH);
delay (200);
}
digitalWrite (4,LOW);
delay (5000);
digitalWrite (4,HIGH);
for(pos = 180; pos>=0; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(10);
// waits 15ms for the servo to reach the position
}
}
Podrías copiar el código completo para ver a que se debe esto, probablemente haya algún delay mal ubicado y por eso notas ese retraso, pero solo poniendo el código completo podría revisarlo
Gracias Mike_117 por tu colaboración este es el código del servo "original":
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}
void loop()
{
for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=0; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(15); // waits 15ms for the servo to reach the position
}
}
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
//Fíjate que no inicializo pos, lo hago en el for
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}
void loop()
{
for(int pos=-180;pos<=180;pos++) //Con el valor absoluto vamos de 0 a 180 y de 180 a 0 del tirón
{ // in steps of 1 degree
myservo.write(abs(pos)); // tell servo to go to position in variable 'pos' (abs(pos))
Serial.println(abs(pos));
delay(15); // waits 15ms for the servo to reach the position
}
}
No tengo servos para probarlo, pero así arreglé un error similar con un LED, prueba y nos cuentas. Según tu descripción el error se da al acabar un bucle "for" e iniciar el siguiente, aquí sólo hay uno, cualquier retraso ahora se deberá al motor, y ahí poco se puede hacer.
Por supuesto si no entiendes algo dilo.
Un saludo.
Xtrem3 gracias por tú aporte e probado tu código y si hace lo que yo quiero ida y vuelta sin parar,al poner lo que me as recomendado hace lo mismo que antes, hace un recorrido de ida y vuelta y luego se queda parado unos segundos,no se si estará bien metida la línea en el lugar correspondiente te dejo el código con tus rectificaciones para que lo veas,uns pregunta si al poner el código "correcto" y no se para esos segundos puede ser cosa del motor como dices entonces? y unas preguntilla mas e visto en tutoriales que es aconsaje una fuente externa de alimentación distinta al arduino solo para el servomotor es eso correcto? estaría funcionando solo unas cuatro horas y no todos los días,gracias y un cordial saludo.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup()
{
pinMode (2,OUTPUT);
pinMode (3,OUTPUT);
pinMode (4,OUTPUT);
digitalWrite(3,HIGH);
digitalWrite (4,HIGH);
digitalWrite (2,HIGH);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}
void loop()
{
for(int pos=-180;pos<=180;pos++) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(abs(pos)); // tell servo to go to position in variable 'pos'
Serial.println(abs(pos));
delay(10);
}
digitalWrite (2,LOW);
delay (4000);
digitalWrite (2,HIGH);
for (int cuenta = 0;cuenta <5;cuenta++)
{
digitalWrite (3,LOW);
delay (1000);
digitalWrite (3,HIGH);
delay (200);
}
digitalWrite (4,LOW);
delay (5000);
digitalWrite (4,HIGH);
for(pos = 180; pos>=0; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(10);
// waits 15ms for the servo to reach the position
}
}
Como diría Jack el Destripador, vayamos por partes.
e visto en tutoriales que es aconsaje una fuente externa de alimentación distinta al arduino solo para el servomotor es eso correcto?
Sí, es lo idóneo: en circuitos suficientemente complejos puede que tu placa Arduino no pueda alimentar todo el hardware, además de que puede ser que tu motor directamente requiera una tensión distinta a la que da la placa. Lo suyo es alimentar el motor por su cuenta y usar Arduino sólo para darle instrucciones.
En cuanto a tu programa, lo analizo por encima (el void loop):
-Haces un barrido de izquierda a derecha y de derecha a izquierda con el motor sin parar.
-Apagas el pin 2 y le dices que espere 4 segundos ("delay" hace que tu placa simplemente pare de hacer nada durante los milisegundos indicados).
-Haces que el pin 3 parpadee, 1 segundo encendido, 0,2 apagado, 5 veces= 6 segundos. Lo mismo con el delay.
-Apagas el pin 4, otros 5 segundos y vuelta a encender.
-Haces otro barrido con el motor, pero esta vez sólo en un sentido.
Total, a petición tuya después del primer barrido (izq-der, der-izq) "esperas" 15 segundos (con la placa parada) haciendo otras cosas antes de seguir.
Imagino (confírmamelo o niégamelo) que quieres hacer el primer barrido, que parpadee el pin 2 sin interrumpir el programa original, que parpadee el pin 3 con las mismas, y lo propio con el 4, vaya, que quieres mantener encendidos o apagados los pines sin que ello suponga parar el motor ¿me equivoco?
Si es eso infórmate de la función Millis(), creo que podría ir por ahí la cosa (yo llevo tiempo sin tocar la placa y no domino la función, pero hay chorrocientos ejemplos).
Un saludo.
si es correcto todo lo que afirmas Xtrem3, los leds que se apaguenn y enciendan me da igual si van o no al ritmos del servo pero llevo poco con arduino y sigo tutoriales y aun no estoy muy entendido e pegado un código dentro del otro siguiendo varios tutoriales,con los ejemplos me lio mucho y estoy en esa fase de quiero y no puedo de eso que te encajonas y no ves mas alla de lo que quieres, y este código cuando este terminado tengo que agregarle otro mas pero aun no me a llegado el gps ,asi me voy enterando pero me e quedo en "stamby".
Entonces lo que yo haría en tu lugar y partiendo de que como digo antes no me he puesto aún en serio con millis(), es comprobar al principio del void loop el tiempo que ha pasado y actuar en consecuencia: si el tiempo es múltiplo de 5 (ojo, tendrás que redondear el segundo en el que estés y hacer algo para que no pase más veces de las que quieres) segundos esto se apaga o se enciende, si es de 4 este se apaga/enciende... una vez hecho eso empieza a investigar y modificarlo hasta que quede a tu gusto. Prueba y si no te sale me pongo a investigar (o seguro que alguien te saca del apuro). Yo lo veo interesante para aprender a salir del atolladero programando.
Un saludo.
Vuelvo a repetirte porque no es lo mismo simultáneamente que en etapas.
El servo va de -180 a 180 y vuelve digamos sin parar
Mientras deben parpadear los led de los pines 2,3 y 4?
Eso es lo que esperas que haga?
Insisto con la pregunta porque no me quiero poner a trabajar en algo que luego me digas, ahhhhhhhhh nooooo esto iba asi. o asa.
Traduzco: Imagina que tienes 4 arduinos.
En uno el servo va y viene
En otro parpadea pin2, otro para pin3 y otro para pin4.
Y tu quieres que todo lo haga un solo arduino.
Ahora si. Ahora que quedó claro veo como hacerlo.
Claro que es posible. Pero tuve que darte un ejemplo porque me ha pasado que me pongo a resolver algo, consume mi tiempo y luego el interesado me cambia el objetivo.
Como es dificil entendernos hasta que nos entendemos y valga la explicación retorcidad que doy, es que prefiero preguntar y repreguntar.
Una manera de verlo es esta
tarea SERVO debe realizarse cada 10 mseg
tarea LedPin2 4000 mseg LOW y luego bascular
tarea LedPin3 LOW 1000 mseg HIGH 200 mseg 5 veces.. acá no se si debe repetirse.
tarea LedPin4 5000 mseg LOW y luego bascular
Bueno no lo he probado, solo se que compila sin errores.
NO debería estar muy mal. Lo único que no cumple bien es que la tarea 3, no se repite 5 veces sino indefinidamente
#include <Servo.h>
#define TLED3LOW 1000
#define TLEDHIGH 200
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = -180; // variable to store the servo position
int incremento = 1;
unsigned long tservo;
unsigned long tLed2;
unsigned long tLed3;
unsigned long tLed4;
unsigned long tiempoLed3[] = {TLED3LOW, TLEDHIGH};
bool estadoLed2 = false;
bool estadoLed3 = false;
bool estadoLed4 = false;
void setup()
{
pinMode (2,OUTPUT);
pinMode (3,OUTPUT);
pinMode (4,OUTPUT);
digitalWrite(3,HIGH);
digitalWrite (4,HIGH);
digitalWrite (2,HIGH);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
tservo = millis();
tLed2 = millis();
tLed3 = millis();
tLed4 = millis();
}
void loop() {
if (millis()-tservo > 10UL) {
myservo.write(abs(pos)); // tell servo to go to position in variable 'pos'
Serial.println(abs(pos));
tservo = millis();
pos = pos + incremento;
if (pos >= 180) {
incremento = -1;
pos = 180;
}
if (pos <= -180) {
incremento = 1;
pos = -180;
}
}
if (millis() - tLed2 > 4000UL) {
digitalWrite (2, estadoLed2);
tLed2 = millis();
estadoLed2 = !estadoLed2; // preparo siguiente estado
}
if (millis() - tLed3 > tiempoLed3[estadoLed3]) {
digitalWrite (3, estadoLed3);
tLed3 = millis();
estadoLed3 = !estadoLed3; // arranco con LOW
}
if (millis() - tLed4 > 5000UL) {
digitalWrite (4, estadoLed4);
tLed4 = millis();
estadoLed4 = !estadoLed4; // preparo siguiente estado
}
}
Fantastico! muchas gracias surbyte lo e probado y va a la perfección,no me importa si hace el infinito,poco puedo hacer para ayudarte veo que eres un maquina,espero aprender tanto como tú no será por empeño.
Bueno nuken, yo quiero que mas alla de que estes aprendiendo releas tu hilo completo y justamente pongas énfasis en como te has explicado.
EL problema es transmitir debidamente tu idea. Lo que deseas que haga algo.
Cuando lees el post#1 nunca hablas de querer hacer las cosas simultáneamente, solo pones énfasis en que en un momento se para.
SIEMPRE y lo pongo en mayúsculas, QUE SE USA DELAY el programa SE DETIENE.
Si quieres que algo fluya NUNCA USES DELAY.
Es la mejor lección que debe quedarte de este tema, para ti y para quien lo lea.
DELAY es solo para ejecutar una secuencia determinada sin importarme el resto de lo que pase.
Ahora si tienes que estar atento a eventos de cualquier tipo, olvidate del DELAY.
EN otras palabras, delay es para la escuela primaria (los comienzos de arduino) y cuando pasas a la secundaria o universidad debes usar millis(), si lo requiere el programa claro está.