Ho modificato i miei precedenti interventi integrando il codice in maniera corretta. Grazie per la segnalazione e per le correzioni alla compilazione del codice, dagli errori che faccio si capisce che non sono molto esperto.
Dunque, questa sera ho rimesso mano su Arduino, dopo alcune ricerche su internet ho scoperto l'esistenza della libreria "VarSpeedServo".
Ho provato a studiarmela un attimo ed ho compilato il programma di oggi adattato a questa nuova libreria. Eccolo qui:
#include <VarSpeedServo.h>
VarSpeedServo myservo1;
VarSpeedServo myservo2;
void setup() {
myservo1.attach(8, 5, 175);
myservo2.attach(9, 5, 175);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
}
void loop() {
boolean p1 = digitalRead(2);
boolean p2 = digitalRead(3);
boolean p3 = digitalRead(4);
boolean p4 = digitalRead(5);
if (p1 == HIGH) {
myservo1.slowmove (5, 50);
delay(1000);
myservo2.slowmove (5, 10);
delay(5000);
myservo1.slowmove (175, 50);
delay(1000);}
if (p2 == HIGH) {
myservo1.slowmove (5, 50);
delay(1000);
myservo2.slowmove (60, 10);
delay(5000);
myservo1.slowmove (175, 50);
delay(1000);}
if (p3 == HIGH) {
myservo1.slowmove (5, 50);
delay(1000);
myservo2.slowmove (120, 10);
delay(5000);
myservo1.slowmove (175, 50);
delay(1000);}
if (p4 == HIGH) {
myservo1.slowmove (5, 50);
delay(1000);
myservo2.slowmove (175, 10);
delay(5000);
myservo1.slowmove (175, 50);
delay(1000);}
}
Adesso i movimenti sono più lenti e molto più adatti ai miei scopi ludici. Ho ancora qualche cosa da aggiustare però...mi spiego meglio.
Con servo1 ho identificato il "catenaccio" che alla pressione di un qualsiasi pulsante si apre, avviene lo spostamento della piattaforma e poi si richiude.
Con servo2 ho identificato la piattaforma.
Ho impostato il tempo tra apertura e chiusura del servo1 in 5 secondi, ovvero poco più del tempo che il servo2 che sto utilizzando ora impiega per andare dalla posizione massima alla minima e viceversa. Se però faccio fare una rotazione minima, tipo da 5° a 60°, il tempo di servo2 è minore e quindi c'è un pò di attesa prima che servo1 torni in posizione iniziale.
Come posso fare per ovviare a questa cosa? Ovvero, come posso personalizzare i tempi di servo1 in base a ciascun movimento?
La cosa più immediata che mi viene in mente è creare tanti if quante sono le possibilità di movimento (16), e cioè:
Da 5° a 5° -> x operazioni
Da 5° a 60° -> x1 operazioni
Da 5° a 120° -> x2 operazioni
Da 5° a 175° -> x3 operazioni
e così via.
In questo caso però credo che il programma debba tenere a mente la posizione da cui parte il movimento per poi stabilire le operazioni da eseguire alla pressione di un tasto qualsiasi.
Qualcuno mi può dare un'idea di come sia fatto il codice?
Altra questione riguarda sempre il servo di rotazione: paulus mi hai messo in testa il fatto di far accelerare e poi decelerare il servo durante il movimento, purtroppo però non riesco a capire (causa inesperienza) come poter utilizzare le indicazioni che mi hai scritto e non so nemmeno se vanno bene con questa nuova libreria (ma credo di sì). Potresti spiegarmi meglio?
Io ho provato una cosa del genere ma non funziona (supponendo la partenza da 5° e l'arrivo a 175°):
myservo2.slowmove (35, 10);
myservo2.slowmove (145, 100);
myservo2.slowmove (175, 10);
Grazie a tutti!
Ciao
Antonio