Ciao a tutti,
sto programmando con un LinkIt One della Mediatek. Come configurazione è simile ad arduino, in pratica identica. Vorrei chiedere a qualcuno, possibilmente che cel'abbia a disposizione, se è normale che l'istruzione digitalRead(pin) ritorni un valore HIGH di default come se ci fosse un circuito di pullup interno. In arduino ovviamente ho un valore LOW. Inoltre un semplice buzzer attivo collegato al linkit suona pianissimo, non riesco a sentirlo: può dipendere da una corrente massima in uscita di 3mA? (in arduino funziona ma ho una corrente di 20 mA mi sembra).
Grazie!!
Ma hai letto almeno le specifiche ? ? ? :o :o :o
MCU: MT2502A ARM7EJ-S™
... monta una MCU ARM a 3.3V che NULLA ha a che vedere con le MCU che monta Arduino e con i livelli di segnale e le correnti disponibili sui pin di quest'ultimo !
Non so nemmeno chi abbia sviluppato il core, ma, di sicuro, difficile che qui trovi qualcuno che lo conosce. :
Probabilmente ti dovrai rivolgere, in lingua inglese, al forum di support di SeeedStudio che, a quanto vedo, è partner nel progetto.
Guglielmo
P.S.: e, prima di fare danni, studiati il datasheet di quella MCU !!!
Grazie per il datasheet, non riuscivo a trovarlo. Avevo posto il problema a seeed studio che mi ha consigliato di chiedere a mediatek, ma sul sito non funziona il form contact us. Nei forum non risponde nessuno! Ora mi studio il datasheet ed eventualmente aspetto una risposta da qualcuno che ha usato la stessa scheda! Grazie mille!
Rieccomi di nuovo,
ho sfogliato il datasheet ma non ho capito quale possa essere la tensione quando il pin è impostato in INPUT mode. Forse non sono in grado di leggerlo come dovrei! Comunque ho trovato la descrizione della funzione Pinmode() per il linkit one sul loro sito. C'è scritto che quando il pin è impostato in INPUT è come se ci fosse una grande resistenza che non permette di far accendere un LED, ne deduco che la tensione dovrebbe essere LOW di default proprio come in Arduino. Impostando invece INPUT_PULLUP ci imposta il pin in modo che funzioni al contrario di INPUT, rilevando HIGH quando il sensore è disabilitato. Il mio dispositivo invece sembra avere sempre un circuito di pullup attivo. Potresti aiutarmi, che probabilmente ne capisci di più?
Stai proprio sbagliando sulla base ... se imposti un pin come INPUT hai due possibilità ...
pinMode(pin, INPUT): in questo modo NON attivi nulla ed il pin è ad altissima impedenza e NON puoi misurare né se è LOW né se è HIGH perché la misura stessa influenza il risultato, per cui, in realtà, non stai vedendo come sta il pin.
Un pin così dichiarato NON andrebbe mai lasciato scollegato (flottante) perché, se lo vai a leggere con una digitalRead() può ritornare un valore casuale e variabile nel tempo.
pinMode(pin, INPUT_PULLUP): in questo modo (che NON sempre è disponibile) dici alla MCU di collegare il pin in ingresso ad una resistenza verso il VCC, resistenza che è, di solito, attorno alla decine di KΩ e che ne impone lo stato logico HIGH quando esso viene lasciato flottante. In tal caso, la digitalRead() del pin flottante, ritorna sempre il valore HIGH forzato dalla resistenza di pull-up.
In ogni caso NON puoi e NON devi collegarci qualche cosa in uscita (... tantomeno un LED) ... per fare questo lo devi dichiarare OUTPUT e puoi collegarci un qualche cosa che NON deve assorbire più di quanto il pin sia in grado di fornire, pena il danneggiare il pin.
Guglielmo
Va bene, grazie, fin qui ora è chiaro. Ultima cosa e non ti disturbo più! Ho iniziato tutto con un progettino di un pulsante. Se premo il pulsante, stampo "pressed" nel monitor, se rilascio, stampo "unpressed". Quindi ne deduco che dovrei fare un circuito con un pulsante collegato rispettivamente:
-da un lato con pin digitale scheda, resistenza di pull down, e ground;
-dall'altro con 3.3V.
In ogni caso tutto il problema è nato qui. Perché sia se premo che se lascio il pulsante, ho sempre "pressed". probabilmente metto una resistenza di pull down troppo alta. Riusciresti ad indicarmi un valore corretto?
Usa una resistenza di pull-up come si fa in tutti i circuiti che ... è molto più semplice e così metti anche un altro paio di componenti e fai anche il "debouncing" (che, con un pulsante, va sempre fatto) ... vedi schema allegato.
Guglielmo
Un tempo "molto" lontano per il "debouncing" si usava ripetere la lettura ritardata di 50ms, e si evitavano 1 resistenza e un condensatore in piu', che moltiplicati per il numero di pulsanti presenti su una scheda potevano diventare un po' fastidiosi. I tempi vanno avanti, purtroppo...
Pasquale
pascal69:
Un tempo "molto" lontano per il "debouncing" si usava ripetere la lettura ritardata di 50ms, e si evitavano 1 resistenza e un condensatore in piu' ...
... dipende sempre dai casi, in una ISR è sbagliato fare una cosa simile, in un programma che non ha tempistiche strette, si fa ancora ...
... comunque, oggi che è tutto SMD, con componenti di dimensioni parecchio inferiori al mm e dal costo irrisorio, la cosa più pulita è la classica rete RC. Se non basta, ci son anche appositi chip, quindi ... le soluzioni sono infinite.
Guglielmo
Smontato un vecchio decoder tv economico, pannello led e 3 push button... semplice rete rc per debouncing
Se mandi direttamente il pulsante al microcontrollore, gli mandi un segnale danneggiato dai rimbalzi, che il microcontrollore deve correggere. Mi sembra molto meglio mandargli un segnale pulito (anche aggiungendo un minuscolo condensatore multistrato classico o smd sotto al pulsante), salvo che per una produzione di un milione di pezzi si abbia ordine di risparmiare fino all'ultimo centesimo.
Datman:
... salvo che per una produzione di un milione di pezzi si abbia ordine di risparmiare fino all'ultimo centesimo.
... risparmi ancora di meno ... considera che un condensatore da 100 nF, in quantitativo 20'000 pezzi, viene sui 0.002€ da distributori ufficiali, immagina su quantitativi più grandi ... stai sotto il millesimo di EURO
Guglielmo
Beh... Considera 5~10 pulsanti
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.