¿Por qué se usa la función de restricción después de la función de mapa?

Estoy leyendo un código de muestra y usan este método de mapeo de datos de sensores IR:

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

¿Cuál es el punto de usar constrain aquí si adj_1 ya está obteniendo un valor 0-255 del map ¿función?

Comentarios

  • Son s1_min y s1_max los límites garantizados o esperados de la lectura sin procesar? map() no restringe su salida.
  • @EdgarBonet ¿qué quiere decir con que no ' t restringe su salida? ¿Ganó ' t devuelve un valor 0-255?
  • No necesariamente, es solo una asignación lineal.
  • Lo siento, ¿qué significa eso significa?
  • Una función lineal .

Responder

Desde el sitio oficial de Arduino :

[La función de mapa] no restringe los valores dentro del rango, porque los valores fuera de rango a veces son intencionados y útiles. La función constrain () se puede utilizar antes o después de esta función, si se desean límites a los rangos.

EDIT: Ejemplo.

Puede probar esto usted mismo con este código:

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

Aunque estableció el límite superior del rango del valor en 10, pasó un un valor más alto que ese y la función lo mapeará linealmente en consecuencia, lo que dará como resultado una salida de 200.

Respuesta

Una advertencia sería Al mapear una entrada que va de 0 a 1023, dado que Arduino es incapaz de leer fuera de este rango, no habría necesidad de restringir. Puede verificar esto ejecutando cada iteración de 0 a 1023 y generando el valor mapeado correspondiente :

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

Ciertamente, si la lectura de su sensor ofrece un rango menor de 0 a 1023, entonces definitivamente se requiere la función constrain (), según LoganBlade «s ejemplo. De lo contrario, no es necesario, pero aún puede caer en el ámbito de las mejores prácticas.

El único inconveniente de esta lógica sería si está mapeando valores decimales (lo cual no tiene mucho sentido ya que el La función devolverá un tipo largo de todos modos), en cuyo caso el encasillado interno de Arduino redondeará su mapeo de valor más bajo. Ejemplo:

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

Nuevamente, por el bien de las mejores prácticas y el tiempo potencial perdido tratando de encontrar un error de mapeo, usar la restricción () es mejor que omitirlo .

Comentarios

  • Algunos sensores generan números altos cuando están fuera de su rango normal de operación o si algo más está apagado. El STM VLS30X puede generar repentinamente 8190 después de haber medido 487 (mm), por ejemplo. Por lo tanto, la restricción debería ser una necesidad. Ver también una solución al error de mapeo que muchos usuarios hacen jetmore.org/john/blog/2011/09/…

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *