Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Semplice Test deviatori o finecorsa con Arduino

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[11] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utenteedgar » 15 mag 2020, 11:52

lucaking ha scritto:interrupt esterno per detectare...

Mannaggia quanto è brutto
Avatar utente
Foto Utenteedgar
6.372 3 5 8
Master
Master
 
Messaggi: 3216
Iscritto il: 15 set 2012, 22:59

0
voti

[12] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utentelucaking » 15 mag 2020, 12:49

In effetti... :oops: :D
Non mi veniva in italiano, rivelare, cogliere, boh.
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

0
voti

[13] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utenteedgar » 15 mag 2020, 13:16

Rilevare, riconoscere, intercettare, acquisire ...
Beccare :mrgreen: :mrgreen:
Avatar utente
Foto Utenteedgar
6.372 3 5 8
Master
Master
 
Messaggi: 3216
Iscritto il: 15 set 2012, 22:59

0
voti

[14] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoFR » 15 mag 2020, 19:02

sto provando a scrivere qualcosa con le interrupt solo ch sto riscontrando molti problemi,non saprei nemmeno da dove cominciare ... iniziamo col dire che proprio la funzione interrupt non riesce a fare ciò che dovrebbe, mi spiego, mi son buttato a capofitto a gestire 2 interrupt (uno per pin) ma problemi su problemi ho pensato che magari sarebbe stata una buona idea iniziare con gestire solo 1 pin, quindi HIGH o LOW ma solo di 1 pin....

ho scritto questo codice giusto per testare:
Codice: Seleziona tutto
void setup() {
  pinMode (2, INPUT);
  Serial.begin(9600);
  attachInterrupt( digitalPinToInterrupt(2) , test , CHANGE);
}
void loop() {
  Serial.println("loop");
  delay(1000);
}
void test() {
  Serial.println("tasto premuto");
}
guardando il monitor seriale ricevo piu e piu volte la scritta tasto premuto nonostante sostituisco il CHANGE con FALLING/HIGH/LOW/RISING, questo è un esempio con CHANGE tenendolo premuto e rlasciandolo dopo una paio di scondi
Codice: Seleziona tutto
loop
loop
loop
tasto premuto
loop
loop
tasto premuto
tasto premuto
tasto premuto
tasto premuto
tasto premuto
loop
loop
loop

sto uscendo pazzo non riesco onestamente nemmeno a descrivere i problemi ...
se qualcuno lo chede questo è quello che ho scritto ma che non funziona (interrupt doppio)
Codice: Seleziona tutto
  int statoiniziale = 0;
  int faseatt = 0;
  int p1;
  int p2;
  int t1 = 0;
  int t2 = 0;
 
void setup() {
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  Serial.begin(9600);
  attachInterrupt( digitalPinToInterrupt(2) , crono , CHANGE);
  attachInterrupt( digitalPinToInterrupt(3) , crono , CHANGE);
}

void loop() {
  //riconosce lo statoiniziale
      p1 = digitalRead(2);
      p2 = digitalRead(3);
      if (p1 && p2 == LOW) statoiniziale = 2;
      if (p1 && p2 == HIGH) statoiniziale = 4;
      if (p1 == HIGH && p2 == LOW) statoiniziale = 1;
      if (p2 == HIGH && p1 == LOW) statoiniziale = 3;

}

void crono() {
  //riconosce la faseatt per poi confrontarla
      p1 = digitalRead(2);
      p2 = digitalRead(3);
      if (p1 && p2 == LOW) faseatt = 2;
      if (p1 && p2 == HIGH) faseatt = 4;
      if (p1 == HIGH && p2 == LOW) faseatt = 1;
      if (p2 == HIGH && p1 == LOW) faseatt = 3;
       if (faseatt == statoiniziale)
          {
            if ( t1==0 ) t1 = millis();
            t2=millis() - t1;
            Serial.println(t2);
          }
  statoiniziale =faseatt;
//switch a scopo debugging
  switch (faseatt){
    case 1:
      Serial.println("caso 1");
    break; 
    case 2:
      Serial.println("caso 2");
    break;
    case 3:
      Serial.println("caso 3");
    break;
    case 4:
      Serial.println("ERRORE");
    break;
  }
}


per oggi chiudo qui, ho fatto prove su prove e onestamente riprovo domani a mente piu fresca
Avatar utente
Foto UtenteMarcoFR
5 3
New entry
New entry
 
Messaggi: 54
Iscritto il: 21 giu 2016, 19:03

0
voti

[15] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoD » 16 mag 2020, 8:19

Mai usare delay(), tenere le routine di servizio interrupt il più brevi possibile !
Non ricordo più dove, ma ultimamente ho letto in EY che è una vaccata informatica


Prova se questo sotto funziona (a parte miei eventuali errori):

Codice: Seleziona tutto
int FLAG;//variabile di segnalazione settata nelle routine dell'interrupt.
void setup() {
  pinMode (2, INPUT);
  FLAG = 0;
  Serial.begin(9600);
  attachInterrupt( digitalPinToInterrupt(2) , test , CHANGE);
Serial.println("inizio");
}
void loop() {

if (FLAG == 1)
{ Serial.println("tasto premuto");
FLAG = 0;
}
}

void test() {
FLAG = 1;
}

O_/
Avatar utente
Foto UtenteMarcoD
7.262 4 8 13
Master EY
Master EY
 
Messaggi: 3223
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[16] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utentelucaking » 16 mag 2020, 9:50

Visto che avete rotto gli indugi, mi espongo a pubblico ludibrio, qui sotto una prova che ho fatto ieri sera.
Codice: Seleziona tutto
const byte ncPin = 2;   //nc = NormallyClosed (diretto)
const byte noPin = 3;   //no = NormallyOpen (deviato)
volatile int ncVal, noVal;
volatile byte state = 0;
byte lastState = 0;
unsigned long changeTime = 0;

void nc_handler ()
{
   ncVal = digitalRead(ncPin);
   state = !state;
}

void no_handler ()
{
   noVal = digitalRead(noPin);
   state = !state;
}

void setup() {
   pinMode (ncPin, INPUT);
   pinMode (noPin, INPUT);
   Serial.begin(9600);
   Serial.print("Partito, NC = ");
   ncVal = digitalRead (ncPin);
   Serial.print(ncVal);
   Serial.print("  NO = ");
   noVal = digitalRead (noPin);
   Serial.println(noVal);
   attachInterrupt(0, nc_handler, CHANGE);   // attiva l'ISR sul Pin 2 (NC)
   attachInterrupt(1, no_handler, CHANGE);   // attiva l'ISR sul Pin 3 (NO)
}

void loop() {
   if (state != lastState) {
      changeTime = millis();
      Serial.print(changeTime);
      Serial.print("  NC = ");
      Serial.print(ncVal);
      Serial.print("  NO = ");
      Serial.println(noVal);
      lastState = state;
   }
}

L' idea era che ad ogni cambio di stato la funzione loop stampi a monitor "l' ora" e lo stato dei due pin.
Lo so, fa un po' schifo, ma non saprei fare di meglio, l' ho reso pubblico solo perché mi farebbero piacere le critiche degli addetti ai lavori per imparare qualcosa.
Per esempio vorrei capire cosa succede se scatta un interrupt mentre la funzione loop() sta stampando a monitor.
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

0
voti

[17] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoFR » 16 mag 2020, 9:56

lucaking ha scritto:
Per esempio vorrei capire cosa succede se scatta un interrupt mentre la funzione loop() sta stampando a monitor.

grazie per l'interesse, ho provato e letteralmente rimane la scritta "spezzata" (es. tra un serial.print e l'altro) per dare precedenza all'interrupt
Avatar utente
Foto UtenteMarcoFR
5 3
New entry
New entry
 
Messaggi: 54
Iscritto il: 21 giu 2016, 19:03

0
voti

[18] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utentelucaking » 16 mag 2020, 12:54

É il comportamento che mi sarei aspettato e che però a me non fa.
Come lo compili tu?
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

0
voti

[19] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto UtenteMarcoFR » 16 mag 2020, 17:36

lucaking ha scritto:É il comportamento che mi sarei aspettato e che però a me non fa.
Come lo compili tu?

cosa intendi come lo compilo? ho la 1.8.11
Avatar utente
Foto UtenteMarcoFR
5 3
New entry
New entry
 
Messaggi: 54
Iscritto il: 21 giu 2016, 19:03

0
voti

[20] Re: Semplice Test deviatori o finecorsa con Arduino

Messaggioda Foto Utentelucaking » 16 mag 2020, 17:44

Intendi l' IDE di arduino?
Avatar utente
Foto Utentelucaking
1.078 2 5 8
Expert
Expert
 
Messaggi: 959
Iscritto il: 29 mag 2015, 14:28

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti