지도 기능 다음에 제약 기능이 사용되는 이유는 무엇입니까?

샘플 코드를 읽고 있으며 IR 센서에서 데이터를 매핑하는이 방법을 사용합니다.

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

adj_1가 이미 iv id에서 0-255 값을 얻는 경우 여기서 constrain를 사용하는 이유는 무엇입니까? = “ee9c7017f7″>

함수?

댓글

  • s1_mins1_max 원시 판독 값의 보장 또는 예상 한계입니까? map()는 출력을 제한하지 않습니다.
  • @EdgarBonet 출력을 제한하지 않는다는 것이 ' 무엇을 의미합니까? ' 0-255 값을 반환하지 않습니까?
  • 반드시 선형 매핑 일뿐입니다.
  • 죄송합니다. 의미?
  • 선형 함수 .

답변

공식 Arduino 사이트 :

[지도 함수]는 범위를 벗어난 값이 때때로 의도되고 유용하기 때문에 값을 범위 내로 제한하지 않습니다. 범위 제한이 필요한 경우이 함수 앞이나 뒤에 constrain () 함수를 사용할 수 있습니다.

편집 : 예.

다음 코드를 사용하여 직접 시도 할 수 있습니다.

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

값 범위의 상한을 10으로 설정했지만 그보다 높은 값을 사용하면 그에 따라 선형 적으로 매핑되어 출력이 200이됩니다.

Answer

한 가지주의 사항 0에서 1023 범위의 입력을 매핑 할 때 Arduino는이 범위를 벗어나는 읽기가 불가능하므로 제한 할 필요가 없습니다. 0에서 1023까지의 각 반복을 실행하고 해당 매핑 된 값을 출력하여이를 확인할 수 있습니다. :

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

물론 센서 판독 값이 0에서 1023보다 작은 범위를 제공하는 경우 LoganBlade에 따라 constrain () 함수가 반드시 필요합니다. 예. 그렇지 않으면 필요하지 않지만 여전히 모범 사례 영역에 속할 수 있습니다.

이 논리에 대한 유일한 문제는 십진수 값에 매핑하는 경우입니다 (이는 그다지 의미가 없습니다. 함수는 어쨌든 긴 유형을 반환합니다),이 경우 Arduino의 내부 유형 변환은 가장 낮은 값 매핑을 반올림합니다. 예 :

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

다시 한 번, 모범 사례와 매핑 버그를 찾는 데 낭비되는 잠재적 인 시간을 위해 constrain ()을 사용하는 것이 건너 뛰는 것보다 낫습니다. .

설명

  • 일부 센서는 정상적인 작동 범위를 벗어나거나 다른 것이 꺼져있을 때 높은 숫자를 출력합니다. STM VLS30X는 예를 들어 487 (mm)를 측정 한 후 갑자기 8190을 출력 할 수 있습니다. 따라서 제한은 필수입니다. 너무 많은 사용자가 만드는 매핑 오류에 대한 해결책도 참조하십시오. jetmore.org/john/blog/2011/09/ …

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다