Funciones personalizadas en Arduino, Entrada/salida serie

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:

Arduino Serial read , Arduino lista de funciones básicas .

Publicado por

Edison Del Rosario

edelros@espol.edu.ec / Profesor del FIEC/FCNM-ESPOL