Programmazione arduino problema sketch Aiuto!

Ciao a tutti,
ho un problema con arduino uno.
Ho realizzato due sketch per muovere dei servo motori in due modi diversi.
Separatamnete funzionano entrambi,ma quando vado a implementarli nello stesso sketch non funzionano, o meglio sembra che i segnali ai motori vadano in conflitto.
Potete aiutarmi grazie in anticipo.. :slight_smile:

Certamente.

Allora, sullo sketch unico devi rinominare la variabile MOT in MOT1
poi assegni un'altra variabile INT MOT2 = 4 ;

E alla fine, quando fai il WHILE, devi effettuare un doppio controllo, ovvero replicare le righe daq 45 a 49, cambiano il nome della variabile da MOT a MOT2

Dimenticavo, nella riga 34 manca la parentesi graffa

Guarda facciamo così ti mando i programmi che ho fatto..

Questo sketch ha la seguente funzione: tenedo premunto il pulsante parte il primo servo quando questo raggiunge 180° parte il secondo e così via fino al 5,poi fa l'operazione inversa premendo il secondo bottone.

// TEST2 MANO ROBOTICA CON PULSANTI
 
#include <Servo.h>
 
Servo servo1;
Servo servo2; 
Servo servo3; 
Servo servo4;
Servo servo5;
 
int grado = 0;
int grado1 = 0;
int grado2 = 0;
int grado3 = 0;
int grado4 = 0;
int minGrad = 0;
int maxGrad = 180;
int prev = A1;
int next = A0;
 
void setup()
{
  servo1.attach( 8 );
  servo2.attach( 9 );
  servo3.attach( 10 );
  servo4.attach( 11 );
  servo5.attach( 12 );

  servo1.write( grado );
  servo2.write( grado );
  servo3.write( grado );
  servo4.write( grado );
  servo5.write( grado );
  
  pinMode( prev, INPUT );
  pinMode( next, INPUT );
}
 
void loop()
{

 {
  if ( analogRead( prev ) > 1000 ) { grado4--; }
  if ( analogRead( next ) > 1000 ) { grado++; }
 
  if ( grado > maxGrad ) { grado = maxGrad; }
  if ( grado4 < minGrad ) { grado4 = minGrad; }
 
  servo1.write( grado );
  delay(1);
  }

 {


  if (( analogRead( prev ) > 1000)&&(grado4 == minGrad )) { grado3--; }
  if (( analogRead( next ) > 1000)&&(grado == maxGrad )) { grado1++; }
 
  if ( grado1 > maxGrad ) { grado1 = maxGrad; }
  if ( grado3 < minGrad ) { grado3 = minGrad; }
 
  servo2.write( grado1 );
  delay(1);
  }

 {


  if (( analogRead( prev ) > 1000)&&(grado3 == minGrad )) { grado2--; }
  if (( analogRead( next ) > 1000)&&(grado1 == maxGrad )) { grado2++; }
 
  if ( grado2 > maxGrad ) { grado2 = maxGrad; }
  if ( grado2 < minGrad ) { grado2 = minGrad; }
 
  servo3.write( grado2 );
  delay(1);
  }

 {


  if (( analogRead( prev ) > 1000)&&(grado2 == minGrad )) { grado1--; }
  if (( analogRead( next ) > 1000)&&(grado2 == maxGrad )) { grado3++; }
 
  if ( grado3 > maxGrad ) { grado3 = maxGrad; }
  if ( grado1 < minGrad ) { grado1 = minGrad; }
 
  servo4.write( grado3 );
  delay(1);
  }

 {


  if (( analogRead( prev ) > 1000)&&(grado1 == minGrad )) { grado--; }
  if (( analogRead( next ) > 1000)&&(grado3 == maxGrad )) { grado4++; }
 
  if ( grado4 > maxGrad ) { grado4 = maxGrad; }
  if ( grado < minGrad ) { grado = minGrad; }
 
  servo5.write( grado4 );
  delay(1);
  }

}

Con questo sketch comandiamo assieme con un pulsante tutti e 5 i servo fino a 180° e viceversa con il scondo pulsante ritornano a 0°

// TEST MANO ROBOTICA CON PULSANTI
 
#include <Servo.h>
 
Servo servo1;
Servo servo2; 
Servo servo3; 
Servo servo4;
Servo servo5;  
 
int grado = 0;
int minGrad = 0;
int maxGrad = 180;
int apertura = A2;
int chiusura = A3;
 
void setup()
{
  servo1.attach( 8 );
  servo2.attach( 9 );
  servo3.attach( 10 );
  servo4.attach( 11 );
  servo5.attach( 12 );

  servo1.write( grado );
  servo2.write( grado );
  servo3.write( grado );
  servo4.write( grado );
  servo5.write( grado );
 
  pinMode( apertura, INPUT );
  pinMode( chiusura, INPUT );
}
 
void loop()
{
  if ( analogRead( apertura ) > 1000 ) { grado--; }
  if ( analogRead( chiusura ) > 1000 ) { grado++; }
 
  if ( grado > maxGrad ) { grado = maxGrad; }
  if ( grado < minGrad ) { grado = minGrad; }
 
  servo1.write( grado );
  delay(1);
  servo2.write( grado );
  delay(1);
  servo3.write( grado );
  delay(1);
  servo4.write( grado );
  delay(1);
  servo5.write( grado );
  delay(1);
}

Grazie per la pazienza :slight_smile:

Prova così:

#include <Servo.h>

Servo servo1;
Servo servo2; 
Servo servo3; 
Servo servo4;
Servo servo5;

int grado1 = 0;
int grado2 = 0;
int grado3 = 0;
int grado4 = 0;
int grado5 = 0;
const int minGrad = 0;
const int maxGrad = 180;

const byte prev = A1;
const byte next = A0;
const byte apertura = A2;
const byte chiusura = A3;

boolean AP, CH, PR, NE;

void setup()
{
  servo1.attach( 8 );
  servo2.attach( 9 );
  servo3.attach( 10 );
  servo4.attach( 11 );
  servo5.attach( 12 );

  servo1.write( grado1 );
  servo2.write( grado2 );
  servo3.write( grado3 );
  servo4.write( grado4 );
  servo5.write( grado5 );

  pinMode( prev, INPUT );
  pinMode( next, INPUT );
  pinMode( apertura, INPUT );
  pinMode( chiusura, INPUT );
}

void loop()
{
  // legge pulsanti
  AP = (analogRead(apertura)>1000);
  CH = (analogRead(chiusura)>1000);
  PR = (analogRead(prev)>1000);
  NE = (analogRead(next)>1000);

  if (AP) { // apre tutti i servi
    grado1--; 
    grado2--;
    grado3--;
    grado4--;
    grado5--;
  }

  if (CH) { // chiude tutti i servi
    grado1++; 
    grado2++;
    grado3++;
    grado4++;
    grado5++;
  }

  if (PR) { // apre un servo alla volta
    grado5--; 
    if (grado5 == minGrad) grado4--;
    if (grado4 == minGrad) grado3--; 
    if (grado3 == minGrad) grado2--;
    if (grado2 == minGrad) grado1--;
  }

  if (NE) { // chiude un servo alla volta
    grado1++; 
    if (grado1 == maxGrad) grado2++;
    if (grado2 == maxGrad) grado3++;
    if (grado3 == maxGrad) grado4++; 
    if (grado4 == maxGrad) grado5++;
  }

  // verifica limiti
  grado1 = constrain(grado1,minGrad,maxGrad);
  grado2 = constrain(grado2,minGrad,maxGrad);
  grado3 = constrain(grado3,minGrad,maxGrad);
  grado4 = constrain(grado4,minGrad,maxGrad);
  grado5 = constrain(grado5,minGrad,maxGrad);

  // aziona servo
  servo1.write( grado1 );
  servo2.write( grado2 );
  servo3.write( grado3 );
  servo4.write( grado4 );
  servo5.write( grado5 );
  delay(1);
}

Grazie mi hai dato qualche spunto ho dovuto fare qualche modifica al tuo programma e implementarlo con il mio!
Ho appena risolto!
Grazie comunque! :wink:

Hai ragione.
Quando un servo è arrivato a fine corsa gradox è uguale a maxgradi, ma al loop sucessivo ingrementi grado di uno (gradox++) quindi l'if non è verificato.
Sostituisci l'uguale con un minore/maggiore uguale
ovvero

if (gradox == minGrad) gradox--;

e

if (gradox == maxGrad) gradox++;

con

if (gradox <= minGrad) gradox--;

e

if (gradox >= maxGrad) gradox++;