Numero di resistenze interne di pullup Arduino

Ciao a tutti.
Spero sia la sezione corretta. Sto cercando di minimizzare totalmente il numero di componenti esterni da utilizzare sulla mia MKR1010 utilizzando sostanzialmente i colori del led interno. Vorrei sapere se posso utilizzare su più input pin contemporaneamente il comando input_pullup. Su ogni pin è presente una resistenza interna da 20k oppure ci potrebbero essere problemi? Risulta più affidabile utilizzare una resistenza esterna da 10k da far funzionare come pulldown nel tempo?

Grazie mille!

Si, senza problemi ... ogni pin disponde della sua pull-up (e, su MKR quindi su SAM D21, anche della sua pull-down).

Guglielmo

Ottimo! Quindi anzichè scrivere pullup, posso scrivere pulldown, senza dovere scrvire la negazione sullo stato alto/basso del pulsante di ingresso?

Senza dover aprire un nuovo topic, dato che si parla della stessa scheda/progetto, vorrei sapere se c'è la possibilità di semplificare la stringa specifica WiFiDrv::pinMode dei colori del led rgb interno, in modo tale da poter definire subito la stringa relativa al colore rosso, verde, blu semplificando non di poco lo sketch dentro il loop. grazie!

Si, su SAM D21 (le MCU della serie MKR) puoi scrivere:

pinMode ( pinNumber, INPUT_PULLDOWN );

... per attivare la pull-down sul pin indicato in 'pinNumber' :slight_smile:

Non ho capito cosa vorresti fare ... :thinking:

Guglielmo

per accendere i colori del led interno della mkr 1010 devo utilizzare le stringhe di codice della libreria wifinina. Vorrei sapere se è possibile trasformare la stringa specifica dell'accensione del relativo pin rosso, sotto il nome "rosso", e così via per gli altri colori verde e blu. le stringhe della libreria si trovano qui
tra l'altro non capisco per quale motivo, se inserisco un analogwrite sulle relative stringhe di accensione dei colori del led all'interno di un comando if else con digitalread, non funziona, mentre invece utilizzando tutto il comando come digitalwrite, non ho problemi:

#include <WiFiNINA.h>
#include <utility/wifi_drv.h>

int rosso = 25;
int verde = 26;
int sensore = 7;

void setup() {

  WiFiDrv::pinMode(rosso, OUTPUT);
  WiFiDrv::pinMode(verde, OUTPUT);
  pinMode(sensore, INPUT_PULLDOWN);
}

void loop() {

  if (digitalRead(sensore) == LOW) {
    WiFiDrv::analogWrite(verde, 0);
    WiFiDrv::analogWrite(rosso, 50);

  } else {
    WiFiDrv::analogWrite(verde, 50);
    WiFiDrv::analogWrite(rosso, 0);
  }
}

Il problema è che sulla MKR 1010 il LED RGB NON è connesso alla MCU Arduino SAM D21, ma è connesso al modulo WiFi (che, in realtà, altro non è che un ESP32 rimarcato da uBlox) e quindi, per comandarlo, occorre in realtà fare un passaggio dal programma che gira sulla MCU Arduino SAMD21 al modulo WiFi che, a sua volta, comanda il LED :roll_eyes:

Ecco lo schema di come sono collegari i tre LED al modulo NINA:

Quelle che tu chiami "stringhe" in realtà sono chiamate a funzioni definite in wifi_drv.h e quindi ... occorre chiamarle così o ... ti crei una tua funzione, a cui passi, ad esempio, i valori R,G e B e quella, a sua volta, compone le chiamate alla wifi_drv.h ...

Guglielmo

... pure questa non l'ho capita :thinking:

Guglielmo

Perfetto! Grazie. Provo a creare una nuova funzione (dovrebbe essere un richiamo con il comando void, se non erro). Mal che vada, utilizzo le sue funzioni per richiamare i colori.

Per quanto riguarda l'analogwrite delle funzioni del led rgb, se utilizzato singolarmente, per esempio:

WiFiDrv::analogWrite(rosso, 255);
  WiFiDrv::analogWrite(blue, 0);
  WiFiDrv::analogWrite(verde, 0);

tutto funziona correttamente, andando anche a regolare l'intensità massima dei colori (a 255 sono troppo luminosi).
Ma se inserisco lo stesso analogwrite all'interno di una funzione if else con a monte una lettura digitale di un pin, non succede nulla:

if (digitalRead(sensore) == LOW) {
    WiFiDrv::analogWrite(verde, 0);
    WiFiDrv::analogWrite(rosso, 50);

  } else {
    WiFiDrv::analogWrite(verde, 50);
    WiFiDrv::analogWrite(rosso, 0);
  }
}

le variabili int del sensore, rosso e verde sono già dichiarate correttamente all'inizio.

Prova così:

if ( digitalRead ( sensore )  ) {
    WiFiDrv::analogWrite(verde, 50);
    WiFiDrv::analogWrite(rosso, 0);
} else {
    WiFiDrv::analogWrite(verde, 0);
    WiFiDrv::analogWrite(rosso, 50);
}

che è più compatta e semplice ... se il pin 'sensore' è HIGH la digitalRead() ritorna un valore diverso da 0 e quindi TRUE per la IF, se il pin 'sensore' è LOW la digitalRead() ritorna un valore 0 che è FALSE per la IF.

Nota che NON è possibile che non funzioni ... se ci sono problemi controlla il segnale sul pin 'sensore'.

Guglielmo

Ciao! Grazie del consiglio. Stasera provo immediatamente! Ma quindi senza dichiarare in modo esplicito la lettura del sensore, la variabile if applica di default una logica booleana true o false?

La cosa singolare è che i led in questione funzionano correttamente impostandoli in digitalwrite ma non in analogwrite. Mi sono accorto inoltre che se la lettura del PIN sensore è high, oltre al led RGB acceso, resta acceso anche il ledbuilt interno. Ho provato a forzarlo come spento ma nulla. Creando un nuovo sketch diverso, funziona tutto correttamente. Solo utilizzando la libreria wifinina per utilizzare il led rgb, in certe condizioni resta sempre acceso.

IF è una istruzione condizionale NON una variabie ... usiamo i termini corretti o non ci si capisce più ... trovi tutto ben documentato nel reference di Arduino.

IF valuta la condizione (quello che scrivi tra parentesi) e, se il risultato della condizione è 0 si considera FALSE, se diverso da 0 si considera TRUE.

Guglielmo

Giusto, è vero! Ok, grazie mille. Stasera provo a correggere il codice come da tuoi consigli e vediamo!

Ciao! HO provato a sperimentare ancora con il mio sketch, ma purtroppo non riesco a far lavorare il led interno in analogwrite, quindi non posso miscelare i colori rgb. Poco male per quello che mi serve, ma sarebbe stata una chicca in più, oltre il fatto di poter abbassare la luminosità di questi led, durante il loro utilizzo.

Ma se fai un programmino che controlla solo la luminosità di un singolo LED riesci a variarla?

Guglielmo

P.S.: ricorda anche che l'occhio NON è lineare, ma logaritmico, quindi, se cambi di poco il valore della analogWrite() difficilmente ad occhio apprezzi la differenza ... prova con 255 e 64 come valori ... dovresti riuscire ad apprezzarla

Se creo un programmino molto semplice come quello presente nell'articolo ufficiale qui sul sito per comandare il led rgb, funziona tutto correttamente, ma se inserisco le stesse impostazioni di analogwrite con i colori desiderati in percentuali (anche molto diverse fra loro, tipo rosso 255, verde 120, blu 180), il led resta totalmente spento all'interno di una condizione IF. Premendo il tasto di reset, per mezzo secondo il led si accende del colore desiderato.

Ho provato anche a riaggiornare il firmware della scheda dall'IDE, ma nulla. Per quello che mi serve, posso utilizzare anche i led in modalità digitalwrite, ma per esempio, mi sarebbe piaciuto utilizzando il sensore dht22, impostare una colorazione personalizzata in base alle fasce di temperatura/umidità rilevate.

... e allora è un problema con l'IF nel senso che la condizione NON viene verificata. Fai un prova, invece che controllare il LED, nell'IF manda messaggi sulla seriale e vedi se entra nei due rami del IF ... secondo me non c'entra e c'è un problema sulla digitalRead ( sensore ).

Guglielmo

Tutto lo sketch ha molte condizioni IF che vanno a loro volta ad attivare altre funzioni e tutte queste funzionano perfettamente (sopratutto sulla logica di lettura di questo famoso sensore). Ho provato anche a cambiare pin di ingresso, ad impostare questo pin sia come _pullup, che utilizzando una resistenza fisica da 10k in pulldown. Purtroppo il led rgb non si accende.

Nel frattempo ho notato che cambiando porta usb dal computer, per qualche minuto funziona tutto correttamente (sensore LOW, luce di un colore miscelato, sensore HIGH, luce di una altro colore miscelato). Poi il colore non varia più. Mi dà quasi la sensazione che c'è un conflitto di comunicazione con la libreria NiNa.

Dai retta, fai la prova mettendo dentro quell'IF due Serial.prinln() e vedi se escono i due messaggi differenti.

Guglielmo

Ciao Guglielmo!

Eccomi qui. Purtroppo non si è risolto nulla di fatto. l'IF funziona perfettamente sulla seriale, ma gli analogwrite dei led non rispondono. Se lavoro con i digitalwrite, vanno alla grande.

#include <WiFiNINA.h>
#include <utility/wifi_drv.h>


int sensore = 7;
int rosso = 25;
int verde = 26;
int blu = 27;



void setup() {

  WiFiDrv::pinMode(rosso, OUTPUT);
  WiFiDrv::pinMode(verde, OUTPUT);
  WiFiDrv::pinMode(blu, OUTPUT);
  pinMode(sensore, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  if (digitalRead(sensore) == !HIGH) {
    WiFiDrv::analogWrite(rosso, 255);
    WiFiDrv::analogWrite(verde, 255);
    WiFiDrv::analogWrite(blu, 255);
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println("1");
  } else {
    WiFiDrv::analogWrite(rosso, 0);
    WiFiDrv::analogWrite(verde, 0);
    WiFiDrv::analogWrite(blu, 0);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("0");
  }
}

ho provato anche a non sostituire i nomi rosso/verde/blu, mantenendo la sorgente originale con i suoi pin 25 26 27, ma non cambia nulla.

EDIT: togliendo il _pullup, ed utilizzando una resistenza esterna in pulldown da 10k, la seriale con il pulsante NO ha iniziato a riempirsi di disturbi. Dopo un reset, si è bloccato tutto.

HO RISOLTO!

Inserendo alla fine un delay anche con valore 1, il led rgb funziona correttamente in analogwrite!

Ora però non ti sò dire se è normale applicare questo delay anche perchè se posso, cerco di evitare come la peste i delay.. confermi?

Grazie!