Componentes: Arduino, cable USB.
Una forma de usar funciones personalizadas para cálculo en arduino, consiste en serparar las instrucciones de cálculo como una función separada del bloque/lazo principal.
Por ejemplo, se puede usar la forma polinómica de la serie de Taylor para una función no disponible de cálculos con la precisión deseada.
La operatividad se muestra usando como ejemplo la función factorial()
, enviando y recibiendo los valores por medio de la conexión por USB y el «monitor serie». Ejemplo:
Observe que se encuentra habilitado el uso de «nueva línea» y «cambio de línea» (NL & CR) , para que al presionar «ENTER» se considera ingresado todos los dígitos del número.
Funciones para cálculos
Para el ejemplo, se realiza el cálculo del factorial:
n! = 1 x 2 x 3 x … x n
float factorial(float n){ float resultado = 1; int i = 2; for (i = 2; i<=n; i++){ resultado = resultado*i; } return resultado; }
En el resultado, la cantidad de dígitos se extiende usando el tipo real (float). Como práctica, cambie la variable resultado a tipo entero (int), actualice el programa en el arduino, y calcule para números mayores a 7; observe y explique el resultado.
Envío y recepción de datos con «monitor Serie»
La prueba de la función se simplifica enviando y recibiendo datos por la conexión USB. La variable mensaje almacena un caracter enviado al arduino, validando que sea un dígito entre 0 y 9. Al presionar «ENTER» se cierra el mensaje, se cambia el valor a número a entero y se procede a usar la función factorial para mostrar el resultado.
// funciones personalizadas para cálculo // ingreso y salida por 'monitor serial' // el mensaje se procesa por dígitos hasta presional ENTER // y se convierte a número String mensaje = ""; void setup() { Serial.begin(9600); // espera por conexion serial-USB while (!Serial) {} Serial.println("\n calcular funcion(): \n"); } void loop() { int uncaracter = 0; float numero = 0; float resultado = 0.0; while (Serial.available() > 0) { uncaracter = Serial.read(); if (isDigit(uncaracter)) { mensaje = mensaje + (char)uncaracter; } if (uncaracter == '.') { mensaje = mensaje + (char)uncaracter; } if (uncaracter == '\n') { numero = mensaje.toInt(); Serial.print("mensaje: "); Serial.println(mensaje); Serial.print("numero es: "); Serial.println(numero); // bloque de función matematica resultado = factorial(numero); Serial.print("factorial(numero): "); Serial.println(resultado); mensaje = ""; } } } float factorial(float n){ float resultado = 1; int i = 2; for (i = 2; i<=n; i++){ resultado = resultado*i; } return resultado; }
Para probar otras funciones, modifique los mensajes siguiendo el contexto del problema a resolver.
Funciones con números reales
Siguiendo el ejemplo de Polinomio de Taylor para el coseno(), en este caso el número de ingreso y salida son es reales (float). El esquema de la función es muy semejante.
1.4 Taylor-polinomio Ejemplo01
// funciones personalizadas para cálculo // ingreso y salida por 'monitor serial' // el mensaje se procesa por dígitos número hasta presional ENTER // y se convierte a número, para usar la función String mensaje = ""; void setup() { Serial.begin(9600); // espera por conexion serial-USB while (!Serial) {} Serial.println("\n calcular funcion(): \n"); } void loop() { int uncaracter = 0; float numero = 0.0; double resultado = 0.0; while (Serial.available() > 0) { uncaracter = Serial.read(); if (isDigit(uncaracter)) { mensaje = mensaje + (char)uncaracter; } if (uncaracter == '.') { mensaje = mensaje + (char)uncaracter; } if (uncaracter == '\n') { numero = mensaje.toFloat(); Serial.print("mensaje: "); Serial.println(mensaje); Serial.print("numero es: "); Serial.println(numero); // bloque de función matematica resultado = poliTaylor(numero); Serial.print("poliTaylor(numero): "); Serial.println(resultado,4); Serial.println(cos(numero),4); mensaje = ""; } } } float poliTaylor(float x){ float resultado; float x0=0.0; resultado = 1 - 0.5*(x-x0)*(x-x0); return resultado; }
Referencias: