Problema digitalWrite e digitalRead

Come da titolo, ho un problema usando queste due funzioni, solo su alcuni pin però. Ad esempio scrivo digitalWrite(30,LOW) su Arduino mega, e lo rilevo sul pin 5 di arduino uno tramite digitalRead(5). Mi dà HIGH. Allora lo collego sul pin analogico e faccio delle prove mettendolo prima ad HIGH dal mega, e poi a LOW. In entrambi casi mi misura 780 (3.8 volt). Perchè digitalWrite(30,LOW) non fa alcun effetto ? Ho bisogno di una pulldown? Cioè nei pin compatibili con digitalWrite non ci sono pullup/pulldown interne?

ovvero:
tu hai due schede, una UNO e una MEGA
hai collegato, senza alcuna resistenza di limitazione un pin (il 30) della MEGA ad un pin (il 5) della UNO
e ti sembra di capire che i livelli NON siano quelli che dovrebbero essere
poche domande:

  1. come alimenti le due macchine?
  2. hai collegato tra loro i GND?
  3. hai messo un led che indica se effettivamente l'uscita sale?

e qualche consiglio:

  1. la prossima volta spiegati meglio, non sono io che devo fare lo sforzo per capire, ma tu per spiegarti
  2. metti una resistenza di limitazione tra i due pin dei due Arduino, in caso di azionamento erroneo vedrai che sarà molto utile
  3. se non lo hai messo metti un led sul pin 30 del MEGA, che ti serve per avere conferma di cosa stai facendo
    scommettiamo che quando avrai fatto questo il problema sparisce per magia?

Standardoil:

  1. come alimenti le due macchine?
  2. hai collegato tra loro i GND?
  3. hai messo un led che indica se effettivamente l'uscita sale?

Sono entrambe collegate al PC, i GND sono in comune (anche se potevo non metterli in comune per ora che sono entrambe collegate al pc), e no il led non c'è anche se effettivamente sale perchè ho misurato la tensione.

Standardoil:

  1. la prossima volta spiegati meglio, non sono io che devo fare lo sforzo per capire, ma tu per spiegarti
  2. metti una resistenza di limitazione tra i due pin dei due Arduino, in caso di azionamento erroneo vedrai che sarà molto utile
  3. se non lo hai messo metti un led sul pin 30 del MEGA, che ti serve per avere conferma di cosa stai facendo
  1. intendi che ho messo poche informazioni ? 2) che valori consigli? 5000 ohm così ho 1ma per esempio può andare?
  2. certo questa è una buona idea

Grazie per la risposta. Riguardo le pullup/pulldown interne, se faccio digitalWrite(30,HIGH) si attiva la pullup e con LOW la pulldown ? Ah sul mega ho messo pinmode(30, OUTPUT) e sull' UNO pinmode(5, INPUT)

ichigokurosaki:
... Riguardo le pullup/pulldown interne, se faccio digitalWrite(30,HIGH) si attiva la pullup e con LOW la pulldown ?

... ma dove hai letto che esistono delle pull-down interne negli AVR ? ? ? :o :o :o

Esistono solo le pull-up (Rpu) ...

Guglielmo

Oltre a quelo che dice Guglielmo, sappi che la resistenza di PullUp viene attivata solo se il pin è impostato come INPUT.
Quindi se metti il pin 30 della mega come OUTPUT non esiste una resistenza di PullUp

brunello22:
... Quindi se metti il pin 30 della mega come OUTPUT non esiste una resistenza di PullUp

... peggio, se mette il pin in OUTPUT e poi fa digitalWrite(pin, livello); con livello che può essere LOW o HIGH, non fa altro che collegare il pin in uscita o a GND o +Vcc ... con le conseguneze del caso (... ove il pin venga malaguratamente connesso, rispettivamnete, a +Vcc o a GND) !

Guglielmo

Ecco perché ho consigliato una resistenza di limitazione
A proposito, tre le 'conseguenze del caso' potrebbe esserci un danno tale da spiegare il comportamento del primo post?

ichigokurosaki:
Ah sul mega ho messo pinmode(30, OUTPUT) e sull' UNO pinmode(5, INPUT)

Sicuro che quel pinMode(30,OUTPUT); sia eseguito prima della digitalWrite() su tale pin? ... Perché comportamenti strani come quelli si hanno a volte anche quando non si mette il pin in OUTPUT ... ::slight_smile:

Guglielmo

… seguendo l’immagine allegata, il pin digitale 30 (Arduino) è il pin fisico 60 che corrisponde a PC7 (… ed anche A15 inteso come External Memory interface address bit 15) … ti corrisponde tutto (posizione, utilizzo, ecc.) ?

Guglielmo

mega.pdf (1.92 MB)

gpb01:
... ma dove hai letto che esistono delle pull-down interne negli AVR ? ? ? :o :o :o

Esistono solo le pull-up (Rpu) ...

Guglielmo

allora ricordo male quello che ho letto, ho fatto un po' di confusione XD

brunello22:
Oltre a quelo che dice Guglielmo, sappi che la resistenza di PullUp viene attivata solo se il pin è impostato come INPUT.
Quindi se metti il pin 30 della mega come OUTPUT non esiste una resistenza di PullUp

Ah ho capito, quindi al massimo se volessi una pulldown dovrei aggiungerla io

gpb01:
... peggio, se mette il pin in OUTPUT e poi fa digitalWrite(pin, livello); con livello che può essere LOW o HIGH, non fa altro che collegare il pin in uscita o a GND o +Vcc ... con le conseguneze del caso (... ove il pin venga malaguratamente connesso, rispettivamnete, a +Vcc o a GND) !

Guglielmo

Che per fortuna non credo di aver fatto, però mi chiedevo se a causa di un errato collegamento potesse esserci qualche danno solamente a qualche Pin e non a tutta la scheda, in maniera tale da spiegare un comportamento strano.

gpb01:
Sicuro che quel pinMode(30,OUTPUT); sia eseguito prima della digitalWrite() su tale pin? ... Perché comportamenti strani come quelli si hanno a volte anche quando non si mette il pin in OUTPUT ... ::slight_smile:

Guglielmo

Sisi, l'ho messo nella funzione setup

gpb01:
... seguendo l'immagine allegata, il pin digitale 30 (Arduino) è il pin fisico 60 che corrisponde a PC7 (... ed anche A15 inteso come External Memory interface address bit 15) ... ti corrisponde tutto (posizione, utilizzo, ecc.) ?

Guglielmo

Si di corrispondere corrisponde, magari potrei usare resistenza di limitazione e led come mi hanno suggerito. In più consigli una pulldown dato che ha difficoltà ad andare in low? Comunque stasera aggiungo la resistenza e vediamo se si risolve con quella

Ho aggiunto una resistenza di limitazione ma il risultato è lo stesso. Ah quando ho scritto il post mi sono sbagliato, il pin in questione era il 31, quindi non il 30. In più ho notato che mettendo in HIGH il pin 30, il pin 31 passa da 3.8V a 4.3V e non capisco il perchè. Il pin 30 passa da 0V a 4.8V mettendolo in HIGH, quindi quello funziona (ripeto infatti avevo scritto male, era il 31 quello che funzionava strano, non il 30).
Quindi riepilogando:
30 low e 31 low = rispettivamente 0V e 3.8V
30 low e 31 high= rispettivamente 0V e 3.8V
30 high e 31 low= rispettivamente 4.8V e 4.3V
30 high e 31 high=rispettivamente 4.8V e 4.3V
Ora mi manca solo da provare con il led ma già questi risultati mi sa che sono un po' strani

ichigokurosaki:
ma già questi risultati mi sa che sono un po’ strani

Eh direi…
Intanto le tensioni che hai misurato, le hai prese facendo riferimento a COSA? Ossia un puntale sul pin, e l’altro su GND (e parliamo del GND della rispettiva scheda?)? E comunque quello che descrivi pare più un problema di mancanza di GND comune (anche se hai detto di averlo messo, controalla…).

Ma soprattutto come dico sempre FAI PROVE SEPARATE per ogni problema, scrivendo un piccolo programmino di test (nel tuo caso due) senza nessun altro componente, quindi falli girare e vedi cosa succede, e quindi posta qui sia i DUE programmini, sia una descrizione rigorosa di cosa hai ottenuto, sia uno schemino (anche fatto a mano e fotografato se non hai altro metodo) con le connessioni esatte.

docdoc:
Eh direi...
Intanto le tensioni che hai misurato, le hai prese facendo riferimento a COSA? Ossia un puntale sul pin, e l'altro su GND (e parliamo del GND della rispettiva scheda?)? E comunque quello che descrivi pare più un problema di mancanza di GND comune (anche se hai detto di averlo messo, controalla..).

Ma soprattutto come dico sempre FAI PROVE SEPARATE per ogni problema, scrivendo un piccolo programmino di test (nel tuo caso due) senza nessun altro componente, quindi falli girare e vedi cosa succede, e quindi posta qui sia i DUE programmini, sia una descrizione rigorosa di cosa hai ottenuto, sia uno schemino (anche fatto a mano e fotografato se non hai altro metodo) con le connessioni esatte.

Scusa se quoto tutto per sbrigarmi ma poco fa mi si e cancellata tutta la risposta... cmq il gnd è in comune perché sono alimentati da usb in più ho anche messo il gnd comune. Inutile dire che staccando e riattaccandolo durante le prove non vedevo cambiamenti numerici, perchè era già in comune perchè erano collegati entrambi al pc. Le tensioni non le ho prese con il voltmetro, come ho scritto in un altro messaggio ho fatto analog read dall'UNO per capire come mai non andava in low. Il programmino penso lo conosci abbastanza bene (in caso contrario lo posto al prossimo messaggio), ed è blink per il mega e analogread out serial per l'UNO, con la differenza che tutti i led_builtin in blink li ho sostituiti prima con 30, poi con 31, con 32, e con 33 ( i risultati di questi ultimi due in effetti ho dimenticato di metterli, comunque erano valore massimo per HIGH e valore minimo per LOW, esattamente come dovevano essere). lo schemino ha solo due fili, che collega D31(mega)-A0(uno) e il gnd comune. Anche in questo caso se mi confermi che così è ambiguo faccio lo schemino al prossimo messaggio. Poi quando volevo vedere come si comportavano gli altri anziché al 31 lo collegavo al 30, al 32, o al 33.

Edit: in effetti sotto consiglio di standardoil ho anche anteposto in serie al collegamento una resistenza di limitazione, ho provato sia con, sia senza, senza differenza di risultati. Come ti dicevo, magari poco fa non l'ho spiegato molto bene e pensavo che adesso spiegandolo meglio (dato che programmino e collegamento sono semplici) si capiva anche così però se così non è posto schemino e programma. Ah il programma nell'uno non è nemmeno propriamente analog read out serial degli esempi, infatti non dichiaro variabili, nel void setup c'è solo l'inizializzazione della seriale a 9600 baud rate e nel loop la riga è unica ed è Serial.println(analogRead(A0));.

Invece di scrivere tutta sta roba mettevi i 2 programmi ed era chiaro lo stesso
Adesso viene fuori che con gli altri pin va, giusto?
Quindi solo quel pin li è ‘fritto’
Vedi cosa succede a non mettere le resistenze di limitazione?

Se tu avessi messo fin da subito il led ti saresti tolto il dubbio da un pezzo,

Standardoil:
Invece di scrivere tutta sta roba mettevi i 2 programmi ed era chiaro lo stesso
Adesso viene fuori che con gli altri pin va, giusto?
Quindi solo quel pin li è ‘fritto’
Vedi cosa succede a non mettere le resistenze di limitazione?

Se tu avessi messo fin da subito il led ti saresti tolto il dubbio da un pezzo,

Aspetta stai dicendo che avrei sentito il “pop” del led bruciato e quindi avrei capito che probabilmente avrei anche fritto il pin incriminato? Quindi c’è anche la possibilità che ho fritto anche uno dei pin digitali di arduino uno (quello che ha ricevuto il pin 31)? T.T

ichigokurosaki:
il gnd è in comune perché sono alimentati da usb

Non fidarti del gnd della USB, ma hai fatto bene a mettere i GND in comune.

Le tensioni non le ho prese con il voltmetro, come ho scritto in un altro messaggio ho fatto analog read dall'UNO per capire come mai non andava in low.

Fammi capire, se hai necessità di capire il livello di tensione di un pin usi un altro pin dello stesso circuito? Non hai un qualsiasi multimetro anche da 15 Euro per verificare cosa succede nei tuoi circuiti?

lo schemino ha solo due fili, che collega D31(mega)-A0(uno) e il gnd comune.

Ok, ma quello era ben chiaro.. Poiché a volte certi risultati sono influenzati da cosa altro è collegato, ti chiedevo: tu non hai nessun altro circuito o componente collegati ai due? Ossia usi un Mega ed un UNO solo per farli comunicare tra loro?

Il programmino penso lo conosci abbastanza bene (in caso contrario lo posto al prossimo messaggio), ed è blink per il mega e analogread out serial per l'UNO

Io non "conosco" proprio niente, ti ho detto di fare due programmini di test che leggono/scrivono direttamente i pin "incriminati", ossia niente blink o altri ammennicoli! Uno che ogni secondo mette HIGH un suo pin di output per 500 ms e poi LOW per altri 500 ms, e l'altro che legge il pin (che avrai connesso al primo, tramite resistenza limitatrice) e su seriale scrive, diciamo ogni 200 ms, il valore letto da quel pin digitale. Il tutto da provare senza collegare NIENTE altro tranne il pin in comune.

E poi magari ripetere la prova con un altro pin per vedere se cambi qualcosa, e dirci il risultato.

infatti non dichiaro variabili, nel void setup c'è solo l'inizializzazione della seriale a 9600 baud rate e nel loop la riga è unica ed è Serial.println(analogRead(A0));.

Ma postare un listato è così faticoso? Hai usato più caratteri per descriverlo che per digitarlo (che poi con copia/incolla ci metti dai 2 ai 5 secondi netti)...

ichigokurosaki:
Aspetta stai dicendo che avrei sentito il "pop" del led bruciato e quindi avrei capito che probabilmente avrei anche fritto il pin incriminato?

I led non fanno "pop", semplicemente non si accendono più...

ichigokurosaki:
Aspetta stai dicendo che avrei sentito il "pop" del led bruciato e quindi avrei capito che probabilmente avrei anche fritto il pin incriminato? Quindi c'è anche la possibilità che ho fritto anche uno dei pin digitali di arduino uno (quello che ha ricevuto il pin 31)? T.T

Nessun pop, ma magari avresti visto che il pin non rispondeva correttamente, a prescindere da come lo comandavi tu, quindi danno hardware.

Non credo tu abbia fatto danni all'Uno, anche se la possibilità c'è.

docdoc:
Non fidarti del gnd della USB, ma hai fatto bene a mettere i GND in comune.

Fammi capire, se hai necessità di capire il livello di tensione di un pin usi un altro pin dello stesso circuito? Non hai un qualsiasi multimetro anche da 15 Euro per verificare cosa succede nei tuoi circuiti?

volevo capire perchè non andava in low (dal punto di vista di arduino uno), per questo ho usato lo stesso circuito. Cioè volevo capire se c’era una variazione tra quando lo mettevo in high e quando lo mettevo in low però così non è stato. Certo potrei anche usare un voltmetro per sicurezza

docdoc:
Ok, ma quello era ben chiaro… Poiché a volte certi risultati sono influenzati da cosa altro è collegato, ti chiedevo: tu non hai nessun altro circuito o componente collegati ai due? Ossia usi un Mega ed un UNO solo per farli comunicare tra loro?

In realtà ho collegato altri arduini a “stella” più o meno allo stesso modo. È che non pensavo avessero potuto influire perchè non erano stati collegati ad arduino uno, però se pensi potrebbero essere la causa allora faccio uno schemino . Appena sono a casa lo faccio al pc.

docdoc:
Io non “conosco” proprio niente, ti ho detto di fare due programmini di test che leggono/scrivono direttamente i pin “incriminati”, ossia niente blink o altri ammennicoli! Uno che ogni secondo mette HIGH un suo pin di output per 500 ms e poi LOW per altri 500 ms,

È esattamente il programma di esempio blink, pensavo fosse molto conosciuto proprio come hello world XD

docdoc:
Ma postare un listato è così faticoso? Hai usato più caratteri per descriverlo che per digitarlo (che poi con copia/incolla ci metti dai 2 ai 5 secondi netti)…

Non l’ho postato perchè mi ero dimenticato come si formattava il codice XD per il mega era

 Void setup(){ 
 pinmode(31, output) ;
}
Void loop(){
digitalWrite(31,HIGH);
Delay(1000);
digitalWrite(31,LOW);
Delay(1000);
}

Nell’uno

Void setup(){
Serial.begin(9600);
}
Void loop(){
Serial.println(analogRead(A0));
}

Non ho fatto copia e incolla perchè in questo momento non ho il pc con me però i programmi erano questi, poi se provavo il 30, il 32, il 33 nel programma del mega sostitutivo il 31 con il 30, 31, oppure il 33
Quando vado a capo mi fa la maiuscola automatica, quindi fai finta che il codice non ha errori di ortografia

ichigokurosaki:
È che non pensavo avessero potuto influire perchè non erano stati collegati ad arduino uno, però se pensi potrebbero essere la causa allora faccio uno schemino . Appena sono a casa lo faccio al pc.

Non è necessario ora lo schemino, basta che tu faccia dei test isolando il problema, ossia collega SOLAMENTE i due Arduino che vuoi far comunicare e basta.

È esattamente il programma di esempio blink, pensavo fosse molto conosciuto proprio come hello world

Quello si, è che esiste anche il Blynk che è una piattaforma per interfacciarti con i cellulari.
Ma in ogni caso, come vedi, hai usato più byte a spiegare, che non a postare i codici che hai usato…

Non l’ho postato perchè mi ero dimenticato come si formattava il codice XD

C’è un pulsantino in alto a sinistra nella toolbar dell’editor del forum, quello con “</>”. Selezioni il codice e premi il pulsantino, oppure premi il pulsantino ed incolli il codice in mezzo.
Ora però, per regolamento del forum, devi anche farlo a questo post: clicca sul pulsante “More…” sotto al tuo ultimo post, seleziona “Modify” quindi uno per volta seleziona i due codici e clicca su “</>”, quindi salva.

Non ho fatto copia e incolla perchè in questo momento non ho il pc con me

Ok, ma fai prima allora a farlo dal PC, non solo perché non è necessario che tu risponda subito se non hai tutte le informazioni, ma anche perché nel forum si richiede di essere più precisi possibile quando si cerca aiuto, per evitare situazioni come questa dove uno deve “immaginare” o “interpretare” le cose scritte dando magari risposte poco accurate, col risultato di far perdere tempo sia a chi vuole cercare di aiutarti (noi) sia a te per dover cercare di spiegare le cose “a rate” o più volte (se poi invece di chiarire si ripete quanto già detto, non è un aumento di informazione).

daysleeper:
Nessun pop, ma magari avresti visto che il pin non rispondeva correttamente, a prescindere da come lo comandavi tu, quindi danno hardware.

Non credo tu abbia fatto danni all'Uno, anche se la possibilità c'è.

ho capito, eventualmente farò qualche test per vedere se quelli dell'UNO sono buoni

docdoc:
Non è necessario ora lo schemino, basta che tu faccia dei test isolando il problema, ossia collega SOLAMENTE i due Arduino che vuoi far comunicare e basta.

questo potrebbe essere un problema, gli arduini e i fili non sono facilmente accessibili. Comunque credo che farò un test degli altri pin che sto usando, giusti per vederci più chiaro

daysleeper:
Quello si, è che esiste anche il Blynk che è una piattaforma per interfacciarti con i cellulari.
Ma in ogni caso, come vedi, hai usato più byte a spiegare, che non a postare i codici che hai usato...

a modo mio volevo prima domandarti se avevi presente il codice esempio prima di postarlo per sbrigarmi, però certo, come mi hai fatto notare, non mi sono sbrigato, anzi...

daysleeper:
Ok, ma fai prima allora a farlo dal PC, non solo perché non è necessario che tu risponda subito se non hai tutte le informazioni, ma anche perché nel forum si richiede di essere più precisi possibile quando si cerca aiuto, per evitare situazioni come questa dove uno deve "immaginare" o "interpretare" le cose scritte dando magari risposte poco accurate, col risultato di far perdere tempo sia a chi vuole cercare di aiutarti (noi) sia a te per dover cercare di spiegare le cose "a rate" o più volte (se poi invece di chiarire si ripete quanto già detto, non è un aumento di informazione).

va bene, ne terrò conto