Varför används begränsningsfunktionen efter kartfunktionen?

Jag läser en del exempelkod och de använder den här metoden för att mappa data från IR-sensorer:

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

Vad är poängen med att använda constrain här om adj_1 redan får ett värde 0-255 från map -funktion?

Kommentarer

  • Är s1_min och s1_max de garanterade eller förväntade gränserna för råavläsning? map() begränsar inte dess utdata.
  • @EdgarBonet vad menar du att det inte ' t begränsar dess produktion? Vann ' t det returnerar ett värde 0-255?
  • Inte nödvändigtvis, det är bara en linjär mappning.
  • Tyvärr, vad gör det betyder?
  • A linjär funktion .

Svar

Från den officiella Arduino-webbplatsen :

[Kartfunktionen] begränsar inte värdena inom området, eftersom värden utanför området ibland är avsedda och användbara. Funktionen constrain () kan användas antingen före eller efter denna funktion, om gränser för intervallen önskas.

EDIT: Exempel.

Du kan prova detta själv med den här koden:

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

Även om du ställer in den övre gränsen för värdets intervall till 10, skickade du en högre värde än det och funktionen kartlägger det linjärt i enlighet med detta, vilket resulterar i en uteffekt på 200.

Svar

En varning skulle vara vid kartläggning av en ingång som sträcker sig från 0 till 1023, eftersom Arduino inte kan läsa utanför detta intervall skulle det inte behöva begränsas. Du kan kontrollera detta genom att köra igenom varje iteration från 0 till 1023 och mata ut motsvarande mappade värde :

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

Visst, om din sensoravläsning erbjuder ett intervall som är mindre än 0 till 1023, är det definitivt nödvändigt att begränsa () -funktionen enligt LoganBlade exempel. Annars behövs det inte, men det kan ändå falla inom ramen för bästa praxis.

Det enda hicka till denna logik skulle vara om du mappar till decimalvärden (vilket inte är mycket vettigt sedan funktionen returnerar en lång typ ändå), i vilket fall Arduinos interna typprognos kommer att runda ner din lägsta värdekartläggning. Exempel:

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

Återigen, för bästa praxis och den bortkastade potentiella tiden för att hitta ett kartläggningsfel är det bättre att använda constrain () än att hoppa över det .

Kommentarer

  • Vissa sensorer matar ut höga siffror när de är utanför deras normala funktionsområde eller om något annat är avstängt. STM VLS30X kan plötsligt mata ut 8190 efter att ha mätt 487 (mm) till exempel. Därför bör begränsning vara ett måste. Se också en lösning på kartningsfelet för många användare gör jetmore.org/john/blog/2011/09/…

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *