Perché la funzione di vincolo viene utilizzata dopo la funzione di mappa?

Sto leggendo un codice di esempio e usano questo metodo per mappare i dati dai sensori IR:

 sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255); 

Qual è lo scopo di utilizzare constrain qui se adj_1 sta già ottenendo un valore 0-255 da map funzione?

Commenti

  • Sono s1_min e s1_max i limiti garantiti o previsti della lettura grezza? map() non limita il suo output.
  • @EdgarBonet cosa significa che ' t limita il suo output? Ha vinto ' t restituisce un valore 0-255?
  • Non necessariamente, è solo una mappatura lineare.
  • Spiacenti, cosa significa significa?
  • Una funzione lineare .

Risposta

Da il sito ufficiale di Arduino :

[La funzione map] non vincola i valori entro lintervallo, perché a volte i valori fuori intervallo sono intesi e utili. La funzione constrain () può essere utilizzata prima o dopo questa funzione, se si desiderano limiti agli intervalli.

EDIT: Esempio.

Puoi provare questo da solo con questo codice:

int val = 20; val = map(val, 0, 10, 0, 100); 

Sebbene tu abbia impostato il limite superiore dellintervallo di valori su 10, hai passato un valore superiore a quello e la funzione lo mapperà linearmente di conseguenza, risultando in un output di 200.

Risposta

Un avvertimento sarebbe essere durante la mappatura di un ingresso che va da 0 a 1023, poiché Arduino non è in grado di leggere al di fuori di questo intervallo non ci sarebbe bisogno di vincoli. Puoi verificarlo eseguendo ogni iterazione da 0 a 1023 e restituendo il valore mappato corrispondente :

for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); } 

Certamente, se la lettura del tuo sensore offre un intervallo inferiore da 0 a 1023, allora la funzione constrain () è decisamente richiesta, come per LoganBlade “s esempio. Altrimenti, non è necessario, ma potrebbe comunque rientrare nel regno delle migliori pratiche.

Lunico inconveniente a questa logica sarebbe se stai mappando i valori decimali (cosa che non ha molto senso poiché il la funzione restituirà comunque un tipo lungo), nel qual caso il typecasting interno di Arduino arrotonderà per difetto la mappatura del valore più basso. Esempio:

map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61 

Ancora una volta, per motivi di best practice e il potenziale tempo sprecato cercando di trovare un bug di mappatura, è meglio usare constrain () che saltarlo .

Commenti

  • Alcuni sensori emettono numeri alti quando sono fuori dal normale raggio di azione o se qualcosaltro è spento. LSTM VLS30X può emettere improvvisamente 8190 dopo aver misurato 487 (mm), ad esempio. Pertanto, il vincolo dovrebbe essere un must. Vedi anche una soluzione allerrore di mappatura troppi utenti rendono jetmore.org/john/blog/2011/09/…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *