<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ArS Electronica | Electronica Desde Cero</title>
    <description>Electronica Desde Cero, Arduino, Tutoriales, Guias, Proyectos, Raspberry Pi, Sistemas Embebidos</description>
    <link>https://blog.ars-electronica.com.ar/</link>
    <atom:link href="https://blog.ars-electronica.com.ar/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Executing Multiple Commands in Docker Compose</title>
        <description>&lt;h1 id=&quot;executing-multiple-commands-in-docker-compose&quot;&gt;Executing Multiple Commands in Docker Compose&lt;/h1&gt;

&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;

&lt;p&gt;In Docker, developers can build, deploy, and test applications by packaging them in a container along with all of their dependencies. Docker Compose is an essential tool for managing multiple containers using services.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll understand how to execute multiple commands in a Docker container, managed using Docker Compose. Additionally, we’ll explore different ways to run multiple commands in the Docker container.&lt;/p&gt;

&lt;h2 id=&quot;table-of-contents&quot;&gt;Table of contents&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#executing-multiple-commands-in-docker-compose&quot;&gt;Executing Multiple Commands in Docker Compose&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#overview&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#table-of-contents&quot;&gt;Table of contents&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#running-single-command&quot;&gt;Running Single Command&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#running-multiple-commands&quot;&gt;Running Multiple Commands&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#using-the--operator&quot;&gt;Using the \&amp;amp;\&amp;amp; Operator&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;
            &lt;table&gt;
              &lt;tbody&gt;
                &lt;tr&gt;
                  &lt;td&gt;[Using the&lt;/td&gt;
                  &lt;td&gt;Operator](#using-the–operator-1)&lt;/td&gt;
                &lt;/tr&gt;
              &lt;/tbody&gt;
            &lt;/table&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;running-single-command&quot;&gt;Running Single Command&lt;/h2&gt;

&lt;p&gt;Docker Compose allows us to execute commands inside a Docker container. During the container startup, we can set any command via the command instruction.&lt;/p&gt;

&lt;p&gt;Let’s take a look at a docker-compose.yml, which runs a simple command inside a container:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;version: &quot;3&quot;
services:
 server:
   image: alpine
   command: sh -c &quot;echo &quot;ars-electronica&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the above docker-compose.yml file, we are executing a single echo command inside the alpine Docker image.&lt;/p&gt;

&lt;h2 id=&quot;running-multiple-commands&quot;&gt;Running Multiple Commands&lt;/h2&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;We can use Docker Compose to manage multiple applications by creating services in the docker-compose.yml file. Specifically, we’ll use the &amp;amp;&amp;amp; and&lt;/td&gt;
      &lt;td&gt;operators. Let’s take a look at both.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;using-the--operator&quot;&gt;Using the &amp;amp;&amp;amp; Operator&lt;/h3&gt;

&lt;p&gt;We’ll start by creating a simple docker-compose.yml file to demonstrate how Docker Compose runs multiple commands:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;version: &quot;3&quot;
services:
 server:
   image: alpine
   command: sh -c &quot;echo &quot;ars-electronica&quot; &amp;amp;&amp;amp; echo &quot;docker&quot; &quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, we used alpine as the base image for the Docker container. Notice the last line where we’re executing two commands: echo ars-electronica and echo docker. They are split by the &amp;amp;&amp;amp; operator.&lt;/p&gt;

&lt;p&gt;To demonstrate the result, let’s run this image using the docker-compose up command:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ docker-compose up
Creating dockercompose_server_1 ... done
Attaching to dockercompose_server_1
server_1  | ars-electronica
server_1  | docker
dockercompose_server_1 exited with code 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, the output of both echo statements is printed on the stdout.&lt;/p&gt;

&lt;h3 id=&quot;using-the--operator-1&quot;&gt;Using the | Operator&lt;/h3&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;We can also use the&lt;/td&gt;
      &lt;td&gt;operator to run multiple commands in Docker Compose. The syntax of the&lt;/td&gt;
      &lt;td&gt;operator is a bit different from the &amp;amp;&amp;amp; operator.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;To illustrate how the&lt;/td&gt;
      &lt;td&gt;operator works, let’s update our docker-compose.yml:&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;version: &quot;3&quot;
services:
 server:
   image: alpine
   command:
      - /bin/sh
      - -c
      - |
        echo &quot;ars-electronica&quot;
        echo &quot;docker&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, we added the commands on separate lines. Everything is the same except for the command instruction.&lt;/p&gt;

&lt;p&gt;This approach is recommended as it keeps our YAML file clean since all commands are in a separate line.&lt;/p&gt;

&lt;p&gt;Let’s again run the Docker container with the docker-compose up command:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ docker-compose up
Creating dockercompose_server_1 ... done
Attaching to dockercompose_server_1
server_1  | ars-electronica
server_1  | docker
dockercompose_server_1 exited with code 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As we can see from the above output, both commands are executed one by one.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;In this article, we demonstrated how to execute multiple commands in Docker Compose. First, we saw how to execute more than one command using the &amp;amp;&amp;amp; operator. Later, we used the&lt;/td&gt;
      &lt;td&gt;operator to achieve similar results.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        <pubDate>Fri, 13 Oct 2023 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/docker-compose-multiple-commands</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/docker-compose-multiple-commands</guid>
      </item>
    
      <item>
        <title>¿Qué es MODBUS? ¿Cómo funciona?</title>
        <description>&lt;h1 id=&quot;protocolo-modbus-fundamentos-y-aplicaciones&quot;&gt;Protocolo Modbus: Fundamentos y aplicaciones&lt;/h1&gt;

&lt;p&gt;El protocolo &lt;a href=&quot;http://www.modbus.org/&quot; title=&quot;The Modbus Organization&quot;&gt;Modbus&lt;/a&gt; es un protocolo abierto, es una estructura de mensajes desarrollada por Modicon en la decada de los 70, utilizada para comunicaciones entre dispositivos maestro-esclavo/cliente-servidor. Modicon fue posteriormente adquirida por Schneider y los derechos sobre el protocolo fueron liberados por la Organización Modbus. Muchos equipamientos industriales utilizan Modbus como protocolo de comunicación, y gracias a sus características:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Protocolo abierto&lt;/li&gt;
  &lt;li&gt;Simplicidad.&lt;/li&gt;
  &lt;li&gt;Facilidad.&lt;/li&gt;
  &lt;li&gt;Es el protocolo más utilizado en la automatización industrial.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;indice-de-contenido&quot;&gt;Indice de contenido&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#qué-es-el-protocolo-modbus&quot;&gt;¿Qué es el protocolo Modbus?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#cómo-funciona-modbus&quot;&gt;¿Cómo funciona MODBUS?&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#capa-física&quot;&gt;Capa física&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#rs-232&quot;&gt;Modbus RS232&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#rs-485&quot;&gt;Modbus RS485&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#ethernet&quot;&gt;Modbus TCP&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#direccionamiento&quot;&gt;Direccionamiento&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#modelo-de-datos&quot;&gt;Modelo de datos&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#código-de-las-funciones&quot;&gt;Código de las funciones&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#modos-de-transmisión&quot;&gt;Modos de transmisión&lt;/a&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#modbus-ascii&quot;&gt;MODBUS ASCII&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#modbus-rtu&quot;&gt;MODBUS RTU&lt;/a&gt; (Remote Terminal Unit)&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#modbus-tcp-ip-con-mbap&quot;&gt;MODBUS TCP&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;qué-es-el-protocolo-modbus&quot;&gt;¿Qué es el protocolo Modbus?&lt;/h2&gt;

&lt;p&gt;Modbus es un protocolo de comunicación situado en los niveles 1, 2 y 7 del Modelo OSI, basado en la arquitectura maestro/esclavo(o cliente/servidor si hablamos de su versión Ethernet) es uno de los protocolos mas utilizados en automatización industrial, gracias a que es un protocolo abierto,  a su simplicidad y facilidad de implementación.&lt;/p&gt;

&lt;h2 id=&quot;cómo-funciona-modbus&quot;&gt;¿Cómo funciona MODBUS?&lt;/h2&gt;

&lt;p&gt;En la figura de abajo vemos un ejemplo de red con el protocolo Modbus, con una gateway haciendo la conexión entre los dos tipos de Modbus, el serial sobre RS-485 y el TCP/IP en ethernet. En el mercado existe la opción de gateway Modbus Wireless. El maestro de la red, que en este caso es un PLC enviá y recibe datos de los esclavos, que son un inversor de frecuencia, una HMI, un controlador de temperatura y una interfaces de I/O remota Modbus.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Ejemplo de una red Modbus rs485 y tcp&quot; title=&quot;Ejemplo de una red Modbus&quot; src=&quot;/assets/ejemplo-red-modbus-2fa5ceab6e7b2d436457da73b83bfa606711f382ce755ae983195800dfa997cf.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;La estación maestro inicia la comunicación solicitando que los esclavos envíen sus datos. Los esclavos, por su parte, reciben el pedido del maestro y devuelven los datos solicitados. Los datos transmitidos pueden ser discretos o números, es decir, es posible enviar un bit para encender o apagar un motor o enviar valores numéricos como temperatura y presión.&lt;/p&gt;

&lt;h3 id=&quot;capa-física&quot;&gt;Capa física&lt;/h3&gt;

&lt;p&gt;Es importante no confundir protocolo de comunicación con estándares físicos. Algunos protocolos posen un estándar físico definido como el caso de la red ASI y de la red CAN, siendo que en esos casos el estándar fisico esta definido junto al protocolo y no es posible alterarlo.&lt;/p&gt;

&lt;p&gt;MODBUS no especifica cuál es la capa física, pudiendo ser utilizado en diversos estándares de capa física como:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;RS-232&lt;/li&gt;
  &lt;li&gt;RS-485&lt;/li&gt;
  &lt;li&gt;Ethernet TCP/IP (MODBUS TCP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La velocidad de comunicación varia en cada uno de estos estándares, así como la longitud máxima de la red y el numero de dispositivos máximos conectados.&lt;/p&gt;

&lt;h4 id=&quot;rs-232&quot;&gt;RS-232&lt;/h4&gt;

&lt;p&gt;El estándar RS-232 (Recommendad Standart-232) o EIA-232(Electronic Industries Alliance-232) es utilizado solamente en comunicaciones del tipo punto a punto, es decir, solo admite dos dispositivos en la red, que en el caso del protocolo Modbus representan un maestro y un esclavo. La velocidad máxima de este estándar esta en torno a los 115Kbps, pero en algunos casos pueden ser encontradas tasas un poco mayores, la distancia máxima entre los dispositivos de la red es de unos 30m.&lt;/p&gt;

&lt;h4 id=&quot;rs-485&quot;&gt;RS-485&lt;/h4&gt;

&lt;p&gt;El estándar RS-485(Recommendad Standart-485) o EIA-485(Electronic Industries Alliance-485) es muy utilizado en la industria y sin dudas es uno de los estándares mas utilizados por el protocolo Modbus. La gran diferencia con RS-232, es que permite mas de dos dispositivos por lo que se pueden tener varios esclavos en la red. Ademas, este estándar permite trabajar con tasas de comunicación que pueden llegar hasta 12Mbps y en algunos casos hasta 50Mbps, vale la pena recordar que cuando mayor es la longitud de la red menor sera la velocidad de comunicación, la distancia máxima de la red es de 1200m, y el numero máximo de dispositivos en la red es de 32.&lt;/p&gt;

&lt;h4 id=&quot;ethernet&quot;&gt;Ethernet&lt;/h4&gt;

&lt;p&gt;El estándar Ethernet en el protocolo Modbus posee algunas variaciones, pudiendo llegar a 100Mbps y hasta 10Gbps. La distancia máxima puede varias de 100m hasta los 200m dependiendo del tipo de cable utilizado y de las condiciones de instalación del mismo.
En algunos casos es posible utilizar redes de fibra óptica, lo que permite alcanzar mayores distancias y mejores tasas de comunicación, así como utilizar comunicación wireless.&lt;/p&gt;

&lt;p&gt;Al utilizar el medio físico Ethernet el protocolo MODBUS opera con el mecanismo de control de acceso CSMA-CD, que es propio de la red Ethernet, con mensajes en el modelo cliente-servidor.&lt;/p&gt;

&lt;h2 id=&quot;direccionamiento&quot;&gt;Direccionamiento&lt;/h2&gt;
&lt;p&gt;El protocolo Modbus tiene 256 direcciones donde:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;0(cero) es la dirección de Broadcast, cuando el maestro enviá un mensaje a la dirección 0, todos los esclavos reciben el mensaje.&lt;/li&gt;
  &lt;li&gt;1 a 247 son direcciones de dispositivos para los esclavos.&lt;/li&gt;
  &lt;li&gt;248 hasta 255 son direcciones reservadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El maestro no posee dirección, solamente los esclavos deben poseer una dirección definida.&lt;/p&gt;

&lt;h2 id=&quot;modelo-de-datos&quot;&gt;Modelo de datos&lt;/h2&gt;
&lt;p&gt;En el modelo de datos Modbus se distinguen 4 tipos de objetos diferentes los cuales tienen un tamaño diferente.
En la siguiente table se observan cuáles son estos tipos de objetos y sus tamaños respectivos.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Tipo de objeto&lt;/th&gt;
      &lt;th&gt;Acceso&lt;/th&gt;
      &lt;th&gt;Tamaño&lt;/th&gt;
      &lt;th&gt;Direcciones&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Coil&lt;/td&gt;
      &lt;td&gt;Leer/Escribir&lt;/td&gt;
      &lt;td&gt;1 bit(Bool)&lt;/td&gt;
      &lt;td&gt;00001 - 09999&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Discrete input&lt;/td&gt;
      &lt;td&gt;Solo leer&lt;/td&gt;
      &lt;td&gt;1 bit(Bool)&lt;/td&gt;
      &lt;td&gt;10001 - 19999&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Input register&lt;/td&gt;
      &lt;td&gt;Solo leer&lt;/td&gt;
      &lt;td&gt;16 bits(Int)&lt;/td&gt;
      &lt;td&gt;40001 - 49999&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Holding register&lt;/td&gt;
      &lt;td&gt;Leer/escribir&lt;/td&gt;
      &lt;td&gt;16 bits(Int)&lt;/td&gt;
      &lt;td&gt;40001 - 49999&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;No hay definido tipos de objetos para datos flotantes o dobles enteros, debido a la época en la que fue desarrollado el protocolo los PLC no contaban con estos tipos de datos. Pero podemos usar el ingenio para lograrlo, por ejemplo usando dos registros, ya que para un flotante o doble entero necesitamos 32 bits.
De la tabla podes ver que tenemos disponibles hasta 9999 variables por tipo de dato.&lt;/p&gt;

&lt;h2 id=&quot;código-de-las-funciones&quot;&gt;Código de las funciones&lt;/h2&gt;

&lt;p&gt;El código de la función es con lo que el maestro especifica el tipo de servicio o función solicitada al esclavo(lectura, escritura, etc). En el protocolo Modbus, cada función es utilizada para acceder a un tipo especifico de dato.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Código de función&lt;/th&gt;
      &lt;th&gt;Descripción&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Lectura en bloque de bits del tipo bobina(salida discreta)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Lectura de bloque de bits del tipo entradas discretas&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;Lectura de bloque de registros del tipo holding&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;Lectura de bloque del tipo input&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;Escritura de un único bit del tipo bobina&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;Escritura en un único registro del tipo holding&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;Leer el contenido de 8 estados de excepción&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;Proveer una serie de test para verificación de la comunicación y errores internos&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;Obtener el contador de eventos&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;12&lt;/td&gt;
      &lt;td&gt;Obtener un informe de eventos&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;15&lt;/td&gt;
      &lt;td&gt;Escritura en bloque de bits del tipo bobina&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;16&lt;/td&gt;
      &lt;td&gt;Escritura en bloque de registros del tipo holding&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;17&lt;/td&gt;
      &lt;td&gt;Leer algunas informaciones del dispositivo&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;20&lt;/td&gt;
      &lt;td&gt;Leer informaciones de un archivo&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;21&lt;/td&gt;
      &lt;td&gt;Escribir información en un archivo&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;22&lt;/td&gt;
      &lt;td&gt;Modificar el contenido de registros de espera a través de operaciones lógicas&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;23&lt;/td&gt;
      &lt;td&gt;Combina leer y escribir en registros en una única transacción&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;24&lt;/td&gt;
      &lt;td&gt;Leer el contenido de la fila FIFO de registros.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;43&lt;/td&gt;
      &lt;td&gt;Identificación del modelo de dispositivo&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;modos-de-transmisión&quot;&gt;Modos de transmisión&lt;/h2&gt;

&lt;p&gt;En las especificaciones del protocolo están definidos dos modos de transmisión:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;ASCII&lt;/li&gt;
  &lt;li&gt;RTU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin embargo existen numerosas variantes del protocolo MODBUS, qué vamos a nombrar las más utilizadas:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;MODBUS ASCII&lt;/li&gt;
  &lt;li&gt;MOBBUS RTU&lt;/li&gt;
  &lt;li&gt;MODBUS TCP/IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los modos definen la forma en como son transmitidos los bytes del mensaje, y como la información del mensaje sera empaquetada en el mensaje y desempaquetada. No es posible utilizar los dos modos de transmisión en la misma red. El modo de transmisión puede ser seleccionado junto con otros parámetros del puerto de comunicación serial, aunque existen equipamientos que no permiten esa selección, pues poseen modo de transmisión fijo, como por ejemplo algunos PLC e inversores de frecuencia que utilizan el modo RTU por defecto.&lt;/p&gt;

&lt;h3 id=&quot;modbus-ascii&quot;&gt;MODBUS ASCII&lt;/h3&gt;

&lt;p&gt;Cuando los equipos son configurados para que se comuniquen en una red Modbus usando ASCII, cada byte en un mensaje es enviado como dos caracteres ASCII. A pesar generar mensajes legibles por la tabla ASCII este modo consume mas recursos de la red. La principal ventaja de esta modalidad es que permite intervalos de tiempo cercanos a un segundo entre dos caracteres sin causar error.&lt;/p&gt;

&lt;p&gt;Los dispositivos monitorean constantemente la rede para determinar el inicio de un mensaje. El inicio de un mensaje es reconocido por el carácter ‘:’(dos puntos), mientras que los del final de la trama son el “retorno de carro”(CR) y el “salto de línea” (LF).&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Tabla que representa la trama MODBUS ASCII&quot; title=&quot;Trama Modbus ASCII&quot; src=&quot;/assets/trama-modbus-ascii-a5408acbe2ad0d75bfb2f981f191ca3019a8814c957fb3fcbfe961dfbf81a788.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;El formato de la trama es el siguiente:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Nombre&lt;/th&gt;
      &lt;th&gt;Longitud (Bytes)&lt;/th&gt;
      &lt;th&gt;Función&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Inicio&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Comienza con el carácter ‘:’&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Dirección&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Dirección del esclavo&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Función&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;indica el código de la función&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Datos&lt;/td&gt;
      &lt;td&gt;n x 2&lt;/td&gt;
      &lt;td&gt;Datos + La longitud se rellena dependiendo del tipo de mensaje&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LRC&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Verificación de redundancia longitudinal (LCR)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Fin&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Retorno de Carro + Avance de linea(CR y LF)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Intervalos de hasta un segundo son permitidos entre caracteres de un mensaje, se ocurre un intervalo mayor, el dispositivo receptor asume que ocurrió un error.&lt;/p&gt;

&lt;h3 id=&quot;modbus-rtu&quot;&gt;MODBUS RTU&lt;/h3&gt;

&lt;p&gt;En el modo RTU(Remote Terminal Unit), cada mensaje de 8 bits contiene dos caracteres hexadecimales de 4 bits. La principal ventaja de este modo es que su mayor densidad de caracteres permite un mejor procesamiento de datos que el modo ASCII para un mismo baudrate, ya que usa menos bits por cada dato a enviar. Cada mensaje debe ser transmitido en un flujo continuo de caracteres.&lt;/p&gt;

&lt;p&gt;En el modo RTU no existe un carácter especifico que indique el inicio o fin de la trama. La indicación de cuando un nuevo mensaje comienza o cuando termina es por la ausencia de transmisión de datos en la red, por un tiempo mínimo de 3,5 veces el tiempo de transmisión de un byte de datos. Siendo asi, si un telegrama se inició después de que se produjo ese tiempo mínimo, los elementos de la red asumen que el primer caracter recibido representa el inicio de un nuevo telegrama. Y de la misma forma, los elementos de la red asumen que finalizado la entrega del telegrama, cuando este tiempo se cumple.&lt;/p&gt;

&lt;p&gt;Si durante la transmisión de un mensaje el tiempo entre los bytes es mayor que este tiempo mínimo, el mensaje se considerará inválido, el controlador descartará los bytes recibidos y montará un nuevo mensaje con los bytes que se están transmitiendo.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Tabla que representa la trama MODBUS RTU&quot; title=&quot;Trama Modbus RTU&quot; src=&quot;/assets/trama-modbus-rtu-ca2d3e0dfaaae9f700efcf56baaf035d821cf2ec1234b28fbd4c10b8d7f7bcee.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;La trama tiene el siguiente formato:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Nombre&lt;/th&gt;
      &lt;th&gt;Longitud (bytes)&lt;/th&gt;
      &lt;th&gt;Función&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Dirección&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Dirección del esclavo&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Función&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;indica el código de la función&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Datos&lt;/td&gt;
      &lt;td&gt;n&lt;/td&gt;
      &lt;td&gt;Datos dependiendo del tipo de mensaje&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CRC&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://es.wikipedia.org/wiki/Verificaci%C3%B3n_de_redundancia_c%C3%ADclica&quot;&gt;Verificación de redundancia cíclica&lt;/a&gt; (CRC)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;modbus-tcpip-con-mbap&quot;&gt;MODBUS TCP/IP con MBAP&lt;/h3&gt;

&lt;p&gt;MDBUS TCP es una implementación del protocolo Modbus basado en TCP/IP, Utiliza la pila TCP/IP para la comunicación y adiciona un encabezado especifico llamado MBAP(MODBUS Application Protocol). El modelo de mensaje de MODBUS TCP/IP tiene la siguiente forma:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Tabla que representa la trama MODBUS TCP/IP con MBAP&quot; title=&quot;Trama Modbus TCP/IP con MBAP&quot; src=&quot;/assets/trama-modbus-tcp-aaa240e7e579dde2c8287c368271bbdfabe7ddb301487710409b2ead3dbb0398.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;El encabezado MBAP tiene un tamaño de 7 bytes, y esta compuesto por los siguientes campos&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Nombre&lt;/th&gt;
      &lt;th&gt;Longitud (bytes)&lt;/th&gt;
      &lt;th&gt;Función&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Transaction identifier&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Sincronización de mensajes entre cliente y servidor&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Protocol&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;El valor 0(cero) indica Modbus/TCP&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Lenght&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Cantidad de bytes en la trama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Unit Identifier&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Utilizado para identificar al esclavo remoto en una red Modbus RTU&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Para completar la trama:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Nombre&lt;/th&gt;
      &lt;th&gt;Longitud (bytes)&lt;/th&gt;
      &lt;th&gt;Función&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Función&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;indica el código de la función&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Datos&lt;/td&gt;
      &lt;td&gt;n&lt;/td&gt;
      &lt;td&gt;Datos dependiendo del tipo de mensaje&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Notar que la trama completa es similar a la del MODBUS RTU, pero se reemplaza Dirección y CRC por el MBAP. La gestión de errores recae sobre el protocolo Ethernet.&lt;/p&gt;

&lt;p&gt;El identificador de unidad(Unit Identifier) se utiliza con dispositivos que están detrás de una pasarela Modbus/TCP a Modbus RTU.&lt;/p&gt;

&lt;p&gt;Al principio cuando a uno le hablan de Modbus, y piensa en industrias, PLC, automatismo, piensa en que puede ser algo complejo y difícil de implementar. Pero es como pudimos ver es un protocolo sencillo, liviano y simple. Con la particularidad y gran ventaja de que es abierto. Es por todo esto que también existen librerías para poder implementar Modbus en Arduino y en casi cualquier placa electrónica actual.&lt;/p&gt;

&lt;p&gt;Créditos:&lt;/p&gt;

&lt;p&gt;Imágenes de portada creada con &lt;a href=&quot;https://www.freepik.com/free-photos-vectors/business&quot;&gt;vector creado por macrovector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://es.wikipedia.org/wiki/Modbus&quot;&gt;Modbus Wikipedia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.embarcados.com.br/protocolo-modbus/&quot;&gt;Protocolo Modbus - Embarcados&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 07 Mar 2019 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/que-es-modbus-funcionamiento</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/que-es-modbus-funcionamiento</guid>
      </item>
    
      <item>
        <title>CD4511 decodificador para display 7 segmentos</title>
        <description>&lt;h2 id=&quot;para-qué-sirve-el-cd-4511&quot;&gt;¿Para qué sirve el CD 4511?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.upgradeindustries.com/media/img/hi_res/hi_res_4511-decoder.jpg&quot; alt=&quot;Circuito Integrado CD4511&quot; title=&quot;Circuito Integrado CD4511&quot; /&gt;
El CD4511 es un decodificador bcd para display de 7 segmentos.&lt;/p&gt;

&lt;p&gt;El display de 7 segmentos es un componente bastante empleado en el mundo de la electrónica, ya que permite que sea muy simple la exhibición de valores numéricos. Pudiendo representar cifras de 0 a 9 y esto ciertamente lo vemos día a día en la aplicación diaria.&lt;/p&gt;

&lt;p&gt;Puede ser aplicado también en ambientes industriales para ejecutar funciones como:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Exhibir la cuenta de piezas en un determinado proceso.&lt;/li&gt;
  &lt;li&gt;Exhibir la temperatura de un alto horno en la fundición de metales.&lt;/li&gt;
  &lt;li&gt;Exhibir las rpm de una máquina.&lt;/li&gt;
  &lt;li&gt;Mostrar la cantidad de aceite lubricante restante en un reservorio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los display de 7 segmentos son empleados la mayoría de las veces a partir de circuitos digitales como circuitos integrados, microcontroladores y otros procesos que trabajan en sistema binario, cuyo sistema y representación es apenas realizado por dos niveles lógicos 0 y 1 denominados bits. Resultando la parejas &lt;strong&gt;cd4511 y display 7 segmentos&lt;/strong&gt; una herramienta muy útil para estos casos, tambien es comun el duo &lt;strong&gt;cd5411 y cd4510&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En el mercado encontramos con diversos codificadores y decodificadores. Cada uno posee características específicas y limitaciones de uso, basta saber a partir de su hoja de datos cuál de ellas es la más adecuada para el proyecto.&lt;/p&gt;

&lt;p&gt;Uno de los decodificadores bcd más utilizado para mostrar números de 0 a 9 en display de 7 segmentos cátodo común es el CD 4511.&lt;/p&gt;

&lt;h2 id=&quot;funcionamiento-cd4511&quot;&gt;Funcionamiento CD4511&lt;/h2&gt;

&lt;p&gt;El CD4511 es un decodificador bcd de 4 bits para display cátodo común, que utiliza tecnología cmos. Recibe en los Pines de entrada a ABCD los datos en código binario y los decodifica a código decimal, siendo posible su exhibición en los display de 7 segmentos.&lt;/p&gt;

&lt;p&gt;El Funcionamiento del cd4511 puede ser visualizado a través de su tabla de verdad. Solo se muestra la decodificación BCD:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabla de la verdad CD4511&lt;/strong&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Pines BCD&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Salida a Display&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Digito&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;A B C D&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;a b c d e f g&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 0 0 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 1 1 1 1 1 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 0 0 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 1 1 0 0 0 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 0 1 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 1 0 1 1 0 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 0 1 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 1 1 1 0 0 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 1 0 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 1 1 1 0 1 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 1 0 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 0 1 1 0 1 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 1 1 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 0 1 1 1 1 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0 1 1 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 1 1 0 0 0 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 0 0 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 1 1 1 1 1 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;8&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 0 0 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 1 1 0 0 1 1&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;9&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Para realizar un proyecto electrónico utilizando el CD4511 es necesario conocer sus características físicas y limitaciones de uso que están disponibles por sus fabricantes a través de sus respectivas hojas de datos.&lt;/p&gt;

&lt;p&gt;Las características más importantes que podemos considerar se encuentran:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Tensión de operación: 3V a 18V de corriente continua.&lt;/li&gt;
  &lt;li&gt;Corriente de salida: 10mA.&lt;/li&gt;
  &lt;li&gt;Temperatura de operación: -55ºC a 125ºC.&lt;/li&gt;
  &lt;li&gt;Configuración de pines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada pin de salida corresponde a un segmento del display,  basta con hacer las conexiones y enviar las informaciones binarias a las entradas,  luego CD4511 decodifica el código bcd y escribe la información en cifras decimales en el display.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://www.electrontools.com/Home/WP/wp-content/uploads/2016/03/7s.jpg&quot; alt=&quot;Display 7 Segmentos&quot; title=&quot;Display 7 Segmentos&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Este Circuito integrado es especifico para trabajar con diplay de 7 segmentos de cátodo comuún, en el caso de querer usar el &lt;strong&gt;CD 4511 con ánodo común&lt;/strong&gt; se debe recurrir a un circuito inversor o usar otro circuito integrador decodificador.&lt;/p&gt;

&lt;p&gt;Tenemos a disposición 3 Pines del CD4511 que pueden tener gran aplicación en diversos proyectos, brindando funciones como:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Economizar Batería.&lt;/li&gt;
  &lt;li&gt;Registrar el ultimo dígito exhibido en el display.&lt;/li&gt;
  &lt;li&gt;Testear los segmentos del display, para validar su funcionamiento y el cableado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos pines y su funcionamiento son:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Lamp Test LT(Pin 3): Este pin nos sirve para probar todos los segmentos. Debido a que es una entrada inversora, para tener un funcionamiento normalizado esta entrada debe estar en 1. Cuando la entrada toma un valor lógico 0 prende todos los segmentos del display para testear el funcionamiento.&lt;/li&gt;
  &lt;li&gt;Blank Input BI(Pin 4): Apaga todos los segmentos, tenér en cuenta que esto es una entrada inversora, por lo tanto para tener un funcionamiento normal del CI esta entrada precisa estar en 1.&lt;/li&gt;
  &lt;li&gt;Lath Enable LE(Pin 5): congela el último dígito exhibido en el display 7 segmentos después de recibir un 1 lógico. Para obtener un funcionamiento normal del CD4511 esta entrada precisa estar en 0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Descargar: &lt;a href=&quot;https://www.ti.com/lit/ds/symlink/cd4511b.pdf&quot; title=&quot;Download CD4511 Datasheet&quot;&gt;&lt;strong&gt;CD4511 Datasheet&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 26 Aug 2017 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2017/08/cd4511-decodificador-para-display-7.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2017/08/cd4511-decodificador-para-display-7.html</guid>
      </item>
    
      <item>
        <title>CD4510: Contador ascendente o descendente.</title>
        <description>&lt;p&gt;Considere una situación donde de manera simple y objetiva se presenta la necesidad de un contador automático de eventos. Pudiendo ser la cantidad de piezas producidas en un proceso, secuenciar el tiempo funcionamiento de determinada máquina, o hasta la cuenta de productos como botellas para embalar en un paquete.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://guideimg.alibaba.com/images/shop/2016/08/22/21/5-pieces-cd4510be-cd4510-cmos-presettable-bcd-up-down-counter_24017021.jpeg&quot; alt=&quot;CD4510&quot; /&gt;&lt;/p&gt;

&lt;p&gt;En electrónica digital esta acción puede ser obtenida de numerosas formas y una de ellas es a través de circuitos contadores. Uno de los componentes más empleados para esta finalidad es el circuito integrado &lt;strong&gt;CD4510&lt;/strong&gt;. Es un &lt;strong&gt;contador sincrónico&lt;/strong&gt; con tecnología CMOS y operen código BCD.&lt;/p&gt;

&lt;p&gt;La cuenta se permite a través de pulsos, pudiendo incrementar o decrementar valores en código BCD en sus salidas. Su funcionamiento es muy simple, vamos describir sus características principales y funciones de cada pin.&lt;/p&gt;

&lt;p&gt;Para realizar un proyecto utilizando el CD4510 es necesario conocer sus características físicas y limitaciones de uso, qué son puesta a disposición por los fabricantes en sus hojas de datos.&lt;/p&gt;

&lt;p&gt;Alguna de las características más importantes del CD4510 que con certeza deben ser consideradas para el montaje de proyectos que se obtienen de la &lt;strong&gt;CD4510 datasheet&lt;/strong&gt; son:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tension minima de trabajo: 5V DC&lt;/li&gt;
  &lt;li&gt;Tensión máxima de trabajo 15V DC&lt;/li&gt;
  &lt;li&gt;Corriente de salida: 15mA&lt;/li&gt;
  &lt;li&gt;Velocidad media operación: 80Mhz&lt;/li&gt;
  &lt;li&gt;Pinout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada pin posee una característica importante para el funcionamiento de este circuito integrado.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://www.radiomuseum.org/images/tubesockel_klein/cd4510_s.gif&quot; alt=&quot;CD4510 PinOut&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Clock&lt;/strong&gt;
El pin de CLOCK es el responsable de recibir la señal de entrada de CLOCK, esta señal puede ser obtenida a través de otros circuitos digitales como microcontroladores, sensores, llaves, etcétera.
Una señal de CLOCK es nada más que una señal que oscila
 entre niveles lógicos de 0 y 1
Este componente registra el CLOCK en el momento ascendente es decir en el flanco de subida.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;UP/DOWN&lt;/strong&gt;
El Pin Up down pin número 10 es el responsable de hacer la Selección del tipo de cuenta, es decir si va ser ascendente o decreciente. Enviando un nivel lógico alto , un uno, la cuenta es ascendente por el contrario enviando un nivel lógico lógico bajo, un 0, la cuenta es descendiente.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt; A, B, C, y D(Q1, Q2, Q3, Q4)
Los pines de salida es decir los fines que forman el código bcd son los pines A, B, C y D, respectivamente serían los pines números 6, 11, 14 y 2&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Count Enable - CI&lt;/strong&gt;
Este pin es el responsable de habilitar o Deshabilitar la cuenta, en este caso la cuenta se detiene con un nivel lógico en alto y por el contrario la cuenta se habilita con el nivel lógico bajo.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Load Input - Entradas&lt;/strong&gt;
Si se desea precargar el contador o con un valor establecido se puede realizar a través del pin de cargar entrada y con los pines de entrada. El pin para habilitar la la carga de entrada es el pin número uno y con un nivel alto se habilita. Inmediatamente se transfiere la cuenta que tengamos en la entrada a la salida.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Carry Out&lt;/strong&gt;
Este pin(numero 7) nos permite obtener muchas aplicaciones prácticas, como por ejemplo obtener valores de dos o más cifras decimales en display de 7 segmentos.
Genera un pulso de CLOCK cada vez que se completa un ciclo de cuenta tanto en el incremento como el decremento, en el caso del incremento es cuando la cuenta pasa de 9 a 0 y en el decremento cuando pasa de 0 a 9.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;RESET&lt;/strong&gt;
Este circuito integrado permite la reinicialización de la cuenta es decir volver la cuenta 0, esto se realiza a través del pin de reset número 9 que con un nivel lógico en alto reinicia la cuenta.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una de las &lt;strong&gt;aplicaciones&lt;/strong&gt; más comunes del contador sincrónico &lt;strong&gt;CD4510&lt;/strong&gt; es la utilización de &lt;strong&gt;display de 7 segmentos&lt;/strong&gt; conjunto al &lt;strong&gt;decodificador BCD CD4511&lt;/strong&gt;. EL CD4510 realiza la cuenta y emite el código BCD en sus salidas, el decodificador CD4511 recibe ese mismo código en sus entradas y decodifica los números decimales dando la posibilidad entonces de exhibir los números en los display de 7 segmentos.&lt;/p&gt;
</description>
        <pubDate>Wed, 23 Aug 2017 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2017/08/cd4510-contador-ascendente-descendente.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2017/08/cd4510-contador-ascendente-descendente.html</guid>
      </item>
    
      <item>
        <title>Recordando a Dennis(Criptografía y seguridad)</title>
        <description>&lt;p&gt;Me demore un poquito con la publicacion de este problema del &lt;a href=&quot;https://blog.ars-electronica.com.ar/2016/04/que-es-coding-contest.html&quot; title=&quot;Coding Contest&quot;&gt;coding contest&lt;/a&gt;, pero aca esta. Fue el problema que mas me motivo cuando lei de que trataba. Es un problema sobre &lt;strong&gt;criptografia&lt;/strong&gt; y &lt;strong&gt;seguridad informatica&lt;/strong&gt;. Veamos de que trata:&lt;/p&gt;

&lt;h2 id=&quot;enunciado&quot;&gt;Enunciado&lt;/h2&gt;
&lt;p&gt;Dennis fue uno de los diseñadores del sistema UNIX junto a Ken. Lamentablemente falleció en 2011, en la misma semana que Steve Jobs. El otro funeral se llevó toda la atención, pero su amigo Ken pudo recuperar las líneas del archivo /etc/shadow correspondientes al usuario dennis de tres sistemas de diferentes épocas:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dennis:ox45K6RsEUfmQ:
dennis:$1$42dJ1xYh$MfrRke8/Ej3h5.vMtNEhC.:
dennis:$6$SZGpKoPi$GGGqHYKy6PO/H5nvV0AmaGB/5krnxVuz2k2uX81O.CF5nYctE5RlR/rzJQCL3ZsF8yratCRbSR2ZuwKzvve.D0:
Dennis siempre usaba letras minúsculas para sus passwords, y éstos nunca tenían más de seis caracteres.

 - ¿Cómo se llamaba el perro de Dennis?
 - ¿Cuál era su color favorito?
 - ¿De qué equipo era hincha?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;resolucion&quot;&gt;Resolucion&lt;/h2&gt;
&lt;p&gt;Hay que saber que existen varios &lt;strong&gt;archivos importantes&lt;/strong&gt; en un sistema &lt;strong&gt;Linux&lt;/strong&gt;, que almacenan información referente a los usuarios y al sistema.&lt;/p&gt;

&lt;p&gt;Dos archivos importantes son &lt;strong&gt;/etc/passwd&lt;/strong&gt; y &lt;strong&gt;/etc/shadow&lt;/strong&gt;. Inicialmente las contraseñas de los usuarios eran almacenadas en el archivo /etc/passwd, pero esto suponia un riesgo ya que dicho archivo podia ser accedido por cualquier usuario. Posteriormente para mejorar la seguridad lo que se hizo fue almacenar los &lt;strong&gt;hash de las contraseñas&lt;/strong&gt; en el archivo /etc/shadow al cual solo pueda tener acceso el &lt;strong&gt;usuario root&lt;/strong&gt;, quedando en el archivo /etc/passwd informacion del usuario como nombre completo, username, directorio home, entre algunos otros mas.&lt;/p&gt;

&lt;p&gt;Generalmente en cualquier &lt;strong&gt;sistema informático&lt;/strong&gt; medianamente seguro, &lt;strong&gt;la contraseña no se almacena en texto plano&lt;/strong&gt; sino que se &lt;strong&gt;hashea&lt;/strong&gt;, es decir se le aplica alguna &lt;a href=&quot;https://es.wikipedia.org/wiki/Funci%C3%B3n_hash&quot; title=&quot;Funcion hash wikipedia&quot;&gt;funcion de hash&lt;/a&gt; y se guarda el hash resultante. Posteriormente lo que se hace para realizar el logeo, es cuando el usuario se logea, se le aplica la misma funcion de hash al password que ingresa, y se comparan ambos hash, en caso de ser correcto el login es satisfactorio.&lt;/p&gt;

&lt;p&gt;Analizando una de las lineas del archivo /etc/shadow se observa:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dennis:$1$42dJ1xYh$MfrRke8/Ej3h5.vMtNEhC.:
   |    |      |           |
 user  id     salt       hash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Cada linea representa al usuario, en este caso dennis, y una cadena que contiene la informacion del password.
Esta cadena esta compuesta de varios campos que se encuentran separados por “$”.
Estos campos representan:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;id : es el identificador de la funcion hash utilizada&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;ID&lt;/th&gt;
      &lt;th&gt;algoritmo&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;DES&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;MD5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Blowfish&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;SHA-256&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;SHA-512&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;salt : es un dato aleatorio que se agrega a la funcion de hash, disminuyendo la efectividad de los ataques por diccionario lo que aumenta la seguridad.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;hash : es el hash resultante de la contraseña y el salt.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mirando el fichero del problema&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dennis:ox45K6RsEUfmQ:
dennis:$1$42dJ1xYh$MfrRke8/Ej3h5.vMtNEhC.:
dennis:$6$SZGpKoPi$GGGqHYKy6PO/H5nvV0AmaGB/5krnxVuz2k2uX81O.CF5nYctE5RlR/rzJQCL3ZsF8yratCRbSR2ZuwKzvve.D0:
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;En el primer caso se uso &lt;a href=&quot;https://es.wikipedia.org/wiki/Data_Encryption_Standard&quot; title=&quot;Data Encryption Standard&quot;&gt;DES&lt;/a&gt;, en el segundo &lt;a href=&quot;https://es.wikipedia.org/wiki/MD5&quot; title=&quot;MD5 Wikipedia&quot;&gt;MD5&lt;/a&gt;, y en el ultimo &lt;a href=&quot;https://es.wikipedia.org/wiki/Secure_Hash_Algorithm&quot; title=&quot;SHA Wikipedia&quot;&gt;SHA-512&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Conociendo el algoritmo utilizado y el salt se va a empezar por un &lt;strong&gt;ataque de diccionario&lt;/strong&gt; y en caso de no encontrar la solucion se pasa a un &lt;strong&gt;ataque por fuerza bruta&lt;/strong&gt;.
En el caso del ataque por diccionario, primero se usara un diccionario que contiene los passwords mas utilizados, obtenido de &lt;strong&gt;Jhon the Ripper&lt;/strong&gt;, y el segundo diccionario a probar, es el archivo de words comunes presente en el sistema Debian(generalmente es un diccionario de palabras americanas).&lt;/p&gt;

&lt;p&gt;La &lt;strong&gt;generación de los hashes&lt;/strong&gt; se realiza  con la libreria &lt;strong&gt;crypt&lt;/strong&gt; de python, que es una implementacion de la utilidad de sistema crypt().&lt;/p&gt;

&lt;p&gt;Una particularidad del problema es que las contraseñas son todas en minúsculas y no tienen mas de 6 caracteres.
Por lo que las palabras del diccionario se pasaran todas a minusculas y se evitan las que superen la longitud máxima.&lt;/p&gt;

&lt;p&gt;El script resultante que propusé es:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/asperduti/4cd4c1ac2e77fa54368325a6eceeac5f.js&quot;&gt;&lt;/script&gt;

&lt;h3 id=&quot;ejecucion-del-script&quot;&gt;Ejecucion del Script&lt;/h3&gt;
&lt;p&gt;El script utilizado esta programado en Python 2.7 y hace uso de las librerias crypt, sys y time.
De la siguiente forma se invoca al script:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python getpass.py shadowfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Donde shadowfile el archivo shadow con las contraseñas.
Para este caso seria&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python getpass.py shadowfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;El programa lee linea por linea el archivo y pregunta para que password se quiere realizar el crackeo.&lt;/p&gt;

&lt;p&gt;El resultado es:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Se va intentar crackear 3 hashes con una longitud maxima por password de 6
Se va a realizar ataque por diccionario
Se usa el diccionario john.txt
El password para $6$SZGpKoPi$GGGqHYKy6PO/H5nvV0AmaGB/5krnxVuz2k2uX81O.CF5nYctE5RlR/rzJQCL3ZsF8yratCRbSR2ZuwKzvve.D0 es knicks
Enlapsed time:  2.76981282234
El password para $1$42dJ1xYh$MfrRke8/Ej3h5.vMtNEhC. es white
Enlapsed time:  3.18808293343
Se usa el diccionario /etc/dictionaries-common/words
El password para ox45K6RsEUfmQ es fido
Enlapsed time:  3.28093099594
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;El perro de Dennis se llamaba fido. Su color favorito era el blanco, y era incha de los Knicks.
Un detalle es que la palabra “fido” la tomo del diccionario, pero en el mismo se contraba escrito “Fido” con la f mayuscala, si no hubiera pasado las letras a minusculas, se huviera usado la generacion de palabras, y hubiera sido mucho mas lento.
El en caso del ataque de fuerza bruta, la generacion de las palabras no es eficiente, habria que buscar alguna forma de mejorarla.
Una particularidad&lt;/p&gt;
</description>
        <pubDate>Wed, 11 May 2016 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2016/05/hacker-password-linux-criptografia.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2016/05/hacker-password-linux-criptografia.html</guid>
      </item>
    
      <item>
        <title>La inclinacion del Cilindro (3d scanning) </title>
        <description>&lt;h2 id=&quot;enunciado&quot;&gt;Enunciado&lt;/h2&gt;
&lt;p&gt;El archivo cilindro.asc contiene las coordenadas de 1908 puntos que definen un cilindro. Cada línea del archivo corresponde a un punto. Cada línea tiene tres valores que corresponden a las coordenadas x , y y z del punto en un sistema cartesiano.&lt;/p&gt;

&lt;p&gt;a. ¿Cuál es la altura del cilindro?&lt;br /&gt;
b. ¿Cuál es el radio del cilindro?&lt;br /&gt;
c. ¿Cuál es la inclinación del eje del cilindro en radianes con respecto al eje z ?&lt;/p&gt;

&lt;h2 id=&quot;resolucion&quot;&gt;Resolucion&lt;/h2&gt;
&lt;p&gt;Este problema lo resolví(o mejor dicho intenté no quede conforme) 10 minutos antes del cierre del concurso. Sinceramente no tenia una idea clara de como &lt;strong&gt;analizar todos los puntos&lt;/strong&gt; y no encontré información sobre si existe alguna &lt;strong&gt;técnica o algoritmo&lt;/strong&gt; para interpretar la &lt;strong&gt;&lt;a href=&quot;https://es.wikipedia.org/wiki/Nube_de_puntos&quot;&gt;nube de puntos&lt;/a&gt;( &lt;a href=&quot;https://en.wikipedia.org/wiki/Point_cloud&quot;&gt;point cloud&lt;/a&gt; )&lt;/strong&gt; generada a partir de un scanner 3d.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-8iR_N1SSIBQ/VyTsh4fgzSI/AAAAAAAAA0Y/xUtbarFQGjYgOjVKOMAZ6HFEuYyWShiHgCLcB/s320/cilindro1.jpeg&quot; alt=&quot;Imagen descriptiva&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A lo único que atine fue abrirlo con &lt;strong&gt;FreeCad&lt;/strong&gt; y ver si el cilindro se encontraba en alguna posición que me facilitara las cosas. Pensé que podía tener suerte y encontrar que solo este rotado sobre el eje y, y así encontrar la inclinación buscando los puntos extremos, sin embargo no fue así, existía una pequeña rotación en los otros ejes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-Hn2Z0F5VfSM/VyTsiBUrjHI/AAAAAAAAA0c/8KJ2b-WQb6sf_-otr7K9hD7YovFhWtVswCLcB/s320/cilindro2.jpeg&quot; alt=&quot;Imagen descriptiva&quot; /&gt;&lt;/p&gt;

&lt;p&gt;No tenia mucho mas tiempo, así que decidí &lt;strong&gt;despreciar esas pequeñas rotaciones&lt;/strong&gt; y supuse que solo estaba rotado en y.
De este modo busqué los &lt;strong&gt;puntos extremos&lt;/strong&gt;, se busca el mas alto(en z), el mas a la izquierda(en x), el mas a la derecha(en x) y el mas bajo(en z).
Con esos datos se &lt;strong&gt;calculan las distancia&lt;/strong&gt; entre los puntos, necesarios según el dato. Para la altura es la distancia entre el mas alto y el punto mas a la izquierda. Para el radio es la mitad de la distancia entre el mas alto y el mas a la derecha. En el caso del angulo lo calculo como el arcsen() entre el punto mas alto y el mas a la izquierda.&lt;/p&gt;

&lt;p&gt;El &lt;a href=&quot;https://github.com/asperduti/coding-contest-cites2016/blob/master/3-cilindro/cilindro.py&quot;&gt;script esta programado en python&lt;/a&gt; y lo que hace es abrir el archivo y recorrer linea por linea los puntos, e ir comparando las coordenadas x,y,z para determinar si es alguno de los puntos extremos.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/asperduti/10f72d03f9b6ea1f94ef1b35fcb3f07d.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;El resultado de ejecutar el script es el siguiente:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python cilindro.py
La altura del cilindro es : 17.071515
El radio del cilindro es : 7.385974
El angulo(radianes) es : 0.573682
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Las repuestas que dieron desde CITES eran:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;altura = 2⋅e⋅π=17.079468…2⋅e⋅π=17.079468
radio = e²=7.389056…e2=7.389056
angulo= 0.574402
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;La verdad que no quede muy a gusto con la solución que plantee, pero las respuestas estuvieron demasiado precisas.&lt;/p&gt;
</description>
        <pubDate>Sat, 30 Apr 2016 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2016/04/point-cloud-cilindro-3d-scanning.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2016/04/point-cloud-cilindro-3d-scanning.html</guid>
      </item>
    
      <item>
        <title>Un perrito y un pajarito (Cálculo numérico)</title>
        <description>&lt;h2 id=&quot;enunciado&quot;&gt;Enunciado&lt;/h2&gt;
&lt;p&gt;Un perrito esta atado a dos postes A y B separados una distancia unitaria con
dos correas. Cada correa tiene longitud uno.
Un pajarito esta atado a dos puntos C y D separados una distancia unitaria con
dos piolines. Cada piolin tiene longitud uno.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;a. ¿Sobre que superficie puede moverse el perrito?&lt;/li&gt;
  &lt;li&gt;b. ¿Sobre que volumen puede moverse el pajarito?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;superficie-en-la-que-puede-moverse-el-perro&quot;&gt;Superficie en la que puede moverse el perro&lt;/h2&gt;
&lt;p&gt;Este problema del &lt;a href=&quot;https://blog.ars-electronica.com.ar/2016/04/que-es-coding-contest.html&quot;&gt;&lt;strong&gt;Coding Contest&lt;/strong&gt;&lt;/a&gt; se me hizo puramente matemático y con matemática simple, cálculos de áreas, volumen e intersecciones básicamente. No se hizo necesario un script, pero genere algo pequeño para probar con diferentes radios. El problema podría ser mas interesante si los radios y las distancias no fueran la misma. Vamos a la solución que propuse.&lt;/p&gt;

&lt;p&gt;El perro si estuviera atado a un solo punto puede moverse dentro de un
&lt;strong&gt;circulo&lt;/strong&gt;, al estar atado a dos puntos, se puede mover solamente en la
&lt;strong&gt;interseccion de los dos circulos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-L7gJ6i20_dg/VyFQGD69sDI/AAAAAAAAA0E/cH-GMkQbgNkwfv205etWVsmwwk45_FpSQCLcB/s1600/perrito.png&quot; alt=&quot;Imagen descriptiva&quot; /&gt;&lt;/p&gt;

&lt;p&gt;En la intersección de los dos círculos, se pueden distinguir dos &lt;a href=&quot;https://es.wikipedia.org/wiki/Segmento_circular&quot;&gt;segmentos de círculos&lt;/a&gt;, la suma de estas dos áreas es el área buscada. A su vez, los centros de cada uno de los círculos con cada uno de los puntos de intersección forman dos triángulos equilateros de lado R(Radio=1), la suma de las alturas de estos triángulos es la longitud de la cuerda de los segmentos.&lt;/p&gt;

&lt;p&gt;El área de un segmento de circulo es: $\frac{R^{2}}{2}(\Omega - \sin( \Omega ))$ , $\Omega$ es el angulo el arco de circunferencia para el segmento, en este caso es $120º=\frac{2}{3}\Pi$ por los dos triángulos equilateros(los ángulos internos son 60º) antes mencionados.
Entonces: $Area = R^{2}( \frac{2}{3}\Pi - \sin{ ( \frac{2}{3}\Pi ) })=R^{2}( \frac{2}{3}\Pi - \frac{\sqrt 3}{2})$
Para el caso de $ R=1 $ el área resulta $Area = 1,228370$&lt;/p&gt;

&lt;h2 id=&quot;volumen-en-el-que-puede-moverse-el-pajarito&quot;&gt;Volumen en el que puede moverse el pajarito&lt;/h2&gt;
&lt;p&gt;El caso es &lt;strong&gt;análogo&lt;/strong&gt; al anterior, solo que resulta de la &lt;strong&gt;intersección de dos esferas&lt;/strong&gt;, que son en las que se podría mover si solo estuviera atado de un punto&lt;/p&gt;

&lt;p&gt;En este caso la porción de volumen que se puede mover en casa esfera es el volumen correspondiente a un casquete de altura $ h = R \over 2 $ .
La altura(h) del &lt;a href=&quot;https://es.wikipedia.org/wiki/Casquete_esf%C3%A9rico&quot;&gt;&lt;strong&gt;casquete&lt;/strong&gt;&lt;/a&gt; se puede ver en base al problema anterior, pensando los circulos como una vista en corte de las esferas.&lt;/p&gt;

&lt;p&gt;El Volumen de un casquete es: $ \frac{1}{3} \pi h^{2}(3R-h) $ Para el caso es dos veces este volumen, resultando: $ vol = \frac{1}{6}\pi R^{2}(3R-\frac{R}{2})=\frac{5}{12}\pi R^{3} $&lt;/p&gt;

&lt;p&gt;Resultando: $ Volumen = 1,308997 $&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: No es necesario un script, ya que estan expuestas las formulas necesarias y se puede realizar facilmente con una calculadora, de todos modos se planteo un pequeño script, para generar rapidamente soluciones para otros valores de R.
El script esta realizado en python(2.7), y hace uso del modulo math.
Se invoca de la siguiente manera:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python solucion.py R
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;donde R es el radio, en este caso:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python solucion.py 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Thu, 28 Apr 2016 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2016/04/un-perrito-y-un-pajarito-calculo.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2016/04/un-perrito-y-un-pajarito-calculo.html</guid>
      </item>
    
      <item>
        <title>El Primo de Fibonacci - Coding Contest </title>
        <description>&lt;h1 id=&quot;el-primo-de-fibonacci&quot;&gt;El Primo De Fibonacci&lt;/h1&gt;

&lt;p&gt;El primer problema del CITES Coding Contest trataba sobre la sucesion de Fibonacci y los numeros primos:&lt;/p&gt;

&lt;h2 id=&quot;enunciado&quot;&gt;Enunciado&lt;/h2&gt;
&lt;p&gt;Considere la sucesión de Fibonacci cuyo n -ésimo elemento f(n) está definido como&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-1R-xUgOZzQk/VxvOe-w3yiI/AAAAAAAAAzs/Ptb_Pc7y62cBW6nNlHWzbO9tTmL0HFNwACLcB/s1600/sucesion.png&quot; alt=&quot;sucesión de Fibonacci&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a. ¿Para qué valores de n ≤ 90 se da que f(n) es primo?&lt;/li&gt;
  &lt;li&gt;b. ¿Cuántas cifras tiene el valor f(1477) escrito en base diez?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;solución&quot;&gt;Solución&lt;/h2&gt;
&lt;p&gt;Lo primero a atacar fue como generar la &lt;strong&gt;sucesión de Fibonacci&lt;/strong&gt; o mejor aun dado un n devolver el elemento f(n) correspondiente según la sucesión. No iba a generar toda la sucesión completa hasta el n dado, seria un desperdicio.&lt;/p&gt;

&lt;p&gt;La primer opción fue usar la la &lt;strong&gt;formula explicita&lt;/strong&gt; pero por trabajar con numero irracional, para números altos(n mayores a 80) en mi caso devuelve resultados erróneos.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/asperduti/0835a4e1b0d3b105fb74a6be4f425301.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Finalmente utilice un &lt;a href=&quot;https://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci#Algref_3&quot;&gt;algoritmo presente en la wikipedia&lt;/a&gt; que implementado en Python resulta:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/asperduti/f558d809f676132088760b6266c2dad2.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;El paso siguiente era determinar si el numero en cuestión era o no primo, hay mucha teoría sobre los números primos, y existen varios &lt;strong&gt;test de primalidad&lt;/strong&gt;, acá decidí utilizar el &lt;a href=&quot;https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test&quot;&gt;&lt;strong&gt;test de Miller-Rabin&lt;/strong&gt;&lt;/a&gt;, la implementación del mismo la tome desde un &lt;a href=&quot;https://stackoverflow.com/a/14616936/6029880&quot;&gt;topic en stackoverflow&lt;/a&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/asperduti/d9e37562c586538e2e29ec5e9056dbad.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: El test se corre con k=7, esto determina la confiabilidad del test, a mayor k menor es el error. Se puede reducir el k a fin de optimizar tiempos, pero se reduce la confiabilidad del test.
El próximo punto del problema era determinar los decimales de un dado n, acá recurrí a la opción mas fácil lo transformo en un string y determino la longitud del mismo.
El &lt;a href=&quot;https://github.com/asperduti/coding-contest-cites2016/blob/master/1-primo-fibonacci/primo_fibonacci.py&quot;&gt;script completo&lt;/a&gt; es el siguiente(esto se encuentra en el &lt;a href=&quot;https://github.com/asperduti/coding-contest-cites2016&quot;&gt;repositorio del Coding Contest&lt;/a&gt;):&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/asperduti/d40164dc423d0d9b31a5bd21543c8baf.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Se le pasa como argumento el n que se desea evaluar y devuelve todos los n tales que f(n) sea primo, y la cantidad de cifras para f(n) Por ejemplo para los puntos pedidos:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python primo_fibonacci.py 90
Los numeros primos para n &amp;lt;= 90 son:  [3, 4, 5, 7, 11, 13, 17, 23, 29, 43, 47, 83]
El numero fn(90) tiene 19 cifras

$ python primo_fibonacci.py 1477
Los numeros primos para n &amp;lt;= 1477 son:  [3, 4, 5, 7, 11, 13, 17, 23, 29, 43, 47, 83, 131, 137, 359, 431, 433, 449, 509, 569, 571]
El numero fn(1477) tiene 309 cifras
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;En la solución que envié al concurso, leí mal y en vez de devolver los n primos devolvía los f(n) por lo que seguramente fue computado como solución incorrecta.&lt;/p&gt;
</description>
        <pubDate>Wed, 27 Apr 2016 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2016/04/coding-contest-primo-fibonacci.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2016/04/coding-contest-primo-fibonacci.html</guid>
      </item>
    
      <item>
        <title>Coding Contest CITES 2016</title>
        <description>&lt;p&gt;Participe de mi primer &lt;strong&gt;Coding Contest&lt;/strong&gt;, que organizo Cites, y voy a publicar una serie de posts con mis soluciones a los problemas planteados.
Desde que me entere de este tipo de concursos he tenido la motivacion de participar, no con la esperanza de ganar, si con la idea de ponerme a prueba y con la curiosidad de conocer de que tratan los problemas y el nivel que se espera.&lt;/p&gt;

&lt;h2 id=&quot;-qué-es-un-coding-contest-&quot;&gt;¿ Qué es un Coding Contest ?&lt;/h2&gt;
&lt;p&gt;Antes de seguír, para quien no este enterado, un Coding Constest ( o &lt;a href=&quot;https://en.wikipedia.org/wiki/Competitive_programming&quot; title=&quot;programming challenges&quot;&gt;Programming Constest&lt;/a&gt; ) es un &lt;strong&gt;concurso de programacion&lt;/strong&gt;, en donde el organizador presenta un conjunto de problemas de logica o matematica y los concursantes deben escribir programas capaces de resolverlos. Lo que se evalua generalmente es el numero de problemas resultos, el tiempo de ejecucion del programa, la eficiencia computacional, la elegancia, etc.
Las temáticas qué se abórdan son por ejemplo, teoría de números, análisis de datos, inteligéncia artificial, criptografía, seguridád, etc.&lt;/p&gt;

&lt;p&gt;Uno de los concursos mas antiguos es el &lt;a href=&quot;https://en.wikipedia.org/wiki/ACM_International_Collegiate_Programming_Contest#2016_World_Finals&quot; title=&quot;Coding contest ACM&quot;&gt;&lt;strong&gt;ACM-ICPC&lt;/strong&gt;&lt;/a&gt; ( ACM International Collegiate Programming Contest ) es un concúrso anual entre las universidades del mundo y que esta sponsoreado por IBM.&lt;/p&gt;

&lt;h2 id=&quot;-en-qué-consistió-el-cites-coding-contest-2016-y-cómo-sé-desarrolló-&quot;&gt;¿ En qué consistió el CITES Coding Contest 2016 y cómo sé desarrolló ?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cites-gss.com/wp-content/uploads/2016/02/coding-contest.png&quot; alt=&quot;CITES Coding Contest 2016&quot; /&gt; &lt;a href=&quot;https://cites-gss.com/&quot; title=&quot;CITES&quot;&gt;CITES&lt;/a&gt; es Centro de Innovación Tecnológica Empresarial y Social del Grupo Sancor Seguros, el cual es una incubadora de empresas de base tecnologicas. Este año lanzaron el &lt;strong&gt;CITES Ideas 2016&lt;/strong&gt; en donde seleccionaran proyectos basados en TICs que necesiten un tiempo de 3 meses en desarrollar un prototipo o primer producto(MVP) y tambien se lanzó el &lt;a href=&quot;https://cites-gss.com/contest&quot; title=&quot;Coding Contest Cites 2016&quot;&gt;concurso de programacion&lt;/a&gt; ( en el cual participé) que inició el viernes 8 de abril de 2016 a las 12:00 PM y terminó el lunes 11 de abril a las 12:00 PM, duró 72hs.&lt;/p&gt;

&lt;p&gt;Los incisos de cada problema correcto recibirian una puntuacion de 0 a 5 para: la &lt;strong&gt;elegancia matematica y computacional&lt;/strong&gt; , y para la &lt;strong&gt;eficiencia en el uso de los recursos&lt;/strong&gt;(memoria y CPU).&lt;/p&gt;

&lt;p&gt;No existia ninguna restriccion para los participantes. Y en cuanto a el &lt;strong&gt;lenguaje de programacion&lt;/strong&gt; se podia usar cualquiera que disponga de interprete o compilador libre, aunque sugerian:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;C&lt;/li&gt;
  &lt;li&gt;C++&lt;/li&gt;
  &lt;li&gt;Python&lt;/li&gt;
  &lt;li&gt;Java&lt;/li&gt;
  &lt;li&gt;R&lt;/li&gt;
  &lt;li&gt;Fortran&lt;/li&gt;
  &lt;li&gt;Octave&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los programas se evaluaban en una pc con &lt;strong&gt;&lt;a href=&quot;https://blog.ars-electronica.com.ar/2014/01/instalacion-minima-debian-y-kde-puro-sin-gtk.html&quot; title=&quot;Instalacion minima Debian y KDE&quot;&gt;Debian jessie&lt;/a&gt; de 64 bits&lt;/strong&gt;. Se podian usar bibliotecas libres que esten en los repositorios de Debian y tambien se permitia el uso de las utilidades estandar de UNIX.
En caso de que algun problema no necesitara el desarrollo de un programa, se podia presentar la solucion matematica argumentada.&lt;/p&gt;

&lt;p&gt;Se premiaron con $10000, $5000 y $3000 a 3 partcipantes con las mejores soluciones.&lt;/p&gt;

&lt;p&gt;Los &lt;strong&gt;problemas&lt;/strong&gt; que se presentaron fueron:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.ars-electronica.com.ar/2016/04/coding-contest-primo-fibonacci.html&quot;&gt;El primo de Fibonacci (&lt;strong&gt;Teoría de números&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.ars-electronica.com.ar/2016/04/un-perrito-y-un-pajarito-calculo.html&quot;&gt;Un perrito y un pajarito (&lt;strong&gt;Cálculo numérico&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.ars-electronica.com.ar/2016/04/point-cloud-cilindro-3d-scanning.html&quot;&gt;La inclinación del cilindro (&lt;strong&gt;3D scanning/printing&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.ars-electronica.com.ar/2016/05/hacker-password-linux-criptografia.html&quot;&gt;Recordando a Dennis (&lt;strong&gt;Criptografía y seguridad&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;El problema del viajante argentino (&lt;strong&gt;Optimización e inteligencia artificial&lt;/strong&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/asperduti/coding-contest-cites2016/raw/master/cites-coding-contest-2016.pdf&quot;&gt;Aca esta el PDF&lt;/a&gt; que enviaron, con las consignas de cada problema.Cree un &lt;a href=&quot;https://github.com/asperduti/coding-contest-cites2016&quot;&gt;repositorio en Github&lt;/a&gt; en donde publicare mis soluciones propuestas y se aceptan pull request para mejorar las soluciones o proponer alguna.&lt;/p&gt;

&lt;p&gt;Me llamo la atencion el &lt;strong&gt;numero de participantes&lt;/strong&gt;, fueron tan solo 36 personas(esperaba almenos 100), de las cuales 12 completaron los 5 problemas(33,3%), no quiere decir que estaban todos bien. Yo no estoy dentro de esos 12, solo puede resolver 4, me falto el el problema del viajante, tenia una idea de como resolverlo, pero no llegue. Y el problema 3 del cilindro, no fue una buena solucion, lo realice en los ultimos 10 minutos como para entregar algo.&lt;/p&gt;

&lt;p&gt;Estuve bastante entretenido con esta experiencia aunque solo el sabado le puede dedicar una buena atencion y el lunes me dedique a preparar la presentacion de las respuestas, me queda pendiente la solucion del ultimo problema.&lt;/p&gt;

&lt;p&gt;La idea es presentar durante esta semana las &lt;strong&gt;soluciones&lt;/strong&gt; que propuse y como las lleve a cabo, con el fin de compartir y recibir algun &lt;strong&gt;feedback&lt;/strong&gt;.&lt;/p&gt;
</description>
        <pubDate>Sat, 16 Apr 2016 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2016/04/que-es-coding-contest.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2016/04/que-es-coding-contest.html</guid>
      </item>
    
      <item>
        <title>Arduino y Display LCD 16x2</title>
        <description>&lt;h1 id=&quot;display-lcd-y-arduino-mostrando-informacion&quot;&gt;Display LCD y Arduino Mostrando informacion&lt;/h1&gt;
&lt;p&gt;Ya conocemos lo que son los &lt;a href=&quot;https://blog.ars-electronica.com.ar/2015/12/display-lcd.html&quot; title=&quot;Displays LCD HD44780&quot;&gt;&lt;strong&gt;displays lcd&lt;/strong&gt;&lt;/a&gt; y ahora queremos utilizarlo con nuestros &lt;a href=&quot;https://blog.ars-electronica.com.ar/p/que-es-arduino.html&quot; title=&quot;Que es Arduino&quot;&gt;&lt;strong&gt;Arduinos&lt;/strong&gt;&lt;/a&gt; para crear proyectos que luzcan mas profesionales y poder interactuar de una manera mas amigable.
En este tutorial de Arduino vamos a ver como conectarlo al &lt;strong&gt;Display LCD 16x2 HD44780&lt;/strong&gt; para mostrar mensajes y como poder crear caracteres personalizados.&lt;/p&gt;

&lt;h2 id=&quot;circuito-de-conexión-lcd-hd44780-y-arduino&quot;&gt;Circuito de conexión LCD HD44780 y Arduino&lt;/h2&gt;
&lt;p&gt;El circuito básico para conectar nuestro Arduino a un display LCD es el siguiente:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-By1MWvhgV8k/VncJUJgDIiI/AAAAAAAAAtg/D2jo3PI2Rg0/s320/fritzing_esquema.png&quot; alt=&quot;&amp;quot;Circuito Arduino y Display LCD 16x2&amp;quot;&quot; title=&quot;Circuito Arduino y Display LCD 16x2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nuestro circuito en la protoboard seria algo asi:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-WZsJKWyLHOY/VncJWuBnw3I/AAAAAAAAAts/a2mq-S9M_Q4/s320/fritzing_protoboard.png&quot; alt=&quot;&amp;quot;Circuito en Protoboard Arduino y Display LCD 16x2&amp;quot;&quot; title=&quot;Circuito en Protoboard Arduino y Display LCD 16x2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;El potenciometro sera usado para ajustar el contraste del LCD.
En el momento que alimentemos el circuito deberiamos ver prender el led y podriamos ajustar el contraste hasta lograr ver los cuadrados negros, esto ademas nos sirve como una primera prueba para verificar nuestro circuito.&lt;/p&gt;

&lt;h3 id=&quot;mostrando-mensajes&quot;&gt;Mostrando Mensajes&lt;/h3&gt;
&lt;p&gt;El código que vamos a cargar en el Arduino es el siguiente:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;LiquidCrystal.h&amp;gt;
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;acctime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Inicializo la libreria con los numeros d elos pines&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// en modo de 4-bit sin utilizar el pin R/W&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;LiquidCrystal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;c1&quot;&gt;//Configuro el tamaño del display&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Visita&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;ArS-Electronica&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;La electronica&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;libre-Tutoriales&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Proyectos&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;millis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;acctime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;acctime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;millis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Vamos a desmenuzar un poquito esto para entender que hace.
Lo primero es incluir la librería LiquisCrystal:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;LiquidCrystal.h&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Defino 3 variables:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Msg es un array de String para almacenar los mensajes a mostrar.&lt;/li&gt;
  &lt;li&gt;counter es una variable usada para seleccionar el mensaje dentro del array.&lt;/li&gt;
  &lt;li&gt;y time se utiliza para almacenar el tiempo para poder cambiar el mensaje cada un intervalo de tiempo fijo.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;acctime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Luego procemos a inicializar el LCD, básicamente lo primero que hacemos es instanciar un objeto llamado lcd del tipo LiquidCrystal y le pasamos como parámetros los pines a los que esta conectado nuestro LCD, el orden es muy importante y este es: rs, enable, d4, d5, d6, d7. Al pasar esta cantidad de argumentos interpreta que vamos a trabajar con el bus de 4 bits, que es lo que deseamos.&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Inicializo la libreria con los numeros d elos pines&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// en modo de 4-bit sin utilizar el pin R/W&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;LiquidCrystal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;En el setup() vamos a definir y configurar las dimensiones del lcd, en este caso de 16x2 y luego inicializo el array con los mensajes que deseo mostrar, como voy a realizar una rotacion vertical del mensaje, copio el en el elemento 6 el contenido del elemento 0 a fin de lograr el efecto continuo en la rotacion.&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   &lt;span class=&quot;c1&quot;&gt;//Configuro el tamaño del display&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Visita&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;ArS-Electronica&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;La electronica&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;libre-Tutoriales&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Proyectos&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;En el loop() lo que hacemos es verificar si (millis()/1000 - counter &amp;gt; 1), millis() es una función de Arduino que devuelve los milisegundos transcurridos desde el ultimo reset, en caso de que la expresión sea verdadera(es decir que paso 1seg), limpiamos el lcd, posicionamos el cursor en la columna 0 fila 0 y escribimos el mensaje indicado por counter, luego posicionamos el cursor en la columna 0 fila 1 y escribimos el siguiente mensaje del array y por ultimo incrementamos el contador y almacemos el tiempo en time, a fin de poder medir el tiempo transcurrido desde que se mostro el nuevo mensaje.&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;millis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;acctime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;acctime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;millis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Por ultimo verificamos si counter llego a 6 que es el ultimo elemento del array y en ese caso lo resetemos a 0.&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;El resultado final seria como el siguiente:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-LqpIVp5KNDY/VncKKIXTJMI/AAAAAAAAAt8/6UTNO05t2Bc/s320/display_lcd_y_arduino.jpg&quot; alt=&quot;&amp;quot;Circuito en Protoboard Arduino y Display LCD 16x2&amp;quot;&quot; title=&quot;Circuito en Protoboard Arduino y Display LCD 16x2&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;definiendo-caracteres&quot;&gt;Definiendo Caracteres&lt;/h2&gt;
&lt;p&gt;Se pueden crear caracteres propios y almacenar hasta un maximo de 8 caracteres en simultaneo, si no nos alcanzan podriamos estar creando y borrando a medida que lo necesitemos mostrar.
Cada caracter es representado por un array de 8 bytes, lo que podriamos pensarlo como una matriz de 8x8. Cada byte representa una fila y los bits las columnas.
Asi por ejemplo se puede crear una tablita como la siguiente y completarla para crear el caracter necesario. Un 1 implica el pixel negro. En este display cada caracter es presentado
con 8x5 pixeles, por los que los bits de 0 a 2 no se visualizan. Este es un ejemplo para representar la letra griega PI.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-9M5peBfdr6E/VncJTx4aYGI/AAAAAAAAAtc/Eh0IhQfMM0Y/s320/crear-caracter-display-lcd.jpg&quot; alt=&quot;&amp;quot;Tabla para crear caracter en display lcd HD44780&amp;quot;&quot; title=&quot;Tabla para crear caracter en display lcd HD4478&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A la derecha se visualiza el valor que le corresponde a cada byte, se representa en binario ya que sale directo de mirar la tabla.&lt;/p&gt;

&lt;p&gt;Con esto explicado lo que necesitariamos hacer en nuestro codigo de arduino es crear un array de bytes:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;byte&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00011111&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Y posteriormente indicarle al lcd la creación del caracter, que se hace de la siguiente forma:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;createChar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//Se crea el caracter en la posicion 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;y finalmente para poder usarlo tenemos que usar la funcion write(int) indicando el numero del caracter creado:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Por ultimo un ejemplo completo:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;LiquidCrystal.h&amp;gt;
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;byte&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00011111&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b00001010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Inicializo la libreria con el numero de pines&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// utilizando el modo de 4 bits sin R/WS&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;LiquidCrystal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;c1&quot;&gt;// Configuro el numero de columnas y filas&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;createChar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//Se crea el caracter en la posicion 1&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setCursor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;//Escribe el caracter creado en la posicion 1&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;lcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;=3,141592653589&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-pl0Kwkm5JCc/VncKIPqj_FI/AAAAAAAAAt0/Fj10UGrs5xU/s320/display_lcd_crear_caracter.jpg&quot; alt=&quot;&amp;quot;Tabla para crear caracter en display lcd HD44780&amp;quot;&quot; title=&quot;Tabla para crear caracter en display lcd HD4478&amp;quot; &amp;quot;Tabla para crear caracter en display lcd HD44780&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 20 Dec 2015 09:00:00 +0000</pubDate>
        <link>https://blog.ars-electronica.com.ar/2015/12/arduino-y-display-lcd-16x2.html</link>
        <guid isPermaLink="true">https://blog.ars-electronica.com.ar/2015/12/arduino-y-display-lcd-16x2.html</guid>
      </item>
    
  </channel>
</rss>
