{"id":103,"date":"2016-02-26T21:57:43","date_gmt":"2016-02-26T20:57:43","guid":{"rendered":"http:\/\/lab.fawno.com\/?p=103"},"modified":"2022-03-07T01:27:05","modified_gmt":"2022-03-07T00:27:05","slug":"","status":"publish","type":"post","link":"https:\/\/lab.fawno.org.es\/en\/2016\/02\/26\/aventuras-con-arduino\/","title":{"rendered":"","raw":""},"content":{"rendered":"","protected":false,"raw":""},"excerpt":{"rendered":"","protected":false,"raw":""},"author":1,"featured_media":134,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_es_post_content":"<!-- wp:paragraph -->\n<p>Har\u00e1 como un mes que me lleg\u00f3 mi primer <a href=\"https:\/\/es.wikipedia.org\/wiki\/Arduino\" target=\"_blank\" rel=\"noopener noreferrer\">Arduino<\/a>, se trataba de un <a href=\"https:\/\/www.arduino.cc\/en\/Main\/ArduinoBoardNano\" target=\"_blank\" rel=\"noopener noreferrer\">Arduino Nano<\/a> y estoy encantado con el juguete.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"align\":\"center\",\"id\":134} -->\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png\" rel=\"attachment wp-att-134 noopener noreferrer\"><img src=\"https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front-1024x399.png\" alt=\"Arduino Nano (Frontal)\" class=\"wp-image-134\"\/><\/a><figcaption>Arduino Nano (Frontal)<\/figcaption><\/figure><\/div>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>El caso es que como ten\u00eda por ah\u00ed los t\u00edpicos&nbsp;<a href=\"https:\/\/es.wikipedia.org\/wiki\/Visualizador_de_siete_segmentos\" target=\"_blank\" rel=\"noopener noreferrer\">displays de 7 segmentos<\/a> pues me puse a jugar con un contador de segundos, tremenda tonter\u00eda, lo se.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>La t\u00e9cnica b\u00e1sica para visualizar n\u00fameros en este tipo de displays es unir todos los segmentos e ir visualizando d\u00edgito por d\u00edgito a gran velocidad... de esta forma, igual que en el cine, enga\u00f1amos al ojo y ve todos los d\u00edgitos encendidos cuando en realidad s\u00f3lo hay uno.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>El problema entonces se trata de extraer para cada display el d\u00edgito correspondiente y ah\u00ed es donde me he dado de bruces con algo que ten\u00eda olvidado.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Veamos, si tenemos el n\u00famero 1234 y queremos visualizar las decenas lo que hacemos es descartar los millares y las centenas y dividir el resto entre 10:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:enlighter\/codeblock {\"language\":\"cpp\",\"theme\":\"dracula\"} -->\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">int Decenas = (Numero % 100) \/ 10;<\/pre>\n<!-- \/wp:enlighter\/codeblock -->\n\n<!-- wp:paragraph -->\n<p>Bueno, pues esto est\u00e1 mal... nos funcionar\u00e1 estupendamente en cualquier ordenador y cualquier programa pero no funcionar\u00e1 bien en Arduino y nos dar\u00e1 errores de redondeo.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>El problema no es la divisi\u00f3n, al ser <em>Decenas<\/em> de tipo entero se truncar\u00e1n los decimales, que es lo que queremos. Arduino no tiene funciones de redondeo, por lo que para evaluar un n\u00famero de coma flotante (<em>float<\/em>) como entero (<em>int<\/em>) lo hace descartando la parte fraccional.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u00bfEntonces?, el problema es que antes de la divisi\u00f3n realizamos un m\u00f3dulo de <em>Numero<\/em>. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modulo_operation\" target=\"_blank\" rel=\"noopener noreferrer\"><em>M\u00f3dulo<\/em> <\/a>es la operaci\u00f3n matem\u00e1tica que nos devuelve el <a href=\"https:\/\/es.wikipedia.org\/wiki\/Resto\" target=\"_blank\" rel=\"noopener noreferrer\">resto de una divisi\u00f3n<\/a>. \u00bfArduino calcula mal el m\u00f3dulo?, no. Para calcular el resto de una divisi\u00f3n hay que hacer varias operaciones, todas ellas en coma flotante y Arduino (m\u00e1s concretamente el microcontrolador <a href=\"https:\/\/es.wikipedia.org\/wiki\/Atmega328\" target=\"_blank\" rel=\"noopener noreferrer\">Atmega328<\/a>) no tiene <a href=\"https:\/\/es.wikipedia.org\/wiki\/Unidad_de_coma_flotante\" target=\"_blank\" rel=\"noopener noreferrer\">unidad de coma flotante<\/a> y ah\u00ed radica el problema.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Al no tener FPU, todos los c\u00e1lculos se hacen en la ALU, que es muy limitada al tratarse de un microcontrolador de 8 bits. As\u00ed que lo que nos encontramos, al realizar el m\u00f3dulo, un c\u00e1lculo redondeado que nos introduce un error en el siguiente c\u00e1lculo...<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>La manera correcta de hacer lo que queremos es:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:enlighter\/codeblock {\"language\":\"cpp\",\"theme\":\"dracula\"} -->\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">int Centenas = int(Numero \/ 100) % 10;<\/pre>\n<!-- \/wp:enlighter\/codeblock -->\n\n<!-- wp:paragraph -->\n<p>Ahora extraemos las centenas descartando primero las decenas y unidades (dividiendo entre 100) y luego descartando el resto de d\u00edgitos de la izquierda (m\u00f3dulo 10). Es importante que antes de realizar el m\u00f3dulo le indiquemos al microcontrolador que nos convierta el <em>float<\/em> resultante de la divisi\u00f3n en un&nbsp;<em>int<\/em>. No obstante el <a href=\"https:\/\/www.arduino.cc\/en\/Main\/Software\" target=\"_blank\" rel=\"noopener noreferrer\">IDE de Arduino<\/a> nos devolver\u00e1 un error y no compilar\u00e1 si no lo hacemos.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Se puede hacer un bucle para ir extrayendo todos los d\u00edgitos:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:enlighter\/codeblock {\"language\":\"cpp\",\"theme\":\"dracula\"} -->\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">for (int d = 0; d &amp;lt; NumeroDeDigitos; d++) {\n  int N = int(Numero \/ pow(10, d)) % 10;\n}<\/pre>\n<!-- \/wp:enlighter\/codeblock -->\n\n<!-- wp:paragraph -->\n<p>Y ya est\u00e1, problema resuelto... pero que me ha tenido loco dos semanas.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Ahora vendr\u00e1 el listo y me dir\u00e1 que c\u00f3mo no me he dado cuenta antes... pero el listo se olvida que todas las CPU desde el <a href=\"https:\/\/es.wikipedia.org\/wiki\/Intel_80486\" target=\"_blank\" rel=\"noopener noreferrer\">i486<\/a> llevan la FPU incorporada:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"align\":\"center\",\"id\":116} -->\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/commons.wikimedia.org\/wiki\/File%3A80486DX2_arch.svg\" rel=\"https:\/\/commons.wikimedia.org\/wiki\/File%3A80486DX2_arch.svg noopener noreferrer\"><img src=\"https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/80486DX2_arch-1024x741.png\" alt=\"https:\/\/commons.wikimedia.org\/wiki\/File%3A80486DX2_arch.svg\" class=\"wp-image-116\"\/><\/a><figcaption>Appaloosa [GFDL (https:\/\/www.gnu.org\/copyleft\/fdl.html) or CC-BY-SA-3.0 (https:\/\/creativecommons.org\/licenses\/by-sa\/3.0\/)], via Wikimedia Commons<\/figcaption><\/figure><\/div>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>Y claro, eso fue ayer mismo por el 1989, casi nada. Adem\u00e1s el <a href=\"https:\/\/es.wikipedia.org\/wiki\/Intel_80386\" target=\"_blank\" rel=\"noopener noreferrer\">i386<\/a> ya era un procesador de 32 bits (a\u00f1o 1986) y aunque careciera de FPU, su ALU daba mejores resultados que la sencilla l\u00f3gica de 8 bits del Atmega, no obstante estamos hablando de 4 veces m\u00e1s bits para representar los mismos n\u00fameros, por lo que es evidente que la precisi\u00f3n es mucho mayor.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Otro d\u00eda, ya os contar\u00e9 m\u00e1s cosas de Arduino.<\/p>\n<!-- \/wp:paragraph -->","_es_post_name":"aventuras-con-arduino","_es_post_excerpt":"","_es_post_title":"Aventuras con Arduino","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"en","footnotes":""},"categories":[19,14,3],"tags":[20],"class_list":["post-103","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-batallitas","category-tips","tag-arduino"],"ninja_gutenberg_blocks_featured_media_urls":{"thumbnail":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front-150x150.png",150,150,true],"ninja_gutenberg_blocks_landscape_large":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png",1059,413,false],"ninja_gutenberg_blocks_portrait_large":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png",1059,413,false],"ninja_gutenberg_blocks_square_large":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png",1059,413,false],"ninja_gutenberg_blocks_landscape":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png",600,234,false],"ninja_gutenberg_blocks_portrait":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png",600,234,false],"ninja_gutenberg_blocks_square":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png",600,234,false],"full":["https:\/\/lab.fawno.org.es\/wp-content\/uploads\/2016\/03\/ArduinoNano_Front.png",1059,413,false]},"_links":{"self":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/posts\/103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/comments?post=103"}],"version-history":[{"count":0,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/posts\/103\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/media\/134"}],"wp:attachment":[{"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/media?parent=103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/categories?post=103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lab.fawno.org.es\/en\/wp-json\/wp\/v2\/tags?post=103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}