Waarom wordt de beperkingsfunctie gebruikt na de kaartfunctie?

Ik lees een voorbeeldcode en ze gebruiken deze methode om gegevens van IR-sensoren in kaart te brengen:

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

Wat heeft het voor zin om constrain hier te gebruiken als adj_1 al een waarde 0-255 krijgt van de map functie?

Reacties

  • Zijn s1_min en s1_max de gegarandeerde of de verwachte limieten van de ruwe lezing? map() beperkt zijn uitvoer niet.
  • @EdgarBonet wat bedoel je dat het niet ' de uitvoer beperkt? Heeft ' geen waarde 0-255 geretourneerd?
  • Niet noodzakelijk, het is slechts een lineaire afbeelding.
  • Sorry, wat betekent dat bedoel?
  • Een lineaire functie .

Antwoord

Van de officiële Arduino-site :

[De kaartfunctie] beperkt waarden niet tot binnen het bereik, omdat waarden die buiten het bereik vallen soms bedoeld en nuttig zijn. De functie constrain () kan voor of na deze functie worden gebruikt, als limieten aan de bereiken gewenst zijn.

EDIT: voorbeeld.

U kunt dit zelf proberen met deze code:

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

Hoewel u de bovengrens van het bereik van de waarde heeft ingesteld op 10, bent u geslaagd voor een hogere waarde dan dat en de functie zal het lineair overeenkomstig toewijzen, wat resulteert in een uitvoer van 200.

Antwoord

Een voorbehoud zou zijn zijn bij het in kaart brengen van een invoer die varieert van 0 tot 1023, aangezien de Arduino niet in staat is om buiten dit bereik te lezen, zou er geen beperking nodig zijn. U kunt dit controleren door elke iteratie van 0 tot 1023 te doorlopen en de bijbehorende toegewezen waarde uit te voeren :

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

Zeker, als uw sensoruitlezing een bereik biedt dat kleiner is dan 0 tot 1023, dan is de functie constrain () absoluut vereist, volgens LoganBlades voorbeeld. Anders is het niet nodig, maar kan het toch in het rijk van de beste praktijken vallen.

Het enige probleem met deze logica zou zijn als u koppelt aan decimale waarden (wat niet veel zin heeft, aangezien de function zal sowieso een lang type teruggeven), in welk geval de interne typecasting van de Arduino de afbeelding met de laagste waarde naar beneden zal afronden. Voorbeeld:

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

Nogmaals, omwille van de beste praktijk en de mogelijke tijdverspilling bij het zoeken naar een mapping-bug, is het gebruik van constrain () beter dan het overslaan .

Opmerkingen

  • Sommige sensoren geven hoge getallen af als ze buiten hun normale bereik zijn of als er iets anders uit is. De STM VLS30X kan plotseling 8190 uitvoeren na bijvoorbeeld 487 (mm) te hebben gemeten. Daarom zou beperking een must moeten zijn. Zie ook een oplossing voor de mapping-fout die te veel gebruikers maken jetmore.org/john/blog/2011/09/…

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *