{"id":1221,"date":"2012-06-14T01:20:48","date_gmt":"2012-06-14T00:20:48","guid":{"rendered":"http:\/\/www.zigbe.net\/?p=1221"},"modified":"2016-02-26T02:05:47","modified_gmt":"2016-02-26T01:05:47","slug":"probando-bootloaders","status":"publish","type":"post","link":"https:\/\/blog.whatsbee.net\/?p=1221","title":{"rendered":"Probando bootloaders alternativos para Arduino"},"content":{"rendered":"<p><!--:en-->Hace algunos a\u00f1os, cuando empezaba en el mundo de la inform\u00e1tica me explicaron de donde proviene la palabra boot (referida al proceso de inicio de los ordenadores). En los ordenadores arranca el hardware, este se tiene que encargar de arrancar el software, pero la rutina que define como debe de arrancar el software no puede estar en el mismo software, el t\u00e9rmino boot deriva de que es un proceso parecido a levantarse a uno mismo del suelo estirando de los cordones de las botas.<\/p>\n<p>En el mundo de los sistemas embebidos suele haber un peque\u00f1o programa que se llama bootloader, su funci\u00f3n es poder cargar los programas en la memoria nvram sin la necesidad de un programador. Poniendo como ejemplo la placa Arduino, con la ayuda de un programador siempre podemos cargar un programa, pero si ponemos un bootloader podremos hacerlo a trav\u00e9s del puerto serie. El micro se inicia, arranca el bootloader y este se encarga de escuchar por el puerto serie o por el puerto USB durante un tiempo despu\u00e9s del reset para ver si queremos cargarle un programa en la nvram.<\/p>\n<p>Normalmente la UART de los micros funciona con niveles l\u00f3gicos de 0 y 5V (o de 0 y 3,3V), mientras que el puerto serie de un ordenador lo hace con +-10 \u00f3 12 V (perdonad la imprecisi\u00f3n), por lo que es necesario un circuito que adapte los niveles. Si lo intentamos hacer a trav\u00e9s de un puerto USB tambi\u00e9n necesitamos un circuito que adapte los niveles y los protocolos, generalmente con un chip de FTDI.<\/p>\n<p>Nosotros intentamos hacer nodos peque\u00f1os y baratos, como esta circuiter\u00eda adicional solo sirve para cargar el programa no es necesario que sea una parte fija del nodo, como norma general lo que se suele hacer es dejar unos headers (pines) en el nodo y utilizar una placa aparte como la de la foto.<\/p>\n<div>\n<dl id=\"attachment_1222\">\n<dt><a href=\"http:\/\/blog.whatsbee.net\/wp-content\/uploads\/2012\/06\/ftdi.jpg\"><img loading=\"lazy\" title=\"ftdi\" src=\"http:\/\/blog.whatsbee.net\/wp-content\/uploads\/2012\/06\/ftdi.jpg\" alt=\"\" width=\"500\" height=\"500\" \/><\/a><\/dt>\n<dd>Placa de FTDI para convertir de USB a UART<\/dd>\n<\/dl>\n<\/div>\n<p>Todo esto en el campo parece un poco complicado, para actualizar el firmware tienes que abrir la caja del nodo, conectar esta placa, un PC con un puerto USB, el entorno de desarrollo y, posteriormente, actualizar el FW de la placa.<\/p>\n<p>Pensando en la forma de simplificarlo he estado mirando bootloaders alternativos, que nos permitan actualizar de una forma m\u00e1s sencilla:<\/p>\n<ul>\n<li>TFTP: Es el m\u00e1s obvio, a trav\u00e9s de la red, he encontrado dos\u00a0<a href=\"https:\/\/github.com\/mharizanov\/TFTPBootloader_0_2\">https:\/\/github.com\/mharizanov\/TFTPBootloader_0_2<\/a>\u00a0y\u00a0<a href=\"https:\/\/github.com\/mharizanov\/arduino-netboot\">https:\/\/github.com\/mharizanov\/arduino-netboot<\/a>, el segundo no me sirve demasiado, porque exige configurar un servidor BOOTP, un poco complicado para lo que lo quiero. El primero lo he probado, pero no he conseguido hacerlo funcionar.<\/li>\n<li>SD: Una forma alternativa de actualizar el FW es poniendo un fichero en la tarjeta SD, simplemente hay que conectar la tarjeta SD a un PC, arrastrar el fichero HEX con un nombre concreto y el nodo al arrancar actualizar\u00e1 su firmware. Combinado con la posibilidad de que el propio programa del nodo busque en Internet actualizaciones, las descargue y las coloque en la SD nos da un procedimiento sencillo para actualizar, si la necesidad de sacar la tarjeta. Podemos tener un repositorio en Internet y que los nodos comparen la versi\u00f3n de FW que tienen con la \u00faltima, si hay una posterior que la descarguen y la graven en la propia tarjeta, la proxima vez que reinicemos la placa se actualizar\u00e1\u00a0m\u00e1gicamente.<\/li>\n<\/ul>\n<p>He encontrado esto\u00a0<a title=\"2boots\" href=\"https:\/\/github.com\/thseiler\/embedded\/tree\/master\/avr\/2boots\/\">2boots<\/a>, que es un bootloader para Arduino que permite la carga por la UART y por la SD. Me falta probarlo, pero parece una buena idea&#8230;.<\/p>\n<p>seguiremos informando<!--:--><!--:es-->Hace algunos a\u00f1os, cuando empezaba en el mundo de la inform\u00e1tica me explicaron de donde proviene la palabra boot (referida al proceso de inicio de los ordenadores). En los ordenadores arranca el hardware, este se tiene que encargar de arrancar el software, pero la rutina que define como debe de arrancar el software no puede estar en el mismo software, el t\u00e9rmino boot deriva de que es un proceso parecido a levantarse a uno mismo del suelo estirando de los cordones de las botas.<\/p>\n<p>En el mundo de los sistemas embebidos suele haber un peque\u00f1o programa que se llama bootloader, su funci\u00f3n es poder cargar los programas en la memoria nvram sin la necesidad de un programador. Poniendo como ejemplo la placa Arduino, con la ayuda de un programador siempre podemos cargar un programa, pero si ponemos un bootloader podremos hacerlo a trav\u00e9s del puerto serie. El micro se inicia, arranca el bootloader y este se encarga de escuchar por el puerto serie o por el puerto USB durante un tiempo despu\u00e9s del reset para ver si queremos cargarle un programa en la nvram.<\/p>\n<p>Normalmente la UART de los micros funciona con niveles l\u00f3gicos de 0 y 5V (o de 0 y 3,3V), mientras que el puerto serie de un ordenador lo hace con +-10 \u00f3 12 V (perdonad la imprecisi\u00f3n), por lo que es necesario un circuito que adapte los niveles. Si lo intentamos hacer a trav\u00e9s de un puerto USB tambi\u00e9n necesitamos un circuito que adapte los niveles y los protocolos, generalmente con un chip de FTDI.<\/p>\n<p>Nosotros intentamos hacer nodos peque\u00f1os y baratos, como esta circuiter\u00eda adicional solo sirve para cargar el programa no es necesario que sea una parte fija del nodo, como norma general lo que se suele hacer es dejar unos headers (pines) en el nodo y utilizar una placa aparte como la de la foto.<\/p>\n<div id=\"attachment_1222\" style=\"width: 510px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.whatsbee.net\/wp-content\/uploads\/2012\/06\/ftdi.jpg\"><img aria-describedby=\"caption-attachment-1222\" loading=\"lazy\" class=\"size-full wp-image-1222\" title=\"ftdi\" src=\"http:\/\/blog.whatsbee.net\/wp-content\/uploads\/2012\/06\/ftdi.jpg\" alt=\"\" width=\"500\" height=\"500\" srcset=\"https:\/\/blog.whatsbee.net\/wp-content\/uploads\/2012\/06\/ftdi.jpg 500w, https:\/\/blog.whatsbee.net\/wp-content\/uploads\/2012\/06\/ftdi-150x150.jpg 150w, https:\/\/blog.whatsbee.net\/wp-content\/uploads\/2012\/06\/ftdi-300x300.jpg 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><p id=\"caption-attachment-1222\" class=\"wp-caption-text\">Placa de FTDI para convertir de USB a UART<\/p><\/div>\n<p>Todo esto en el campo parece un poco complicado, para actualizar el firmware tienes que abrir la caja del nodo, conectar esta placa, un PC con un puerto USB, el entorno de desarrollo y, posteriormente, actualizar el FW de la placa.<\/p>\n<p>Pensando en la forma de simplificarlo he estado mirando bootloaders alternativos, que nos permitan actualizar de una forma m\u00e1s sencilla:<\/p>\n<ul>\n<li>TFTP: Es el m\u00e1s obvio, a trav\u00e9s de la red, he encontrado dos\u00a0<a href=\"https:\/\/github.com\/mharizanov\/TFTPBootloader_0_2\">https:\/\/github.com\/mharizanov\/TFTPBootloader_0_2<\/a>\u00a0y\u00a0<a href=\"https:\/\/github.com\/mharizanov\/arduino-netboot\">https:\/\/github.com\/mharizanov\/arduino-netboot<\/a>, el segundo no me sirve demasiado, porque exige configurar un servidor BOOTP, un poco complicado para lo que lo quiero. El primero lo he probado, pero no he conseguido hacerlo funcionar.<\/li>\n<li>SD: Una forma alternativa de actualizar el FW es poniendo un fichero en la tarjeta SD, simplemente hay que conectar la tarjeta SD a un PC, arrastrar el fichero HEX con un nombre concreto y el nodo al arrancar actualizar\u00e1 su firmware. Combinado con la posibilidad de que el propio programa del nodo busque en Internet actualizaciones, las descargue y las coloque en la SD nos da un procedimiento sencillo para actualizar, si la necesidad de sacar la tarjeta. Podemos tener un repositorio en Internet y que los nodos comparen la versi\u00f3n de FW que tienen con la \u00faltima, si hay una posterior que la descarguen y la graven en la propia tarjeta, la proxima vez que reinicemos la placa se actualizar\u00e1\u00a0m\u00e1gicamente.<\/li>\n<\/ul>\n<p>He encontrado esto <a title=\"2boots\" href=\"https:\/\/github.com\/thseiler\/embedded\/tree\/master\/avr\/2boots\/\">2boots<\/a>, que es un bootloader para Arduino que permite la carga por la UART y por la SD. Me falta probarlo, pero parece una buena idea&#8230;.<\/p>\n<p>seguiremos informando<!--:--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace algunos a\u00f1os, cuando empezaba en el mundo de la inform\u00e1tica me explicaron de donde proviene la palabra boot (referida al proceso de inicio de los ordenadores). En los ordenadores arranca el hardware, este se tiene que encargar de arrancar&hellip; <br \/><a class=\"read-more-button\" href=\"https:\/\/blog.whatsbee.net\/?p=1221\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":1222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0},"categories":[16,2,20,11],"tags":[35,37,41],"_links":{"self":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/posts\/1221"}],"collection":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1221"}],"version-history":[{"count":1,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/posts\/1221\/revisions"}],"predecessor-version":[{"id":7582,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/posts\/1221\/revisions\/7582"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/media\/1222"}],"wp:attachment":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}