huborarduino.com

La web de Hubor para la simulación de Arduino con Proteus

Banner Guia Programacion Arduino Con Proteus

[Proteus versión 8.1]

Hasta ahora el curso se ha centrado más en la utilización de nuestro Arduino y la serie de componentes que giran a su alrededor. Pero en esta ocasión hemos querido dedicar esta lección a un concepto puramente de sotware: las operaciones matemáticas. El uso de operadores matemáticos y de funciones matemáticas es una tema fundamental en la mayoría de los proyectos desarrollados con Arduino porque son los que nos posibilitan la realización de los diferentes cálculos necesarios para llevar a buen fin nuestro proyecto.

Los lectores que estén familiaraizados con la programación en C o C++ podrán comprobar que los operadores y las funciones matemáticas son iguales que los que se utilizan en estos lenguajes de programación. Como suele ser habitual en el tratamiento de este tema en todos los libros de texto, vamos a estudiar los operadores matemáticos agrupados por familias básicas. Para poder practicar con su uso vamos a realizar el siguiente montaje, dónde simplemente se utiliza un terminal para poder presentar por pantalla los valores resultantes de nuestras operaciones.

Lec14 001

Operadores suma, resta, multiplicación y división.

Sirven para realizar las cuatro operaciones fundamentales y se utilizan los operadores universales para estas operaciones +, -,* y /. Para comprobar su funcionamiento vamos a utilizar el siguiente programa muy sencillo que nos muestra su uso.

Lec14 002

Hemos utilizado la función setup() en lugar de la habitual loop() para que las operaciones no se estén realizando de forma continua. El resultado de compilar y ejecutar nuestro programa es el mostrado en la imagen siguiente, donde se pueden ver el resultado de las cuatro operaciones matemáticas básicas.

Lec14 003

Podemos utilizar paréntesis para indicar qué operaciones se deben llevar a cabo con anterioridad a otras.

Lec14 004

Operadores Incrementadores y Decrementadores.

Los operadores para incrementar o decrementar el valor de una variables son += y -=. Su uso equivale a las siguientes sumas y restas:

resultado += 5  --> resultado = resultado + 5

resultado -=3  --> resultado = resultado - 3.

Su utilización se muestra en el siguiente ejemplo.

Lec14 005

También se pueden utilizar los operadores para incrementar y decrementar una variable un número 'n' de veces. Es decir usar los operadores *= y /= para multiplicar o dividir una variable por un número. El equivalente con los productos y divisiones sería:

resultado *=5 --> resultado = resultado * 5

resultado /= 3  --> resultado = resultado / 3

Un código que utiliza estos operadores sería:

Lec14 006

Para terminar esta sección, veremos los operadores ++ y --. Sirven para incremetar o decrementar una unidad el valor de la variable. El equivalente con las sumas y restas serían:

resultado++ ---> resultado = resultado + 1

resultado-- ---> resultado = resultado - 1

Un programa de ejemplo sería:

Lec14 007

Operador Resto de una división.

El operador resto (%) nos proporciona el resto resultante de dividir dos números. El ejemplo de utilización se muestra en la siguiente imagen.

Lec14 008

En este caso el resto es 0.

Lec14 009

Y en este caso el resto es 1.

Un sencillo ejemplo de utilización sería el siguiente código que comprueba si un número es par o impar.

Lec14 010

Función valor absoluto.

Para calcular el valor absoluto de una variable podemos utilizar la función abs( <operando> ) que nos devulve una variable de tipo entero que se corresponde con el valor absoluto del operando. El ejemplo de uso se muestra a continuación.

Lec14 011

El resultado devuelto será 15. Es importante caer en la cuenta que en la programación de Arduino se utiliza el punto '.' como separador decimal y no la coma ','.

Función potencia.

Para calcular el resultado de elevar un determinado número x a una potencia y, la función que tenemos que utlizar es pow( <base> , <exponente>). Su uso se muestra en el siguiente código.

Lec14 012

Para calcular la raiz cuadrada de un número utilizaremos la función sqrt( <operando>).

Lec14 013

Números decimales y varibles tipo float.

Hasta ahora hemos utilizado números enteros en todos nuestros ejemplos. Sin embargo, es muy habitual que los cálculos matemáticos den como resultados números decimales y no enteros. Para manejarlos, Arduino nos permite utilizar dos tipos de variables: float y double. En Arduino se mantienen los dos tipos por compatibilidad con C y C++, pero es importante tener en cuenta que no hay diferencia entre ambos. Los dos permiten utilizar números decimales entre el intervalo 3.4028235e+38 y -3.4028235e+38.

En informática, para gestionar números decimales utilizamos la técnica denominada de punto flotante. La razón de ello es que la memoria limitada de nuestros equipos no nos permiten guardar una gran cantidad de números con la precisión necesaria para almacenarlos con todas sus cifras decimales. Por ello, se recurre a la mencionada técnica que consiste en descomponer el número en dos partes y almacenarlas juntas. Por un lado se almacena la mantisa (también llamada coeficiente o significando) que contiene los dígitos del número. Mantisas negativas representan números negativos. Por otro lado se almacena el exponente que indica dónde se coloca el punto decimal (o binario) en relación al inicio de la mantisa. Exponentes negativos representan números menores que uno. Este formato cumple las siguientes exigencias:

  • Puede representar números de órdenes de magnitud enormemente dispares (limitados a la longitud del exponente).
  • Proporciona la misma precisión relativa para todos los órdenes (limitadoa a la longitud de la mantisa).
  • Permite cálculos entre magnitudes: multiplicar un número muy grande y uno muy pequeño conserva la precisión de ambos en el resultado.

Los números de coma flotante normalmente se expresan en notación científica con un punto explícito siempre entre el primer y el segundo dígitos. El exponente o bien se escribe explícitamente incluyendo la base, o se usa una e (indiferentemente en mayúsculas o minúsculas) para separarlo de la mantisa. Ejemplos de uso son:

El número float escrito 10.0 equivale a 10

El número float escrito 10.324 equivale a 10,324

El número float escrito 2.34E5  equivale a 2.34 * 10^5  y su valor es 234000

El número float escrito 67e-12  equivale a 67.0 * 10^-12  y su valor es 0.000000000067

El número float escrito 3.45e-5 equivale a 3.45 * 10^-5 y su valor es 0.0000345

Es importante tener en cuenta las siguientes limitaciones en el uso de números de coma flotante:

  • Los float tienen una precisión de 6 o 7 dígitos decimales. Esto significa el número total de dígitos, no el número a la derecha de la coma decimal. Al contrario que en otras plataformas, donde tu podrías obtener mayor precisión usando una variable tipo double (por ejemplo, por encima de 15 dígitos), en Arduino los double tienen el mismo tamaño que los float.
  • Los números en coma flotante no son exactos, y muchos proporcionan falsos resultados cuando son comparados. Por ejemplo, 6.0 / 3.0 puede no ser igual a 2.0. Debes comprobar que el valor absoluto de la diferencia entre los números pertenezca a un rango pequeño.
  • La matemática en coma flotante es mucho más lenta que la matemática de enteros para realizar operaciones, por lo que deberías evitarla si, por ejemplo, un bucle tiene que ejecutarse a la máxima velocidad para funciones con temporizaciones precisas. Los programadores normalmente suelen asignar unas longitudes para convertir las operaciones de coma flotante en cálculos con enteros, para aumentar la velocidad.

Es importante dedicar un tiempo a estudiar y practicar el uso correcto de los números en coma flotante (float) porque tiene singularidades, como acabamos de ver, que conviene tener en cuenta.

Además, es importante tener en cuenta que cuando utilizamos las funciones print o println para mostrar una variable de tipo float, hay que utilizar la siguiente sintaxis para no ver truncados los valores decimales, porque por defecto print y println sólo muestran dos posiciones decimales. Un ejemplo nos ayudará a entender la diferencia.

Lec14 014

Lec14 015

funciones trigonométricas.

Las funciones trigonométricas básicas se pueden calcular utilizando las funciones sin( <angulo> ), cos(<angulo> ) y tan( <angulo> ). Con ellas podemos calcular el seno, el coseno y la tangente de un ángulo dado. Es importante tener en cuenta que las tres funciones esperan que el ángulo se exprese en radianes. El radián es la unidad de ángulo plano en el Sistema Internacional de Unidades. Representa el ángulo central en una circunferencia y abarca un arco cuya longitud es igual a la del radio. Por tanto, el ángulo completo de una circunferencia de radio r, medido en radianes es 2Π radianes.

Lec14 016

Si preferimos pasar el ángulo expresado en grados sexagesimales, podemos convertirlos facilmente utilizando la constante DEG_TO_RAD definida por defecto cuando utilizamos el sistema de desarrollo de ARDUINO. El siguiente programa nos facilita la conversión de grados sexagesimales a radianes de todos los valores comprendidos entre 0º y 360º en saltos de 5 en 5.

Lec14 019

El resultado en el terminal será:

Lec14 020

Veamos ahora un ejemplo de utilización de las funciones vistas para calcular el seno, el coseno y la tangente de 45º. Observe que utilizamos la función println con la cláusula DEC para no truncar los números decimales.

Lec14 017

El resultado obtenido en el terminal virtual debe ser:

Lec14 018

Con lo visto en esta lección, el lector ya está en disposición de enfrentarse con aquellos proyectos que necesitan realizar cálculos matemáticos.

 

 

Comparte este artículo en redes sociales

Submit to FacebookSubmit to Google PlusSubmit to TwitterSubmit to LinkedIn


Esta página es propiedad de Hubor.

2014.

¡Atención! Este sitio usa cookies y tecnologías similares. Si no cambia la configuración de su navegador, usted acepta su uso. Ampliar información