Caja "inútil"...

Hola, creo que estoy en el sitio adecuado....al menos, eso espero....
Estoy intentando que funcione una caja "inútil" que se resiste a funcionar bien, creo que es debido a Debounce...el caso es que los servos hacen lo que quieren (creo que repiten la misma secuencia) sin tocar o pulsar el interruptor de palanca.
Estoy utilizando el Arduino Nano, con 2 servos, 1 motor y 1 sensor sharp...
El proyecto está aquí:
Caja Inutil

El problema de hacer proyectos de hace años.....es que si tienes algún problema, ya no responden....He hecho todos los pasos que dice el autor, la forma del conexionado, la programación....todo es lo mismo. He ido probando cosas pero he vuelto al punto de partida, es decir, a la programación original.

Llevo buscando y probando 2 semanas!! Si alguien me pudiera decir que es lo que le falta a mi código para que funcione.....estaría muy agradecida.

caja_inutil_12.ino (16.9 KB)

Por dios, quien escribe esos programas horriblemente largos!!!!

Bueno me cansé de hacer arreglos asi que sigue en general como estaba pero logré que compile

NO se que no funciona. Yo probé y compila.

caja_inutil_12.ino (16.8 KB)

Gracias por responder ... Así es, muy largo......el problema no es de compilación, puesto que ya compilaba, el problema es que, sin tocar el interruptor (palanca) se pone en marcha solo y se vuelve loco haciendo secuencias que, creo que son las mismas....

Ah bueno pero eso ocurre porque lo tienes conectado al revés.

usaste una conexión Pull-up o Pull-down?. Si no sabes, google y pones eso mismo

Revisa y responde, pero obvio que tu sistema esta a la inversa por eso se acciona cuando no debe hacerlo.

Estos dos elementos definen tu situación
En el setup

 pinMode(switch_pin, INPUT);

