Spero abbiate passato dei giorni sereni e che altri ne verranno.
Nel setup() del mio programma, attraverso pinMode() definisco la 'destinazione' di un pin. Quindi OUTPUT o INPUT.
E' possibile in qualsiasi momento usarlo in modo diverso? Cioè, supponiamo che io abbia un jack collegato ad un pin digitale e a GND. In una parte del software da questo pin voglio leggere il valore di un sensore.
In un altra parte voglio poter collegare a questo jack un led ed accenderlo o spegnerlo a piacimento (ovviamente i due non saranno mai collegati contemporaneamente).
E' una cosa fattibile o una volta dichiarato devo usarlo in INPUT o OUTPUT?
Se la cosa è fattibile, all'interno del codice come mi devo comportare? Devo riassegnare la destinazione con pinMode, o basta un digitalRead o un digitalWrite?
Mi pare sia molto importante dichiararlo nel codice. Il fatto di dichiarare un pin come OUTPUT e utilizzarlo come INPUT puo' essere la causa di malfunzionamento/rottura di Arduino.
f.schiano:
Mi pare sia molto importante dichiararlo nel codice. Il fatto di dichiarare un pin come OUTPUT e utilizzarlo come INPUT puo' essere la causa di malfunzionamento/rottura di Arduino.
Ciao,
Fab.
E sta bene. Quello che voglio capire è: nel setup dichiaro pinMode(3, INPUT). Poi, un bel giorno in un'altra parte del codice mi serve come output, basta che gli scrivo con un digitalWrite o prima devo dirgli pinMode(3, OUTPUT)? Mi pare di capire che devo specificarlo con pinMode, giusto?
Quindi, altra domanda: a questo punto nel setup non dichiaro più l'uso dei pin, ma lo faccio per ogni specifica routine all'interno del programma... va bene?
Lo puoi fare. Lo puoi fare in qualunque punto del codice.
La dichiarazione dei pin la metti dove vuoi. Si mette in setup solo quando durante tutto il resto del codice la direzione del pin non deve più cambiare.
Se devi scrivere su un pin dichiarato come input, devi prima switcharlo ad output: scrivere High su un pin in input attiva la resistenza di pull-up, ottenendo quindi in effetto indesiderato.
@f.schiano:
l'ho detto infatti di prendere le dovute accortezze lato codice affinché non si usi in malo modo il pin.
GS88:
Ma digitalWriteFast, digitalReadFast e pinModeFast ??!
mmm....
questi 3 mi giungono nuovi, non sono comandi, li avrai visti da qualche parte come proprietà di funzioni.
ad esempio così, ma alla fine dentro c'e' sempre digitalWrite o digitalRead
digitalWriteFast(a, b)
{
digitalWrite((a), (b));
}
Ma perchè il programma dovrebbe a un certo punto cambiare il suo PinMODE?
Non si danneggia assolutamente niente, l'unica cosa a cui devi stare attento è che se ci attacchi qualcosa che ha un'uscita (ad es. un mic.) e poni il pin come output potrebbe esserci un conflitto elettrico e quindi il dispositivo/pin di potrebbe danneggiare.
Fatta questa premessa, la digitalWrite fa una cosa ben precisa quando il pin è come input, ovvero attiva un pull-up interno del valore di circa 20-30Kohm. Per approfondimenti digitalWrite() - Arduino Reference
If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW.
If the pin is configured as an INPUT, writing a HIGH value with digitalWrite() will enable an internal 20K pullup resistor (see the tutorial on digital pins). Writing LOW will disable the pullup. The pullup resistor is enough to light an LED dimly, so if LEDs appear to work, but very dimly, this is a likely cause. The remedy is to set the pin to an output with the pinMode() function.
pablos71:
questi 3 mi giungono nuovi, non sono comandi, li avrai visti da qualche parte come proprietà di funzioni.
ad esempio così, ma alla fine dentro c'e' sempre digitalWrite o digitalRead
digitalWriteFast(a, b)
{
digitalWrite((a), (b));
}
Ma perchè il programma dovrebbe a un certo punto cambiare il suo PinMODE?
Il programma dovrebbe cambiare il pin mode, perchè ho tre jack che uso in una parte per leggere dei valori da sensori. Però domani, quegli stessi tre jack, vorrei usarli per pilotare un dispositivo a 12V, quindi anzichè leggerci, vorrei scriverci.
Per parlarci chiaro:
Se colleghi un pin di Arduino a un uscita di un dispositivo che Ti da 0V o 5V e questo pin lo definisci come uscita (con pinMode(pin, OUTPUT) ) e dai tensioni 5V o 0V metti praticamente il pin in corto. Questo caso devi evitare.
Un uso pratico del cambiare entrata/uscita di un pin é quando piloti certi tipi di multiplexing di matrice di LED (Charlieplexing - Wikipedia) e metti i pin non attivi delle righe come entrata e percui come "uscite" di alta impedenza (paraticamente simuli un tristate).
Se colleghi 3 jack a Arduino e li usi come in un applicazione/sketch come entrate collegandone delle uscite e una altra volta li usi con un altra applicazione/sketch come uscite collegano ad essi delle entrate non ci sono problemi.
uwefed:
Per parlarci chiaro:
Se colleghi un pin di Arduino a un uscita di un dispositivo che Ti da 0V o 5V e questo pin lo definisci come uscita (con pinMode(pin, OUTPUT) ) e dai tensioni 5V o 0V metti praticamente il pin in corto. Questo caso devi evitare.
Un uso pratico del cambiare entrata/uscita di un pin é quando piloti certi tipi di multiplexing di matrice di LED (Charlieplexing - Wikipedia) e metti i pin non attivi delle righe come entrata e percui come "uscite" di alta impedenza (paraticamente simuli un tristate).
Se colleghi 3 jack a Arduino e li usi come in un applicazione/sketch come entrate collegandone delle uscite e una altra volta li usi con un altra applicazione/sketch come uscite collegano ad essi delle entrate non ci sono problemi.
Ciao Uwe
Ciao grazie Uwe.
Io ho 3 jack che vorrei usare nello stesso sketch, una volta per leggere dei valori che mi restituiscono i sensori. Poi, staccando i sensori, vorrei usare questi 3 jack per comandare ad esempio tre led.
Supponi che ho un menu, dal menu seleziono "leggi dai sensori" ed i pin dovranno essere in INPUT. Poi sempre dal menu scelgo "Accendi i led". Questa volta dovranno essere in output.
Anzichè dover usare altri pin, che non ho, magari vorrei usare uno di questi jack perchè anzichè tre sensori ne ho collegato solo uno o due...
@GS88
Allora Ti consiglio di aggiungere delle resistenza sui pin di Arduino tra Arduino e i Jack per proteggerli da un eventuale corto derivate a un errato menu e dal circuito non previsto attacato al jack.
Per avere piú entrate/uscite si possono usare expander I2C oppure dei Shift-Register.
Ciao Uwe