Usare le Interrupt con Arduino - #59

Поділитися
Вставка
  • Опубліковано 7 вер 2024
  • In questo video spiego cosa sono le Interrupt e come utilizzarle con Arduino.
    Sorgenti e schemi:
    github.com/zma...
    Indice dei video:
    www.zeppelinmak...
    Puoi scaricare gratuitamente il mio libro: "Il manuale di Arduino - Guida Completa" dal mio sito: www.zeppelinmaker.it oppure direttamente da gumroad: gumroad.com/l/...

КОМЕНТАРІ • 90

  • @alfa-psi
    @alfa-psi 5 років тому +42

    Aggiungo una nota per "volatile"
    volatile serve a dire al compilatore che la variabile potrebbe essere modificata improvvisamente da qualcosa/qualcuno al di fuori del normale flusso logico di esecuzione del programma, in questo caso nella routine di interrupt, e che per tanto deve astenersi dalle solite ottimizzazioni alle quali alle volte ricorre, come per esempio memorizzare temporanemamente la variabile in un registro del microcontroller per velocizzare certe operazioni o creare codice piu' compatto.
    Questo perche' se la variabile cambia, lui potrebbe non accorgersene a lungo perche' sta usando la copia all'interno del registro, quando invece la variabile e' gia' cambiata.
    Ancora peggio potrebbe sovrascrivere la variabile con il contenuto del registro che ormai non e' piu' allineato al valore reale della variabile.
    volatile insoma disabilita tutte le varie ottimizzazioni che il compilatore a volte implementa quando e' sicuro di avere il totale controllo della sequenza di esecuzione del codice.
    In tal modo e' costretto a leggere dalla RAM la variabile ogni volta che c'e' un riferimento ad essa, ma almeno non combina pasticci.

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +5

      Ottimo! Grazie per questa preziosissima nota!

    • @lucagraziano8091
      @lucagraziano8091 2 роки тому +2

      Grazie utilissimo, spiegato finalmente in modo chiaro

  • @gianpierozaccaria8164
    @gianpierozaccaria8164 3 місяці тому

    Grazie e complimenti per la chiarissima ed esaustiva spiegazione.

  • @carloalbertobirocco6264
    @carloalbertobirocco6264 5 років тому +2

    Finalmente la spiegazione che cercavo .... Paolo, anche questa volta hai fatto chiarezza su un argomento non scontato e mi hai dato un grande aiuto. Grazie infinite!

  • @carloippoliti319
    @carloippoliti319 Рік тому

    Grazie Paolo chiarissimo👍

  • @GiuseppeFerraro-z7giuseppe7z
    @GiuseppeFerraro-z7giuseppe7z 6 років тому +1

    Complimenti ottima spiegazione ed esempio

  • @paologrisanti7865
    @paologrisanti7865 6 років тому +1

    Ciao Paolo. Per certi argomenti poco 'appariscenti', come questo, non ne capisco subito la portata. Ma ciò è a causa della mia ignoranza in materia di programmazione e di microcontrollori. Comunque ne ho sentito parlare molto e ora che hai spiegato il significato ho capito cosa sono. Usarle è un altro paio di maniche. Metto anche questo tool nella 'cassetta degli attrezzi'. Grazie!

    • @zeppelinmaker
      @zeppelinmaker  6 років тому +1

      L'importante è "esporsi" a tutti gli argomenti. Quando ti servirà... lo saprai!

  • @1Robbie75
    @1Robbie75 5 років тому

    Bravo. Chiaro e preciso. Complimenti.

  • @Alberto-sk7zd
    @Alberto-sk7zd 6 років тому +3

    Questo video è molto utile, se avessi saputo degli interrupt al tempo.. Grazie Paolo... Non è banale, sopratutto se si ha un circuito in cui devi accendere il dispositivo da remoto e in seguito controllare lo stato di esso.. (progettini di domotica). non sottovalutate questo

    • @zeppelinmaker
      @zeppelinmaker  6 років тому +1

      Grazie! come vedi gli argomenti sono parecchi... ci sarebbe anche lo sleep della scheda...

  • @Ale-ff6ob
    @Ale-ff6ob 3 роки тому

    ottimo spunto Paolo !! grazie ... procedo piano piano anche con Arduino

  • @davidegros
    @davidegros 5 років тому

    Complimenti per la chiarezza

  • @mauropaganelli8465
    @mauropaganelli8465 4 роки тому +2

    Ciao Paolo, ti seguo da poco e grazie alle tue videolezioni sono passato dagli ST7 ad Arduino. Ora,dovendo memorizzare un timer e volendo usare millis come base dei tempi mi chiedevo se Arduino ha la possibilità di collegare millis ad un interrupt software,grazie.

  • @marcocoruzzolo6397
    @marcocoruzzolo6397 4 роки тому +1

    Buongiorno paolo, volevo chiederle una cosa, in questo caso dobbiamo configurare il pulsante con la resistenza interna di arduino?

  • @nistorcosminn
    @nistorcosminn 3 роки тому +4

    pog

  • @tommasomagliocchetti3026
    @tommasomagliocchetti3026 Рік тому

    se mi si ''attiva'' l'interrupt cosa succede al resto dei comandi di arduino? rimangono come stavano prima dellinterrupt? ad esempio...se ho un relè eccitato quel relè durante lo svolgimento dell'interrupt cosa fa ?

  • @ocramingaz9200
    @ocramingaz9200 4 роки тому

    vorrei realizzare un dispositivo per misurare il tempo di apertura e chiusura di un interruttore di media tensione , i tempi tipici vanno dai 50 ai 70 ms, sembrerebbe che le interrupt facciano al caso mio

  • @DarioCostanzo-vr9os
    @DarioCostanzo-vr9os Рік тому

    Salve, provavo a testare il funzionamento ma non riesco. Serve installare una libreria specifica?
    Comunque vorrei parlare di qualcosa non riesco a fare, in pratica sto creando una suoneria con il buzzer, una cosa semplice, suona ogni secondo per segnalare un tempo che è possibile visualizzare nel seriale, solo che ho provato in tutti i modi, mi creda, ma non c'è verso di fermarlo intervenendo via software, sono arrivato a guardare questa pagina, a parte per fare una nuova esperienza in più ma anche per per tentare in qualche modo di intervenire proprio fisicamente nell'hardware, dato che da software praticamente, almeno a me, sembra impossibile intervenire per dare il semplice comando di interruzione dell'IF, o WHILE. E' scontato che debbano funzionare così ma non tanto per le IF, almeno a parere mio, perché non essendo un "durante" (while) con una semplice logica morale puoi intendere che forse una strada potrebbe esistere. Beh spero mi potrà aiutare, Lei mi sembra la mia ultima spiaggia. Sono uno studente cerca di imparare quindi capisce bene ne ho bisogno, ogni aiuto sarà gradito, dico in più solo uso un Arduino Uno e nella prova interrupt ho usato un altro pin per il LED (non il 13), grazie in anticipo.

  • @Thebasicmaker
    @Thebasicmaker 3 роки тому

    Ciao! Funziona anche per gli ingressi analogici?

  • @andreamorichetti5861
    @andreamorichetti5861 5 років тому

    ciao. gli interrupt possono quindi interrompere un'istruzione delay(..)?
    dove riprenderebbe l'esecuzione del codice dopo l'esecuzione della funzione associata all'interrupt?
    grazie e complimenti!!

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      Si, ma usare lunghe delay non è mai il massimo... (una delay è implementata con un ciclo vuoto!)

  • @ocramingaz9200
    @ocramingaz9200 4 роки тому

    A cosa è dovuto il fatto che il led non è rimasto acceso alla seconda pressione del pulsante?

  • @stefanoderosa2375
    @stefanoderosa2375 4 роки тому

    Questa è una bella chicca...
    Vorrei fare una domanda stupida... Ma un prodotto qualsiasi può essere venduto con l'elettronica di Arduino dentro??
    Non intendo fare nuove schede ma proprio prendere un Arduino e montarlo dentro qualcosa... Potrebbe essere venduto?

    • @zeppelinmaker
      @zeppelinmaker  4 роки тому

      basta aprire qualche stampante 3D... in teoria si.

  • @lucagraziano8091
    @lucagraziano8091 2 роки тому

    Ma hai un font particolare nell'ide ?

  • @gianlucacampus7455
    @gianlucacampus7455 5 років тому

    Ciao, complimenti per i video che pubblichi, ottimi. volevo chiederti come posso usare vari pulsanti touch per accendere un led. ciao grazie

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      Ciao... in che senso pulsanti touch?

    • @gianlucacampus7455
      @gianlucacampus7455 5 років тому

      @@zeppelinmakerCiao buongiorno, volevo collegare dei tasti touch al relè 5 v per poi accendere un led, io ho provato mettendo anche del diodi, ma vanno in conflitto. Grazie.

    • @gianlucacampus7455
      @gianlucacampus7455 5 років тому

      TASTI TOUCH TTP223

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      Ciao. ma come li colleghi? tramite arduino o direttamente?

    • @gianlucacampus7455
      @gianlucacampus7455 5 років тому

      @@zeppelinmaker direttamente... Se poi non è possibile metterei un Arduino mega. Mille grazie Paolo

  • @previdimaurizio6457
    @previdimaurizio6457 5 років тому

    Bel Progetto, io vorrei realizzare un misuratore di fase. Dato un elemento piezo TX comandato da una porta digitale di Arduino ed un elemento piezo RX collegato ad una porta analogica vorrei vedere il tempo di ritardo e di anticipo tra TX ed RX. Si puo' trovare un tipo di Arduino che abbia maggiore sensibilita' sulle porte analogiche? Adesso e' di 4.8 mV su arduino uno. Per avere un'onda quadra piu' pulita si puo cambiare il registro OCR?

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      Ciao. Se devi realizzare cose più spinte forse serve un ADC esterno. Eventualmente per fare "misure" conviene passare a DSP più specifici per l'analisi e elaborazione dei segnali...

    • @previdimaurizio6457
      @previdimaurizio6457 5 років тому

      @@zeppelinmaker Grazie paolo, ti mando il link del tutto, volevo semplificare con arduino od altro l'oscillatore, amplificatore,comparatore CD4046, integrare il segnale 0-10 Volt ed elaborarlo per ottenere dall'area dei picchi la concentrazione.....questo in un secondo tempo. Cio che vedi nel video e' un sistema di analisi che usa un detector ad ultrasuoni che all'uscita della colonna di separazione dei componenti legge lo sfasamento tra TX ed RX a seconda del gas che vi passa attraverso, ua-cam.com/video/UX_F5GLz6s0/v-deo.html

  • @samuelebaiano6505
    @samuelebaiano6505 5 років тому

    Posso usare glibinterrupt per rendere più veloce un programma per fare un "parcheggiometro"? In pratica il problema si pone quando devo dire che, sotto certe distanze, l'altoparlante deve emettere degli impulsi sonori, la distanza di questi l'ho definita con dei delay, naturalmente più è vicino l'oggetto e più velocemente i bip avvengono, ma i delay che determinano il periodo di pausa tra un bip e l'altro mi rallentano tutto il programma, rendendolo meno reattivo, come faccio?

    • @samuelebaiano6505
      @samuelebaiano6505 5 років тому

      Considera che ho definito 3 lunghezze di pausa dei bip sotto 3 distanze differenti, ma finchè il programma non avrà eseguito i delay, non controllerà di nuovo se la distanza rilevata è diversa, quindi se mi avvicino non rileverà nulla, fino alla fine dei delay, è assai meno reattivo di quanto dovrebbe, mi chiedevo se con gli interrupt potevo risolvere e come

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      Ciao. Visto che il problema sono i delay, devi eliminarli usando pause non bloccanti tipo: ua-cam.com/video/3gIvhr1Q2jI/v-deo.html
      Con le interrupt non credo che tu risolva il problema

    • @samuelebaiano6505
      @samuelebaiano6505 5 років тому +1

      paolo aliverti grazie mille per l'aiuto

  • @pietromercuri1490
    @pietromercuri1490 4 роки тому

    Buongiorno Paolo, sono un neofita ed avevo intenzione di realizzare un conta litri utilizzando un flussimetro.
    Oggi ho provato a collegare il flussimetro al piedino due dia arduino uno, con una resistenza di puldown da 10k. Volevo innanzitutto testarlo per vedere se e come recepisce il segnale in ingresso, ho scritto questo breve Sketch per contare gli impulsi, ma a seconda di come si ferma la ventolina, il contyatore continua a contare anche dopo essersi fermata, vorrei capire se è un problema di sensore, oppure se ho capito male come si utilizza
    //Gestione di un flussostato

    int ingresso = 2; //Piedino di ingresso del flussostato
    volatile int count; //Variabile di conteggio

    void setup() {
    pinMode (ingresso, INPUT); //Imposta piedino 2 in ingresso
    attachInterrupt (0, impulso, FALLING); //Configura interrupt 0 pin 2
    , da alto a basso
    Serial.begin (9600); //Velocità seriale
    }

    void loop() {
    delay (100); //Pausa di 1 secondo
    Serial.println (count); //Scrive a schermo la variabile flusso//count scrive il numero degli impulsi
    }

    void impulso() {
    count ++; //Incrementa count di 1
    }
    grazie mille

    • @pietromercuri1490
      @pietromercuri1490 4 роки тому

      se sposto manualmente la ventolina, il conteggio si ferma, se continuo a spostarla, riparte il conteggio, credo che il problema si verifichi quando il sensore magnetico rimane nella posizione alto

    • @pietromercuri1490
      @pietromercuri1490 4 роки тому

      RISOLTO!
      Guardando un tuo video sugli encoder rotanti, ho capito che lavorano mettendo a massa il segnale, quindi ho messo in pullup l'ingresso e lavorato al contrario.
      Complimenti perché hai una capacità incredibile di spiegare in modo semplice anche concetti complessi. Ora ho acquistato il tuo libro, mi sono sempre dilettato con la programmazione in VB, ma con arduino sto scoprendo un mondo fantastico.

  • @fabioprevitali8050
    @fabioprevitali8050 4 роки тому

    ma rispvegliare arduino con un comando seriale è possibile? grazie

    • @zeppelinmaker
      @zeppelinmaker  4 роки тому +1

      si! è tra le possibilità previste. Consulta le reference ufficiali. C'è anche un esempio.

  • @skandy63
    @skandy63 4 роки тому +2

    Nel circuito che disegni metti il PIN (2/3) a +5 tramite interruttore, anziché a massa e la resistenza è a massa anziché a +5, che potrebbe funzionare (anche se non metterei mai un PIN direttamente a +) se l'interrupt fosse a Rising.
    Avrei specificato che si trattava l'interrupt hardware visto che come ben sai ce ne sono altri.
    Ma perché lo declini al femminile quando per tutto il mondo (lo so per gli anglosassoni è neutro) è maschile: gli interrupt 🤗

  • @angelociccotosto
    @angelociccotosto 4 роки тому

    Ciao Paolo, ho un problema, devo accendere 5 led in sequenza, tenendo premuto un pulsante. al rilascio di questo pulsante deve rimanere acceso il led, quindi capiterà in posizione casuale, come posso fare ? il ciclo per la sequenza l'ho fatto, non riesco a fermare la sequenza al rilascio del pulsante. Spero che tu riesca ad aiutarmi o qualcun altro .

    • @micheledestefano
      @micheledestefano 3 роки тому +1

      Ciao
      Ho letto la tua richiesta solo due giorni fa, mi ha “stuzzicato”, mi sono cimentato e credo di avere risolto.
      Tu hai risolto?

    • @angelociccotosto
      @angelociccotosto 3 роки тому

      @@micheledestefano ciao,grazie per esserti cimentato in questo problema,questo "progetto" mi serviva per scuola all'esame di stato,da presentare assieme ad un programma per PLC ,alla fine ho lasciato perdere per via del problema riscontrato e del poco tempo rimasto.

    • @micheledestefano
      @micheledestefano 3 роки тому +1

      @@angelociccotosto
      Peccato non aver letto prima la tua richiesta...spero comunque che l’esame sia andato ugualmente ok👋

    • @angelociccotosto
      @angelociccotosto 3 роки тому +1

      @@micheledestefano tranquillo,grazie lo stesso,si si,esame quasi perfetto 95/100 🤣

  • @lorenrus
    @lorenrus 5 років тому

    Ciao e complimenti per i video.
    Io sto usando Arduino Mega e ho collegato due pulsanti in due pin dedicati per l'interrupt.
    i pin sono il 18, a cui ho collegato il pulsante uno, ed il 19, a cui ho collegato il pulsante due.
    Quello che mi aspetto è:
    - il programma è in free running , poi premo il pulsante uno è parte la sua ISR_1 poi premendo il pulsante due parte la ISR_2, quindi funzionando in mutua esclusione.
    Giusto ?
    Grazie

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      Ciao. Credo di si... ti funziona?

    • @lorenrus
      @lorenrus 5 років тому

      @@zeppelinmaker Sisi funziona perfettamente. Avrei un'ulteriore domanda. Solo che non riguarda il video in questione. Posso farla qui o cerco un video inerente e commento li ? Grazie

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      @@lorenrus mandami una mail a paolo @ zeppelinmaker . it

  • @Elettronica-xt7nm
    @Elettronica-xt7nm 5 років тому

    Ottimo video . Ma una domanda mi sorge spontanea . Possibile utilizzare un MUX I2C per aumentare gli ingressi degli interrupt ?

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      Ciao, si. Ci sono dei MUX specifici per i2c.

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      Scusa, intendevi un'altra cosa... si si può fare esistono chip che aumentano per esempio gli ingressi e che incorporano un loro sistema di interrupt.

    • @Elettronica-xt7nm
      @Elettronica-xt7nm 5 років тому

      @@zeppelinmaker Si infatti volevo utilizzare l'integrato MCP23017 I2C è utilizzare i 16 GPIO come ingressi . È possibile fare ciò ?

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      Ho guardato il datasheet. Si. lo colleghi via i2c ad arduino.

    • @Elettronica-xt7nm
      @Elettronica-xt7nm 5 років тому

      @@zeppelinmaker Si questo mux sono riuscito a farlo funzionare in uscita senza problemi con NodeMcu per la gestione dei relè , ma non riesco a utilizzare interrupt per la gestione di pulsanti fisici da fare azionare le uscite .

  • @albertomora4462
    @albertomora4462 5 років тому

    Ciao Paolo, faccio in un altro commento una seconda domanda: come mai il pin 3 non è definito come INPUT?

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      perché mi son scordato!!! Grazie per la nota...

  • @riccardomarino2927
    @riccardomarino2927 5 років тому

    Ciao Paolo, stavo cercando di creare una serra, e per aprire una porta, volevo usare una funzione interrupt (gestendo un servo motore)
    È ok?

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      Ciao. Perchè complicare con delle Interrupt? non basta leggere semplicemente il pulsante/sensore?

    • @riccardomarino2927
      @riccardomarino2927 5 років тому

      @@zeppelinmaker perché il loop impiega viva 30 secondi per terminare e ricominciare

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      30 secondi? ma con dei delay? se è così, rivedrei l'approccio... usando macchine a stati e pause non bloccanti.

    • @riccardomarino2927
      @riccardomarino2927 5 років тому +1

      @@zeppelinmaker bella idea Paolo, grazie, come sempre sei il migliore

  • @stefano.a
    @stefano.a 5 років тому

    l’unico accorgimento da tenere con gli interrupt è l’aggiunta obbligatoria di un circuito antirimbalzo hardware se si ha a che fare con dei pulsanti o in generale degli interruttori meccanici

    • @zeppelinmaker
      @zeppelinmaker  5 років тому

      Grazie del commento! A presto!

    • @skandy63
      @skandy63 4 роки тому +2

      Se è per un pulsante, può essere tranquillamente implementato via software controllando che il pulsante sia premuto per un tempo consecutivo di 20msec. Così facevamo in Olivetti per le tastiere delle macchine per scrivere serie ET

  • @Pinolissimo
    @Pinolissimo 5 років тому

    Bel video, grazie.Avrei una domanda per favore, nel caso di un sensore ad ultrasuoni(hc-sr04) come fare per legare l'interrupt ad un determinato valore rilevato? per esempio bloccare subito i motori anche mentre sta eseguendo un ciclo che fa avanzare il robot in una direzione e poi appare un ostacolo che non c'era prima al controllo del sensore... spero di essere stato chiaro..

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      dovresti legare l'interrupt ad ogni lettura e poi decidere. Forse conviene studiare a tavolino il codice perché possa prevedere le emergenze e gestire lo stop

    • @Pinolissimo
      @Pinolissimo 5 років тому

      @@zeppelinmaker Grazie mille per la tua risposta, in realtas' la cosa e' un pochino complessa.... parliamo di un progetto di un prototipo che sto sviluppando a 4 sensori.Posso inviarti una mail? sarebbe geniale una tua opinione da esperto in materia.Grazie in ogni caso (ho acquistato il tuo libro per un ringraziamento pratico al sostegno che dai on-line! :) )

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      ​ Pino Allocca ok. grazie! trovi i contatti su zeppelinmaker.it

  • @albertomora4462
    @albertomora4462 5 років тому

    Ciao Paolo, mi è capitato di vedere alcuni sketch (vedi www.theorycircuit.com/water-flow-sensor-yf-s201-arduino-interface/) con interrupt in cui veniva dichiarato nel setup la funzione sei() o cli() o le analoghe noInterrupts() & interrupts(). A cosa servono? Cone mai nel tuo esempio non le usavi?

    • @zeppelinmaker
      @zeppelinmaker  5 років тому +1

      Con quelle funzioni puoi disabilitare o abilitare temporaneamente gli interrupt. Non le usate perché non mi servivano... magari faccio un video di approfondimento

    • @albertomora4462
      @albertomora4462 5 років тому

      paolo aliverti sarebbe fantastico! Grazie e buona giornata

  • @PaoloFraccaro
    @PaoloFraccaro 3 роки тому

    Ho copiato il tuo sketch ma mi da errore:
    test.ino: In function ‘void setup()’:
    test.ino: 4.42: error: ‘digitalPinToInterrupt’ was not declared in this scope
    Che dipenda dalla versione dell'IDE (vers. 1.8.15), dove potrebbero aver aggiornato qualcosa?
    Grazie in anticipo per la risposta.