rilevazione tempo manovra apparecchiatura

Salve a tutti, sto diventando matto con un progetto che dovrebbe farmi rilevare il tempo di manovra di un apparecchio meccanico, in pratica si tratta di contare il tempo che intercorre dall inizio dell impulso che causerà la manovra alla conferma dell avvenuta manovra,e cosi per lamanovra opposta in pratica due pulsanti , apertura e chiusura e due finecora chiuso e aperto, avrei scritto uno sketch che sembreebbe funzionare bene su tinkercad, ma idolori cominciano con la pratica , il problema sembra dato dagli optoisolatori buckk_817 in quanto al rilascio di uno dei pulsanti origina un picco sull ingresso opposto , evidenziabile dall accensione dell altro led nonchè da un mini oscilloscopio, la mia idea sarebbe quella di creare un inibizione dell ingresso opposto similmente a un contatto di interblocco ma ipotizzo io i cicli sono cosi rapidi che non mi basta porre delle condizioni con degli AND,se stacco il filo del pulsante opposto ,ad esempio apparecchio chiuso, spingo apertura con fli staccato dell apertura tutto va ok e il circuito conta un tempo che varia dai 3 ai 5 ms in linea con le specifiche del bistabile che uso per simulare la macchina e cosi per l'apertura, dunque direi che con ogni probabilità in mancanza di quell impulso che mi calcia indietro andrebbe tutto per il meglio anche perchè i tempi tipici della manovra vanoo dai 40 ai 70 ms.

int stato;
int tch;
int tAP;



const int PREMUTO = 1;
const int RILASCIATO = 0;
const int ON = HIGH;
const int OFF = LOW;


long t0;
long t;
long t1;
long t2;

void setup() {
  Serial.begin(9600);
  pinMode(5, INPUT_PULLUP);// ho usato  il pullup perchè  gli ingressi sono optoisolati
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  Serial.println("PRONTO PER LA PROVA");
  
  
  stato = RILASCIATO;
  tch = OFF;
  tAP= OFF;
  
}

void loop(){
  
  int pAP= digitalRead(5); //pulsante di apertura
  int pCH = digitalRead(6); // pulsante di chiusura
  int _52AP = digitalRead(7); //micro segnalazione  interruttore aperto 
  int _52CH = digitalRead(8); // micro segnalazione interruttore chiuso
  
  
  if ((tch == OFF) && (pCH ==LOW) &&(_52AP == LOW)&&(pAP==HIGH)&&(tAP==OFF)) { //verifica che tch sia off che il segnale di chiusura sia attivo e l?interruttore sia aperto
    tch = ON;
    
    
    
    
   
    
    t0 = millis();
    Serial.println("TCH");
  }
  
 
  
  if ((tch == ON) && (_52CH == LOW)) {
    tch = OFF;
   
    
    
    t = millis() - t0;
    
    Serial.println(t);
   
    
    
    
 
  
  }
  
  
  if ((tAP == OFF) && (pAP == LOW)&&(_52CH==LOW)&&(pCH==HIGH)&&(tch==OFF) ) {
    tAP = ON;
    
    
  
    
    t0 = millis();
    Serial.println("TAP");
  }
 
  
  
  if ((tAP == ON) && (_52AP == LOW)) {
    tAP = OFF;
  
   
    
    t = millis() - t0;
     
    
    Serial.println(t);
 
  
  }
}

questo il codice che ho provato a metter giù

dimenticavo: ho ovviato il problema con delle resistenze di pulldown sull 'ingresso

il problema è che in una simulazione con il mio alimentatore funziona ma da qualche problema quando sul campo uso un alimentatore che da 27 volt anzichè 20 e la resistenza non è sufficiente a smorzare avevo pensato di aggiungere una condizione per abilitare il contatore inutilizzato solo dopo un certo tempo che è stata esguita la prima operazione e viceversa a tal scopo ho provato a scrivere questo

const int buttonPin = 2;     
const int ledPin =  13;
unsigned long t1=0;
unsigned long t2;
unsigned long t3;
unsigned long t4;    

int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  
  pinMode(ledPin, OUTPUT);
  
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
 
  buttonState = digitalRead(buttonPin);

 
  if (buttonState == LOW) {
    
    digitalWrite(ledPin, HIGH);
    t2=millis();
    t3=t2-t1;
    
   
  }
 
  t4=millis();
  if ((t4-t3)>10500){digitalWrite( ledPin,LOW);}
 
 
}

e funziona, do un impulso e mi rimane il led od uno stato alto per il tempo che voglio senza usare il delay ,il problema è che non riesco ad utilizzarlo nello sketch di sopra.

... tu hai letto il punto 15.5 del REGOLAMENTO vero?

Continuate pure a voler usare uno strumento didattico per scopi industriali ... poi questi sono i risultati ... ::slight_smile:

Guglielmo

Ma non mi sembra di avere violato quella norma.

zagnimarco1790:
Ma non mi sembra di avere violato quella norma.

No, infatti, NON ti ho detto che hai violato qualche cosa ... ti ho detto di leggere bene ciò che dice il punto 15.5 in merito ad un uso di Arduino come quello che stai facendo tu che riguarda, se non ho capito male, il controllo di una apparecchiatura meccanica e quindi ... industriale ... ::slight_smile:

O stai parlando di controllare un piccolo "modellino" ? ? ? :o ... perché non lo si evince da nulla ...

Guglielmo

veramente io vorrei capire il tempo che ci mette, nulla del funzionamento di quello che voglio controllare sarà influenzato nel funzionamento dal mio progetto.

... cambia poco nel discorso di usare uno strumento didattico che, come spiegato al punto 15.5, NON ha nulla per essere immune da rumore e quant'altro in un ambiente/con un apparecchiatura industriale, non ti pare?

Comunque avrai problemi se non lo renderai un'apparecchiatura per ambienti industriali ... tipo cose come quelle che trovi QUI !

Poi, ovviamente, fai come vuoi ... ::slight_smile:

Guglielmo

Quindi mi suggerisci di togliermi con nonchalance....

... no, ma di utilizzare prodotti fatti per gli ambienti di lavoro in cui ci sono disturbi e quant'altro.

Ti do anche un'altro link, è un prodotto Siemens ... QUESTO, anche se io preferisco quelli di sferalab ... sono in Italia ed offrono tutto il supporto tecnico necessario :wink:

Guglielmo