Hola a todos
Conoceis alguna Librería que regule la velocidad de los Servos, para hacer más suave su movimiento.???
He estado buscando en Google y en búsquedas de Arduino y no he encontrado nada satisfactorio.
Gracias de antemano !!!... ...
Hola a todos
Conoceis alguna Librería que regule la velocidad de los Servos, para hacer más suave su movimiento.???
He estado buscando en Google y en búsquedas de Arduino y no he encontrado nada satisfactorio.
Gracias de antemano !!!... ...
Lo mío es muy rudimentario, pero me funciona para amortiguar los movimientos bruscos que se hacen con los mandos de PS2, o otros sensores.
Hi,
Haz tratado usando un delay de pulso a pulso. Para el delay debes de usar millis.
Hola @felix-rojo " Rey de los muñecos "
Probare tus lineas, estoy dando un"pateo" por librerías, no me rindo.
(Como van tus chispas ????)
Gracias por tu colaboración !!! ... ....
Hola @tauro0221
Supongo que te refieres a delay/millis dentro de una sentencia for ????
Gracias por el "empujon" !!! ... ...
No, sin delay ni millis, el ciclo ya le hace suavizar el impulso, si quieres mas lentitud le sumas solo uno o dos. Pruébalo,
Ojo, que yo usando delay me quedo solo, a veces pienso que a las próximas generaciones no les quedarán ningún delay para sus programas. (Si lo necesitas le pones algo "delay 20", perderé mi poco prestigio diciendo esto, pero funciona.
.
Hola a todos:
Al fin, después de estar batallando contra Google , Github y otras historias, he conseguido descargar el zip de VarSpeedServo.h.
He hecho un sencillo código que me abre una serie de posibilidades para los Servos.
/*
*
* SERVO CON VELOCIDADES VARIABLES
*
* Aqui el link a GITHUB:
*
* https://github.com/netlabtoolkit/VarSpeedServo/blob/master/examples/ServoSequence/ServoSequence.ino
*
*
*
*/
#include <VarSpeedServo.h>
VarSpeedServo ServoA; // CREACION OBJETO
void setup()
{
ServoA.attach(9); // Pin 9 conexion SERVO
}
void loop()
{
ServoA.write(180, 90); // 180º , Velocidad 90
delay (2000);
ServoA.write(0, 5); // 0º , Velocidad 5
delay (2000);
ServoA.write(90, 90); // 90º , Velocidad 90
delay (2000);
ServoA.write(45, 40); // 45º , Velocidad 40
delay (2000);
ServoA.write(0, 10); // 0º , Velocidad 10
delay (2000);
}
// ******************** FIN ****************************
Como podeis comprobar, cada linea, da una posición y una velocidad.
Visitad el GITHUB que indico al principio y encontrareis muchas soluciones.
Un saludo !!! ... ...
.
Hi,
El problema es que estas usando delay y en la practica no se debe usar. Debes de usar el millis().Solamente un consejo.
Hola @tauro0221
Tienes razón, fue un lapsus.
Con la impaciencia de acabar y probar la librería y el código lo hice con delay .
Que me perdonen los mas novatos, por el mal ejemplo.!!!!
Un saludo !!! ... ...
Hi,
No hay problema por lo menos estas aprendiendo rapido.
El problema no es usar delay(20) el problema es anidar muchos delay(20) que totalicen muchos mseg. Se entiende?
Moderador
En el post#2 tienes una captura.
Por favor, no coloques capturas, coloca el código usando etiquetas. Lee las normas del foro. 1er hilo de cualquier sección.
Pido disculpas.
Primero por intentar sortear las normas poniendo una foto para no tener que hacer las cosas bien. Pereza
Después por el mal consejo de poner delay, que es otra forma de no hacer las cosas bien.
Como decía un amigo, "aunque nadie lea tu código, Dios lo ve..."
Como todo en la vida, depende de la situación.
Si necesitas hacer tiempo en setup()
no hay problemas en usar delay()
porque no vas a hacer otras tareas mientras tanto como seguramente sí ocurrirá en loop()
.
Incluso así sea en loop()
si no hay otras tareas que necesiten atención durante el delay, no hay inconveniente en usarlo.
Por ejemplo en el clásico Blink no hay problema en usar delay()
porque no hace otra cosa.
Claro está que no puedes usar delay()
junto con millis()
si el tiempo del delay es mayor al intervalo que controlas con los milisegundos.
Por ej., poner un delay de 10 seg. y a la vez controlar un evento cada 200 mseg. , está claro que no va a funcionar.
¿Pero si fuese al revés, cuál es el problema?
Mientras se utilice con criterio es válido usarlo.
Hola a todos otra vez
Volviendo al tema inicial:
Conoceis alguna libreria mas para servos con regulación de velocidad ????. ( a parte de VarSpeedServo.h )
Se agradece la buena información !!! ... ...
Hi,
Aqui adjunto de otra libreria para bajar la velocidad del servo.
Hola @tauro0221
Gracias por la aportación, lo probare y te informo como me funciona.
Un saludo !!!... ...
...
Hola @MaximoEsfuerzo
Tienes toda la razón en la cuestión delay/millis !!!!
Siempre que no entorpezca las funciones de todo el sentido del conjunto del código.
No hay que ser absolutista, todo depende de la situación.
Un saludo !!! ... ...
Hola @felix-rojo
Podrías postear el código de Marcelino ???.
Quisiera ver las disposiciones del retardo de servos.
Si lo haces, hazlo en quote, si no, te echaran el "chaparron" los moderadores,
Gracias !!! ... ...
Faltaria mas, pero me voy a poner al dia de como hacerlo.
No te sustes cuando lo veas, es bantante largo, pero cada rutina (o como se llamen), esta bien explicada. Y no me digais que he gastado todos los "delay" que había en el planeta, ya lo se, pero soy autodidacta y nunca paso del segundo video.
Os pedire ayuda seguramente para ello.
Saludos cordiales
No consigo iniciar sesión en el ordenador, me he enviado el fichero "ino" al movil, quizas eso sea admisible en codigo de conducta, pero no se que es "quote" o como adjuntarlo correctamente.
MARCELINO_2024_PS2_2.ino (48,5 KB)
Me la juego... ¿ Sera asi?
#include <SoftwareSerial.h>
#include <Servo.h>
#include <PS2X_lib.h>
// cambiando en la libreria #define CTRL_CLK 4 por #define CTRL_CLK 20 , quitando todas las anotaciones del principio
// directamente alimentar con 5v de arduino
// ASIGNAMOS LOS PINES EN ORDEN EN LA LINEA DE CODIGO DEL SETUP
// A6 Y A7 DE ARDUINO NANO son exclusivamente entradas analogicas
PS2X ps2x;
int error = 0;
byte type = 0;
byte vibrate = 0;
int mandoizqy;
int mandoizqx;
int mandodray;
int mandodrax;
//Marceduino 17 05 2022
// ELIMINADA LA RUTINA rutina PARA ABREVIAR
Servo ojosvertical; // Al pin 8. Movimiento vertical, 20=abajo, 40=centrados, 60=arriba
Servo ojoshorizontal; // Al pin 9. Movimiento horizonal de los ojos, 50=izq, 25=centrados, 5=derecha
Servo parpadoizquierdo; //Cable blanco, SU PARPADO DERECHO CONECTADO AL PIN 3 65 ABIERTO 0 CERRADO
Servo parpadoderecho; // NUMERO 7. SU PARPADO DERECHO 0=abierto, 70=cerrado CONETADO AL PIN 2
Servo comisuraizquierda; // Al pin 10. Movimiento de comisura izquierda. 1=abajo, 50 =arriba
Servo comisuraderecha; // Al pin 11. Movimiento de comisura derecha. 50=abajo, 1=arriba
Servo musculoderecho; // Al pin 6. Movimiento de musculo cuello derecha. 0=abajo, 30=centrado, 60=arriba
Servo musculoizquierdo; //Al pin 5. Movimiento de musculo cuello izquierdo. 60=abajo, 30=centrado, 0=arriba
Servo girocuello; //Al pin 4. Movimiento de GIRO del cuello, 80=derechaa, 50=centrado, 20=izquierda
int valorA = 0; // Almacenará la recepción de señal del mando a distantica A
int valorB = 0; //Almacenará la recepción de señal del mando a distantica B
int valorC = 0; //Almacenará la recepción de señal del mando a distantica C
int valorD = 0; //Almacenará la recepción de señal del mando a distantica D
int j = 1;
int i = 1;
int v = 1;
int x = 1;
int h = 0;
int ojosv = 25; //10 arriba 25 centrados, 45 abajo
int ojosh = 20; //Almacenara la posición de los ojos en la linea horizontal 0 20 40
int ojos = 30;
int cuelloizq = 30; //En 60 esta abajo, en 30 centrado, en 0 levantado
int cuellodra = 30; // En 0 esta abajo, en 30 centrado, en 60 levantado
int mandocuelloizq = 30;
int mandocuellodra = 30;
int posicuelloizq = 30;
int posicuellodra = 30;
int cuello = 0;
int giro = 50;
int mandogiro = 50;
int posigiro = 50;
int parpadoizq = 70; //En 70 estA abierto, en 0 cerrado
int parpadodra = 0; // En 0 esta abierto, en 70 esta cerrado
unsigned long lecturatiempo = 0;
unsigned long intervaloparpadeo = 8000; // TIEMPO ENTRE PARPADEOS
unsigned long intervalomueca = 28000; // TIEMPO ENTRE PARPADEOS
int posicion = 60; //marca el lugar donde girara la cabeza
long distanciaA = 140;
long distanciaA0 = 140;
long distanciaA1 = 140;
long distanciaA2 = 140;
long distanciaA3 = 140;
long distanciaB = 140;
long distanciaB0 = 140;
long distanciaB1 = 140;
long distanciaB2 = 140;
long distanciaB3 = 140;
long distanciaC = 140;
long distanciaC0 = 140;
long distanciaC1 = 140;
long distanciaC2 = 140;
long distanciaC3 = 140;
int distanciadeteccion = 100; //DISTANCIA A LA QUE REACCIONARAN LOS SENSORES
int tiempo; //Esta variable es solo para determinar el tiempo que dura la funcion
long tiempoA;
long tiempoB;
long tiempoC;
int abrepuerta28 = 28; //pin al que se conecta el shiels del motor 1 para abrir
int cierrapuerta29 = 29; //pin al que se conecta el shiels del motor 1 para cerrar
int abrepuerta30 = 30; //pin al que se conecta el shiels del motor 2 para abrir
int cierrapuerta31 = 31; //pin al que se conecta el shiels del motor 2 para cerrar
int abrepuerta32 = 32; //pin al que se conecta el shiels del motor 3 para abrir
int cierrapuerta33 = 33; //pin al que se conecta el shiels del motor 3 para cerrar
int fincarrera40 = 40; //Interruptor verde FIN DE CARRERA DE LAS PUERTAS DEL 40 AL 45
int fincarrera41 = 41; //interruptor amarillo
int fincarrera42 = 42; //interruptor azul
int fincarrera43 = 43; //interruptor morado
int fincarrera44 = 44; //interruptor gris
int fincarrera45 = 45; //interruptor blanco
int estado40; //Guarda el estado del interruptor 40
int estado41; //Guarda el estado del interruptor 41
int estado42; //Guarda el estado del interruptor 42
int estado43; //Guarda el estado del interruptor 43
int estado44; //Guarda el estado del interruptor 44
int estado45; //Guarda el estado del interruptor 45
int girodestino = 50; // En el void de seguimiento guarda la posicion de destino
int giroestado = 50; //En el void de seguimiento guarda la posición actual del giro
boolean interruptor;
void setup() {
Serial.begin(9600);
parpadoderecho.attach(2); // Conexion del servo del parpado DERECHO CABLE MORADO arriba 70 abajo 5
parpadoizquierdo.attach(3); // Conexion del servo del parpado IZQUIERDO CABLE BLANCO INDEPENDIENTE arriba 0 abajo 70
ojosvertical.attach(4); // Conexion del servo de movimiento vertical de los ojos al pin 9 CABLE AZUL
ojoshorizontal.attach(5); // Conexion del servo de movimiento horizontal de los ojos al pin 8 CABLE VERDE
comisuraizquierda.attach(6); // Conexion del servo comisura izquierdaal pin 10 CABLE AMARILLO
comisuraderecha.attach(7); // Conexion del servo comisura derecha al pin 11 CABLE NARANJA
girocuello.attach(8); // Conexion del servo giro del cuello 4 CABLE NEGRO
musculoizquierdo.attach(9); // Conexion del servo cuello derech0 al pin 5 CABLE BLANCO
musculoderecho.attach(10); // Conexion del servo cuello izquierdo al pin 6 CABLE GRIS
pinMode(16, OUTPUT); //seis pin de salida de luces
pinMode(17, OUTPUT);
pinMode(18, OUTPUT); //seis pin de salida de luces
pinMode(19, OUTPUT);
pinMode(20, OUTPUT);
pinMode(21, OUTPUT); //seis pin de salida de luces DE LA CARPA
pinMode(22, OUTPUT); //activación del pin A0 como salida: para el pulso ultrasónico sensor izq cable amarillo
pinMode(23, INPUT); //activación del pin A1 como entrada: tiempo del rebote del ultrasonido sensor izq cable naranja
pinMode(24, OUTPUT); //activación del pin A0 como salida: para el pulso ultrasónico sensor izq cable amarillo
pinMode(25, INPUT); //activación del pin A1 como entrada: tiempo del rebote del ultrasonido sensor izq cable naranja
pinMode(26, OUTPUT); //activación del pin 2 como salida: para el pulso ultrasónico sensor dra cable amarillo
pinMode(27, INPUT); //activación del pin 3 como entrada: tiempo del rebote del ultrasonido sensor dra cable naranja
pinMode(abrepuerta28, OUTPUT); // CONECTA EL PIN 30 AL SHIELD MOTOR PARA ABRIR PUERTA 1 IZQUIERDA
pinMode(cierrapuerta29, OUTPUT); //CONECTA EL PIN 31 AL SHIELD MOTOR PARA CERRAR PUERTA 1
pinMode(abrepuerta30, OUTPUT); // CONECTA EL PIN 30 AL SHIELD MOTOR PARA ABRIR PUERTA DERECHA
pinMode(cierrapuerta31, OUTPUT);
pinMode(abrepuerta32, OUTPUT); // CONECTA EL PIN 30 AL SHIELD MOTOR PARA ABRIR PUERTA SUPERIOR
pinMode(cierrapuerta33, OUTPUT);
pinMode(38, INPUT); // INTERRUPTOR DE PALANCA, para ejecutar MANDO A DISTANCIA o RUTINA
pinMode(fincarrera40, INPUT); //Interruptor cable verde, estado 40 PARA ABRIR PUERTA 1 IZQUIERDA
pinMode(fincarrera41, INPUT); //Interruptor cable amarillo, estado 41 PARA CERRAR PUERTA
pinMode(fincarrera42, INPUT); //Interruptor cable azul, estado 42 PARA ABRIR PUERTA DERECHA
pinMode(fincarrera43, INPUT); //Interruptor cable morado, estado 43 PARA CERRAR PUERTA
pinMode(fincarrera44, INPUT); //Interruptor cable gris, estado 44 PARA ABRIR PUERTA SUPERIOR
pinMode(fincarrera45, INPUT); //Interruptor cable blanco, estado 45 PARA CERRAR PUERTA
//pinMode 46, 47, 48, 49 CONEXIONES RECEPTOR PS2
pinMode(50, OUTPUT); //INACTIVO Cable VERDE BOTON RETROCESO Y BAJA VOLUMEN EN PULSACION LARGA
pinMode(51, OUTPUT); //Cable BLANCO boton central HACE PAUSA
pinMode(52, OUTPUT); //INACTIVO Cable AMARILLO BOTON AVANCE Y SUBE VOLUMEN EN PULSACION LARGA
pinMode(53, INPUT); //INACTIVO Cable GRIS RECIBE SEÑAL DE ALTAVOZ PARA SABER SI ESTA EMITIENDO MUSICA
ojosvertical.write(ojosv);
ojoshorizontal.write(ojosh); // deja los ojos en posicion horizontal centrada
comisuraizquierda.write(1);
comisuraderecha.write(45);
parpadoizquierdo.write(parpadoizq);
parpadoderecho.write(parpadodra);
musculoderecho.write(cuellodra);
musculoizquierdo.write(cuelloizq);
girocuello.write(giro);
//DESDE AQUI SON DEL PROGRAMA DEL MANDO PS2
error = ps2x.config_gamepad(46, 48, 47, 49, true, true); //ASIGNAMOS LOS PINES DEL RECEPTOR EN ESTE ORDEN: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
// NEGRO CLOCK 46, BLANCO ATTENTION 47, GRIS COMMAND 48, MARRON DATA 49,
if (error == 0) {
Serial.println("Found Controller, configured successful");
Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
Serial.println("holding L1 or R1 will print out the analog stick values.");
Serial.println("Go to www.billporter.info for updates and to report bugs.");
} else if (error == 1)
Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
else if (error == 2)
Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");
else if (error == 3)
Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
type = ps2x.readType();
digitalWrite(51, HIGH); // Pulsa el boton de pausa del equipo de musica
delay(500); // Pulsación corta para PAUSA
digitalWrite(51, LOW); // Deja de pulsar boton
delay(500);
}
void loop() {
inicio();
}
void inicio() {
distancia();
while (distanciaA >= distanciadeteccion and distanciaB >= distanciadeteccion and distanciaC >= distanciadeteccion) //actualmente distacia de deteccion en 120 cm
{
distancia();
}
rutina();
}
void rutina() {
interruptor = digitalRead(38); //Lee el estado del interruptor y ejecuta MANDO o el PROGRAMAAUTONOMO
for (tiempo = 1; tiempo <= 10000;) {
while (interruptor == HIGH) {
interruptor = digitalRead(38); //Lee el estado del interruptor
MANDOPS2();
}
while (interruptor == LOW) {
interruptor = digitalRead(38); //Lee el estado del interruptor
tiempo = (tiempo + 1);
distancia();
seguimiento();
if (tiempo == 10) {
motorabrir();
despierta();
}
if ((tiempo == 1000) or (tiempo == 5000) or (tiempo == 9000)) { risa(); }
if (tiempo == 2500) { si(); }
if (tiempo == 5500) { no(); }
if ((tiempo == 3500) or (tiempo == 7050)) { mueca(); }
if ((tiempo == 2000) or (tiempo == 4500)) {
ladeocuello();
ladeocuello();
}
if (tiempo == 9500) { foto(); }
if ((tiempo == 500) or (tiempo == 9200)) { parpadeo(); }
if (tiempo == 10000) {
duerme();
motorcerrar();
delay(5000);
tiempo = 0;
}
}
}
}
void MANDOPS2() {
if (type == 1) {
ps2x.read_gamepad(false, vibrate); //Lectura del estado
//Lectura de los botones de dirección IZQUIERDA estos acumulan sin volver a pulsar
if (ps2x.Button(PSB_PAD_UP)) { //PULSA BOTON HACIA ARRIBA EN LA BOTONERA IZQ
parpadeo();
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
}
if (ps2x.Button(PSB_PAD_DOWN)) { //PULSA BOTON DE ABAJO
Serial.print("DOWN held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
}
if (ps2x.Button(PSB_PAD_RIGHT)) { //PULSA BOTON DERECHO
Serial.print("Right held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
posicuellodra = (posicuellodra + 2);
posicuelloizq = (posicuelloizq - 2);
if (posicuellodra > 60) { posicuellodra = 60; }
if (posicuelloizq < 0) { posicuelloizq = 0; }
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
}
if (ps2x.Button(PSB_PAD_LEFT)) { //PULSA BOTON IZQUIERDO
Serial.print("LEFT held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
}
//Lectura del estado de botones DERECHA estos deben pulsarse repetidamente para acumular
if (ps2x.NewButtonState()) {
if (ps2x.Button(PSB_RED)) // la B
Serial.println("Circle pressed");
if (ps2x.Button(PSB_RED) == true) { delay(100); }
if (ps2x.Button(PSB_GREEN)) // la Y
Serial.println("Triangle pressed");
if (ps2x.Button(PSB_GREEN) == true) { parpadeo(); }
if (ps2x.Button(PSB_PINK)) // la X
Serial.println("Square pressed");
if (ps2x.Button(PSB_PINK) == true) { tiempo = 9900; }
if (ps2x.Button(PSB_BLUE)) //la A
Serial.println("X pressed");
if (ps2x.Button(PSB_BLUE) == true) { delay(100); }
if (ps2x.Button(PSB_START))
Serial.println("Start is being held");
if (ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");
if (ps2x.Button(PSB_L1)) // BOTON FRONTAL 1 DE LA IZQUIERDA
Serial.println("L1 pressed");
if (ps2x.Button(PSB_L1) == true) { mueca(); }
if (ps2x.Button(PSB_R1)) // BOTON FRONTAL 1 DE LA DERECHA
Serial.println("R1 pressed");
if (ps2x.Button(PSB_R1) == true) { muecaizq(); }
if (ps2x.Button(PSB_L2))
Serial.println("L2 pressed"); // BOTON FRONTAL 2 DE LA IZQUIERDA
if (ps2x.Button(PSB_L2) == true) { risa(); }
if (ps2x.Button(PSB_R2)) //BOTON FRONTAL 2 DE LA DERECHA
Serial.println("R2 pressed");
if (ps2x.Button(PSB_R2) == true) { risa(); }
}
//Lectura de las palancas analógicas JOYSTICK
Serial.print("StickValues:");
Serial.print(ps2x.Analog(PSS_LY), DEC); //Mando izquierdo EJE Y
Serial.print(",");
mandoizqy = ps2x.Analog(PSS_LY);
ojosv = map(mandoizqy, 0, 255, 20, 50); // 15 ARRIBA Y 50 ABAJO
ojosvertical.write(ojosv);
Serial.print(mandoizqy);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_LX), DEC); // MANDO IZQUIERDO EJE X
Serial.print(",");
mandoizqx = ps2x.Analog(PSS_LX);
ojosh = map(mandoizqx, 0, 255, 0, 40); // 0 mira a la izq, 40 mira a la derecha
ojoshorizontal.write(ojosh);
Serial.print(mandoizqx);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_RY), DEC); //Mando derecho EJE Y VERTICAL
Serial.print(",");
mandodray = ps2x.Analog(PSS_RY);
mandocuellodra = map(mandodray, 0, 255, 60, 0);
mandocuelloizq = map(mandodray, 0, 255, 0, 60);
if (mandocuellodra > posicuellodra) { posicuellodra = posicuellodra + 4; } //para evitar movimientos violentos
if (mandocuelloizq > posicuelloizq) { posicuelloizq = posicuelloizq + 4; }
if (mandocuellodra < posicuellodra) { posicuellodra = posicuellodra - 4; }
if (mandocuelloizq < posicuelloizq) { posicuelloizq = posicuelloizq - 4; }
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
Serial.print(mandodray);
Serial.print(",");
Serial.println(ps2x.Analog(PSS_RX), DEC); // MANDO DERECHO EJE X HORIZONTAL
Serial.print(",");
mandodrax = ps2x.Analog(PSS_RX);
mandogiro = map(mandodrax, 0, 255, 20, 80);
if (mandogiro > posigiro) { posigiro = posigiro + 3; } //para evitar movimientos violentos
if (mandogiro < posigiro) { posigiro = posigiro - 3; }
girocuello.write(posigiro);
Serial.print(posigiro);
Serial.print(",");
} else {
return;
}
delay(50);
}
void foto() {
int parpadoizq = 65; //En 65 estA abierto, en 0 cerrado
int parpadodra = 10; // En 10 esta abierto, en 70 esta cerrado
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
giro = posicion;
for (giro = posicion; giro <= 80; giro = giro + 1) //gira a su derecha
{
ojosh = map(giro, posicion, 80, 20, 40);
ojoshorizontal.write(ojosh);
girocuello.write(giro);
delay(30);
}
for (int posicuellodra = 30; posicuellodra <= 60; posicuellodra++) /* Este for BALANCEA LA CABEZA A SU IZQUIERDA */
{
posicuelloizq = map(posicuellodra, 30, 60, 30, 60);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
delay(2000);
parpadeo();
delay(2000);
for (int ojosh = 40; ojosh >= 20; ojosh--) /* Este for hace que los ojos se muevan horizontalmente de LA DERECHA AL CENTRO*/
{
giro = map(ojosh, 40, 20, 80, 65);
ojoshorizontal.write(ojosh);
girocuello.write(giro); /* giro cuello a la izq*/
delay(20); /* velocidad de movimiento*/
}
for (int ojosh = 20; ojosh >= 5; ojosh--) /* Este for hace que los ojos se muevan horizontalmente deL CENTRO a la DERECHA*/
{
giro = map(ojosh, 20, 5, 65, 50);
ojoshorizontal.write(ojosh);
girocuello.write(giro); /* giro cuello a la izq*/
delay(20); /* velocidad de movimiento*/
}
delay(2000);
parpadeo();
risa();
delay(1000);
for (int ojosh = 5; ojosh <= 20; ojosh++) /* Este for hace que los ojos se muevan horizontalmente de LA DERECHA AL CENTRO*/
{
giro = map(ojosh, 5, 20, 50, 80);
ojoshorizontal.write(ojosh);
girocuello.write(giro); /* giro cuello a la izq*/
delay(30); /* velocidad de movimiento*/
}
parpadeo();
for (int i = 1; i <= 48; i++) /* Este for hace que los loas comisuras suban de 0 a 48*/
{
x = map(i, 1, 48, 50, 3);
comisuraizquierda.write(i);
delay(30); /* velocidad de movimiento*/
}
for (int posicuellodra = 60; posicuellodra >= 30; posicuellodra--) /* Este for BALANCEA LA CABEZA DE SU IZQUIERDA AL CENTRO*/
{
posicuelloizq = map(posicuellodra, 60, 30, 60, 30);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
delay(1000);
for (int i = 48; i >= 1; i--) /* Este for hace que llas comisura bajen de 48 a 0*/
{
x = map(i, 48, 1, 3, 50);
giro = map(i, 48, 1, 80, 50);
girocuello.write(giro);
comisuraizquierda.write(i);
delay(10); /* velocidad de movimiento*/
}
delay(1000);
mueca();
}
void despierta() {
girocuello.write(50);
digitalWrite(16, HIGH);
int parpadoizq = 0; //En 65 estA abierto, en 0 cerrado
int parpadodra = 70; // En 10 esta abierto, en 70 esta cerrado
ojosv = 45;
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
ojosvertical.write(ojosv);
for (x = 1; x <= 3; x++) //este loop hace cabecear tres veces
{
for (int posicuellodra = 0; posicuellodra <= 15; posicuellodra++) /* Este for hace levantar un poco la cabeza*/
{
posicuelloizq = map(posicuellodra, 0, 15, 60, 45);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(50); /* velocidad de movimiento*/
}
delay(1000);
for (int posicuellodra = 15; posicuellodra >= 0; posicuellodra--) /* Este for hace BAJAR LA CABEZA */
{
posicuelloizq = map(posicuellodra, 15, 0, 45, 60);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(20); /* velocidad de movimiento*/
}
delay(1000);
}
for (int posicuellodra = 0; posicuellodra <= 30; posicuellodra++) /* Este for hace levantar la CABEZA DE ABAJO AL CENTRO*/
{
posicuelloizq = map(posicuellodra, 0, 30, 60, 30);
parpadodra = map(posicuellodra, 0, 30, 70, 10);
parpadoizq = map(posicuellodra, 0, 30, 0, 65);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(50); /* velocidad de movimiento*/
}
for (int posicuellodra = 30; posicuellodra >= 0; posicuellodra--) /* Este for hace BAJAR LA CABEZA DEL CENTRO A ABAJO */
{
posicuelloizq = map(posicuellodra, 30, 0, 30, 60);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (ojosv = 45; ojosv >= 25; ojosv--) /* Este for hace SUBIR A CABEZA DE ABAJO AL CENTRO*/
{
posicuellodra = map(ojosv, 45, 25, 0, 30);
posicuelloizq = map(ojosv, 45, 25, 60, 30);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
ojosvertical.write(ojosv);
delay(15); /* velocidad de movimiento*/
}
parpadeo();
risa();
digitalWrite(17, HIGH);
delay(1000);
for (ojosv = 25; ojosv <= 45; ojosv++) /* Este for hace BAJAR LA CABEZA DEL CENTRO A ABAJO */
{
posicuellodra = map(ojosv, 25, 45, 30, 0);
posicuelloizq = map(ojosv, 25, 45, 30, 60);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
ojosvertical.write(ojosv);
delay(15); /* velocidad de movimiento*/
}
giracuello();
digitalWrite(18, HIGH);
delay(1000);
digitalWrite(19, HIGH);
giracuello();
delay(1000);
digitalWrite(20, HIGH);
delay(1000);
parpadeo();
for (ojosv = 45; ojosv >= 25; ojosv--) /* Este for hace SUBIR A CABEZA DE ABAJO AL CENTRO*/
{
posicuellodra = map(ojosv, 45, 25, 0, 30);
posicuelloizq = map(ojosv, 45, 25, 60, 30);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
ojosvertical.write(ojosv);
delay(15); /* velocidad de movimiento*/
}
parpadeo();
ladeocuello();
risa();
parpadeo();
for (int posicuellodra = 30; posicuellodra <= 60; posicuellodra++) /* Este for hace SUBIR A CABEZA DEL CENTRO A ARRIBA*/
{
posicuelloizq = map(posicuellodra, 30, 60, 30, 0);
ojosv = map(posicuellodra, 30, 60, 25, 15);
ojosvertical.write(ojosv);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
digitalWrite(21, HIGH); //luces de la carpa
giracuello();
parpadeo();
risa();
for (int posicuellodra = 60; posicuellodra >= 30; posicuellodra--) /* Este for hace BAJAR LA CABEZA DE ARRIBA AL CENTRO */
{
posicuelloizq = map(posicuellodra, 60, 30, 0, 30);
ojosv = map(posicuellodra, 60, 30, 15, 25);
ojosvertical.write(ojosv);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
parpadeo();
risa();
parpadeoizq();
}
void distancia() /* Rutina que mide distancias, elimina errores, y guarda las inferiores a distanciadeteccion en distanciaA, distanciaB y distanciaC*/
{
for (x = 1; x < 4;) {
x = x + 1;
/*A mide el sensor de la derecha, B la izquierda y C el centro*/
digitalWrite(22, LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(10);
digitalWrite(22, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(10);
tiempoA = pulseIn(23, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
deja de hacerlo, LOW, la longitud del pulso entrante*/
distanciaA0 = int(0.017 * tiempoA); /*fórmula para calcular la distancia obteniendo un valor entero*/
/*Monitorización en centímetros por el monitor serial*/
delayMicroseconds(15);
digitalWrite(24, LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(10);
digitalWrite(24, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(10);
tiempoB = pulseIn(25, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
deja de hacerlo, LOW, la longitud del pulso entrante*/
distanciaB0 = int(0.017 * tiempoB); /*fórmula para calcular la distancia obteniendo un valor entero*/
/*Monitorización en centímetros por el monitor serial*/
delayMicroseconds(15);
digitalWrite(26, LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(10);
digitalWrite(26, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(10);
tiempoC = pulseIn(27, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
deja de hacerlo, LOW, la longitud del pulso entrante*/
distanciaC0 = int(0.017 * tiempoC); /*fórmula para calcular la distancia obteniendo un valor entero*/
/*Monitorización en centímetros por el monitor serial*/
delayMicroseconds(15);
distanciaA3 = distanciaA2;
distanciaA2 = distanciaA1;
distanciaA1 = distanciaA0;
distanciaB3 = distanciaB2;
distanciaB2 = distanciaB1;
distanciaB1 = distanciaB0;
distanciaC3 = distanciaC2;
distanciaC2 = distanciaC1;
distanciaC1 = distanciaC0;
if (distanciaA1 <= distanciadeteccion && distanciaA2 <= distanciadeteccion && distanciaA3 <= distanciadeteccion) {
distanciaA = ((distanciaA1 + distanciaA2 + distanciaA3) / 3);
} else {
distanciaA = 130;
}
if (distanciaB1 <= distanciadeteccion && distanciaB2 <= distanciadeteccion && distanciaB3 <= distanciadeteccion) {
distanciaB = ((distanciaB1 + distanciaB2 + distanciaB3) / 3);
} else {
distanciaB = 130;
}
if (distanciaC1 <= distanciadeteccion && distanciaC2 <= distanciadeteccion && distanciaC3 <= distanciadeteccion) {
distanciaC = ((distanciaC1 + distanciaC2 + distanciaC3) / 3);
} else {
distanciaC = 130;
}
}
if (distanciaA < distanciaB && distanciaA < distanciaC) /*Acción si la señal del sensor A a la derecha es la de menor distancia*/
{
girodestino = 90;
}
if (distanciaB < distanciaA && distanciaB < distanciaC) { girodestino = 10; }
if (distanciaC < distanciaA && distanciaC < distanciaB) /*Acción si la señal del sensor B a la izquierda es la de menor distancia*/
{
girodestino = 50;
}
Serial.println("girodestino ");
Serial.println(girodestino);
if (distanciaA >= distanciadeteccion and distanciaB >= distanciadeteccion and distanciaC >= distanciadeteccion) { girodestino = 50; }
}
void seguimiento() {
//Una vez tomadas la posicion de la presencia en A, B y C comienza el posicionamiento de la cabeza
giroestado = giro;
if (giro < girodestino) {
for (ojosh = 20; ojosh != 40; ojosh++) //Este for hace que primero mueva los ojos el centro a su izq
{
ojoshorizontal.write(ojosh);
delay(20);
}
delay(50);
for (giro = giroestado; giro != girodestino; giro = giro + 1) // cuello a la derecha
{
ojosh = map(giro, giroestado, girodestino, 40, 20);
ojoshorizontal.write(ojosh);
girocuello.write(giro);
delay(20);
}
giroestado = girodestino; //una vez llegado al destino, giro pasa a ser la posicion actual llamada giroestado
}
if (giro > girodestino) {
for (ojosh = 20; ojosh != 0; ojosh--) //Este for hace que primero mueva los ojos el centro en sentido del movimiento
{
ojoshorizontal.write(ojosh);
delay(20);
}
delay(50);
for (giro = giroestado; giro != girodestino; giro = giro - 1) // cuello a la izquierda
{
ojosh = map(giro, giroestado, girodestino, 0, 20);
ojoshorizontal.write(ojosh);
girocuello.write(giro);
delay(20);
}
giroestado = girodestino; //una vez llegado al destino, giro pasa a ser la posicion actual llamada giroestado
}
}
void parpadeo() {
for (int parpadodra = 10; parpadodra <= 60; parpadodra++) /* Este for hace que los parapados se abran*/
{
parpadoizq = map(parpadodra, 10, 60, 60, 10);
parpadoizquierdo.write(parpadoizq);
parpadoderecho.write(parpadodra);
delay(2); /* velocidad de movimiento*/
}
delay(50);
for (int parpadodra = 60; parpadodra >= 0; parpadodra--) /* Este for hace que los parapados se cierren*/
{
parpadoizq = map(parpadodra, 60, 10, 10, 60);
parpadoizquierdo.write(parpadoizq);
parpadoderecho.write(parpadodra);
delay(2); /* velocidad de movimiento*/
}
}
void parpadeoizq() {
for (int parpadoizq = 65; parpadoizq >= 0; parpadoizq--) /* Este for hace que los parapados se CIERRE*/
{
parpadoizquierdo.write(parpadoizq);
delay(2); /* velocidad de movimiento*/
}
delay(50);
for (int parpadoizq = 0; parpadoizq <= 65; parpadoizq++) //ABRE EL PARPADO
{
parpadoizquierdo.write(parpadoizq);
delay(2); /* velocidad de movimiento*/
}
}
void parpadeodra() {
for (int parpadodra = 0; parpadodra <= 70; parpadodra++) /* Este for hace que los parapados se cierren*/
{
parpadoderecho.write(parpadodra);
delay(2); /* velocidad de movimiento*/
}
delay(50);
for (int parpadodra = 70; parpadodra >= 0; parpadodra--) {
parpadoderecho.write(parpadodra);
delay(2); /* velocidad de movimiento*/
}
}
void giracuello() {
for (int giro = 50; giro <= 80; giro++) /* este for hace girar la CABEZA del centro a SU IZQUIERDA*/
{
ojosh = map(giro, 50, 80, 20, 40); /* mapea la posicion del cuello y la reproduce en los ojos*/
girocuello.write(giro); /* giro cuello a la izq*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(20); /* velocidad de movimiento*/
}
for (int giro = 80; giro >= 50; giro--) /* Este for hace que gire el cuello de SU IZQUIERDA AL CENTRO*/
{
ojosh = map(giro, 80, 50, 40, 20); /* mapea la posicion del cuello y la reproduce en los ojos*/
girocuello.write(giro); /* cuello a la derechaa*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(20); /* velocidad de movimiento*/
}
for (int giro = 50; giro >= 20; giro--) /* Este for hace que gire el cuello del CENTRO A SU DERECHA*/
{
ojosh = map(giro, 50, 20, 20, 0); /* mapea la posicion del cuello y la reproduce en los ojos*/
girocuello.write(giro); /* cuello a la derechaa*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(20); /* velocidad de movimiento*/
}
for (int giro = 20; giro <= 50; giro++) /* este for hace girar la cabeza de SU DERECHA AL CENTRO*/
{
ojosh = map(giro, 20, 50, 0, 20); /* mapea la posicion del cuello y la reproduce en los ojos*/
girocuello.write(giro); /* giro cuello a la izq*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(20); /* velocidad de movimiento*/
}
}
void risa() {
for (int i = 1; i <= 50; i++) /* Este for hace que los loas comisuras suban de 0 a 48*/
{
x = map(i, 1, 50, 50, 1);
comisuraizquierda.write(i); /*Comisura izquierda*/
comisuraderecha.write(x);
delay(10); /* velocidad de movimiento*/
}
delay(700);
for (int i = 50; i >= 1; i--) /* Este for hace que las comisura bajen de 48 a 0*/
{
x = map(i, 50, 1, 1, 50);
comisuraizquierda.write(i);
comisuraderecha.write(x);
delay(10); /* velocidad de movimiento*/
}
}
void mueca() //Mueca y giño de su ojo derecho
{
for (int i = 1; i <= 50; i++) /* Este for hace que los loas comisuras suban de 0 a 48*/
{
parpadodra = map(i, 1, 50, 0, 70); /*variable para la posición de los parpados mapeo el valor de x a la relacion de parpado*/
parpadoderecho.write(parpadodra);
comisuraizquierda.write(i); /*Comisura izquierda*/
delay(10); /* velocidad de movimiento*/
}
delay(200);
for (int i = 50; i >= 1; i--) /* Este for hace que las comisura bajen de 48 a 0*/
{
parpadodra = map(i, 50, 1, 70, 0); /*variable para la posición de los parpados mapeo el valor de x a la relacion de parpado*/
parpadoderecho.write(parpadodra);
comisuraizquierda.write(i);
delay(10); /* velocidad de movimiento*/
}
}
void muecaizq() //Mueca y giño de su ojo izquierdo
{
for (int i = 50; i >= 0; i = i - 1) /* Este for hace que los loas comisuras suban de 0 a 48*/
{
parpadoizq = map(i, 50, 1, 65, 0); /*variable para la posición de los parpados mapeo el valor de x a la relacion de parpado*/
parpadoizquierdo.write(parpadoizq);
comisuraderecha.write(i); /*Comisura izquierda*/
delay(10); /* velocidad de movimiento*/
}
delay(200);
for (int i = 1; i <= 50; i++) /* Este for hace que las comisura bajen de 48 a 0*/
{
parpadoizq = map(i, 1, 50, 0, 65); /*variable para la posición de los parpados mapeo el valor de x a la relacion de parpado*/
parpadoizquierdo.write(parpadoizq);
comisuraderecha.write(i);
delay(10); /* velocidad de movimiento*/
}
}
void ladeocuello() {
for (x = 1; x <= 2; x++) {
for (int posicuellodra = 30; posicuellodra <= 60; posicuellodra++) /* Este for BALANCEA LA CABEZA A SU IZQUIERDA */
{
posicuelloizq = map(posicuellodra, 30, 60, 30, 60);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (int posicuellodra = 60; posicuellodra >= 0; posicuellodra--) /* Este for BALANCEA LA CABEZA DE SU IZQUIERDA A SU DERECHA*/
{
posicuelloizq = map(posicuellodra, 60, 0, 60, 0);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (int posicuellodra = 0; posicuellodra <= 30; posicuellodra++) /* Este for BALANCEA LA CABEZA DE SU DERECHA AL CENTRO */
{
posicuelloizq = map(posicuellodra, 0, 30, 0, 30);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
}
}
void subecuello() {
for (int posicuellodra = 30; posicuellodra <= 60; posicuellodra++) /* Este for hace BAJAR LA CABEZA DEL CENTRO A ABAJO */
{
posicuelloizq = map(posicuellodra, 30, 60, 30, 0);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (int posicuellodra = 60; posicuellodra >= 0; posicuellodra--) /* Este for hace SUBIR A CABEZA DE ABAJO A ARRIBA*/
{
posicuelloizq = map(posicuellodra, 60, 0, 0, 60);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (int posicuellodra = 0; posicuellodra <= 30; posicuellodra++) /* Este for hace BAJAR LA CABEZA DE ARRIBA AL CENTRO */
{
posicuelloizq = map(posicuellodra, 0, 30, 60, 30);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
}
void vertical() /* Movimiento vertical de los ojos*/
{
ojosvertical.write(25); /* deja los ojos en posicion vertical centrada*/
for (int ojosv = 25; ojosv >= 10; ojosv--) /* Este for hace que los ojos se muevan verticalmente del CENTRO HACIA ARRIBA */
{
ojosvertical.write(ojosv);
delay(tiempo); /* velocidad de movimiento*/
}
delay(200);
for (int ojosv = 10; ojosv <= 25; ojosv++) /* Este for hace que los ojos se muevan verticalmente DE ARRIBA AL CENTRO */
{
ojosvertical.write(ojosv);
delay(tiempo); /* velocidad de movimiento*/
}
for (int ojosv = 25; ojosv <= 45; ojosv++) /* Este for hace que los ojos se muevan verticalmente DEL CENTRO A ABAJO */
{
ojosvertical.write(ojosv);
delay(tiempo); /* velocidad de movimiento*/
}
delay(200);
for (int ojosv = 45; ojosv >= 25; ojosv--) /* Este for hace que los ojos recorran verticalmente DE ABAJO AL CENTRO*/
{
ojosvertical.write(ojosv);
delay(tiempo); /* velocidad de movimiento*/
}
}
void horizontal() {
ojoshorizontal.write(20); /* deja los ojos en posicion horizontal centrada*/
for (int ojosh = 20; ojosh >= 0; ojosh--) /* Este for hace que los ojos se muevan horizontalmente del CENTRO A LA DERECHA*/
{
ojoshorizontal.write(ojosh);
delay(tiempo); /* velocidad de movimiento*/
}
delay(200);
for (int ojosh = 0; ojosh <= 20; ojosh++) /* Este for hace que los ojos recorran horizontalmente de la DERECHA AL CENTRO*/
{
ojoshorizontal.write(ojosh);
delay(tiempo); /* velocidad de movimiento*/
}
for (int ojosh = 20; ojosh <= 40; ojosh++) /* Este for hace que los ojos recorran horizontalmente de CENTRO A LA IZQUIERDA*/
{
ojoshorizontal.write(ojosh);
delay(tiempo); /* velocidad de movimiento*/
}
delay(200);
for (int ojosh = 40; ojosh >= 20; ojosh--) /* Este for hace que los ojos recorran horizontelmente de IZQUIERDA A CENTRADOS*/
{
ojoshorizontal.write(ojosh);
delay(tiempo); /* velocidad de movimiento*/
}
}
void duerme() {
for (posicion > 50; posicion >= 50; posicion = posicion - 1) {
girocuello.write(posicion);
delay(20);
}
for (posicion < 50; posicion <= 50; posicion = posicion + 1) {
girocuello.write(posicion);
delay(20);
}
ojosv = 25;
ojosvertical.write(ojosv); /* deja los ojos en posicion vertical centrada*/
for (posicuellodra = 30; posicuellodra >= 0; posicuellodra--) /* Este for hace que baje la cabeza del centro a abajo*/
{
posicuelloizq = map(posicuellodra, 30, 0, 30, 60);
parpadodra = map(posicuellodra, 30, 0, 5, 40); // deja caer un poco los parpados y cabeza
parpadoizq = map(posicuellodra, 30, 0, 70, 35);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(30); /* velocidad de movimiento*/
}
delay(500);
for (int posicuellodra = 0; posicuellodra <= 20; posicuellodra++) /* este for hace levantar la cabeza de abajo un poco*/
{
posicuelloizq = map(posicuellodra, 0, 20, 60, 40);
parpadodra = map(cuello, 0, 20, 40, 5);
parpadoizq = map(cuello, 0, 20, 35, 70);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(10); /* velocidad de movimiento*/
}
delay(500);
ojosvertical.write(25); /* deja los ojos en posicion vertical centrada*/
for (posicuellodra = 20; posicuellodra >= 0; posicuellodra--) /* Este for hace que baje la cabeza del centro a abajo*/
{
posicuelloizq = map(posicuellodra, 20, 0, 40, 60);
parpadodra = map(posicuellodra, 20, 0, 5, 40); // deja caer un poco los parpados y cabeza
parpadoizq = map(posicuellodra, 20, 0, 70, 35);
ojosv = map(posicuellodra, 20, 0, 25, 45);
ojosvertical.write(ojosv);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(30); /* velocidad de movimiento*/
}
for (posicuellodra = 0; posicuellodra <= 30; posicuellodra++) /* levanta la cabeza y los parpados de abajo al centro*/
{
posicuelloizq = map(posicuellodra, 0, 30, 60, 30);
parpadodra = map(posicuellodra, 0, 30, 40, 5);
parpadoizq = map(posicuellodra, 0, 30, 35, 70);
ojosv = map(posicuellodra, 0, 30, 45, 25);
ojosvertical.write(ojosv);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(20); /* velocidad de movimiento*/
}
for (parpadodra = 5; parpadodra <= 40; parpadodra++) //Deja caer un poco los parpados
{
parpadoizq = map(parpadodra, 5, 40, 70, 35);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
delay(40);
}
for (parpadodra = 40; parpadodra >= 5; parpadodra--) //levanta los parpados
{
parpadoizq = map(parpadodra, 40, 5, 35, 70);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
delay(10);
}
for (posicuellodra = 30; posicuellodra >= 0; posicuellodra--) /* Este for hace que baje la cabeza del centro a abajo*/
{
posicuelloizq = map(posicuellodra, 30, 0, 30, 60);
parpadodra = map(posicuellodra, 30, 0, 5, 40); // deja caer un poco los parpados y cabeza
parpadoizq = map(posicuellodra, 30, 0, 70, 35);
ojosv = map(posicuellodra, 30, 0, 25, 45);
ojosvertical.write(ojosv);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(40); /* velocidad de movimiento*/
}
for (posicuellodra = 0; posicuellodra <= 30; posicuellodra++) /* levanta la cabeza y los parpados de abajo al centro*/
{
posicuelloizq = map(posicuellodra, 0, 30, 60, 30);
parpadodra = map(posicuellodra, 0, 30, 40, 5);
parpadoizq = map(posicuellodra, 0, 30, 35, 70);
ojosv = map(posicuellodra, 0, 30, 45, 25);
ojosvertical.write(ojosv);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(10); /* velocidad de movimiento*/
}
for (posicuellodra = 30; posicuellodra >= 0; posicuellodra--) /* Este for hace que baje la cabeza del centro a abajo*/
{
posicuelloizq = map(posicuellodra, 30, 0, 30, 60);
parpadodra = map(posicuellodra, 30, 0, 5, 40); // deja caer un poco los parpados y cabeza
parpadoizq = map(posicuellodra, 30, 0, 70, 35);
ojosv = map(posicuellodra, 30, 0, 25, 45);
ojosvertical.write(ojosv);
parpadoderecho.write(parpadodra);
parpadoizquierdo.write(parpadoizq);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(50); /* velocidad de movimiento*/
}
delay(1000);
digitalWrite(20, LOW);
for (int posicuellodra = 0; posicuellodra <= 15; posicuellodra++) /* este for hace levantar la cabeza de abajo un poco*/
{
posicuelloizq = map(posicuellodra, 0, 15, 60, 45);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(30); /* velocidad de movimiento*/
}
delay(1000);
for (int posicuellodra = 15; posicuellodra >= 0; posicuellodra--) /* este for hace caer la cabeza a abajo*/
{
posicuelloizq = map(posicuellodra, 15, 0, 45, 60);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(20); /* velocidad de movimiento*/
}
delay(1000);
for (int posicuellodra = 0; posicuellodra <= 15; posicuellodra++) /* este for hace levantar la cabeza de abajo un poco*/
{
posicuelloizq = map(posicuellodra, 0, 15, 60, 45);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(50); /* velocidad de movimiento*/
}
delay(1000);
for (int posicuellodra = 15; posicuellodra >= 0; posicuellodra--) /* este for hace caer la cabeza a abajo*/
{
posicuelloizq = map(posicuellodra, 15, 0, 45, 60);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(20); /* velocidad de movimiento*/
}
delay(1000);
digitalWrite(19, LOW);
for (int posicuellodra = 0; posicuellodra <= 15; posicuellodra++) /* este for hace levantar la cabeza de abajo un poco*/
{
posicuelloizq = map(posicuellodra, 0, 15, 60, 45);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(50); /* velocidad de movimiento*/
}
delay(1000);
for (int posicuellodra = 15; posicuellodra >= 0; posicuellodra--) /* este for hace caer la cabeza a abajo*/
{
posicuelloizq = map(posicuellodra, 15, 0, 45, 60);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(20); /* velocidad de movimiento*/
}
delay(1000);
digitalWrite(18, LOW);
delay(1000);
for (int posicuellodra = 0; posicuellodra <= 15; posicuellodra++) /* este for hace levantar la cabeza de abajo un poco*/
{
posicuelloizq = map(posicuellodra, 0, 15, 60, 45);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(50); /* velocidad de movimiento*/
}
delay(1000);
digitalWrite(17, LOW);
for (int posicuellodra = 15; posicuellodra >= 0; posicuellodra--) /* este for hace caer la cabeza a abajo*/
{
posicuelloizq = map(posicuellodra, 15, 0, 45, 60);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(20); /* velocidad de movimiento*/
}
delay(1000);
digitalWrite(16, LOW);
delay(1000);
}
void no() {
parpadoizquierdo.write(65);
parpadoderecho.write(10);
for (int giro = posicion; giro <= (posicion + 20); giro = giro + 1) /* este for hace girar la CABEZA de posicion a la izquierda*/
{
ojosh = map(giro, posicion, (posicion + 20), 20, 40); /* mapea la posicion del giro y los mueve al contrario del cuellos*/
cuellodra = map(giro, posicion, (posicion + 20), 30, 10);
cuelloizq = map(giro, posicion, (posicion + 20), 30, 50);
musculoderecho.write(cuellodra);
musculoizquierdo.write(cuelloizq);
girocuello.write(giro); /* giro cuello a la izq*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
ojosvertical.write(35);
delay(15); /* velocidad de movimiento*/
}
delay(200);
for (int giro = (posicion + 20); giro >= posicion; giro = giro - 1) /* Este for hace que gire el cuello de la izquierda a POSICION*/
{
ojosh = map(giro, (posicion + 20), posicion, 40, 20); /* mapea la posicion del giro y los mueve al contrario del cuellos*/
girocuello.write(giro); /* cuello a la derechaa*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(15); /* velocidad de movimiento*/
}
for (int giro = posicion; giro >= (posicion - 20); giro = giro - 1) /* Este for hace que gire el cuello del POSICION a la derecha*/
{
ojosh = map(giro, posicion, (posicion - 20), 20, 0); /*mapea la posicion del giro y los mueve al contrario del cuellos*/
girocuello.write(giro); /* cuello a la derechaa*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(15); /* velocidad de movimiento*/
}
for (int giro = (posicion - 20); giro <= posicion; giro = giro + 1) /* este for hace girar la cabeza de derecha a POSICION*/
{
ojosh = map(giro, (posicion - 20), posicion, 0, 20); /* mapea la posicion del cuello y los mueve al contrario del cuellos*/
girocuello.write(giro); /* giro cuello a la izq*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(15); /* velocidad de movimiento*/
}
for (int giro = posicion; giro <= (posicion + 20); giro = giro + 1) /* este for hace girar la CABEZA de posicion a la izquierda*/
{
ojosh = map(giro, posicion, (posicion + 20), 20, 40); /* mapea la posicion del giro y los mueve al contrario del cuellos*/
girocuello.write(giro); /* giro cuello a la izq*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(15); /* velocidad de movimiento*/
}
for (int giro = (posicion + 20); giro >= posicion; giro = giro - 1) /* Este for hace que gire el cuello de la izquierda a POSICION*/
{
ojosh = map(giro, (posicion + 20), posicion, 40, 20); /* mapea la posicion del giro y los mueve al contrario del cuellos*/
girocuello.write(giro); /* cuello a la derechaa*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(15); /* velocidad de movimiento*/
}
for (int giro = posicion; giro >= (posicion - 20); giro = giro - 1) /* Este for hace que gire el cuello del POSICION a la derecha*/
{
ojosh = map(giro, posicion, (posicion - 20), 20, 0); /*mapea la posicion del giro y los mueve al contrario del cuellos*/
girocuello.write(giro); /* cuello a la derechaa*/
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(15); /* velocidad de movimiento*/
}
for (int giro = (posicion - 20); giro <= posicion; giro = giro + 1) /* este for hace girar la cabeza de derecha a POSICION*/
{
ojosh = map(giro, (posicion - 20), posicion, 0, 20); /* mapea la posicion del cuello y los mueve al contrario del cuellos*/
girocuello.write(giro); /* giro cuello a la izq*/
cuellodra = map(giro, (posicion - 20), posicion, 10, 30);
cuelloizq = map(giro, (posicion - 20), posicion, 50, 30);
musculoderecho.write(cuellodra);
musculoizquierdo.write(cuelloizq);
ojoshorizontal.write(ojosh); /* posición horizontal de los ojos*/
delay(15); /* velocidad de movimiento*/
}
parpadoizquierdo.write(90);
parpadoderecho.write(0);
ojosvertical.write(25);
parpadeo();
}
void si() {
for (int posicuelloizq = 30; posicuelloizq >= 10; posicuelloizq--) /* Este for hace BAJAR LA CABEZA DEL CENTRO A ABAJO */
{
posicuellodra = map(posicuelloizq, 30, 10, 30, 50);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (int posicuelloizq = 10; posicuelloizq <= 50; posicuelloizq++) /* Este for hace ladee SUBIR A CABEZA DE ABAJO A ARRIBA*/
{
posicuellodra = map(posicuelloizq, 10, 50, 50, 10);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (int posicuelloizq = 50; posicuelloizq >= 10; posicuelloizq--) /* Este for hace BAJAR LA CABEZA DEL CENTRO A ABAJO */
{
posicuellodra = map(posicuelloizq, 50, 10, 10, 50);
musculoderecho.write(posicuellodra);
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
for (int posicuelloizq = 10; posicuelloizq <= 30; posicuelloizq++) /* Este for hace ladee SUBIR A CABEZA DE ABAJO A ARRIBA*/
{
posicuellodra = map(posicuelloizq, 10, 30, 50, 30);
musculoderecho.write(posicuellodra); /* cuello abajo*/
musculoizquierdo.write(posicuelloizq);
delay(15); /* velocidad de movimiento*/
}
risa();
}
void motorabrir() {
digitalWrite(51, HIGH); // Pulsa el boton de pausa
delay(500); // Pulsación corta para PAUSA
digitalWrite(51, LOW); // Deja de pulsar boton
delay(500);
estado40 = digitalRead(fincarrera40); // lee el estado del fin de carrera apertura puerta 1
estado42 = digitalRead(fincarrera42);
estado44 = digitalRead(fincarrera44);
while (estado40 == (HIGH) or estado42 == (HIGH) or estado44 == (HIGH)) {
estado40 = digitalRead(fincarrera40);
estado42 = digitalRead(fincarrera42);
estado44 = digitalRead(fincarrera44);
if (estado40 == LOW) {
digitalWrite(abrepuerta28, LOW);
digitalWrite(cierrapuerta29, LOW);
} else {
digitalWrite(abrepuerta28, HIGH);
digitalWrite(cierrapuerta29, LOW);
}
if (estado42 == LOW) {
digitalWrite(abrepuerta30, LOW);
digitalWrite(cierrapuerta31, LOW);
} else {
digitalWrite(abrepuerta30, HIGH);
digitalWrite(cierrapuerta31, LOW);
}
if (estado44 == LOW) {
digitalWrite(abrepuerta32, LOW);
digitalWrite(cierrapuerta33, LOW);
} else {
digitalWrite(abrepuerta32, HIGH);
digitalWrite(cierrapuerta33, LOW);
}
}
}
void motorcerrar() {
estado45 = digitalRead(fincarrera45); //LEE EL SENSOR DE LA TAPA
while (estado45 == HIGH) {
digitalWrite(15, HIGH);
estado45 = digitalRead(fincarrera45);
if (estado45 == LOW) {
digitalWrite(abrepuerta32, LOW);
digitalWrite(cierrapuerta33, LOW);
} else {
digitalWrite(abrepuerta32, LOW);
digitalWrite(cierrapuerta33, HIGH);
}
}
estado41 = digitalRead(fincarrera41);
estado43 = digitalRead(fincarrera43);
digitalWrite(21, LOW);
while (estado41 == (HIGH) or estado43 == (HIGH)) {
estado41 = digitalRead(fincarrera41);
estado43 = digitalRead(fincarrera43);
if (estado41 == LOW) {
digitalWrite(abrepuerta28, LOW);
digitalWrite(cierrapuerta29, LOW);
} else {
digitalWrite(abrepuerta28, LOW);
digitalWrite(cierrapuerta29, HIGH);
}
if (estado43 == LOW) {
digitalWrite(abrepuerta30, LOW);
digitalWrite(cierrapuerta31, LOW);
} else {
digitalWrite(abrepuerta30, LOW);
digitalWrite(cierrapuerta31, HIGH);
}
}
digitalWrite(51, HIGH); // Pulsa el boton de pausa
delay(500); // Pulsación corta para PAUSA
digitalWrite(51, LOW); // Deja de pulsar boton
delay(500);
}
Moderador:
Editado como las normas lo indican