Blink LED durante azionamento Servo

Salve a tutti,

dopo aver risolto in un altro thread il problema di come muovere due servo in maniera "speculare", ora volevo aggiungere due led che lampeggiassero nel mentre che i servo vanno da una posizione ad un'altra, ma si spengano quando i servo sono fermi.

Ho provato ad usare la funzione millis() e la libreria secTimer per definire un timer al blinking, ma senza successo (probabilmente per il mio essere ancora inesperto).

Ho anche provato ad inserire il tutto nel ciclo for, ma naturalmente in questo modo i servo sono molto rallentati.

Vi posto lo stato attuale del sello script.

#include <Servo.h>
#define PIN_SERVO_1 9
#define PIN_SERVO_2 10

int pulsantePin = 2;
int attesa = 2000;
int singlestep = 20;
Servo servo1; // classe oggetto, la seconda parola è il nome di tale oggetto. Se due servo, crearne due con nomi diversi
Servo servo2;

void setup() {
  servo1.attach(PIN_SERVO_1);
  servo2.attach(PIN_SERVO_2);
  pinMode(pulsantePin, INPUT);
  servo1.write(0);
  servo2.write(180);
}

void loop() {
  int angolo_servo_1 = servo1.read();
  int angolo_servo_2 = servo2.read();
  if(digitalRead(pulsantePin) == HIGH && angolo_servo_1 < 80 && angolo_servo_2 > 100){
    ascesa1();
  }
  if(digitalRead(pulsantePin) == HIGH && angolo_servo_1 == 80 && angolo_servo_2 == 100){
    ascesa2();
  }
  if(digitalRead(pulsantePin) == HIGH && angolo_servo_1 == 140 && angolo_servo_2 == 40){
    discesa();
  }
}

void ascesa1(){
  for(int i = 0; i <= 80; i++){ // sposta testina da 0 a 80 gradi
    servo1.write(i);
    servo2.write(180 - i);
    delay(singlestep);
  }
}

void ascesa2(){
  for(int i = 80; i <= 140; i++){ // sposta testina da 80 a 140 gradi
    servo1.write(i);
    servo2.write(180 - i);
    delay(singlestep);
  }
}

void discesa(){
   for(int i = 140; i >= 0; i--){ // sposta testina da 140 a 0 gradi
    servo1.write(i);
    servo2.write(180 - i);
    delay(singlestep);
  }
}

Vorrei far sì che i led collegati ad un pin digitale lampeggino durante le funzioni ascesa1(), ascesa2() e discesa(), aggiungendo una funzione a tempo oppure inserendole nelle funzioni stesse.

Grazie mille...!

Salve escoch, volevo sapere se hai risolto il tuo problema di far lampeggiare i led,

anche io ho lo stesso problema vorrei far lampeggiare un led al verificarsi di una certa situazione.
Essendo anche io non molto esperto ho difficolta ad impostare le funzioni del blink.
mi hanno suggerito di usare blinksenza Delay.
Ho provato senza successo.

saresti così gentile di dirmi come hai risolto.

Saluti
Lorenzo

LOLLO65:
Salve escoch, volevo sapere se hai risolto il tuo problema di far lampeggiare i led,

anche io ho lo stesso problema vorrei far lampeggiare un led al verificarsi di una certa situazione.
Essendo anche io non molto esperto ho difficolta ad impostare le funzioni del blink.
mi hanno suggerito di usare blinksenza Delay.
Ho provato senza successo.

saresti così gentile di dirmi come hai risolto.

Saluti
Lorenzo

Ciao LOLLO65,

mi dispiace ma nessuno ancora mi ha risposto e ancora non ho risolto...
Intanto mi sto concentrando sulla modifica del setup hardware, in attesa di un aiuto qui. Come dici te vorrei capire come mandare un certo segnale/funzione nel mentre che un'altra è in corso.

Attendiamo....!

Per poter fare queste cose occorre studiare molto bene come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e quindi tutti gli articoli che sono in QUESTA pagina ... vedrai che poi sarà più chiaro come fare.

Guglielmo

escoch:
come mandare un certo segnale/funzione nel mentre che un'altra è in corso.

Se è solo per far blinkare un LED si può vedere la libreria MsTimer2, che richiama si a tempo una funzione a parte, ma lo fa tramite interrupt del timer creando un potenziale processo concorrente, che se non si scrive come si deve a sua volta può bloccare quello principale.

La via generale che permette di portare avanti N compiti indipendenti assieme è quella già indicata qui, che comporta pensare la logica in modo diverso. L'uso di millis permette di contare il tempo senza bloccare nulla, ma da solo, senza questa diversa strutturazione non basta.

Ciao escoch,

grazie per la rispopsta, spiacente che non hai risolto ma come ci dice Gulienmo occorre studiare bene.
Applicherei io mia espriesssione: Se cerchi una mano da qualcuno, la trovi in fono al tuo braccio.

Grazie Guglielmo e grazie Claudio_FF per i suggerimenti. Ci sto provando a studiare i vostri suggerimenti ma le mie scarse conoscenze di C++ per ora non mi consentono di trovare la soluzione,
Non demordo studierò ancora e ancora,

Se propio non riusciro a risolvere vi contattero ancora.

Saluti,
ù
Lorenzo

Come scritto prima, per un LED lampeggiante c'è l'esempio (Example) a metà pagina indicata.
MsTimer2::start(); per avviare il lampeggio
MsTimer2::stop(); per fermarlo

Per fare cose più complesse il problema non è tanto di linguaggio, ma di struttura e impostazione logica (indipendenti dal linguaggio). Ho provato a scrivere due righe qui, non so se chiariscono.

Ciao,

grazie a tutti. Mi riservo un pò di tempo per chiudere il post, ma tutte le vostre risposte sono state utilissime.

Per motivi lavorativi non sempre riesco a mettermici. E sono anche io convinto che molte volte non è tanto le singole funzioni quanto la logica nello scrivere un programma che fa la differenza.

Naturalmente, per sviluppare quest'ultima serve tanta esperienza, impegno e applicazione...!

A presto...!

Una possibile soluzione, senza usare millis() o timers, potrebbe essere questa :

#define PIN_LED  3     //pin dove è collegato il led

pinMode(PIN_LED, OUTPUT);  // da inserire nel setup()


void ascesa1(){
 digitalWrite(PIN_LED, HIGH);
 for(int i = 0; i <= 80; i++){ // sposta testina da 0 a 80 gradi
   servo1.write(i);
   servo2.write(180 - i);
   delay(singlestep);
   if( i % 20 == 0) digitalWrite(PIN_LED, ! digitalRead(PIN_LED)) ; 
 }
 digitalWrite(PIN_LED,LOW);
}

L'unica cosa è che devi accontentarti di una frequenza di lampeggio non facilmente modificabile, in questo caso dovrebbe essere 400 ms.

Ciao, Ale.