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..
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
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!
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++;