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/...
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.
Ottimo! Grazie per questa preziosissima nota!
Grazie utilissimo, spiegato finalmente in modo chiaro
Grazie e complimenti per la chiarissima ed esaustiva spiegazione.
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!
Grazie Carlo
Grazie Paolo chiarissimo👍
Complimenti ottima spiegazione ed esempio
Grazie!
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!
L'importante è "esporsi" a tutti gli argomenti. Quando ti servirà... lo saprai!
Bravo. Chiaro e preciso. Complimenti.
Grazie Roberto
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
Grazie! come vedi gli argomenti sono parecchi... ci sarebbe anche lo sleep della scheda...
ottimo spunto Paolo !! grazie ... procedo piano piano anche con Arduino
Complimenti per la chiarezza
grazie!
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.
Buongiorno paolo, volevo chiederle una cosa, in questo caso dobbiamo configurare il pulsante con la resistenza interna di arduino?
pog
pog
@@alessiopigliapoco8595 pogU
@@nistorcosminn no pogU
@@matteosantamarianova5628 pogChamp
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 ?
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
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.
Ciao! Funziona anche per gli ingressi analogici?
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!!
Si, ma usare lunghe delay non è mai il massimo... (una delay è implementata con un ciclo vuoto!)
A cosa è dovuto il fatto che il led non è rimasto acceso alla seconda pressione del pulsante?
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?
basta aprire qualche stampante 3D... in teoria si.
Ma hai un font particolare nell'ide ?
Ciao, complimenti per i video che pubblichi, ottimi. volevo chiederti come posso usare vari pulsanti touch per accendere un led. ciao grazie
Ciao... in che senso pulsanti touch?
@@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.
TASTI TOUCH TTP223
Ciao. ma come li colleghi? tramite arduino o direttamente?
@@zeppelinmaker direttamente... Se poi non è possibile metterei un Arduino mega. Mille grazie Paolo
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?
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...
@@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
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?
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
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
paolo aliverti grazie mille per l'aiuto
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
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
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.
ma rispvegliare arduino con un comando seriale è possibile? grazie
si! è tra le possibilità previste. Consulta le reference ufficiali. C'è anche un esempio.
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 🤗
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 .
Ciao
Ho letto la tua richiesta solo due giorni fa, mi ha “stuzzicato”, mi sono cimentato e credo di avere risolto.
Tu hai risolto?
@@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.
@@angelociccotosto
Peccato non aver letto prima la tua richiesta...spero comunque che l’esame sia andato ugualmente ok👋
@@micheledestefano tranquillo,grazie lo stesso,si si,esame quasi perfetto 95/100 🤣
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
Ciao. Credo di si... ti funziona?
@@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
@@lorenrus mandami una mail a paolo @ zeppelinmaker . it
Ottimo video . Ma una domanda mi sorge spontanea . Possibile utilizzare un MUX I2C per aumentare gli ingressi degli interrupt ?
Ciao, si. Ci sono dei MUX specifici per i2c.
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.
@@zeppelinmaker Si infatti volevo utilizzare l'integrato MCP23017 I2C è utilizzare i 16 GPIO come ingressi . È possibile fare ciò ?
Ho guardato il datasheet. Si. lo colleghi via i2c ad arduino.
@@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 .
Ciao Paolo, faccio in un altro commento una seconda domanda: come mai il pin 3 non è definito come INPUT?
perché mi son scordato!!! Grazie per la nota...
Ciao Paolo, stavo cercando di creare una serra, e per aprire una porta, volevo usare una funzione interrupt (gestendo un servo motore)
È ok?
Ciao. Perchè complicare con delle Interrupt? non basta leggere semplicemente il pulsante/sensore?
@@zeppelinmaker perché il loop impiega viva 30 secondi per terminare e ricominciare
30 secondi? ma con dei delay? se è così, rivedrei l'approccio... usando macchine a stati e pause non bloccanti.
@@zeppelinmaker bella idea Paolo, grazie, come sempre sei il migliore
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
Grazie del commento! A presto!
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
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..
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
@@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! :) )
Pino Allocca ok. grazie! trovi i contatti su zeppelinmaker.it
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?
Con quelle funzioni puoi disabilitare o abilitare temporaneamente gli interrupt. Non le usate perché non mi servivano... magari faccio un video di approfondimento
paolo aliverti sarebbe fantastico! Grazie e buona giornata
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.