Mi sono accorto che nel precedente articolo sono partito spedito a scrivere di pin, modalità di utilizzo e comandi di INPUT ed OUTPUT, in realtà ho sottovalutato l’aspetto relativo alla conoscenza dei pin presenti su un Arduino e il relativo significato.
Innanzitutto va detto che ciascuna scheda Arduino possiede alcuni pin utilizzabili con segnali digitali, ed altri con segnali analogici, va anche detto che la distinzione non è così netta quando poi programmiamo e ti mostrerò il perchè nel corso di questo articolo, prima facciamo una panoramica:
Pin Digitali: da 0 a 13 ( quadrato rosso )Pin Analogici: da 0 a 5 ( quadrato giallo/arancio )
Pin PWM: 3,5,6,9,10,11 ( quadrato verde ) |
Pin Digitali: da 0 a 13 ( indicato dalla serigrafia )Pin Analogici: da 0 a 5 ( indicato dalla serigrafia a0-a5 )
Pin PWM: 3,5,6,9,10,11 |
Pin Digitali: da 0 a 13 ( indicato dalla serigrafia d0-d13)Pin Analogici: da 0 a 5 ( indicato dalla serigrafia a0-a5 )
Pin PWM: 3,5,6,9,10,11 |
Non sono certo tutti i modelli disponbili, che puoi trovare sul sito ufficiale, sono solo quelli che ho potuto vedere e sono sufficenti per chiarirci quali sono i Pin Digitali, i Pin Analogici e i Pin utilizzabili con segnali di tipo PWM ( Pulse Width Modulation ).
Quasi tutte le schede Arduino hanno 14 pin digitali: sono pin che puoi utilizzare sia in modo INPUT (ingresso), per acquisire il valore di un pulsante ad esempio o di un interruttore a leva, sia in modo OUTPUT (uscita) per inviare segnali logici ad una scheda aggiuntiva, ad un led, ecc…
Siccome si tratta di impulsi di tipo digitale il valore che puoi ricevere/inviare è il classico 0/1 o in linguaggio Arduino LOW/HIGH.
Concentrati prima sulla acquisizione rilevare un valore LOW ( 0 ) equivale a dire che sul pin che stai controllando è arrivato un segnale logico basso 0v, viceversa ricevere HIGH ( 1 ) equivale a dire che il pin ha ricevuto un segnale logico alto 5v.
Il ragionamento appena fatto è valido anche in caso di utilizzo dl pin come OUTPUT, ossia per inviare segnali: se invii LOW ( 0 ) invierai un segnale logico basso 0v, se invii HIGH invierai un segnale logico alto 5v.
Un po’ di sintassi:
Per definire come utilizzeremo un dato pin puoi usare il seguente comando: pinMode(pin, modalità) dove pin indica il numero del pin che vogliamo settare con la modalità definita nel secondo parametro, modalità: INPUT o OUTPUT.
Per inviare un segnale al pin utilizza il comando: digitalWrite(pin,level) dove pin indica sempre il numero del pin a cui vogliamo inviare il segnale definito nel secondo parametro, level: LOW o HIGHT ( 0 o 1 ).
Per leggere un valore digitale, magari quello di un interruttore collegato a massa puoi utilizzare il comando pinMode con modalità INPUT, ed il comando digitalRead(pin) dove pin indica il numero del pin di cui vogliamo conoscere il valore.
Alcuni degli ingressi digitali presentano la sigla PWM, per la trattasione di cos’è un segnale PWM ti invito a leggere in internet spiegazioni molto più esaurienti di quella che potrei darti io, per me è molto chiara quella di Giovanni che trovo davvero un ottimo punto di partenza e non solo, ovviamente c’è anche la Wiki dedicata al PWM.
Ma vediamo cosa puoi farci, io ho sperimentato come pilotare dei servocomandi da modellismo oppure led con dissolvenza, scriverò presto degli articoli.
Il segnale PWM accetta come valori da 0 a 255, per ciascun valore varia il duty-cycle generato, ad esempio con il valore 0 otterrai un valore di duty-cycle dello 0% ossia sempre 0 in modo analogo a quello che avresti ottenuto utilizzando digitalWrite(pin,LOW).
Un po’ di sintassi:
Ricorda sempre di settare la modalità del pin prima di eseguire l’invio dei comandi, in questo esempio ho utilizzato il pin 11 scrivendo: pinMode(11,OUTPUT) indico ad Arduino di utilizzarlo in modo OUTPUT ( come una uscita ); posso quindi inviare il mio segnale con duty-cycle al 50%: analogWrite(11,127), avrai notato che ho utilizzato analog Write anche se il pin 11 è un pin digitale, il motivo è che il tipo di segnale che desidero generare ha una variazione di valori da 0 a 255 e non solo 0 e 1, la funzione digitalWrite accetta come secondo parametro solo 0 e 1 oppure LOW e HIGH. Il valore 127 è esattamente a metà della mia scala ( 0 – 255 ) quindi il duty-cycle generato sarà del 50%.
Per comprendere meglio la questione duty-cycle ho preso l’immagine riportat sul sito Arduino contenete alcuni valori simbolo del duty-cycle in funzione del numero che specificherai:
Infine ci sono 6 pin dedicati ai segnali analogici, ma solo in input, ossia questi pin servono principalmente per acquisire dei segnali provenienti da sensori di tipo analogico: trimmer, potenziometri, fororesistenze, ultrasuoni, IR, ecc… ossia tutti quei sensori che possono generare un segnale analogico in funzione della loro stimolazione (luminosa, meccanica, ecc) se ad esempio volessi rilevare la distanza con un sensore IR dovrai utilizzare uno di questi pin.
Un po’ di sintassi:
Non è necessario settare questi pin con la modalità essendo solo pin di input Arduino sa già come utilizzarli.
Per leggere il valore presente sul pin 5, ad esempio, utilizza il comando: analogRead(pin) -> analogRead(5) il valore rilevato può variare da 0 a 1023, all’interno del range indicato ogni variazione del segnale sarà indicata con una variazione di tale valore.
Nei prossimi articoli vedremo come pilotare un led con dissolvenza(fade), come rilevare la distanza di un oggetto con un sensore IR e man mano come pilotare dei servo motori, e tanto altro ancora …
109 commenti
6 ping
Vai al modulo dei commenti
Dove é possibile trovare gli argomenti sul comando di servo motori?
Autore
Ciao Agostino,
io parto sempre dal sito ufficiale arduino.cc ci sono molte informazioni veramente utili, sui servo ad esempio puoi consultare la pagina http://arduino.cc/en/Reference/Servo che descrive la classe Servo.
Ho intenzione di scrivere un tutorial sull’uso dei servo, non garantisco l’uscita ma lo farò presto.
Autore
Ciao Agostino,
è on-line il primo dei miei tutoria sui servo: https://www.mauroalfieri.it/elettronica/tutoria-arduno-servo.html
Spero possa esserti utile.
Un informazione! Ma gli altri Pin a cosa servono? Tipo Vin? Grazie mille! Ottimo sito!
Autore
Ciao Angelo,
nel blog ci sono molti articoli in cui descrivo l’uso degli altri pin.
Vin é collegato alla tensione di ingresso di arduino.
Mauro
Ciao, ho una domanda, è possibile settare HIGH a un valore diverso da 5V per un pin in output?ad esempio a 2 V?
grazie
Autore
Ciao Andrea,
Il valore HIGH è preimpostato a 255 non ai volt erogati, potresti provare con una uscita PWM controllandola in analogWrite, cerca come usare l’output PWM come potenziometro, penso sia quello che ti occorre, magari un prossimo articolo lo dedico a questo problema.
Grazie e buon divertimento.
Intanto grazie della risposta. Ti spiego meglio il mio problema, io con arduino devo pilotare alcuni componenti digitali che hanno come range massimo di tensione digitale in ingresso un valore di circa 3V. Io li piloto tramite i pin SPI di arduino mega 2560. per questo ti chiedevo se era possibile cambiare il valore di default di High. ora la domanda che mi viene da farti è posso conciliare l’output Pwm e quello SDI????grazie!!
mi sono scordato di dire una cosa, l’alimentazione del mio componente è +- 2.5V
Autore
Ciao Andrea, non sono molto ferrato sull’uso dell’SPI, se pupo fornirmi qualche link su cui documentarmi provo a capire se quelo che vuoi fare è fattibile.
Pubblico i tuoi commenti perchè magari altri lettori del blog con maggiori conoscenze delle mie possano darti aiuto.
Ciao
Ciao…sinceramente non ho ancora trovato nulla di così interessante in giro riguardo al mio problema…intanto grazie…
Ciao Mauro, mi sto avvicinando ad Arduino e vorrei realizzare un progetto che prevede l’utilizzo di due componenti (sensore temperatura e orologio) che andrebbero collegati agli stessi PIN (+5V, GND, Clock (SCL), Data (SDA)): i primi 2 (+5V e GND) immagino non siano in problema, ma gli ultimi 2 (Clock (SCL) e Data (SDA), da connettere rispettivamente ai PIN analogici 5 e 4) immagino che non sia possibile collegarli agli stessi PIN: hai qualche suggerimento per risolvere questo problema? Posso usare altri PIN (ad esempio 3 e 2) per collegare questi 2? Se sì, significa che devo cambiare qualche libreria? Grazie mille!
Autore
La tua ipotesi potrebbeessere una buona soluzione, che librerie utilizzi?
Autore
Ciao Davide, come procede il tuo progetto? Mi hai inviato i nomi delle librerie che intesi usare?
Se vuoi seguimi su twiter @mauroalfieri ci sono altri appassionati ed esperti come noi che possono darti aiuto.
Mauro
Salve Mauro, ti faccio una domanda forse banale :<>:
Grazie
Autore
Quale domanda vuoi sottopormi?
Mauro
intanto ringrazio anticipatamente !!!! sto cercando di leggere due o tre segnali analogici collegati agli ingressi A0.A1,A2 io ho trovato il codie per uno solo come avrai capito sono all’inizio puo darmi un aiuto grazie !!!
Autore
Ciao Ivob,
prova a seguire un po’ di tutorial sul blog, se sei alle prime armi certamente potrai trovare tante cose interessanti da scoprire.
Per la tua richiesta di leggere più segnali analogici puoi risolverla in molti modi, il più semplice è usare lo stesso comando “analogRead” per ciascun ingresso.
Se mi scrivi cosa vuoi farci con questi segnali magari posso darti altre info più dettagliate.
Mauro
Salve, devo utilizzare un ADC esterno con arduino: MCP3301.
L’ADC utilizza l’interfaccia SPI. Ho cercato di capire il funzionamento dell’interfaccia, che sembra semplice, utilizzando la libreria. Però mi sfuggono alcune cose specialmente nella fase di configurazione: SPI.setClockDivider, SPI.setDataMode, SPI.setBitOrder(). Considerando l’ADC in questione quali sono i valori corretti da utilizzare ?
Per quanto riguarda la gestione dell’ADC, utilizzo il codice sotto riportato, però devo capire se eseguo le cose correttamente. La gestione dei cicli e i bit che leggo, forse dovuto al fatto che ancora non so leggere il datasheet in particolare la pagina 21 e 22.
// inslude the SPI library:
#include
# define CS 10 // Pin Selezione
//# define MOSI 11 // MOSI // non utilizzato in quanto l’ADC non necessità di configurazione
# define MISO 12 // MISO
# define SCLK 13 // CLOCK
#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
long readvalue0;
void setup()
{
// Set pin modalità
pinMode (CS, OUTPUT);
//pinMode (MOSI, OUTPUT);
pinMode (MISO, INPUT);
pinMode (SCLK, OUTPUT);
// Disabilitare il dispositivo per iniziare
digitalWrite (CS, HIGH);
//digitalWrite (MOSI, LOW);
digitalWrite (SCLK, LOW);
Serial.begin (115200);
//SPI.setClockDivider (SPI_CLOCK_DIV2);
//SPI.setClockDivider (SPI_CLOCK_DIV4);
//SPI.setClockDivider (SPI_CLOCK_DIV8);
//SPI.setClockDivider (SPI_CLOCK_DIV16);
//SPI.setClockDivider (SPI_CLOCK_DIV32);
//SPI.setClockDivider (SPI_CLOCK_DIV64);
SPI.setClockDivider (SPI_CLOCK_DIV128);
SPI.setDataMode (SPI_MODE0);
//SPI.setDataMode (SPI_MODE1);
//SPI.setBitOrder (MSBFIRST);
//SPI.setBitOrder (LSBFIRST);
}
void loop ()
{
long t0=micros();
for(int k=0; k<500; k++)
{
readvalue0 = read_adcSlow ();
Serial.println (readvalue0, DEC);
}
}
int read_adcSlow ()
{
long avg = 0; int value=0;
for (int k=0; k=0; i–)
{
//value += digitalRead (MISO) << i;
value += (bitRead(PINB, 4) << i);
//cycle clock
digitalWrite (SCLK, HIGH);
digitalWrite (SCLK, LOW);
}
avg=avg+value;
digitalWrite (CS, HIGH);
//delayMicroseconds (10);
}
avg=avg/4;
return avg;
}
sapete dirmi se eseguo le cose correttamente e come faccio a verificare ?
grazie.
Autore
Ciao gcam,
purtroppo non ho mai provato l’ADC MCP3301 ed ho fatto poche esperienze con l’interfaccia SPI.
Pubblico il tuo commento perchè altri appassionati possano darti un aiuto.
Se intanto riesco a sperimentare con questo ADC e trovo qualche dritta te la invio.
Mauro
Ti posso dire che il codice ‘funziona’.
Speravo di avere qualche dritta sulla lettura del datascheet, anche per poter utilizzare altri dispositivi SPI.
grazie.
sul datasheet cosa si intende per SB ?
praticamente ci sono due bit null, sb e poi 11 bit che dovrebbero corrispondere al valore.
Poichè l’ADC consente di settare una VREF esterna compresa tra 400mV e 5V, vorrei settare come VREF 400 mV. Come la creo ?
ciao,
volevo porti una domanda: che tensioni e che correnti può gestire arduino negli ingressi analogici? cioè quanti volt e quanti ampere posso collegare in ingresso?
grazie,
simone.
Autore
Ciao Simone,
puoi verificare sul sito ufficiale le caratteristiche della tua scheda, variano in funzione del modello ( Uno, Mega, Due, … )
Mauro
salve, sto utilizzando ArduinoLeonardo e mi servirebbe il comando per configurare i piedini analogici in digitale.. sapresti dirmi come si fa? grazie.
Autore
Ciao Michele,
non ho compreso la richiesta, vuoi usare I pin analogici come digitali?
Hai provato a dichiararlo con il pinMode() e leggerli con digitalRead()?
Spero. Aver interpretato la tua richiesta.
Mauro
Ciao Mauro
Devo per necessita creare un programmino per arduino uno
Non e tanto complesso…. Sono disposto a finanziare il tutto
Sei disposto ad aiutarmi ?
Ciao Loris
Autore
Ciao Loris,
descrivimi in una email ciò che vuoi realizzare, l’indirizzo é l’info del blog.
Ti aiuto volentieri e se non richiede molto tempo non ci sono problemi economici.
Ti chiedo la cortesia, in email, di mettere tutti i dettagli possibili.
Mauro
Grazie mille ti sto inviando il tutto
CIAO MAURO
SCUSAMI SE TI DISTURBO… TI è ARRIVATA LA MIA MAIL CON IL VIDEO ?
Autore
Ciao Loris,
no, non mi è arrivato nulla.
Puoi evitare il MAIUSCOLO 🙂
Grazie
Mauro
Te l’ho inviata con un video su info@mauroalfieri.dot.it
e giusto?
Autore
Ciao Loris,
Dot in inglese é . Quindi il dominio é mauroalfieri.it
Cosa contiene il video?
Mauro
Il video c’è il movimento che deve fare la macchina…
Oggi te lo rinvio
Salve Mauro!
Innanzi tutto volevo farle i complimenti per il suo sito che offre guide dettagliate e ottime per iniziare con arduino.
Veramente un ottimo lavoro.
Volevo chiederle se riusciva a togliermi un dubbio con arduino: quando cerco di accendere 2 led solo il primo si accende al pieno della potenza mentre gli altri si accendono fiacchi e quasi non si vede nemmeno.
Come posso fare per farli accendere? le ho provate tutte.
Roberto
Autore
Ciao Roberto,
per poter rispondere con precisione avrei bisogno di sapere:
– quanti sono i led
– che tipo di led sono
– a quali pin li hai connessi
– quali resistenze hai utilizzato
meglio ancora se sai l’assorbimento di ciascun led.
La causa principale potrebbe essere l’elevata richiesta di corrente da parte dei led, arduino è in grado di erogare 40mA max per pin ed in totale 150mA massimi.
Mauro
Non conosco le specifiche dei led perchè li ho trovati in un kit di arduino.
Per fare una prova avevo connesso i led senza resistenza per quello non andavano.
Mettendo delle resistenze da 220 ohm si accendono entrambi un pò meno forte.
Grazie mille Mauro.
Volevo chiedere un’altra cosa:
è possibile bloccare temporaneamente il loop ad un determinato punto facendolo riprendere alla pressione di uno o più tasti?
Grazie mille in anticipo.
Autore
Ciao Roberto,
ben fatto per i led.
Si esistono diverse tecniche per ottenere una pausa temporanea fino alla pressione di un pulsante o altro segnale.
Ti consiglio di approfondire i cicli di tipo “while” che consentono di creare dei loop interni alla funzione loop() stessa.
Mauro
Ciao Mauro,
vorrei collegare ad un pin digitale dell’Arduino UNO un telecomando per le luci del giardino. L’idea è quella di mantenere sempre premuto con un morsetto il pulsantino del telecomando ed agire, tramite Arduino, sulla sua alimentazione per accendere/spegnere le luci. Il telecomando funziona con due batterie a bottone (del tipo CR2032) da 3 V ciascuna, quindi 6 V in tutto. L’assorbimento medio del telecomando è di 14 mA.
Arrivo alla mia domanda: visto che l’output del pin digitale è di 5 V, questi potrebbero bastare (e quindi potrei collegare direttamente il telecomando, ovviamente senza le batterie, al pin) oppure il Volt di differenza mi obbliga ad usare un mosfet?
Tante grazie per l’attenzione.
Fabiano
Autore
Ciao Fabiano,
se, come dici i 5v sono sufficienti al telecomando non hai bisogno di mosfet o altro, se non lo sono ti consiglio un relè per arduino.
In ogni caso mi sembra una soluzione macchinosa, hai pensato di usare direttamente arduino come telecomando? Ho scritto degli articoli in merito.
Volevo chiedere un parere,Vorrei utilizzare Arduino per sostituire la scheda di controllo di una stufa a pellet,è fattibile la cosa?
Autore
Ciao Marco,
mi sembra pericoloso in quanto le stufe a pellet avranno sicuramente una centralina complessa per il controllo fumi, erogazione del pellet e bruciatore.
Solitamente i produttori sottopongono a complessi controlli e certificazioni i loro prodotti per dichiararli sicuri.
Se la tua stufa non ha delle funzioni che desideri controlla che non sia possibile integrare tali funzioni esternamente, magari tramite arduino, su protocolli di tipo seriale, I2C o SPI.
Carissimo Mauro, innanzitutto un sincero ringraziamento per come esponi la programmazione ed i passi per realizzare un progetto. Io ho perso il lavoro di tecnico commercile con altre 90 persone, mi occupavo di soluzioni per la connessione elettrica. Adesso sto affrontando un percorso di riprofessionalizzazione, visto che vendendo un monoprodotto mi sono perso molte cose per starda…tra cui Arduino, che mi sta appassionando e aiuando. Ho un problema con la gestione di più cicli all’ionterno dello stesso programma. Faccio un esempio se devo gestire 4 input e 4 output ( Analog i primi e Digital i secondi), metti che devo timerizzare un OUTPUT e lo faccio con DELAY, tuto il programma si ritarda. Mi sono letto tutti i manuali possibili ed ho trovato una soluzione nel tuo Tutorial Interrupt ,ne ho capito il funzionamento edho realizzato tutto.
C’è qualcosa di più leggero ? Come posso gestire tempi di intervento divesi sugli OUTPUT?
GRAZIE e forza ,continua su questa strada
CIAO
Autore
Ciao Roberto,
al posto del delay() puoi usare la funzione millis() per verificare il trascorrere del tempo ed evitare il delay.
E’ più leggero ma di certo differente dall’uso degli interrupt che servono a tutt’altra cosa e sono solo 2 in arduino uno.
Ciao non potresti fare un piccolo progetto serra con ecoduino non solo che dia da bere ma che rinfreschi l’ ambiente se è troppo caldo e che tramite fotoresistenze si accendono dei led come illuminazione a mo di serra idroponica. Grazie se leggi questo commento bel blog 🙂
Autore
Ciao Michael, sarebbe un progetto interessante e sicuramente leggendo gli articoli che ho già scritto sarai in grado di farlo di solo, pensa alla soddisfazione di dire: l’ho fatto io al posto di dire agli amici “l’ho copiato da un sito”
Ciao Mauro da poco tempo sono entrato nel mondo di Arduino e ho letto alcuni dei tuoi corsi che sono veramente comprensibili anche per persone poco esperto come il sottoscrito. Io vorrei costruire una piccala attrezzatura semi automatica movimentata da 2 cilindri pneumatici comandati da 2 elettrovalvole con 2 solenoidi, come ingressi ho 3 sensori di prossimità, 3 sensori di fine corsa dei cilindri, un pulsante di emergenza, uno di avvio ciclo e uno di fine cicli, con la scheda Shield IN/OUT cod.8220-VMA05 è possibile farla funzionare?
Grazie
Ciao
Autore
Ciao Guglielmo,
contandoi sensori che vuoi inserire sono più di 6, se non conto male, e questa scheda gestisce 6 sensori di input e 6 output che nel tuo caso sarebbero troppi output.
Probabilmente una shield con 4 relay sarebbe più che sufficiente ed i sensori li colleghi direttamente ad arduino se lavorano a 5v.
Ciao Mauro
Avendo la scheda 6 ingressi analogici e 6 digitali pensavo di utilizzare dei sensori digitali e i pulsanti analogici, mentre non ho problemi per le uscite in quanto sono 4 per i 2 cilindri + 1 per la valvola di scarico rapido per l’emergenza.
Colgo l’occasione per augurati un buon 2015
Guglielmo
Autore
Ciao Guglielmo,
perdonami ma avevo inteso che tu volessi utilizzare solo gli ingressi digitali della shield in-out ( 6 appunto ) se usi anche quelli analogici puoi avere in ingresso 12 input ( 6 analogici e 6 digitali ) ricorda che sono tutti ingressi a 5v e che gli analogici ti daranno un valore da 0 a 1023 in funzione del circuito che gli connetti.
Grazie delle informazioni.
Pensavo anche; è possibile, avendo montato la scheda in / out su arduino, poter collegare anche il display LCD ACM1602B per visualizzare istruzioni, allarmi o commenti.
grazie ancora per la disponibilità.
Guglielmo
Autore
Ciao Guglielmo,
a memoria ti direi di no in quanto il display necessita di 8 pin + 1 pin di blacklight per il controllo e la IN/OUT di 6 pin digitali.
So che la Lemontech.cc ( http://www.lemontech.cc ) sta per produrre una shield LCD che funziona con soli due pin ed a quel punto potresti riuscirci.
Tieni sotto controllo il sito per sapere quando sarà disponibile.
Salve Mauro,
Avrei una domanda da porle, premetto che sono agli inizi!
Come posso sapere la totale quantità di alimentazione che mi serve per un progetto fatto da Arduino uno+wifishield di adafruit+sensore dht22? Come si può fare? Mi servirebbero più informazioni possibili a riguardo.
La ringrazio tanto, davvero!
Autore
Ciao Davide,
il modo più affidabile che conosco è costruire il circuito e misurare la corrente assorbita in fase di funzionamento per il periodo che ti interessa monitorare in modo da avere valori certi.
Buongiorno Mauro,
e complimenti per il tuo spazio web che per me è diventato di riferimento, nel cercare di capire Arduino.
A proposito di segnali in ingresso ti chiedo:
ho bisogno di avviare un programma attraverso un pulsante, e poi il programma deve tornare all’inizio, in attesa di una nuova pressione del pulsante.
Il probema è che il pulsante, una volta premuto, può rimanere premuto anche a lungo, anche quando il programma è già finito ed attende il nuovo segnale.
Io vorrei che il programma si riavviasse solo quando:
il pulsante è stato rilasciato, e poi nuovamente premuto.
Cioè, credo, con un impulso, anziché con uno stato.
Come faresti?
Ti ringrazio per la disponibilità.
Andrea.
Autore
Ciao Andrea,
io userei un boolean di controllo se la pressione è avvenuta lo setti a “true” e verifichi la pressione, al rilascio imposti “false” così sai se il pulsante è già stato premuto o è ancora premuto dalla volta precedente.
ciao, sono un ragazzo di 14 anni molto appassionato di queste cose.
volevo davvero ringraziarti, perché grazie ai tuoi cosiddetti corsi sto riuscendo a capire la programmazione, in attesa di ricevere arduino.
grazie 10000
Autore
Bene Federico,
io lo faccio con piacere e so che tu imparerai tanto 🙂
Ciao a tutti ho bisogno di una mano sto realizzando un progetto ma mi sono bloccato … Il progetto è una macchina per riempire il vino nelle bottiglie … Tutto il progetto di basa su un loop che comanda una sequenza di operazioni solo che adesso mi servirebbe che a metà loop il sistema si fermasse e tramite un pulsante vorrei farlo ripartire io per continuare l’altra metà rimanente di loop
Autore
Ciao Ezio,
descritto con i pochi particolari che mi dici potrei ipotizzare tante soluzioni e magari nessuna adatta.
Cosa intendi per “una sequenza di operazioni solo che adesso mi servirebbe che a metà loop il sistema si fermasse”:
quali sono le operazioni ?
quanto dura ciascuna ?
quanti sensori usi per capire in che punto sei ?
quando capisci che sei a metà ?
a metà del loop() cosa succede che ti fa capire che ci sei arrivato ?
ogni loop() serve solo ad un ciclo o per riempire una bottiglia ci vogliono più cicli ?
é un prodotto personale o devi industrializzarlo ?
Ciao e grazie per l’articolo!
Ho notato che quando pongo il servo in posizione 90°, il servo sembra rimani acceso senza che la testina si muova. Ad angoli tipo 45° o altri, il servo raggiunge la posizione e poi si spegne (non si sente nulla). A 90, raggiunge la posizione e rimane acceso (si sente il rumore del motorino interno).
È normale?
Autore
Ciao Francesco,
non dovresti udire un sovraccarico del servo per mantenere la posizione, questo indica che il motore non riesce a raggiungere o mantenere la posizione e l’elettronica del servo tende a correggere continuamente.
Quindi è difettoso? Ho parlato con chi me l’ha venduto e mi ha detto che è normale…
Autore
Ciao Francesco,
mi sono probabilmente spiegato in modo errato: ti ho scritto il motivo per cui verifichi questo comportamento.
La causa non è necessariamente un malfunzionamento del prodotto potrebbe ad esempio dipendere dal tipo di controllo che effettui o da altri fattori esterni, ad esempio la meccanica a cui è collegato, ecc…
Per verificarlo ti consiglio di testare il servo con un controller per modellisti, possibilmente della stessa ditta produttrice del servo, verificando che ad ogni comando il relativo posizionamento.
Ciao Mauro, avrei bisogno di alcune informazioni per un progetto che sto tentando di realizzare con Arduino Mega SDK.
Ti anticipo che sono molti anni che non tocco elettronica e non mi sono mai approcciato ad arduino sinora, tuttavia ci provo.
Il mio scopo è quello di leggere tramite input analogici dei valori di tensione e digitalizzarli per leggerli in tempo reale.
Leggo sul sito di arduino che il range in input analogico è 0-5 v ed una corrente massima di 40mA.
Come alimentazione utilizzo una normale batteria 9V duracell.
Vengo alle domande:
– C’è modo di limitare la tensione di uscita da un circuito in mofo da non far mai arrivare oltre 5v ad arduino?
(tento una risposta: con uno zener 5.1 o 4.7? e come dovrebbe essere fatto il circuito? Ho provato col solo zener ed in pochi secondi è diventato rovente ergo troppi mA)
– C’è modo di limitare la corrente a 40mA (o meno) per lo stesso motivo di cui sopra?
Grazie per la disponibilità
Autore
Ciao Alberto,
senza sapere a quale tipo di progetto stai lavorando e che tipo di sensore stai collegando non so risponderti.
Ciao Mauro,
devo pilotare un motore attraverso arduino, controllando:
1 velocità del motore (attraverso un potenziometro);
2 tempo di lavoro, ovvero il tempo per cui deve girare (controllato sempre attraverso un potenziometro);
3 tempo di pausa, ovvero quando il motore non deve girare (controllato sempre attraverso un potenziometro).
per farlo ho scritto 2 programmi, quello che controlla la velocità e uno che controlla il tempo di lavoro, mentre per il tempo di pausa non ho visto ancora nulla.
visto che i due programmi sono separati ho bisogno di unirli, non ci riesco perchè ci sono 2 righe di codice per azionare il motore. potresti aiutarmi?
[[ codice rimosso in automatico ]]
Grazie in anticipo.
Autore
Ciao Antonio,
innanzitutto ti chiedo di rispettare le regole in fondo ad ogni articolo e nelle pagine del blog.
Non correggo codici di altri e sopratutto nei commenti.
Per il tuo problema ti basta fare uno schema mentale delle fasi da eseguire e in che sequenza eseguirle, poi tradurre in un unico sketch il risultato, non puoi avere due righe che contemporaneamente debbano azionare il motore in quanto o sei in fase 1 o in fase 2 o in fase3 non sarai mai in fase 1 e 2 contemporaneamente
Chiedo scusa per non aver utilizzato il tag per scrivere il codice, quindi non posso regolare la velocità del motore e contemporaneamente regolare il tempo di lavoro? Ovviamente io voglio farlo con due potenziometri.
Autore
Certo che puoi Antonio,
leggi bene la mia risposta ed i consigli che ti ho scritto.
Con arduino uno mi ritrovo le uscite digitali non PWN in stato low con 3volt invece che a gnd….non dovrei avere solo 0 o 5V?
Autore
Ciao Guli,
hai già provato a collegarci un led+resistenza per verificare che sia una tensione effettiva?
L’arduino è originale?
Ciao Mauro, complimenti per il sito e per il modo con cui spieghi, sono a muovere i primi passi con Arduino uno, ti volevo chiedere se hai fatto una guida su come gestire un pulsante NO e un pulsante NC in serie.
Volevo capire come si programma arduino con il classico comando marcia, arresto e blocco sicurezza.
Grazie, intanto continuo a leggere i tuoi articoli.
Autore
Ciao Angelo,
nel corso Base trovi molti tutorial sui pulsanti che puoi adattare al tuo scopo.
Salve. È possibile utilizzare una porta analogica come se fosse una porta pwm? Mi spiego: ho da utilizzare un led rgb ma ho gia tutte le porte pwm utilizzate posso usare le porte analogiche in modo che possa “impostare” il colore del led? E se si come?
Autore
Ciao Davide,
i pin analogici possono essere usati come digitali in input o output ma come PWM in output mi sembra di no. Puoi verificare sul pinout arduino.
ciao Mauro vorrei sapere da te se e possibile con arduino controllare l’automobile mi spiego meglio
vorrei che arduino controllasse lo stato porte aperte avaria luci o altre avarie controllo temperatura e via discorrendo ma essendo l’impianto della macchina a 12V spenta e circa 14V accesa ti chiedo come superare tale o se mi puoi indirizzare in qualche modo premetto che non sono ne un tecnico ne un informatico ma solo un appassionato autodidatta grazie in anticipo
Autore
Ciao Nico,
volendoti collegare direttamente agli impianti esistenti, io lo sconsiglio per una questione di garanzia e sicurezza stradale, puoi usare degli optoisolatori opportunamente tarati per interfacciare i sensori a 12/14v a uscite a 5v.
Nel blog trovi trattato l’argomento e dovrai costruirti tu un circuito adatto predendolo dal datasheet o da qualche manuale di elettronica.
ciao mauro.
sto creando un progetto scolastico in cui faccio comunicare due arduino uno come trasmettitore/ricevitore. l’unico problema è che non so come settare tutti i pin digitali (che saranno led) a livello basso. dove una volta andati HIGH tornino bassi dopo qualche millisecondo (microsenddelay)
Autore
Ciao Luigi,
trovi nel blog molti articoli in cui è spiegato come portare un pin da HIGH a LOW.
Ciao Mauro….inizio a dirti che di elettronica non ci capisco un tubo…ho comprato però.. Un kit da AMAZON e precisamente ELEGOO STARTER KIT mega 2560r3…vorrei costruire un sensore di umidità per interno con display a 16 pin ..ho provato ma non riesco,anche perche non so come collegarli..mi invii per favore in e_mai uno schema su come devo collegare il display alla scheda ? Grazie mille Gianpiero
Autore
Ciao Giampiero,
trovi tutto nel blog, basta usare il campo di ricerca.
Premetto che i display sono trai componenti più complessi da collegare e variano i collegamenti da display a display, nel blog trovi alcuni esempi, per essere certo di non danneggiarli ti serve lo schema di collegamento del produttore.
Ciao Mauro,
posso usare i pin 0 e 1 come input/output digitale? Sto provando con 2 pushbutton ma mi ritorna un segnale sempre HIGH (diversamente da altri pushbutton connessi su pin differenti). Non so se usandoli come output per 2 led possa cambiare qualcosa…
Grazie tante.
Autore
Ciao Elia,
se li usi come pin digitali non puoi usare il serial monitor e le istruzioni Serial nel tuo sketch. Trovi il motivo descritto in alcuni articoli del mio corso base gratuito arduino on-line
Buongiorno, ho iniziato da poco a utilizzare Arduino non originale ma alla fine mi sembra che non cambi nulla. I primi problemi sono stati causati dal driver che non riconosceva la scheda sulla com3. Adesso tutto ok. Ma il maledetto led “L” che continua a lampeggiare sempre anche quando cambio listato. Ho letto sul forum che bisogna mettere un resistore da 100k dal pin 13 (che corrisponde al pin 19 Atmega328p) e gnd!!! Proverò. Chissà perchè si utilizzano ancora le porte com (se fosse seriale ok) con la porta usb ………………….. . In ogni caso volevo far presente che a me non funziona nulla, inserisco un codice ma senza ottenere niente di niente. Volevo iniziare con il progetto pulse heart ma per il momento sono fermo. Ho acquistato un libro per iniziare a utilizzare al meglio questa schedina e appena mi arriva sperimento. Caspita forse era meglio il mitico ST7! Saluti.
Autore
Ciao Pierpaolo,
se tu usassi l’originale non avresti tutti questi problemi.
desidero contattare mauro alfieri per commissionarlo un mio progetto che non riesco
a far funzionare ( forse 79 anni la memoria fa cilecca)
renato de felice grazie
Autore
Ciao Renato,
puoi scrivermi del progetto alla casella info del blog, la medesima da cui ti è arrivata questa email.
Ciao Mauro, ho conosciuto oggi il tuo sito.
Ho un piccolo problema, ho ditate su IDE uno sketch ed in una ria di seta, ho digitato : digitalState(2); // Pin INPUT.
Facendo la verifica mi spunta :exit status 1 ‘ was not declared in this scope’.
Vorrei sapere cosa significa e cosa dovrei fare.
Sono alle prime armi.
Ringrazio anticipatamente
Autore
Ciao Antonio,
in primo luogo non ho compreso cosa tu sta facendo, forse a causa della correzione del cellulare la frase è incomprensibile.
Il comando “digitalState” non esiste.
Ciao Mauro,
innanzitutto complimenti per il magnifico lavoro che hai realizzato.
Ho un problema che apparentemente può sembrare stupido ma che non riesco a risolvere per via della mia poca conoscenza di Arduino.
Sto utilizzando un Arduino Mega 2560 con il quale devo gestire un Mass Flow Controller.
Il mio problema riguarda l’apertura della valvola del MassFlow il quale richiede un voltaggio di +5 VDC e deve essere effettuato dal pin analogico (nel mio caso, il pin in questione è il A4) quindi dal pin A4 di Arduino (il quale è collegato al pin relativo del MassFlow) mi deve uscire un voltaggio di +5 VDC che mi permette l’apertura della valvola .
Ora le chiedo: come si scrive questo comando che vorrei effettuare nello sketch?
La ringrazio anticipatamente per l’aiuto che mi darà.
Autore
Ciao Simone,
innanzitutto ti consiglio di leggere e comprendere i miei articoli ed il corso arduino base gratuito che ho realizzato e pubblicato in questo blog.
Perché vuoi usare il pin A4 come output? I pin A0-A5 possono essere usati come Analogici in input o digitali in output.
Ciao Mauro,
la scelta del pin A4 è stata casuale, serviva solo per capire come effettuare il comando; usare il pin A4 come output mi sono reso conto che era un errore.
Comunque, leggendo i suoi articoli e il corso base di arduino, sono riuscito a risolvere questo problema.
La ringrazio di nuovo per l’aiuto e per la disponibilità.
Autore
Bravissimo Simone.
Buongiorno Mauro, cercando indicazioni su Arduino sono incappato sul tuo lavoro che trovo impressionante e frutto sicuramente di una passione pura. Io sono datato e distratto da altre cose ma per onorare il regalo di Arduino fattomi a Natale dai nipoti, ho provato a farne una applicazione. Si tratta di misurare un impulso che va alto per un tempo variabile da 4ms a 1004 ms . Ho usato l’istruzione durata = pulseIn(pin, HIGH, 1004000) . che poi divido per 1000 e visualizzo. Il risultato sembra coerente con la durata rilevata sull’oscilloscopio tranne che per valori superiorti a 30 ( 30000 micros ) ho inversione di segno. Ti sarei grato se potessi indicarmi come uscirne , ne va della mia onorabilità di nonno. Grazie e buon divertimento.
Autore
Ciao ALdo,
lavoro encomiabile per essere un primo esperimento .. hai tutta la mia stima.
L’inversione di segno potrebbe essere dovuta solo ad un errato tipo si variabile utilizzata che trasformando i numeri in binario ti riporta a valori negativi raggiunto il suo limite superiore.
Che tipo di variabile hai utilizzato?
Buongiorno Mauro, ho risolto il problema impostando la variabile come ” unsigned long” . E’ bastato leggere qualche lezione del tuo corso. Lavoro meritorio. Grazie. Se dovessi mettere la testa a posto, non è escluso che torni a disturbarti per altri consigli. Buon lavoro
Autore
Bene Aldo,
se tu volessi condividere i tuoi progetti sarò lieto di pubblicarli.
Leggi nella sezione “Collabora al Blog” come fare e pensa che se oggi quello che ho scritto è stato utile a te ciò che hai da raccontare domani sarà utile ai tuoi nipoti e non solo.
Salve,
è possibile alimentare Arduino con i 12-14 V di una automobile e usare anche i segali in entrata allo stesso voltaggio. Dalle caratteristiche che leggo nel sito sembrerebbe di si, mi la lascia qualche dubbio l’Operating voltage a 5v.
Grazie.
Autore
Ciao Marco,
no, non è possibile.
Puoi alimentare Arduino Uno attraverso il Vin o il connettore Jack nero frontale da 7 a 20v, anche se il sito raccomanda 12v, ma gli ingressi e le uscite, pin, restano operanti a 5v ( Operating voltage 5v )
Salve,
e grazie mille per la risposta. Pensa che potrei risolvere il problema alimentando sia l’Arduino che i sensori con i 12 v del veicolo e poi convertendo solo l’uscita dei sensori con degli switching di step down per avere una caduta di tensione fino a 5 v ? Risolto questo dubbio inizierei subito con la programmazione del mio progetto ( un antifurto con condizioni specifiche di allarme )
Grazie.
Autore
Ciao Marco,
si puoi alimentare arduino a 12v dal Vin, come ti ho scritto, ma ai pin devi far arrivare al max 5v.
Salve,
sarebbe comunque possibile usare le entrate analogiche “come” digitali (facendogli leggere un ingresso alto o basso) in caso avessi bisogno di più ingressi per il mio progetto?
Autore
Ciao Marco,
si è possibile usare i pin analogici A0-A5 dell’arduino uno sia come input analogici, funzione designata, sia come IN/OUT digitali.
Ciao Mauro, innanzitutto complimenti per il sito e per la disponibilità che dimostri con tutti
Mi affaccio per la prima volta al mondo dell’elettronica perchè ho smesso di fumare e devo avere una mania ossessiva per distrarmi.
il progetto che vorrei realizzare consiste nel far sì che tenendo premuto n secondi un tasto del citofono (quello che serve per attivare la cornetta e sentire/parlare) si attivi un telecomando (a 433 Mhz) che sblocca l’ascensore. Ho recuperato un arduino micro.
Devo dire che ho già fallito nel riuscire a leggere il segnale del telecomando con la libreria rcswtich e i rx/tx 433 mhz economici che si trovano su internet – il risultato è che la tensione del ricevitore si fissa su 1 v quando eccitato dal telecomando mentre oscilla tra 0.02 e 0.06 v o qualcosa del genere a riposo , che non mi significa niente. E senza sapere come lavora il telecomando (millisecondi, n. ripetizioni etc), anche se vedo l’impostazione dei 10 dipswitch, non so cosa fare per trasmettere con il rc 433 mhz che ho comprato.
Per tale motivo ho deciso di andare ad azionare con arduino il telcomando già esistente.
Il citofono, tra i vari contatti elettrici interni, ne ha uno che è 6,6 v in condizioni “a riposo” e che cala a 1 v quando viene schiacciato questo tasto della cornetta.
La mia idea è di usare un AnalogRead per valutare un certo tempo di permanenza a 1 v (tasto premuto) e a quel punto con un DigitalWrite high azionare un relè che lascia passare i 12 v al telecomando.
il mio dubbio è:
(oltre a: ha senso quello che ho scritto? 😀 )
1) leggo ovunque che la tensione massima che bisogna applicare a un pin analogico in input è 5 v. Io ho 6,6 perciò devo tirarla giù di 1,6 circa – ma per dimensionare la resistenza (lo faccio così?) mi serve sapere l’intensità corrente. Che corrente assorbe il pin analogico? ho già trovato sia pareri tipo “48 mAh” piuttosto che 0.0001 mAh – nel primo caso mi servirebbe una resistenza da 1,6/0.048 = 33 ohm nel secondo caso 1.6/0.0000001 = 16 Mohm ?!?!?!?! Mi sono un po’ perso.
2) posso alimentare tramite Vi l’arduino tra 7 e 12 v come raccomandato in alcune schede tecniche? o bisogna dargli max 5 v?
Grazie mille in anticipo e buon weekend!
Matteo
Autore
Ciao Matteo,
il primo commento che inserisci deve essere approvato per questo non li vedi subito.
In merito a quello che scrivi non vorrei aver frainteso ma se si tratta di pulsanti o segnali cmq digitali è meglio usare un digitalRead su un pin digitale che un analogRead.
Forse prima di approcciare a questo progetto è bene che tu prenda pratica su progetti più semplici e con tensioni standard.
In merito alle tue domnade dirette:
1. usa un partitore di tensione, online trovi molti calcolatori, considera che sei in input e quindi le correnti assorbite da Arduino sono trascurabili o quasi nulle, io ad esempio per ripartire da 5v a 2,5v uso due resistenze uguali da 1K o 10k in base a quali ho a disposizione in quel momento.
2. si puoi alimentare Arduino da 7 a 12v dal suo connettore frontale DC.
Ciao Mauro, ah ok non sapevo del primo commento perciò ho provato un po’ di volte pensavo fosse una questione di cookies disabilitati o simili 🙂
grazie mille per la risposta
l’input sì potrebbe essere assimilato a un segnale digitale. E’ il circuito elettrico che alimenta speaker e microfono della cornetta del citofono, che appunto è 6,6 v a riposo e circa 1 se schiacciato. Portandolo a 5 con il partitore tensione a monte lo posso leggere con un pin digitale. Ho capito bene?
Ok, approfondirò il discorso partitore di tensione; effettivamente mi manca un po’ la teoria “applicata”, ero convinto che con correnti approssimabili a 0 servissero dei megaOhm come resistori.
Alimentazione arduino: ok, il micro non ha il connettore ma penso sia uguale usando Vi.
Grazie ancora
buona settimana
Autore
Ciao Matteo,
se usi un partitore correttamente configurato un pull-up o pull-down puoi trattarlo come input digitale con Arduino.
Che version di scheda arduino stai usando ?
il micro, questo:
https://store.arduino.cc/arduino-micro
Autore
Ciao Matteo,
si puoi usare i 7-12v come indicato nelle specifiche tecniche del prodotto.
[…] Se vuoi pilotare dei servo prima di tutto devi sapere che la complessità dell’opera nasce dalla necessità di utilizzare un duty-cycle per impartire comandi a questi meravigliosi oggetti in grado di trasformare la volontà elettronica in movimento. Arduino dispone, secondo i modelli, di uscite PWM ossia pin digitali in grado di generare un duty-cycle utilizzabile per far muovere un servo, puoi trovare una panoramica sull’argomento in questo mio articolo. […]
[…] il vaore ad Arduino sul pin definito alle linee 18-20, i valori passati saranno tradotti in segnali PWM dai pin di […]
[…] Se non ti è chiaro perchè utilizzo la funzione analoWrite() se ho collegato il led alle uscite digitali PWM puoi leggere questo mio articolo che ti chiarirà le idee: Programmare con Arduino – Pin Digitali e Analogici. […]
[…] indica il tempo del duty-cycle, se non sai cos’è ti invito a leggere questo mio articolo: Programmare con Arduino – Pin Digitali e Analogici in cui trovi una semplice spiegazione di come funziona e a cosa […]
[…] Ti invito a leggere l’introduzione sul’argomento in questo articolo. […]
[…] linea 11: indico ad Arduino che utilizzerò la comunicazione seriale a 9600 boud (vedi articolo) […]