ciao a tutti, chiedo un aiuto...
ho costruito un braccio comandando 3 servo con potenziometri e la pinza con un pulsante di apertura e uno di chiusura e tutto funziona come voglio...
ora vorrei integrare una sirena lampeggiante di due led che si aziona quando il sistema è in movimento, ma non riesco a farla integrare con il programma,
credo sia un problema del delay, ma non ne esco fuori, se inserisco il void sirena, la pinza non apre e non chiude, in simulazione si muove con il delay 400 credo, perchè si muove lentamente.
ecco il codice:
// gestione 3 potenziometri e pinza a pulsanti apri e chiudi
#include <Servo.h>
//oggetti servo
Servo XServo1;
Servo YServo2;
Servo XServo3;
Servo Servo4Pinza;
//ingressi servo braccio
int Servo1XPin = 5;
int Servo2YPin = 6;
int Servo3XPin = 9;
//ingresso servo pinza
int pinServoPinza = 3;
//ingressi led sirena
int LedSirena1 = 7;
int LedSirena2 = 8;
//uscite analogiche
int X1PotPin = A2;
int Y2PotPin = A0;
int X3PotPin = A1;
int apriPinzaPinza = A3;
int chiudiPinza = A4;
//angoli servo
int Servo1_Min = 0;
int Servo1_Max = 180;
int Servo2_Min = 0;
int Servo2_Max = 180;
int Servo3_Min = 0;
int Servo3_Max = 180;
int GradoPinza = 0;
int minGradPinza = 0;
int maxGradPinza = 150;
//posizioni servo
int X1PotValue;
int XServo1Position;
int X3PotValue;
int XServo3Position;
int Y2PotValue;
int YServo2Position;
void setup()
{
//setup servo braccio
XServo1.attach(Servo1XPin);
YServo2.attach(Servo2YPin);
XServo3.attach(Servo3XPin);
//setup servo pinza
Servo4Pinza.attach( pinServoPinza );
Servo4Pinza.write( GradoPinza );
pinMode( chiudiPinza, INPUT );
pinMode( apriPinzaPinza, INPUT );
//setup led
pinMode(LedSirena1, OUTPUT);
pinMode(LedSirena2, OUTPUT);
}
void loop()
{
movimenti();
pinza ();
sirena ();
}
void movimenti()
{
//loop servo braccio
X1PotValue = analogRead(X1PotPin);
Y2PotValue = analogRead(Y2PotPin);
X3PotValue = analogRead(X3PotPin);
XServo1Position = map(X1PotValue, 0, 1023, Servo1_Min , Servo1_Max);
YServo2Position = map(Y2PotValue, 0, 1023, Servo1_Min , Servo1_Max);
XServo3Position = map(X3PotValue, 0, 1023, Servo3_Min , Servo3_Max);
XServo1.write(XServo1Position);
YServo2.write(YServo2Position);
XServo3.write(XServo3Position);
}
void pinza () {
//loop servo pinza
if ( analogRead( chiudiPinza ) > 1000 ) { GradoPinza--; }
if ( analogRead( apriPinzaPinza ) > 1000 ) { GradoPinza++; }
if ( GradoPinza > maxGradPinza ) { GradoPinza = maxGradPinza; }
if ( GradoPinza < minGradPinza ) { GradoPinza = minGradPinza; }
Servo4Pinza.write( GradoPinza );
delay(1);
}
void sirena () {
digitalWrite(LedSirena1, HIGH);
delay(400);
digitalWrite(LedSirena1, LOW);
digitalWrite(LedSirena2, HIGH);
delay(400);
digitalWrite(LedSirena2, LOW);
}
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto.
ma non sapendo come fare l'alternata tra led1 e led 2, uno l'ho lasciato sempre acceso ...
non so se è una cosa corretta, ma ottengo che il led2 lampeggia!! e la pinza apre e chiude con i pulsanti :o
domenico2019:
sono riuscito ad ottenere il risultato giocando sulla luminosità del led cosi,
....
ma non sapendo come fare l'alternata tra led1 e led 2, uno l'ho lasciato sempre acceso ...
Quindi NON hai ottenuto il risultato che volevi, ma qualcos'altro, che può pure andarti bene, ma è venuto fuori quasi "per caso", e questo va molto meno bene Il punto di partenza è studiare l'uso della funzione millis nell'esempio blink without delay.
E' corretto il fatto che adesso il loop scorre liberamente, senza venire bloccato dai delay.
Adesso devi fare un passo avanti: non usare il tuo incremento "luminosita = luminosita + fadeAmount", ma l'incremento di millis(), che è un orologio già esistente che scorre in continuazione!
Perciò, schematicamente:
segna il tempo iniziale: t1=millis(); [t1 deve essere unsigned long]
digitalWrite HIGH
è trascorso il tempo previsto? Sì: digitalWrite LOW e segna il tempo per ricominciare; No: va avanti
perfetto, ora ci siamo, nel frattempo ho creato un doppio impianto, uno che illumina la zona della pinza a led accesi fissi bianchi, e uno che lampeggia e segnala i movimenti
posto il codice finale, magari potrà essere utile a chi cerca qualcosa di simile in futuro..
// gestione 3 potenziometri e pinza a pulsanti apri e chiudi
#include <Servo.h>
//oggetti servo
Servo XServo1;
Servo YServo2;
Servo XServo3;
Servo Servo4Pinza;
//ingressi servo braccio
int Servo1XPin = 5; //base
int Servo2YPin = 6; //sinistro
int Servo3XPin = 9; //destro
//ingresso servo pinza
int pinServoPinza = 3;
//led luce fissa
int LedSirena1 = 7;
//led sirena
const int LedSirena2 = 8;
int ledState = LOW ;
unsigned long previousMillis = 0 ;
const long interval = 300 ;
//uscite analogiche
int X1PotPin = A2;
int Y2PotPin = A0;
int X3PotPin = A1;
int apriPinzaPinza = A3;
int chiudiPinza = A4;
//angoli servo
int Servo1_Min = 1; // BASE
int Servo1_Max = 179; // BASE
int Servo2_Min = 45; // SINISTRO 45
int Servo2_Max = 105; // SINISTRO 105
int Servo3_Min = 35; //DESTRO 35
int Servo3_Max = 105; //DESTRO 105
int GradoPinza = 0;
int minGradPinza = 6 ; // minimo pinza aperta
int maxGradPinza = 100;
//posizioni servo
int X1PotValue;
int XServo1Position;
int X3PotValue;
int XServo3Position;
int Y2PotValue;
int YServo2Position;
void setup()
{
//setup servo braccio
XServo1.attach(Servo1XPin);
YServo2.attach(Servo2YPin);
XServo3.attach(Servo3XPin);
//setup servo pinza
Servo4Pinza.attach( pinServoPinza );
Servo4Pinza.write( GradoPinza );
pinMode( chiudiPinza, INPUT );
pinMode( apriPinzaPinza, INPUT );
//setup led
pinMode(LedSirena1, OUTPUT);
pinMode(LedSirena2, OUTPUT);
}
void loop()
{
movimenti();
pinza ();
illuminazione ();
}
void movimenti()
{
//loop servo braccio
X1PotValue = analogRead(X1PotPin);
Y2PotValue = analogRead(Y2PotPin);
X3PotValue = analogRead(X3PotPin);
XServo1Position = map(X1PotValue, 0, 1023, Servo1_Min , Servo1_Max);
YServo2Position = map(Y2PotValue, 0, 1023, Servo2_Min , Servo2_Max);
XServo3Position = map(X3PotValue, 0, 1023, Servo3_Min , Servo3_Max);
XServo1.write(XServo1Position);
YServo2.write(YServo2Position);
XServo3.write(XServo3Position);
}
void pinza () {
//loop servo pinza
if ( analogRead( chiudiPinza ) > 1000 ) { GradoPinza--; }
if ( analogRead( apriPinzaPinza ) > 1000 ) { GradoPinza++; }
if ( GradoPinza > maxGradPinza ) { GradoPinza = maxGradPinza; }
if ( GradoPinza < minGradPinza ) { GradoPinza = minGradPinza; }
Servo4Pinza.write( GradoPinza );
delay(1);
}
void illuminazione ()
{
digitalWrite(LedSirena1, HIGH);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(LedSirena2, ledState);
}
}