De ce este utilizată funcția de constrângere după funcția de hartă?

Citesc câteva exemple de cod și utilizează această metodă de mapare a datelor de la senzorii IR:

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

Ce rost are utilizarea constrain aici dacă adj_1 obține deja o valoare 0-255 din map funcție?

Comentarii

  • Sunt s1_min și s1_max garantat sau limitele așteptate ale citirii brute? map() nu constrânge ieșirea.
  • @EdgarBonet ce vrei să spui că nu ' nu constrânge ieșirea? ' nu a returnat o valoare 0-255?
  • Nu neapărat, este doar o mapare liniară.
  • Ne pare rău, ce înseamnă asta? înseamnă?
  • O funcție liniară .

Răspuns

De la site-ul oficial Arduino :

[Funcția hartă] nu constrânge valorile în interval, deoarece valorile în afara intervalului sunt uneori intenționate și utile. Funcția constrain () poate fi utilizată înainte sau după această funcție, dacă se doresc limite la intervale.

EDIT: Exemplu.

Puteți încerca acest lucru singur cu acest cod:

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

Deși ați setat limita superioară a intervalului valorii la 10, ați trecut un o valoare mai mare decât aceasta și funcția o va mapa liniar în consecință, rezultând o ieșire de 200.

Răspuns

Un avertisment ar să fie atunci când cartografiați o intrare care variază de la 0 la 1023, deoarece Arduino este incapabil să citească în afara acestui interval, nu ar fi nevoie să vă constrângeți. Puteți verifica acest lucru executând fiecare iterație de la 0 la 1023 și afișând valoarea mapată corespunzătoare. :

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

Cu siguranță, dacă citirea senzorului dvs. oferă un interval mai mic de la 0 la 1023, atunci funcția constrain () este cu siguranță necesară, conform LoganBlade „s exemplu. În caz contrar, nu este necesar, dar poate să cadă în tărâmul celor mai bune practici.

Singurul sughiț al acestei logici ar fi dacă mapezi la valori zecimale (ceea ce nu are mult sens din moment ce funcția va returna oricum un tip lung), caz în care tipărirea internă a Arduino va rotunji maparea cu cea mai mică valoare. Exemplu:

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

Din nou, de dragul celor mai bune practici și al potențialului timp pierdut încercând să găsim o eroare de mapare, folosirea constrain () este mai bună decât omiterea acesteia .

Comentarii

  • Unii senzori generează un număr mare atunci când sunt în afara domeniului lor normal de funcționare sau dacă altceva este oprit. STM VLS30X poate emite brusc 8190 după ce a măsurat, de exemplu, 487 (mm). Prin urmare, constrângerea ar trebui să fie o necesitate. Vedeți, de asemenea, o soluție la eroarea de mapare, prea mulți utilizatori fac jetmore.org/john/blog/2011/09/…

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *