{"id":619,"date":"2024-04-07T07:00:00","date_gmt":"2024-04-07T06:00:00","guid":{"rendered":"https:\/\/jorgeturiel.es\/?p=619"},"modified":"2024-05-26T19:59:26","modified_gmt":"2024-05-26T18:59:26","slug":"que-es-ultibo","status":"publish","type":"post","link":"https:\/\/jorgeturiel.es\/?p=619","title":{"rendered":"\u00bfQu\u00e9 es Ultibo?"},"content":{"rendered":"\n<p>Si visitamos la wikipedia de la p\u00e1gina del proyecto <a href=\"https:\/\/ultibo.org\/\">ultibo<\/a>, encontramos una definici\u00f3n m\u00e1s t\u00e9cnica.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Ultibo core es un entorno completo para el desarrollo integrado o b\u00e1sico (sin sistema operativo) en Raspberry Pi (todos los modelos excepto Pico). No es un sistema operativo en s\u00ed, pero proporciona muchos de los mismos servicios que un sistema operativo, como administraci\u00f3n de memoria, subprocesos, redes y sistemas de archivos. Con el objetivo principal de hacer que el desarrollo de aplicaciones integradas sea lo m\u00e1s similar posible al desarrollo para otras plataformas al proporcionar caracter\u00edsticas y servicios comunes y eliminar la necesidad de comenzar desde cero, Ultibo core se puede utilizar de muchas maneras diferentes.<\/p>\n<\/blockquote>\n\n\n\n<!--more-->\n\n\n\n<p>La respuesta corta ser\u00eda, es un proyecto que usa Free Pascal y Lazarus para programar las placas Raspberry pi, como si fueran placas arduinos. <\/p>\n\n\n\n<p>Estos es, nos permite el microprocesador las placas Rasberry Pi directamente, como si fuera un microcontrolador m\u00e1s, sin tener un sistema operativo. Adem\u00e1s se puede interactuar con los perif\u00e9ricos, por ejemplo si se desea hacer uso de la comunicaci\u00f3n SPI, debemos inicializar el la conexi\u00f3n SPI que lleva integrada el microprocesador de nuestra Raspberry PI, por ejemplo<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">  SPIDevice:=PSPIDevice(DeviceFindByDescription('BCM2836 SPI0 Master'));<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware requerido.<\/h2>\n\n\n\n<p>Para empezar necesitas un placa de Raspberry Pi, da igual si es una Raspberry PI 1B, como una Zero, o la versi\u00f3n 4B. La \u00faltima versi\u00f3n, a la hora de escribir este texto, es la versi\u00f3n 5 que a\u00fan no est\u00e1 soportada por Ultibo. <\/p>\n\n\n\n<p>Adem\u00e1s necesitar\u00e1s una pantalla con entrada HDMI, una tarjeta SD para la placa Raspberry Pi (normalmente son microSD) y un lector de tarjetas SD, si tu ordenador no dispone de lector incorporado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instalando Ultibo.<\/h2>\n\n\n\n<p>Lo primero de todo es dirigirse a la p\u00e1gina <a href=\"https:\/\/ultibo.org\/\">Ultibo<\/a>, y en la secci\u00f3n de descargas, descargar el <em>Core<\/em> que corresponda al sistema operativo que tengamos.<\/p>\n\n\n\n<p>Una vez instalado Ultibo, abrimos la aplicaci\u00f3n y nos encontramos con el entorno de <em>Lazarus<\/em>, adaptado y preparado para empezar a crear el primer programa.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"544\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143131-1024x544.png\" alt=\"\" class=\"wp-image-676\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143131-1024x544.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143131-300x159.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143131-768x408.png 768w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143131-1536x816.png 1536w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143131.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Entorno Lazarus para programa con Ultibo<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Para crear un proyecto, vamos al men\u00fa Proyecto y seleccionamos Nuevo Proyecto.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"702\" height=\"417\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143429.png\" alt=\"\" class=\"wp-image-677\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143429.png 702w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-143429-300x178.png 300w\" sizes=\"auto, (max-width: 702px) 100vw, 702px\" \/><figcaption class=\"wp-element-caption\">Crear un proyecto nuevo<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Debemos elegir la versi\u00f3n que corresponda con el modelo de Raspberry Pi que tengamos. Al pulsar OK, se crear\u00e1 un programa nuevo con todos los ajustes seg\u00fan el modelo elegido.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Primer programa. Hola Mundo<\/h2>\n\n\n\n<p>Siguiendo la tradici\u00f3n, vamos a crear el cl\u00e1sico saludo \u00abHola Mundo\u00bb. <\/p>\n\n\n\n<p>A\u00f1ade la unidad <em>Console<\/em>, y escribe el siguiente c\u00f3digo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" title=\"Hola Mundo\">var\n  windowHandle: TWindowHandle;\nbegin\n  windowHandle := ConsoleWindowCreate(ConsoleDeviceGetDefault,CONSOLE_POSITION_FULL, True);\n  ConsoleWindowWriteLn(windowHandle, 'Hola mundo');\n  ThreadHalt(0);   \nend.<\/pre><\/div>\n\n\n\n<p>En la l\u00ednea 2, declaramos una variable de tipo <em>TWindowHandle<\/em>, la cual contendr\u00e1 la direcci\u00f3n de la consola que vamos a crear.<\/p>\n\n\n\n<p>En la l\u00ednea 4, llamamos a la funci\u00f3n <em>ConsoleWindowCreate<\/em>, el primer par\u00e1metro es un puntero a una consola, en este caso indicamos que use la consola por defecto. El segundo par\u00e1metro es una constante que indica su posici\u00f3n, en este caso le indicamos que ocupe toda la pantalla. Y el \u00faltimo par\u00e1metro le indicamos que ser\u00e1, de ahora en adelante, la consola por defecto.<\/p>\n\n\n\n<p>La l\u00ednea 5, simplemente, escribimos una l\u00ednea en la consola. Para ello como primer par\u00e1metro indicamos en que consola, en este caso, la que acabamos de crear. Y como segundo par\u00e1metro el texto a mostrar.<\/p>\n\n\n\n<p>Para terminar, en la l\u00ednea 6 detenemos este hilo.<\/p>\n\n\n\n<p>Guarda, este programa en una carpeta. En el men\u00fa Ejecutar, seleccionar Compilar, o simplemente pulsa la combinaci\u00f3n de teclas <em>Ctrl+F9<\/em>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Preparar la tarjeta SD<\/h3>\n\n\n\n<p>El siguiente paso es preparar la tarjeta SD, para que la placa Raspberry Pi pueda arrancar desde ella y ejecutar nuestro programa<\/p>\n\n\n\n<p>Cualquier tarjeta SD que tengas a mano te servir\u00e1, incluso una de poco capacidad, ya que el programa que hemos creado y los archivos necesarios apenas llegan a los 2 MB. Debes asegurarte que la tarjeta est\u00e9 formateado con el formato FAT.<\/p>\n\n\n\n<p>Debes copiar los siguientes archivos, los cuales son parte del firmware de la Raspberry Pi.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>bootcode.bin <\/li>\n\n\n\n<li>start.elf <\/li>\n\n\n\n<li>fixup.dat<\/li>\n<\/ul>\n\n\n\n<p>En el caso de la Raspberry Pi 4, los archivos que debes copiar son los siguientes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>start4.elf <\/li>\n\n\n\n<li>fixup4.dat <\/li>\n\n\n\n<li>armstub32-rpi4.bin <\/li>\n\n\n\n<li>config.txt <\/li>\n<\/ul>\n\n\n\n<p>Estos archivos los puedes localizar en la carpeta d\u00f3nde instalaste Ultibo, normalmente en <em>C:\\Ultibo\\Core\\firmware<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"726\" height=\"372\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-150950.png\" alt=\"\" class=\"wp-image-682\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-150950.png 726w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-150950-300x154.png 300w\" sizes=\"auto, (max-width: 726px) 100vw, 726px\" \/><figcaption class=\"wp-element-caption\">Firmware<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Introduce la tarjeta en tu pc, bien en la ranura destinado para ello, o usando un adaptador, y copia los archivos del firmware seg\u00fan la versi\u00f3n de tu Raspberry Pi. Adem\u00e1s copia el archivo que acabas de compilar. Lo encontrar\u00e1s en la carpeta d\u00f3nde has guardado el proyecto. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"771\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_162636-1024x771.jpg\" alt=\"\" class=\"wp-image-685\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_162636-1024x771.jpg 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_162636-300x226.jpg 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_162636-768x578.jpg 768w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_162636-1536x1157.jpg 1536w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_162636-2048x1542.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Adaptador usb para leer tarjetas SD<\/figcaption><\/figure>\n<\/div>\n\n\n<p>El archivo se llama Kernel.img, en el caso que hayas compilado para la versi\u00f3n de la Raspeberry Pi 2B o 3B se llamara Kernel7.img. Y si la versi\u00f3n es Raspberry Pi 4B, el archivo se llamara kernel7l.img.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td>Nombre archivo<\/td><td>Versi\u00f3n Raspberry PI<\/td><\/tr><tr><td>Kernel.img<\/td><td>Raspberry A, B, A+, B+ or Zero<\/td><\/tr><tr><td>Kernel7.img<\/td><td>Raspeberry  2B o 3B<\/td><\/tr><tr><td>Kernel7l.img<\/td><td>Raspberry Pi 4B<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Tabla de nombre de archivos seg\u00fan versi\u00f3n Raspberry PI<\/figcaption><\/figure>\n\n\n\n<p>Tras copiar los archivos, coloca la tarjeta en la Raspberry Pi y enci\u00e9ndala.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"771\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_163105-1024x771.jpg\" alt=\"\" class=\"wp-image-686\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_163105-1024x771.jpg 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_163105-300x226.jpg 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_163105-768x578.jpg 768w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_163105-1536x1157.jpg 1536w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/IMG_20240331_163105-2048x1542.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Pantalla HDMI mostrando mensaje por consola.<\/figcaption><\/figure>\n<\/div>\n\n\n<p>De ahora en adelante, cada vez que hagas un cambio en el programa, solo tienes que copiar a la tarjeta SD el archivo Kernel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Actualizaciones por red.<\/h2>\n\n\n\n<p>El proceso de cargar nuestro programa colocando la tarjeta SD en el pc puede ser bastante latoso. Lo m\u00e1s c\u00f3modo es enviar por red el programa cada vez que deseemos. Este proceso se puede simplificar habilitando un servicio <a href=\"https:\/\/es.wikipedia.org\/wiki\/TFTP\">TFTP<\/a> en nuestros programas.<\/p>\n\n\n\n<p>Para ello, lo primero es conectar a tu router la placa Raspberry Pi con un cable ethernet. Luego descarga el archivo <a href=\"https:\/\/github.com\/pjde\/ultibo-tftp\/blob\/master\/uTFTP.pas\">uFTP.pas<\/a> y gu\u00e1rdalo en un carpeta. Este archivo lo debemos incluir en todos nuestros proyectos.<\/p>\n\n\n\n<p>Al conectar la placa con un cable al router, este le asignar\u00e1 un direcci\u00f3n IP como a todos los dispositivos que haya conectados a la red. Debemos conocer esta direcci\u00f3n IP para enviar el programa. <\/p>\n\n\n\n<p>Crea un proyecto nuevo, a\u00f1ade el archivo que acabas de descargar. Para ello ve al men\u00fa Archivo, luego seleccionar abrir.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"296\" height=\"452\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-183016.png\" alt=\"\" class=\"wp-image-688\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-183016.png 296w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-183016-196x300.png 196w\" sizes=\"auto, (max-width: 296px) 100vw, 296px\" \/><figcaption class=\"wp-element-caption\">Men\u00fa abrir<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Localiza el archivo que acabas de descargar y \u00e1brelo. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"541\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193208.png\" alt=\"\" class=\"wp-image-689\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193208.png 857w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193208-300x189.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193208-768x485.png 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><figcaption class=\"wp-element-caption\">Abrir archivo uFTP<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Una vez abierto, a\u00f1\u00e1delo al proyecto actual, para ello pulsa  shift+F11, y acepta el siguiente mensaje.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"453\" height=\"150\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193528.png\" alt=\"\" class=\"wp-image-691\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193528.png 453w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193528-300x99.png 300w\" sizes=\"auto, (max-width: 453px) 100vw, 453px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"453\" height=\"182\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193604.png\" alt=\"\" class=\"wp-image-692\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193604.png 453w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-193604-300x121.png 300w\" sizes=\"auto, (max-width: 453px) 100vw, 453px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Localizar la direcci\u00f3n IP<\/h3>\n\n\n\n<p>Crea el siguiente c\u00f3digo para que cuando la placa Rasbperry Pi arranque muestre por consola su direcci\u00f3n Ip. <\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \">program project1;\n\n{$mode objfpc}{$H+}\n\n{ Raspberry Pi Application                                                     }\n{  Add your program code below, add additional units to the \"uses\" section if  }\n{  required and create new units by selecting File, New Unit from the menu.    }\n\n{  To compile your program select Run, Compile (or Run, Build) from the menu.  }\n\n{  To build for the QEMU target select Project, Project Options ... from the   }\n{  menu, go to Config and Target and choose the appropriate Target Controller. }\n\nuses\n  RaspberryPi,\n  GlobalConfig,\n  GlobalConst,\n  GlobalTypes,\n  Platform,\n  Threads,\n  SysUtils,\n  Classes,\n  uTFTP,\n  Ultibo { Add additional units here },\n  Console,\n  Winsock2;\n\nvar\n  windowHandle: TWindowHandle;\n  IPAddress: string;\n\n  function WaitForIPComplete: string;\n  var\n    TCP: TWinsock2TCPClient;\n  begin\n    TCP := TWinsock2TCPClient.Create;\n    Result := TCP.LocalAddress;\n    if (Result = '') or (Result = '0.0.0.0') or (Result = '255.255.255.255') then\n    begin\n      while (Result = '') or (Result = '0.0.0.0') or (Result = '255.255.255.255') do\n      begin\n        sleep(1000);\n        Result := TCP.LocalAddress;\n      end;\n    end;\n    TCP.Free;\n  end;\n\nbegin\n  windowHandle := ConsoleWindowCreate(ConsoleDeviceGetDefault,\n    CONSOLE_POSITION_FULL, True);\n  ConsoleWindowWriteLn(windowHandle, 'Hola mundo');\n  IPAddress := WaitForIPComplete;\n  ConsoleWindowWriteLn(windowHandle, 'Ip actual: ' + IPAddress);\n  ThreadHalt(0);   \n\nend.<\/pre><\/div>\n\n\n\n<p>Compila el programa y gu\u00e1rdalo en la tarjeta SD, como hiciste antes.<\/p>\n\n\n\n<p>Al arrancar saldr\u00e1 un mensaje, por la consola indicando la direcci\u00f3n IP de la placa Raspberry PI. <\/p>\n\n\n\n<p>Desde ahora, y siempre que el programa incluya el fichero <em>uTFTP<\/em> (f\u00edjate que est\u00e1 a\u00f1adido en la clausula uses del c\u00f3digo anterior), podremos enviar un programa cliente TFTP. <\/p>\n\n\n\n<p>Windows tiene, entre sus caracter\u00edsticas un cliente TFTP, el cual se puede activar, desde el panel de control en el apartado programas y caracter\u00edsticas.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"555\" height=\"491\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-201238.png\" alt=\"\" class=\"wp-image-694\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-201238.png 555w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/03\/Captura-de-pantalla-2024-03-31-201238-300x265.png 300w\" sizes=\"auto, (max-width: 555px) 100vw, 555px\" \/><figcaption class=\"wp-element-caption\">Caracter\u00edsticas de Windows <\/figcaption><\/figure>\n<\/div>\n\n\n<p>Para probarlo, a\u00f1ade un nueva l\u00ednea en el programa anterior, por ejemplo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \"> ConsoleWindowWriteLn(windowHandle,'Este programa fue cargado por TFTP');    <\/pre><\/div>\n\n\n\n<p>Compila el programa, y abre una terminal de Windows y ve al directorio donde est\u00e1 el archivo Kernel.img y escribe:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:ps decode:true \">TFTP -i 192.168.100.188 PUT kernel.img\n<\/pre><\/div>\n\n\n\n<p>TFTP es el nombre del cliente, el par\u00e1metro <em>-i<\/em> indica que la conexi\u00f3n ser\u00e1 en binario, luego la direcci\u00f3n IP de la Raspberry PI. PUT indica que vamos enviar un archivo, y por \u00faltimo el nombre del archivo. Tras un momentos, la placa Raspberry PI se reiniciar\u00e1 y arrancar\u00e1 con el programa nuevo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Direcci\u00f3n IP est\u00e1tica.<\/h3>\n\n\n\n<p>Tener una direcci\u00f3n IP din\u00e1mica puede ser un inconveniente, por tanto podemos indicar una direcci\u00f3n est\u00e1tica a la placa Raspberry PI. Esto se puede hacer por c\u00f3digo (fuente<a href=\"https:\/\/ultibo.org\/forum\/viewtopic.php?f=10&amp;t=978&amp;p=6531#p6596\"> foro Ultibo<\/a>).<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \">uses\n  SysUtils,\n  Classes,\n  GlobalSock,\n  Network,\n  Transport,\n  IP;\n\nfunction SetIPAddress(const AName,AAddress,ANetmask,AGateway:String):Boolean;\nvar\n Adapter:TNetworkAdapter;\n Transport:TNetworkTransport;\n TransportAdapter:TIPTransportAdapter;\nbegin\n {}\n Result:=False;\n\n if Length(AName) = 0 then Exit;\n if Length(AAddress) = 0 then Exit;\n if Length(ANetmask) = 0 then Exit;\n {Gateway can be empty}\n\n {Get Adapter}\n Adapter:=AdapterManager.GetAdapterByName(AName,True,NETWORK_LOCK_READ);\n if Adapter = nil then Exit;\n try\n  {Get IP Transport}\n  Transport:=TransportManager.GetTransportByType(AF_INET,PACKET_TYPE_IP,True,NETWORK_LOCK_READ);\n  if Transport = nil then Exit;\n  try\n   {Get Transport Adapter (The connection between the Network device and the IP Transport)}\n   TransportAdapter:=TIPTransportAdapter(Transport.GetAdapterByAdapter(Adapter,True,NETWORK_LOCK_WRITE));\n   if TransportAdapter = nil then Exit;\n\n   {Set the Adapter Status to Down}\n   TransportAdapter.Adapter.Status:=ADAPTER_STATUS_DOWN;\n\n   {Unlock Transport Adapter}\n   TransportAdapter.WriterUnlock;\n\n   WriteLn(AName + ' set to ADAPTER_STATUS_DOWN');\n\n   WriteLn('Waiting until Transport Adapter is Unconfigured');\n\n   {Lock Transport Adapter (Reader)}\n   TransportAdapter.ReaderLock;\n\n   {Wait for Transport Adapter to be Unconfigured}\n   while TransportAdapter.Configured do\n    begin\n     {Wait}\n     Sleep(500);\n    end;\n\n   {Unlock Transport Adapter}\n   TransportAdapter.ReaderUnlock;\n\n   WriteLn('Setting IP, Netmask and Gateway');\n\n   {Lock Transport Adapter (Writer)}\n   TransportAdapter.WriterLock;\n\n   {Set the IP address, netmask and gateway}\n   TransportAdapter.ConfigDefault:=CONFIG_TYPE_STATIC;\n   TransportAdapter.ConfigAddress:=InAddrToHost(StringToInAddr(AAddress));\n   TransportAdapter.ConfigNetmask:=InAddrToHost(StringToInAddr(ANetmask));\n   if Length(AGateway) &lt;&gt; 0 then\n    begin\n     TransportAdapter.ConfigGateway:=InAddrToHost(StringToInAddr(AGateway));\n    end;\n\n   {Set the Adapter Status to Up}\n   TransportAdapter.Adapter.Status:=ADAPTER_STATUS_UP;\n\n   {Unlock Transport Adapter}\n   TransportAdapter.WriterUnlock;\n   \n   WriteLn(AName + ' set to ADAPTER_STATUS_UP');\n\n   Result:=True;\n  finally\n   Transport.ReaderUnlock;\n  end;\n finally\n  Adapter.ReaderUnlock;\n end;\nend;\n\n<\/pre><\/div>\n\n\n\n<p>Haciendo una llamada a la funci\u00f3n, de la siguiente manera, se puede establecer una direcci\u00f3n Ip fija.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \"> SetIPAddress('Network0','192.168.1.55','255.255.255.0','192.168.1.1');<\/pre><\/div>\n\n\n\n<p>Existe otra posibilidad, para establecer una direcci\u00f3n Ip est\u00e1tica, sin tener que cambiar o recompilar el c\u00f3digo. Para ello debemos crear un archivo llamado cmdline.txt. Colocarlo en el directorio ra\u00edz de la tarjeta. Y dentro de este archivo podemos especificar diversos comandos. Por ejemplo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:ps decode:true \">NETWORK0_IP_CONFIG=STATIC\nNETWORK0_IP_ADDRESS=&lt;IP Address&gt;     (example NETWORK0_IP_ADDRESS=192.168.123.123)\nNETWORK0_IP_NETMASK=&lt;Subnet Mask&gt;    (example NETWORK0_IP_NETMASK=255.255.255.0)\nNETWORK0_IP_GATEWAY=&lt;Router Address&gt; (example NETWORK0_IP_GATEWAY=192.168.123.1)<\/pre><\/div>\n\n\n\n<p>M\u00e1s informaci\u00f3n de los comandos y ejemplos est\u00e1 disponible en el <a href=\"https:\/\/ultibo.org\/forum\/viewtopic.php?f=4&amp;t=122\">foro de ultibo.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones<\/h2>\n\n\n\n<p>Iniciarse en la programaci\u00f3n embebida a veces puede ser frustrante debido a la cantidad de horas y trabajo necesario para poder llegar a escribir una sola l\u00ednea de c\u00f3digo. La instalaci\u00f3n de Ultibo, nos proporciona el compilador Free Pascal, con una colecci\u00f3n de bibliotecas, as\u00ed como el  entorno de desarrollo integrado Lazarus, todo ello listo para empezar a programar.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Iniciarse en la programaci\u00f3n embebida a veces puede ser frustrante debido a la cantidad de horas y trabajo necesario para poder llegar a escribir una sola l\u00ednea de c\u00f3digo.<\/p>\n","protected":false},"author":2,"featured_media":704,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25,58],"tags":[32,23,21,60,59],"class_list":["post-619","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pascal","category-ultibo","tag-free-pascal","tag-lazarus","tag-pascal","tag-raspberry-pi","tag-ultibo"],"_links":{"self":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/619","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=619"}],"version-history":[{"count":22,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/619\/revisions"}],"predecessor-version":[{"id":708,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/619\/revisions\/708"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/media\/704"}],"wp:attachment":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=619"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=619"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}