en el loop

   if (digitalRead(switch_pin) == HIGH) {

Entonces tu deberías tener asi conectado el switch

Y esa R puede valer entre 4k7 a 10k como dice el esquema.

Edité porque había puesto el esquema inapropiado.
Tu caso es de Pull-down
Siempre debes leer un LOW cuando no esa presionado y al presionar lees HIGH.

Vale, tienes razón! lo tenía Pull-down, lo he cambiado a Pull-up poniendo en la instrucción pinMode:
INPUT_PULLUP

y cambiando el cableado como en tú esquema.....y parce que funciona un "pelin" mejor la palanca (interruptor) pero...aun así, no funciona como debería. He retocado el movimiento de los servos pero siguen volviéndose locos los servos, parece que repiten la misma secuencia todo el rato....

Oh vaya!
No pasa nada....lo cambio de nuevo

Es un código muy largo, no puedes analizar eso y pretender que todo funcione bien.
Prueba por partes, con una secuencia primero, entiéndela y luego la siguiente hasta completarlas todas..

En lugar del random de esta sección del código

        if (Testmove == 0) {
         	if (randomize == false) {  
       		    if (selectedMove > 10) {
      		  	  	selectedMove = 0; //when all moves are played, repeat the moves from beginning 
      		}
      	} 
      	else {
      		  	selectedMove = random(11);
      	}

solo pones

selectMove = 0 y pruebas la acción 0 o bien usa un SelectMove++ y cada vez que presiones el switch cambias de modo.
cuando llegue al máximo lo vuelves a 0.

Bueno, ya cambié otra vez el cableado, ahora está igual como lo tenía (Pull-down) también he cambiado la sección del código que me dijiste pero....no puedo hacer nada puesto que sigue igual!

Cambio selectMove = 2 y sigue moviéndose sin ton ni son, sin tocar la palanca (interruptor)

Olvidemos todo y veamos que hace bien y qué mal.

Código pensado para pull-down

// Constantes para definir los pines
const int pulsadorPin = 2;
const int ledPin = 13;
 
int valorPulsador = 0;
 
void setup() {
    // Activamos los pines de entrada y salida
    pinMode(pulsadorPin, INPUT);
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}
 
void loop() {
    // Leemos el valor del pin
    valorPulsador = digitalRead(pulsadorPin);
 
  // Encendemos o apagamos el pin del LED según convenga
  if (valorPulsador == HIGH) {
      digitalWrite(ledPin, HIGH);
      Serial.println("Esta en presionado en HIGH");
  }
  else {
      digitalWrite(ledPin, LOW);
      //Serial.println("Esta en LOW"); // descomenta para poder verlo en el Monitor serie
  }
}

Si pruebas esto veras que "Esta en LOW" se ve todo el tiempo en el monitor serie.
Asi que dos alternativas, o no lo ves como yo dejé ahora el probrama y visualizas solo la situación que te interesa o usas otro método.

Prueba esto que es básico pero sabremos que esta bien tu hardware.
Si falla hay soluciones antirebote por ejemplo.

La primer mejora es esta, usar algo que sepa el estado anterior.

// Constantes para definir los pines
const int pulsadorPin = 2;
const int ledPin = 13;
 
bool valorPulsador, valorPulsadorAnt = false;
 
void setup() {
    // Activamos los pines de entrada y salida
    pinMode(pulsadorPin, INPUT);
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}
 
void loop() {
    // Leemos el valor del pin
    valorPulsador = digitalRead(pulsadorPin);
 
  // Encendemos o apagamos el pin del LED según convenga
  if (valorPulsador && !valorPulsadorAnt) {
      digitalWrite(ledPin, HIGH);
      Serial.println("Esta en presionado en HIGH");
  }
  if (!valorPulsador && valorPulsadorAnt) {
      digitalWrite(ledPin, LOW);
      Serial.println("Esta en LOW"); 
  }
  valorPulsadorAnt = valorPulsador;
}

Ahora cada cambio será visualizado. En general esto funciona muy bien y no necesitas antirebotes.
Ya me diras.

No había visto tú respuesta!!

Acabo de probar los dos códigos y los dos funcionan muy bien, ahora tengo una duda el interruptor que uso es de palanca, no es pulsador, es decir, cuando yo pulse la palanca en HIGH, saldrá un dedo que lo pondrá en LOW....funcionará igual??

Veo que hay 2 pin en el arduino: el 2 y el 13 para el led
El 2 es el botón pero....entonces necesito poner los 2 servos con los pines 9 y 10??

// Constantes para definir los pines
const int pulsadorPin = 2;
const int ledPin = 13;

Caramba....no sé cómo ponerlo

Veo que hay 2 pin en el arduino: el 2 y el 13 para el led
El 2 es el botón pero....entonces necesito poner los 2 servos con los pines 9 y 10??

No Gusitos. Te dije que era un ejemplo.

Okay vamos por pasos.

Te pondre un código y lo vas a probar y me dices si funciona bien.
Es una versión mas simple. solo lo que no debería hacer nada y luego un movimiento. Deberías ver en el monitor serie el Movimiento que le corresonde a cada paso

#include <Servo.h> 

Servo doorServo;
Servo handServo;

unsigned long TimerA,TimerB;    // timer for the movement detection routine
int switch_pin = 2;             // set switch on pin 2

//motor variables
int motorThrottle  = 11;
int motorDirection = 13;
int motorBrake     = 8;

//Distance Variables
int motionPin      = 3;         // motion sensor pin on analog 0
int lastDist       = 0;         // to remember last distance
int currentDist    = 0;   
int thresh         = 200;       // Threshold for Movement (set it such that you get the desired sensetivity of motion detection)


int pos            = 0;
int selectedMove   = 0;         //move selector
int Testmove       = 0;         // test mode: set to move number to test only one selected move 
                                // (set to Zero to run normally i.e: roundrobbin on all moves)
boolean randomize  = true;      // if true, the box will do movers randomly, if set to false then the moves will be done sequencially from 1 to 10 

void switchoffbitaraddod();
void switchoff();

void setup() {
  Serial.begin(9600);
  pinMode(switch_pin, INPUT);
  doorServo.attach(9);           //set door servo on Pin 9 pwm
  handServo.attach(10);          //set hand servo on Pin 10 pwm

  doorServo.write(80);           //set door to hiding position 
  handServo.write(0);            //set hand to hiding position
  //Setup Channel B, since Channel A is reserved by door and hand servos and can't ber used at same time
  pinMode(motorDirection, OUTPUT); //Initiates Motor Channel B pin
  pinMode(motorBrake, OUTPUT); //Initiates Brake Channel B pin
}


void loop() {

    //if the switch is on, then move door and hand to switch it off...
    if (digitalRead(switch_pin) == HIGH) {
        Serial.print("Movimiento: ");
        Serial.println(selectedMove);
        switch(selectedMove) {
            case 0,1: switchoff();
                    break;
            case 2: switchoffbitaraddod();
                    selectedMove = 0;
                    break;
        }

    }
}

// Library of moves
void switchoff() {                  // basic move 
	//Moving door
    doorMoveP(80,155,3);  
   
    //Moving hand
    handMoveP(0, 129, 4);
    
    //hiding hand
    handMoveN(129, 0, -4);

    //hiding door
    doorMoveN(155, 80, -3);
    selectedMove += 1;
}
     
// move 3: open and wait, then move hand and wait, then switch of and hide  
void switchoffbitaraddod()   {
    //Moving door
    doorMoveP(80, 155, 3);  
    delay(800); 
    //Moving hand
    handMoveP(0, 100, 4);
    delay(1000); 
    handMoveP(100, 129, 4);    
    //hiding hand
    handMoveN(129, 0, -5);

    //hiding door
    doorMoveN(155,80, -3);
}



void doorMoveP(int desde, int hasta, int step) {
    for (pos = desde; pos < hasta; pos +=step) {                                   
        doorServo.write(pos);              
        delay(15);                       
    }   
}

void doorMoveN(int desde, int hasta, int step) {
    for (pos = desde; pos >= hasta; pos -=step) {                                   
        doorServo.write(pos);              
        delay(15);                       
    }   
}

void handMoveP(int desde, int hasta, int step) {
    for (pos = desde; pos < hasta; pos += step) {
        handServo.write(pos);              
        delay(15);                       
    }   
}

void handMoveN(int desde, int hasta, int step) {
    for (pos = desde; pos >= hasta; pos -= step) {                                   
        handServo.write(pos);              
        delay(15);                       
    }   
}

Uy.....meda error de compilación:

C:\Users\Ideas\Desktop\sketch_dec31a\sketch_dec31a.ino: In function 'void loop()':

sketch_dec31a:51: error: expected ':' before ',' token

           case 0,1: switchoff();

                 ^

sketch_dec31a:51: error: expected primary-expression before ',' token

sketch_dec31a:51: error: expected ';' before ':' token

           case 0,1: switchoff();

                   ^

exit status 1
expected ':' before ',' token

reemplaza por

case 0:
case 1:   switchoff();

A ver esta versión?

El código a pesar de la reducción sigue siendo muy grande.
Asi que esta adjunto.

caja_inutil_12.ino (10.2 KB)

Bueno resumo las experiencias con Olga a quien he tenido el gusto de conocer a la distancia.
Encontramos algunos errores en el código que hemos resuelto al pasar.

El código final quedó asi

#include <Servo.h> 

Servo doorServo;
Servo handServo;

#define MOVIMIENTO_FINAL 9
#define DEBUG_PRINT 0           // si esta en 1 mostrara la posicion del servo, en 0 no muestra nada.

unsigned long TimerA,TimerB;    // temporizador para la rutina de detección de movimiento
int switch_pin      = 2;        // configurar el interruptor pin 2

//motor variables
int motorThrottle   = 11;       //5;   VELOCIDAD en ENB     
int motorDirection  = 12;       //13; //6;  DIRECCIÓN en IN1
int motorBrake      = 8;        //4;   FRENOS en IN2

//Distance Variables
int motionPin       = 3;         // pin sensor de movimiento en analógico 0
int lastDist        = 0;         // recordar la última distancia
int currentDist     = 0;   
int thresh          = 200;       // Umbral de movimiento (configúrelo de modo que obtenga la sensibilidad deseada de detección de movimiento)


int pos             = 0;
int selectedMove    = 0;         //selector de movimiento
int selectedMoveAnt = 0;
int Testmove        = 0;         // modo de prueba: configurar para mover el número para probar solo un movimiento seleccionado 
                                 //(establecer en cero para ejecutar normalmente i.e: round robin en todos los movimientos)
boolean randomize      = true;   // si es verdadero (true), la caja hará movimientos al azar, si se establece en (falso), los movimientos se realizarán secuencialmente de 1 a 10 
bool status, statusAnt = true;

void switchoffbitaraddod();
void switchoff();
void switchoffbitaraddod();
void crazydoor();
void crazyslow();
void m7anika7anika();
void m3alla2();
void matrix(); 
void sneak();
void zee7();

char buffer[50];

void setup() {
  Serial.begin(9600);
  pinMode(switch_pin, INPUT);
  doorServo.attach(9);           // establecer el servo de la puerta en Pin 9 pwm
  handServo.attach(10);          // establecer servo de mano en Pin 10 pwm

  doorServo.write(50);           // poner la puerta a la posición de ocultación 
  handServo.write(100);          //poner la mano a la posición de ocultación

  //Configurar el canal B, ya que el canal A está reservado por servos de puerta y de mano y no se puede usar al mismo tiempo
  pinMode(motorDirection, OUTPUT);     //Inicia Motor Channel B pin
  pinMode(motorBrake, OUTPUT);        // Inicia el canal de freno B pin
  Serial.println("Comenzando a funcionar la caja inutil");
  Serial.println();
  sprintf(buffer, "Movimiento %d, Testmove %d, randomize %d", selectedMove, Testmove, randomize);
  Serial.println(buffer);  
}

void loop() {

    
    
    //si el interruptor está encendido, mueva la puerta y la mano para apagarlo...
    status = digitalRead(switch_pin);
    if (status != statusAnt)
        Serial.println(status?"ON":"OFF");
    statusAnt = status;
    if (status) {
        if (Testmove == 0) {
            if (randomize == false) {  
               selectedMove++;         //cambiar al siguiente movimiento si no está en modo de prueba
               sprintf(buffer, "Movimiento %d, Testmove %d, randomize %d", selectedMove, Testmove, randomize);
               Serial.println(buffer);  

                if (selectedMove > MOVIMIENTO_FINAL) 
                    selectedMove = 0;      //cuando todos los movimientos se juegan, repite los movimientos desde el principio 
            }
            else {
                selectedMove = random(MOVIMIENTO_FINAL);
    
                sprintf(buffer, "Movimiento %d, Testmove %d, randomize %d", selectedMove, Testmove, randomize);
                Serial.println(buffer);  
            }
        } 
        
    }
    else 
         selectedMove = Testmove;
        
//    if (selectedMove != selectedMoveAnt) {
//        Serial.print("Movimiento: ");
//        Serial.println(selectedMove);  
//    }
    
    switch (selectedMove) {
        case 0: break;
        case 1: switchoff();
                break;
            case 2: switchoffbitaraddod();
                        break;
            case 3: crazydoor();
                    break;
            case 4: crazyslow();
                        break;
            case 5: m7anika7anika();
                    break;
            case 6: m3alla2();
                    break;
            case 7: switchoff();
                    break;
            case 8: matrix(); 
                    break;
            case 9: sneak();
                    break;
            case 10: zee7();
                     break;
    }   
  selectedMoveAnt = selectedMove;
}

// Library of moves
void switchoff() {                  // basic move 
    Serial.println("switchoff");
    
    //Moving door
    if (DEBUG_PRINT) Serial.println("Moving door");
    doorMoveP(50, 109, 3, 15);  
   
    //Moving hand
    if (DEBUG_PRINT) Serial.println("Moving hand");
    handMoveN(100, 0, -4, 15);
    
    //hiding hand
    if (DEBUG_PRINT) Serial.println("Hiding hand");
    handMoveP(0, 100, 4, 15);

    //hiding door
    if (DEBUG_PRINT) Serial.println("Hiding door");
    doorMoveN(109, 50, -3, 15);
    //Serial.println("switchoff termina");
}
     
// move 3: abrir y esperar, luego mover la mano y esperar, luego cambiar y ocultar    
void switchoffbitaraddod()   {
    Serial.println("switchoffbitaraddod empieza");
    
    //Moving door
    
    doorMoveP(50, 109, 3, 15);  
    delay(800); 
    
    //Moving hand
    handMoveN(100, 15, -4, 15);
    delay(1000); 
    
    handMoveN(15, 0, -4, 15);    
    //hiding hand
    handMoveP(0, 100, 5, 15);

    //hiding door
    doorMoveN(109,50, -3, 15);
    Serial.println("switchoffbitaraddod termina");
}

  
//move 4: abra la puerta y luego ciérrela muchas veces, espere, luego vuelva a abrirla rápidamente, 
   //apáguela y escóndala.
void crazydoor()  {
    Serial.println("crazydoor empieza");
    
    // Moving door
    doorMoveP( 50, 90, 3, 15);
  
    // hiding door
    doorMoveN(90, 50, -5, 15);
   
    //Moving door
    doorMoveP( 50, 83, 3, 15);
  
    //hiding door
    doorMoveN(83, 50, -15, 15);
    delay(700);

    // Puerta en movimiento
    doorMoveP(50, 90, 3, 15);
    delay(700);
    
    // puerta escondida
    doorMoveN(90, 50, -5, 15);
    
    //----of switch of----//
    // Moving door
    doorMoveP(50, 109, 8, 15);
       
    // Moving hand
    handMoveN(100, 0, -3, 15);
      
    // hiding hand
    handMoveP(0, 100, 3, 15);
      
    //hiding door
    doorMoveN(109,50,-15, 15);
    Serial.println("crazydoor termina");
  }

segunda parte

 // move 5: abra la puerta, luego mueva la mano muy lentamente hacia adelante y hacia atrás 
 //para esconderse muy lentamente, luego cierre rápidamente la puerta
 void crazyslow(){
  Serial.println("crazyslow empieza");
 
    //Moving door
    doorMoveP(50, 109, 1, 15);
       
    //Moving hand
    handMoveN(100, 0, -1, 30);
    
    //hiding hand
    handMoveP(0, 100, 1, 30);
     
    //hiding door
    doorMoveN(109, 90, -1, 30);
    delay(100);

    doorMoveN(90, 0, -4, 15);    
    Serial.println("crazyslow termina");
 }
 
 //move 6:
 void m7anika7anika() {
    Serial.println("m7anika7anika empieza");
 
    // Moving door
    doorMoveP(50, 109, 3, 15);
         
    //Moving hand
    handMoveN(100, 32, -1, 15);
    delay(800);
    
    //hiding door
    doorMoveN(109, 95, -3, 15);
    
    //hiding door
    doorMoveP(95, 109, 3, 15);
     
    // hiding door
    doorMoveN(109, 95, -3, 15);
    
    //hiding door
    doorMoveP(95, 109, 3, 15);
     
    handServo.write(40);
    delay(1000);
      
    //Moving hand
    handMoveN(40, 0, -4, 15);
    
    //hiding hand
    handMoveP(0, 100, 4, 15);
    
    doorMoveN(109, 50, -1, 15);      
    Serial.println("m7anika7anika termina");
} 

void m3alla2(){
    Serial.println("m3alla2 empieza");
    // Moving door
    doorMoveP(50, 109, 3, 15);

    // Moving hand
    handMoveN(100, 0, -4, 15);

    //hiding door
    doorMoveN(109, 95, -3, 15);
    delay(2000);
    
    doorMoveP(95, 109, 3, 15);
    
    doorMoveN(109, 93, -3, 15);
    doorMoveP(93, 109, 3, 15);
    delay(500);

    //hiding hand
    handMoveP(0, 100, 4, 15);
      
    //hiding door
    doorMoveN(109, 50, -3, 15);
    Serial.println("m3alla2 termina");
}
   
void matrix() {
    Serial.println("matrix empieza");

    // Moving door
    doorMoveP(50, 109, 3, 15);
   
    //Moving hand
    handMoveN(100, 80, -4, 15);
    
    handMoveN(56, 0, -1, 30);
    delay(300);
    
    handMoveP(0, 100, 4, 10);
      
    //hiding door
    doorMoveN(109, 50, -3, 15);
    Serial.println("matrix termina");
}

void sneak() {
    Serial.println("sneak empieza");    
    // Moving door
    doorMoveP(50, 95, 1, 30);
    delay(2000);
    
    //Moving hand
    handMoveN(100, 55, -1, 30);
    delay(500);
    
    doorMoveP(95, 109, 4, 15);
    delay(100);
    
    handMoveN(55, 28, -4, 15);
    delay(500);

    //hiding hand
    handMoveP(28, 55, 4, 15);
    delay(100);

    handMoveN(55, 28, -4, 15);
    delay(100);

    handMoveP(28, 55, 4, 15);
    delay(100);
       
    handMoveN(28, 55, -4, 15);
    
    handMoveP(0, 100, 4, 15);

    //hiding door
    doorMoveN(109, 50, -3, 15);
    Serial.println("sneak termina");
} 
   
// este movimiento abrirá la puerta y esperará el movimiento, si se detecta cerca del interruptor, 
// la caja se moverá primero a la derecha y luego a la izquierda, y finalmente la mano se mueve y apaga el interruptor
void zee7() {
  Serial.println("zee7 empieza");  
     
    // open door
    doorMoveP(50, 109, 3, 15);
    delay(1200);    //espere para estabilizar las lecturas del sensor después de abrir la puerta
      
    // configurar el temporizador y leer el sensor
    // esperar a un movimiento que exceda el umbral o si el temporizador expira (5 sec),
    lastDist= analogRead(motionPin);   
    TimerA= millis();
     
    while(millis()-TimerA <= 5000)     {
        currentDist = analogRead(motionPin);
     
        //¿La distancia actual se desvía de la última distancia en más del umbral?
        //si es así, mueva el cuadro a la derecha
        if ((currentDist > lastDist + thresh || currentDist < lastDist - thresh) || currentDist > 300)  {
          
            //avance velocidad media hacia la izquierda (elija la velocidad y la demora 
           //(i.e delay(300) de acuerdo con la caja y el voltaje de la batería de modo que el lanzamiento de movimiento sea deseable)
            digitalWrite(motorDirection, LOW);  //Establishes RIGHT direction of Channel A
            digitalWrite(motorBrake, LOW);      //Disengage the Brake for Channel B
            analogWrite(motorThrottle, 100);    //Spins the motor on Channel B at full speed
            delay(300);
            digitalWrite(motorBrake, HIGH); //Eengage the Brake for Channel B
            break;
        }
        lastDist = currentDist;   
    }
    
    // configurar el temporizador y leer el sensor
    // espere un movimiento que exceda el umbral o si el temporizador expira (5 sec),
    delay(1200);  //espere para estabilizar las lecturas del sensor después de abrir la puerta
    lastDist = analogRead(motionPin);  
    TimerB = millis();
      
    while (millis()-TimerB <= 5000) {
            currentDist = analogRead(motionPin);     
            //¿La caja ya se movió hacia la derecha y la distancia actual se desvió de la última distancia en más del umbral?
            // Si es así, entonces muévase hacia la izquierda
            if ((currentDist > lastDist + thresh || currentDist < lastDist - thresh) || currentDist > 300) {

                //hacia atrás @ velocidad media hacia la derecha (elija la velocidad y la demora 
                //(i.e delay(300) de acuerdo con la caja y el voltaje de la batería de modo que el lanzamiento de movimiento sea deseable)
                digitalWrite(motorDirection, HIGH); //Establece la dirección IZQUIERDA de Channel B
                digitalWrite(motorBrake, LOW);      //Desengrane el freno para Channel B
                analogWrite(motorThrottle, 100);    //Enciende el motor Channel B a media velocidad
                delay(300);
                digitalWrite(motorBrake, HIGH); //Enganche el freno por Channel B
                break;
            }
      
            lastDist = currentDist;   
   
    }
    
    delay(100);
    // Moving hand
    handMoveN(100, 0, -4, 15);

    // hiding hand
    handMoveP(0, 100, 4, 15);

    //hiding door
    doorMoveN(109, 50, -3, 15);
    Serial.println("zee7 termina");
} 


void doorMoveP(int desde, int hasta, int paso, int temp) {
    unsigned int cont = 0;
 
    for (pos = desde; pos < hasta; pos +=paso) {                                   
        doorServo.write(pos);
        if (DEBUG_PRINT) {              
            Serial.print(pos);
            Serial.print(" ");
            if(cont++>20){
               cont = 0;
               Serial.println();
            }
        }
        delay(temp);                       
    }   
}

void doorMoveN(int desde, int hasta, int paso, int temp) {
    unsigned int cont = 0;
    
    for (pos = desde; pos >= hasta; pos +=paso) {                                   
        doorServo.write(pos);              

        if (DEBUG_PRINT) {              
            Serial.print(pos);
            Serial.print(" ");
            if(cont++>20){
               cont = 0;
               Serial.println();
            }
        }
        delay(temp);                       
    }   
}

void handMoveP(int desde, int hasta, int paso, int temp) {
    unsigned int cont = 0;
 
     for (pos = desde; pos < hasta; pos += paso) {
        handServo.write(pos);              
        if (DEBUG_PRINT) {              
            Serial.print(pos);
            Serial.print(" ");
            if(cont++>20){
               cont = 0;
               Serial.println();
            }
        }
        delay(temp);                       
    }   
}

void handMoveN(int desde, int hasta, int paso, int temp) {
    unsigned int cont = 0;
    //sprintf(buffer, "desde %d hasta %d paso %d temp %d", desde, hasta, paso, temp);
    //Serial.println(buffer);  
    for (pos = desde; pos >= hasta; pos+=paso) {                                   
        handServo.write(pos);              
        if (DEBUG_PRINT) {              
            Serial.print(pos);
            Serial.print(" ");
            if(cont++>20){
               cont = 0;
               Serial.println();
            }
        }
        delay(temp);                       
    }   
}

Después de darle vueltas al código (que estaba mal) rectificar unas cuantas cosas, poner unas variables, definir un par de cosas, añadir otras tantas y probar ...hemos conseguido hacer funcionar la caja "inútil" a la perfección!
Sin lugar a dudas una gran experiencia y aprendizaje, que seguro voy a seguir.
Muchas gracias Surbyte!! Un gran profesional!!