{"id":994,"date":"2024-06-09T20:03:27","date_gmt":"2024-06-09T18:03:27","guid":{"rendered":"https:\/\/www.pinguytaz.net\/?p=994"},"modified":"2024-07-06T22:47:19","modified_gmt":"2024-07-06T20:47:19","slug":"rust-embebido-arduino-introduccion-parte-1","status":"publish","type":"post","link":"https:\/\/www.pinguytaz.net\/index.php\/2024\/06\/09\/rust-embebido-arduino-introduccion-parte-1\/","title":{"rendered":"Rust-Embebido \u00abArduino\u00bb Introducci\u00f3n parte 1"},"content":{"rendered":"\n<p>Continuamos con la experiencia en Rust en el desarrollo de sistemas integrados (Embebidos) en sistemas basado en microcontrolador, podemos ver una descripci\u00f3n del Rust-embebidos en el enlace <a href=\"https:\/\/docs.rust-embedded.org\/book\/\">https:\/\/docs.rust-embedded.org\/book\/<\/a> y nosotros utilizaremos una placa de Arduino que esta m\u00e1s extendida.<\/p>\n\n\n\n<p>Lo primero es saber que deberemos instalar para tener nuestro entorno para programar Arduino con Rust, en nuestro caso realizaremos la pruebas en un entorno Linux (distribuci\u00f3n ArchLinux)) pero podremos utilizar cualquier sistema que disponga de las herramientas de desarrollo del microprocesador AVR que es el que utiliza Arduino.<\/p>\n\n\n\n<p>Nuestro Arduino trabaja normalmente con el micro <a href=\"https:\/\/ww1.microchip.com\/downloads\/aemDocuments\/documents\/MCU08\/ProductDocuments\/DataSheets\/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">AVR(atmega328)<\/a> por lo tanto lo primero sera instalar las herramientas necesarias que nos permitan compilar, enlazar y subir el ejecutable a la placa.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Todo el c\u00f3digo de esta serie de POST los podremos encontrar donde tenemos los c\u00f3digos del libro \u00ab<a href=\"https:\/\/amzn.eu\/d\/32OJJdF\" target=\"_blank\" rel=\"noreferrer noopener\">De 0 a 100 con Arduino y ESP32<\/a>\u00bb \u00ab<a href=\"https:\/\/github.com\/pinguytaz\/Arduino-ESP32\/tree\/master\/CuadernoTecnico\">https:\/\/github.com\/pinguytaz\/Arduino-ESP32\/tree\/master\/CuadernoTecnico<\/a>\u00bb exactamente en la carpeta \u00ab<strong>RustArduino<\/strong>\u00bb estar\u00e1n los c\u00f3digos y ejemplos de esta serie de POST de programaci\u00f3n de Arduino con Rust.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entorno AVR<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pacman -S avr-gcc avr-libc (Linker y compilador)<\/li>\n\n\n\n<li>pacman -S arduino-avr-core avrdude (avrdude para Flashear el microprocesador)<\/li>\n\n\n\n<li>pacman -S systemd pkgconf<\/li>\n\n\n\n<li>Debugs (No necesarias en principio)<\/li>\n\n\n\n<li>pacman -S avr-gdb qemu-system-avr<\/li>\n\n\n\n<li>pacman -S elf2nucleus<\/li>\n<\/ul>\n\n\n\n<p>Tambi\u00e9n precisaremos configurar nuestro Rust con herramientas para integrar Rust con las herramientas anteriores:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rustup toolchain install nightly<br>cargo install ravedude<\/code><\/pre>\n\n\n\n<p> Como es muy c\u00f3modo iniciar el primer c\u00f3digo desde una plantilla ejecutaremos las siguientes instrucciones que nos preguntar\u00e1n por el nombre del proyecto.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cargo install cargo-generate\ncargo generate --git https:\/\/github.com\/Rahix\/avr-hal-template.git<\/code><\/pre>\n\n\n\n<p>Esto nos genera una serie de directorios y ficheros y deberemos configurar algunos:<\/p>\n\n\n\n<div class=\"wp-block-group has-small-font-size is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>.cargo\/config.toml<\/strong> <\/p>\n\n\n\n<p>En este fichero definimos el target y como ejecutar ravedude para la carga del programa. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UNO: runner = \"ravedude uno -cb 57600\" \nNANO Boot OLD: runner = \u201cravedude nano -P \/dev\/ttyUSB0 -cb 57600\" <\/code><\/pre>\n\n\n\n<p>Deberemos poner el puerto que corresponda en nuestro caso.<\/p>\n\n\n\n<p><strong>\/avr-specs<\/strong>                                       Ficheros json que define los target.<\/p>\n\n\n\n<p><strong>\/src\/main.rs<\/strong>                                   Nuestro c\u00f3digo a compilar.<\/p>\n\n\n\n<p><strong>Cargo.toml<\/strong>                                      Con las dependencias necesarias inicialmente.<\/p>\n\n\n\n<p><strong>README.md, rust-toolchain.toml<\/strong>, etc.<\/p>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Para ejecutar la consola, una vez este cargado el programa, y as\u00ed poder debugear nuestro programa ejecutaremos<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/.cargo\/bin\/ravedude -P --open-console --baudrate 57600\nLos tipos de placa se pueden ver ejecutando --help en nuestro caso sera uno.<\/code><\/pre>\n\n\n\n<p>Con todo esto ya podremos compilar \u00abcargo build\u00bb que nos generara un fichero ELF que con el comando file podemos ver que es de tipo AVR de 8 bits.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>file analogicos.elf\nanalogicos.elf: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped<\/code><\/pre>\n\n\n\n<p>y para que ademas de compilarlo se suba a nuestra placa, gracias a las configuraciones anteriores, es tan sencillo como ejecutar \u00abcargo run\u00bb y ademas nos ejecutara la consola de forma automatica.<\/p>\n\n\n\n<p>Ahora ya estamos preparados para generar nuestro primer programa (el t\u00edpico blinker de un led) que es el que se crea con la plantilla, en nuestro ejemplo le hemos a\u00f1adido una salida por consola.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!&#91;no_std]\n#!&#91;no_main]\n\nuse panic_halt as _;\n\n\n#&#91;arduino_hal::entry]\nfn main() -&gt; ! {\n    let dp = arduino_hal::Peripherals::take().unwrap();\n    let pins = arduino_hal::pins!(dp);      \/\/ Obtenemos los pines.\n    let mut led = pins.d13.into_output();   \/\/ define el Pin13 digital como salida. (led de la placa)\n    let mut led2 = pins.d4.into_output();   \/\/ define el Pin4 digital como salida.\n\n    \/\/ Configuracion de consola\n    let mut serial = arduino_hal::default_serial!(dp, pins, 57600);\n\n    loop {\n        led.toggle();\n        led2.toggle();\n        arduino_hal::delay_ms(10000);\n\n        \/\/ Escribe blink\n        _ = ufmt::uwriteln!(serial, \"Blink!\");    \/\/ Salida por consola.\n    }\n}<\/code><\/pre>\n\n\n\n<p>Debemos tener en cuenta en la programaci\u00f3n el poner las directivas siguientes al principio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>#![no_std]<\/strong>                                  No usa la librer\u00eda est\u00e1ndar y si la Core.<\/li>\n\n\n\n<li><strong>#![no_main]<\/strong>                              No utilizar la funci\u00f3n <em>main<\/em> est\u00e1ndar de un programa t\u00edpico de Rust.<\/li>\n\n\n\n<li><strong>use panic_halt as _;<\/strong>              Tratamiento de p\u00e1nicos y errores graves.<\/li>\n\n\n\n<li><strong>#[arduino_hal::entry]<\/strong>          Punto de entrada del programaci\u00f3n, donde iniciamos nuestro programa.<\/li>\n<\/ul>\n\n\n\n<p>En este caso no tenemos una funci\u00f3n <em>setup() <\/em>y otra <em>loop()<\/em> sino que tenemos una funci\u00f3n main en la cual pondremos un bucle <em>loop<\/em> para realizar la funci\u00f3n <em>loop<\/em>() de la programaci\u00f3n normal de Arduino.<\/p>\n\n\n\n<p>Antes de esta funci\u00f3n y al igual que solemos hacer en la funci\u00f3n <em>setup()<\/em> de una programaci\u00f3n t\u00edpica de Arduino es definir los perif\u00e9ricos a utilizar, en nuestro caso solo pines de salida.<\/p>\n\n\n\n<p>Hemos podido ver en el c\u00f3digo anterior como con la macro \u00abuwriteln!\u00bb pod\u00edamos sacar informaci\u00f3n por consola, o lo que es lo mismo tener una comunicaci\u00f3n serie, a continuaci\u00f3n ponemos un peque\u00f1o fragmento de c\u00f3digo en la que se ve como manejar el puerto serie de nuestro Arduino no solo para salida de datos sino tambi\u00e9n para entrada.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use arduino_hal::prelude::*;   \/\/ Liberia necesaria para \n\n\/\/ Configuraci\u00f3n de la velocidad.\nlet mut serial = arduino_hal::default_serial!(dp, pins, 57600);\n\n\/\/ Env\u00edo texto\n_ = ufmt::uwriteln!(serial, \"A\u00f1ade nueva linea\");\n_ = ufmt::uwriteln!(serial, \"Sin nueva linea\");\n\n\/\/ Permite par\u00e1metros {}\n_ = ufmt::uwriteln!(serial, \"A\u00f1ade nueva linea {}\",a);\n\n\n\/\/ Lectura de datos y env\u00edo.\nlet b = nb::block!(serial.read());   \/\/ Lectura\nnb::block!(serial.write(b.expect(\"POOOOO\")));    \/\/ Escritura\n<\/code><\/pre>\n\n\n\n<p>Con esto terminamos la primera parte pero aun queda por explicar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>E\/S Digitales<\/li>\n\n\n\n<li>Uso de las entradas anal\u00f3gicas ADC<\/li>\n\n\n\n<li>Uso de los pines PWM<\/li>\n\n\n\n<li>Uso de interrupciones externas.<\/li>\n\n\n\n<li>Timer usando servomotores<\/li>\n\n\n\n<li>Timer para uso del sonar HC-SR04<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Continuamos con la experiencia en Rust en el desarrollo de sistemas integrados (Embebidos) en sistemas basado en microcontrolador, podemos ver una descripci\u00f3n del Rust-embebidos en el enlace https:\/\/docs.rust-embedded.org\/book\/ y nosotros utilizaremos una placa de Arduino que esta m\u00e1s extendida. Lo primero es saber que deberemos instalar para tener nuestro entorno para programar Arduino con Rust, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":996,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"categories":[3,84,7,186],"tags":[119,188,187],"class_list":["post-994","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-lenguajes","category-linux","category-rust","tag-arduino-uno","tag-avr","tag-rust"],"_links":{"self":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/comments?post=994"}],"version-history":[{"count":8,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/994\/revisions"}],"predecessor-version":[{"id":1082,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/994\/revisions\/1082"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media\/996"}],"wp:attachment":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media?parent=994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/categories?post=994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/tags?post=994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}