Publi

Utilizar float con sprintf() y derivados en Arduino

globo-de-aire
El objetivo de la plataforma Arduino es que los programas sean pequeños, ya que tienen que caber en pocos Kbs. Un pequeño problema que tenemos con eso es que muchas bibliotecas no están implementadas completamente, sino que las encontramos en su versión light, en las que implementan sólo las funcionalidades más normales.
Un ejemplo de ello son los comandos printf() y scanf() cuya funcionalidad no cubre los valores de punto flotante (float, double), y que si hacemos el siguiente programa:

1
2
3
4
5
6
7
8
9
10
11
12
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  char buffer[30];
  sprintf (buffer, "Valor: %f\n", 25.4);
  Serial.println(buffer);
  delay(1000);
}

Veremos constantemente:


Valor: ?
Valor: ?
Valor: ?

Y no muestra el valor deseado. Eso sí, ocupa 4.29Kb

La clave para la solución

El tema está en que el compilador no enlaza con las bibliotecas buenas, sino que enlaza con las ligeras. Por lo que tenemos que hacer que éste enlace con las bibliotecas correctas añadiendo el siguiente parámetro al compilador avr-gcc:

-Wl,-u,vfprintf -lprintf_flt

Haciendo el cambio para SConstruct

Si para compilar tus proyectos de Arduino utilizas este método, tienes que modificar una línea en el archivo SConstruct… pongo parte del contexto, cerca de la línea 170, donde pone:

1
2
3
4
5
6
envArduino.Append(BUILDERS = {'Processing':Builder(action = fnProcessing,
        suffix = '.cpp', src_suffix = '.pde')})
envArduino.Append(BUILDERS={'Elf':Builder(action=AVR_BIN_PREFIX+'gcc '+
        '-mmcu=%s -Os -Wl,--gc-sections -o $TARGET $SOURCES -lm'%MCU)})
envArduino.Append(BUILDERS={'Hex':Builder(action=AVR_BIN_PREFIX+'objcopy '+
        '-O ihex -R .eeprom $SOURCES $TARGET')})

Debemos escribir:

1
2
3
4
5
6
envArduino.Append(BUILDERS = {'Processing':Builder(action = fnProcessing,
        suffix = '.cpp', src_suffix = '.pde')})
envArduino.Append(BUILDERS={'Elf':Builder(action=AVR_BIN_PREFIX+'gcc '+
        '-mmcu=%s -Os -Wl,--gc-sections -o $TARGET $SOURCES-Wl, -u,vfprintf -lprintf_flt -lm'%MCU)})
envArduino.Append(BUILDERS={'Hex':Builder(action=AVR_BIN_PREFIX+'objcopy '+
        '-O ihex -R .eeprom $SOURCES $TARGET')})

Con esta modificación, el programa en Arduino (el binario ocupa 5.8Kb) debe dar:

Valor: 25.400000
Valor: 25.400000
Valor: 25.400000

Más información

La IDE de Arduino hace las llamadas al compilador desde su código fuente en lugar de utilizar un Makefile, por ejemplo, por lo que para compilar incluyendo las instrucciones del linkador en el código fuente del IDE. El problema de esto es que no hay una forma fácil de conmutar el linkado con printf_flt y printf_min (que es como se llama la versión light).

Con scanf() también se puede

scanf() también permite la inclusión de la biblioteca que es capaz de leer floats. La instrucción que hay que escribir es:

-Wl,-u,vfscanf -lscanf_flt

Foto: Eric Lim Photography (Flickr) compartido con CC-by a 30/11/2011

También podría interesarte....

There are 32 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. Pingback: BlogESfera.com /

  3. marco /
    Usando Google Chrome Google Chrome 16.0.912.75 en Windows Windows 7

    hola amigo , me pregunto si no habra una forma de solucionarlo en windows ?

    grasias de ante mano.

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 8.0 en Ubuntu Linux Ubuntu Linux

      scons funciona también bajo Windows , además, hay tutoriales por Internet para configurar Eclipse como IDE para Arduino, por lo que en el compilador podríamos introducir los modificadores que vemos en el post para compilar.

  4. Pingback: Controlando un display de 7 segmentos con Arduino y un botón por interrupción. – Poesía Binaria /

  5. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Actually, it’s pretty good to see! Tiler Adelaide

  6. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Thanks for sharing! Tiler Adelaide

  7. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Thanks for letting us know! Tiler Wollongong

  8. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Good to know about this! Tiling Wollongong

  9. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Excellent post! Concreters in Wollongong

  10. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Thanks for sharing this to public! Adelaide Landscaping

  11. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Such a great post! Adelaide Landscaping

  12. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Glad to find this fabulous website. Landscaper Wollongong

  13. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    I visited Your blog and got a massive number of informative articles. I read many articles carefully and got the information that I had been looking for for a long time. Hope you will write such a helpful article in future. Thanks for writing.Tilers in Hobart

  14. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Very useful and informative post! Tiling Townsville

  15. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Very informative post! tiler melbourne

  16. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Thats what I was looking for! Adelaide Air Conditioning

  17. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    To be honest, I generally don’t read. But, this article caught my attention.seo adelaide

  18. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    I am really impressed with your writing style. Keep it up! Landscapers Canberra

  19. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Many thanks for sharing this! Adelaide Coolroom Hire

  20. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Thanks for sharing! Sliding Doors Adelaide

  21. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    It’s so kind of you! Solar Panels Adelaide

  22. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Many many thanks to you! Cleaning Services Adelaide

  23. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    I wish I could write anything close to that. That’s too good! Car Detailing Adelaide

  24. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Such beautiful writing this is. I appreciate your talent. Painters Adelaide

  25. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    You presented your ideas and thoughts really well on the paper. Solar Panels Adelaide

  26. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    What a great piece of article! seo adelaide

  27. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Very informative content. Thanks. tow truck wollongong

  28. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Please keep up the good work! drum lessons adelaide

  29. James Song /
    Usando Google Chrome Google Chrome 109.0.0.0 en Windows Windows NT

    Thanks for letting us know. Tiler Adelaide

  30. Delivery on Demand App /
    Usando Google Chrome Google Chrome 111.0.0.0 en Linux Linux

    Hire mobile app, custom web app team & digital marketers on hourly, fixed price, monthly retainers
    Delivery on Demand App

  31. 6 Weeks Industrial Training in Mohali /
    Usando Mozilla Firefox Mozilla Firefox 110.0 en Ubuntu Linux Ubuntu Linux

    Gsquare is a company located in Mohali that provides 6 Weeks Industrial Training in Mohali to students and professionals. The training program is designed to provide hands-on experience to participants in various fields such as web development, mobile app development, digital marketing, and software testing.

Leave a Reply