Usare le Interrupt con Arduino - #59

Поделиться
HTML-код
  • Опубликовано: 18 июл 2018
  • In questo video spiego cosa sono le Interrupt e come utilizzarle con Arduino.
    Sorgenti e schemi:
    github.com/zmaker/arduino_coo...
    Indice dei video:
    www.zeppelinmaker.it/arduino100/
    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/arduino

Комментарии • 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 Месяц назад

    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!

  • @1Robbie75
    @1Robbie75 5 лет назад

    Bravo. Chiaro e preciso. Complimenti.

  • @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.

  • @Ale-ff6ob
    @Ale-ff6ob 3 года назад

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

  • @GiuseppeFerraro-z7giuseppe7z
    @GiuseppeFerraro-z7giuseppe7z 5 лет назад +1

    Complimenti ottima spiegazione ed esempio

  • @davidegros
    @davidegros 5 лет назад

    Complimenti per la chiarezza

  • @marcocoruzzolo6397
    @marcocoruzzolo6397 4 года назад +1

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

  • @carloippoliti319
    @carloippoliti319 Год назад

    Grazie Paolo chiarissimo👍

  • @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!

  • @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...

  • @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

  • @Thebasicmaker
    @Thebasicmaker 2 года назад

    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!)

  • @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

  • @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

  • @ocramingaz9200
    @ocramingaz9200 4 года назад

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

  • @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 ?

  • @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 .

  • @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, ruclips.net/video/UX_F5GLz6s0/видео.html

  • @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...

  • @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: ruclips.net/video/3gIvhr1Q2jI/видео.html
      Con le interrupt non credo che tu risolva il problema

    • @samuelebaiano6505
      @samuelebaiano6505 5 лет назад +1

      paolo aliverti grazie mille per l'aiuto

  • @nistorcosminn
    @nistorcosminn 3 года назад +4

    pog

  • @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

  • @lucagraziano8091
    @lucagraziano8091 2 года назад

    Ma hai un font particolare nell'ide ?

  • @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 🤣

  • @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.

  • @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.

  • @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.

  • @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.

  • @Pinolissimo
    @Pinolissimo 4 года назад

    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  4 года назад +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 4 года назад

      @@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  4 года назад +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

  • @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

  • @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.

  • @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 🤗