<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Electrónica · DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/tags/electr%C3%B3nica/</link><description>Blog de tecnología, programación y electrónica, para compartir conocimientos, experiencias y tutoriales con este apasionante mundo.</description><generator>Hugo</generator><language>es-CO</language><copyright>Copyright © 2026 DacaDev. All rights reserved.</copyright><lastBuildDate>Wed, 08 May 2024 09:00:00 +0000</lastBuildDate><atom:link href="https://blog.dacadev.com/tags/electr%C3%B3nica/index.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.dacadev.com/images/blog-logo.png</url><title>DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/</link></image><item><title>MicroPython: Manejo de pines</title><link>https://blog.dacadev.com/micropython/pines/</link><pubDate>Wed, 08 May 2024 09:00:00 +0000</pubDate><guid>https://blog.dacadev.com/micropython/pines/</guid><dc:creator>Dacadev</dc:creator><category>micropython</category><description>Aprende a manejar los pines con la clase Pin de MicroPython. Descubre cómo configurar, usar y sacar el máximo provecho de tu RP2040.</description><media:content url="https://blog.dacadev.com/images/micropython/pins/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-la-clase-pin"&gt;¿Qué es la clase &lt;code&gt;Pin&lt;/code&gt;?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#instancia-de-la-clase-pin"&gt;Instancia de la Clase &lt;code&gt;Pin&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#métodos-de-la-clase-pin"&gt;Métodos de la Clase &lt;code&gt;Pin&lt;/code&gt;&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#pininit"&gt;Pin.init&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pinvalue"&gt;Pin.value&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#pinon"&gt;Pin.on()&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pinoff"&gt;Pin.off()&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pintoggle"&gt;Pin.toggle()&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#pinirq"&gt;Pin.irq()&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#ejemplos-prácticos-de-pin-con-rp2040"&gt;Ejemplos prácticos de &lt;code&gt;Pin&lt;/code&gt; con RP2040&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;





 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo aprenderás que es la clase &lt;code&gt;Pin&lt;/code&gt; de &lt;em&gt;Micropython 🐍&lt;/em&gt; y como esta gestiona las diferentes funcionalidades genéricas de los pines de cualquier tipo de chip. Además, verás ejemplos de cómo configurarla y usarla con la &lt;strong&gt;RP2040&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-la-clase-pin"&gt;¿Qué es la clase &lt;code&gt;Pin&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Empecemos definiendo qué es un &lt;strong&gt;pin&lt;/strong&gt; dentro de nuestro microcontrolador (&lt;strong&gt;uM&lt;/strong&gt;), un &lt;strong&gt;pin&lt;/strong&gt; hace referencia a una interfaz I/O asociada a un &lt;strong&gt;pin&lt;/strong&gt; físico de nuestro &lt;strong&gt;uM&lt;/strong&gt;. Con él podemos interactuar con el mundo real, ya sea leyendo o escribiendo señales digitales, o incluso analógicas.&lt;/p&gt;
&lt;p&gt;La clase &lt;code&gt;Pin&lt;/code&gt; es una de las principales clases que provee &lt;em&gt;Micropython 🐍&lt;/em&gt;, ya que es la que nos permitirá interactuar con los pines de nuestros &lt;strong&gt;uM&lt;/strong&gt;. Esta clase se encuentra en el paquete &lt;code&gt;machine&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="instancia-de-la-clase-pin"&gt;Instancia de la Clase &lt;code&gt;Pin&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La clase &lt;code&gt;Pin&lt;/code&gt;, tiene la siguiente firma de constructor&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;class&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;Pin&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;id&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;mode&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;pull&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;drive&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;alt&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En donde:&lt;/p&gt;
&lt;p&gt;controla cuál será el comportamiento del pin. En Micropython 🐍 encuentras constantes que te ayudan a establecer el funcionamiento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; es el unico parámetro obligatorio y hace referencia al pin que quieres controlar. Cada &lt;strong&gt;uM&lt;/strong&gt; tiene su propio mapeo de pines, por lo que deberás de consultar la documentación de tu &lt;strong&gt;uM&lt;/strong&gt; para saber que pines puedes controlar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mode&lt;/code&gt;* controla cuál será el comportamiento del pin. En *Micropython 🐍* encuentras constantes que te ayudan a establecer el funcionamiento:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pin.IN&lt;/code&gt; establece el pin como entrada.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.OUT&lt;/code&gt; establece el pin como salida.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.OPEN_DRAIN&lt;/code&gt; establece el pin como salida de tipo &lt;em&gt;Open-drain&lt;/em&gt; (colector abierto), lo que significa que, si la salida está en nivel bajo, es un cero lógico, y si está en alto (1), se configura como alta impedancia.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.ALT&lt;/code&gt; establece el pin para funcionar de manera alterna, utilizando un propósito específico del hardware.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.ALT_OPEN_DRAIN&lt;/code&gt; es la combinación de &lt;code&gt;Pin.ALT&lt;/code&gt; y &lt;code&gt;Pin.OPEN_DRAIN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.ANALOG&lt;/code&gt; establece el pin como entrada analógica&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pull&lt;/code&gt;* activas o no la opción de usar una resistencia de &lt;strong&gt;pull-up&lt;/strong&gt; o &lt;strong&gt;pull-down&lt;/strong&gt;, sus opciones validas son:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pin.PULL_UP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.PULL_DOWN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;None&lt;/code&gt; = No se activa ninguna resistencia, es el valor por defecto&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt; es el valor inicial que quieres asignar al pin y solo funciona cuando el pin es configurado como salida, es decir que &lt;code&gt;Pin.OUT&lt;/code&gt; o &lt;code&gt;Pin.OPEN_DRAIN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drive&lt;/code&gt; se utiliza para especificar la fuerza de la salida del pin. Esto es importante cuando conectas el pin a circuitos que tienen diferentes requerimientos de corriente. Los valores típicos para drive son algo así como Pin.DRIVE_0, Pin.DRIVE_1, etc., donde los números más altos representan una mayor capacidad de corriente de salida.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alt&lt;/code&gt;* cuando el pin está configurado como Pin.ALT o Pin.ALT_OPEN_DRAIN, este parámetro se utiliza para especificar la función alternativa que se desea utilizar.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;* No todos los pines tiene disponibles todas las configuraciones descritas, para validarlo debes de consultar la documentación de tu &lt;strong&gt;uM&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="métodos-de-la-clase-pin"&gt;Métodos de la Clase &lt;code&gt;Pin&lt;/code&gt;&lt;/h2&gt;
&lt;h3 id="pininit"&gt;Pin.init&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;init&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;mode&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;pull&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;drive&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;alt&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una vez tengas una instancia de la clase &lt;code&gt;Pin&lt;/code&gt;, puedes cambiar su configuración inicial usando el método &lt;code&gt;init&lt;/code&gt; el cual recibe los mismos atributos del constructor salvo el identificador &lt;code&gt;id&lt;/code&gt;. Un ejemplo de su uso sería&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;machine&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;led&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;25&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;led&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;init&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;mode&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;OUT&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el ejemplo anterior, estoy creando una instancia asociada al pin 25 (mapeado de mi &lt;strong&gt;uM&lt;/strong&gt;) y posteriormente configurándolo con el método &lt;code&gt;init&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="pinvalue"&gt;Pin.value&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;([&lt;span style="color:#e06c75"&gt;x&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este método se utiliza para leer o escribir el valor del pin. Si no se pasa ningún parámetro, el método se comporta como un lector. Si se pasa un valor, el método se comporta como un escritor. Un ejemplo de su uso sería&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;machine&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;led&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;25&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;OUT&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;led&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;led&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el ejemplo, estamos creando un pin como salida y configurando su valor a 1, para luego leer el valor del pin.&lt;/p&gt;
&lt;h4 id="pinon"&gt;Pin.on()&lt;/h4&gt;
&lt;p&gt;Este método es un atajo para configurar el valor del pin a 1, es decir, que el pin se configura en alto, lo cual sería lo mismo que hacer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="pinoff"&gt;Pin.off()&lt;/h4&gt;
&lt;p&gt;Este método es un atajo para configurar el valor del pin a 0, es decir, que el pin se configura en bajo, lo cual sería lo mismo que hacer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="pintoggle"&gt;Pin.toggle()&lt;/h4&gt;
&lt;p&gt;Este método es un atajo para cambiar el valor del pin. Si el pin está en 1, lo cambia a 0 y viceversa, lo cual sería lo mismo que hacer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;not&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="pinirq"&gt;Pin.irq()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;irq&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;handler&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;trigger&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;IRQ_FALLING&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;|&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;IRQ_RISING&lt;/span&gt;, &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;priority&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;wake&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;hard&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;False&lt;/span&gt;)¶
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este método es muy importante, ya que sirve para configurar los pines para que sean asociados a interrupciones y poder ejecutar un &lt;code&gt;callback&lt;/code&gt; cuando se cumpla una condición. Los parámetros que recibe son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;handler&lt;/code&gt;: Es un &lt;code&gt;callable&lt;/code&gt; de python, es decir, una función o método de clase que recibe como parámetro únicamente un objeto de tipo &lt;code&gt;Pin&lt;/code&gt;, que será la instancia del pin que activó la interrupción.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;trigger&lt;/code&gt;: A través de este atributo controlaremos el tipo de comportamiento que se deberá cumplir para activar la interrupción. Para entender los posibles valores que podemos asignar, veamos primero cómo es una señal digital.Una señal digital oscila entre dos valores, 0 o 1, y la transición entre esos valores es lo que llamamos flancos. Como hay dos valores, tenemos 2 tipos de flancos. Los flancos de subida ocurren cuando cambiamos de 0 a 1 y los flancos de bajada cuando cambiamos de 1 a 0. De esta manera, en Micropython encontramos 4 tipos de activadores que podemos configurar en nuestra interrupción por pin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_FALLING&lt;/code&gt;: Configura la interrupción para que se active cuando el pin cambie de 1 a 0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_RISING&lt;/code&gt;: Configura la interrupción para que se active cuando el pin cambie de 0 a 1&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_LOW_LEVEL&lt;/code&gt;: Configura la interrupción para que se active cuando el pin se encuentre en 0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_HIGH_LEVEL&lt;/code&gt;: Configura la interrupción para que se active cuando el pin se encuentre en 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En el siguiente diagrama puedes visualizar las fases de la señal:&lt;/p&gt;

 
 
 
 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/micropython/pins/trigger-types_hu_2fa10276e580adee.webp"
 alt="Imagen guia del contenido de la página"style="width:400px"/&gt;
 &lt;/div&gt;
 
 
 
 

&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En el siguiente &lt;a href="https://blog.dacadev.com/micropython/interrupciones"



 


&gt;artículo&lt;/a&gt; te explico más del tema de interrupciones con &lt;em&gt;Micropython 🐍&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="ejemplos-prácticos-de-pin-con-rp2040"&gt;Ejemplos prácticos de &lt;code&gt;Pin&lt;/code&gt; con RP2040&lt;/h2&gt;
&lt;p&gt;En el siguiente embebido estamos creando un proyecto en la plataforma &lt;a href="https://wokwi.com/"




 target="_blank"
 


&gt;Wokwi&lt;/a&gt;, que nos permite simular proyectos con tarjetas como Arduino Uno, ESP32, Raspberry Pi Pico, entre otras, junto con un amplio conjunto de sensores y actuadores. En este caso, estamos utilizando una Raspberry Pi Pico y conjunto de LEDs y botones para mostrar cómo se puede controlar un pin con la clase &lt;code&gt;Pin&lt;/code&gt; de &lt;em&gt;Micropython 🐍&lt;/em&gt;&lt;/p&gt;
&lt;iframe
 src="https://wokwi.com/projects/396825205015340033"
 height="600"
 width="100%"
 title="Ejemplo RP Pines"
 loading="lazy"&gt;
&lt;/iframe&gt;
&lt;p&gt;En el ejemplo podemos ver 4 casos de uso sencillos para la clase &lt;code&gt;Pin&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Caso 1&lt;/strong&gt;: Configuramos un pin como salida y lo encendemos en la función &lt;code&gt;main&lt;/code&gt; en un intervalo de 500ms con la fuinción &lt;code&gt;sleep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caso 2&lt;/strong&gt;: Declaramos un pin como salida, pero primero instanciamos la clase &lt;code&gt;Pin&lt;/code&gt; y luego configuramos el pin con el método &lt;code&gt;init&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case 3&lt;/strong&gt;: Configuramos dos pines con la clase &lt;code&gt;Pin&lt;/code&gt;, uno como salida y otro como entrada. Leemos el valor del pin de entrada y lo asignamos al pin de salida&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caso 4&lt;/strong&gt;: Configuramos un pin como entrada y configuramos una interrupción para que se active cuando el pin cambie de 0 a 1. En el &lt;code&gt;callback&lt;/code&gt; simplemente cambiamos el valor del pin de salida.&lt;/li&gt;
&lt;/ol&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;ul&gt;
&lt;li&gt;En el siguiente &lt;a href="https://wokwi.com/projects/396825205015340033"




 target="_blank"
 


&gt;enlace&lt;/a&gt; puedes ver el código fuente del proyecto en una nueva pestaña.&lt;/li&gt;
&lt;li&gt;El caso 4 de nuestro proyecto funciona con interrupciones, y es posible que en la simulación no funcione correctamente debido a que no se está procesando el debounce del botón.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;





 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Podrás encontrar toda la documentación de la clase Pin para &lt;em&gt;micropython 🐍&lt;/em&gt; en el siguiente &lt;a href="https://docs.micropython.org/en/latest/library/machine.Pin.html#machine.Pin"




 target="_blank"
 


&gt;&lt;strong&gt;link&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>RP Pico: Interrupciones de GPIO</title><link>https://blog.dacadev.com/micropython/raspberry-pico/manejo-de-interrupciones/</link><pubDate>Sun, 28 Apr 2024 21:18:46 +0000</pubDate><guid>https://blog.dacadev.com/micropython/raspberry-pico/manejo-de-interrupciones/</guid><dc:creator>Dacadev</dc:creator><category>micropython</category><description>Guía completa para configurar interrupciones GPIO en la Raspberry Pi Pico con MicroPython. Aprende sobre NVIC, tipos de triggers, flancos y ejemplos prácticos.</description><media:content url="https://blog.dacadev.com/images/micropython/rp-interrupts-gpio/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-son-las-interrupciones"&gt;¿Qué son las interrupciones?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#manejo-de-interrupciones-en-el-rp2040"&gt;Manejo de interrupciones en el RP2040&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#interrupciones-con-micropython"&gt;Interrupciones con Micropython&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#tipo-de-activadores-de-interrupciones"&gt;Tipo de activadores de interrupciones&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;





 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;En este artículo aprenderás a manejar las interrupciones GPIO de la &lt;strong&gt;Raspberry Pi Pico&lt;/strong&gt; usando &lt;strong&gt;MicroPython&lt;/strong&gt;. Al final entenderás cómo configurarlas y qué tener en cuenta al diseñar el comportamiento de las interrupciones.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-son-las-interrupciones"&gt;¿Qué son las interrupciones?&lt;/h2&gt;
&lt;p&gt;Las interrupciones son acciones, normalmente una serie de tareas que se ejecutan cuando cierta condición o evento se genera durante la ejecución del programa. Haciendo que el programa se detenga en ese punto y proceda a ejecutar las acciones que se han definido para ese evento.&lt;/p&gt;
&lt;h2 id="manejo-de-interrupciones-en-el-rp2040"&gt;Manejo de interrupciones en el RP2040&lt;/h2&gt;
&lt;p&gt;Antes de configurar el código para nuestra &lt;strong&gt;RP2040&lt;/strong&gt;, es importante entender cómo maneja las interrupciones. Cada núcleo está equipado con un controlador de interrupciones propio, conocido como &lt;em&gt;Controlador de Interrupciones Vectorizadas Anidadas&lt;/em&gt; (o &lt;strong&gt;NVIC&lt;/strong&gt; por sus siglas en inglés, &lt;em&gt;Nested Vectored Interrupt Controller&lt;/em&gt;). Cada NVIC puede gestionar 32 tipos de interrupciones. Esto proporciona al &lt;strong&gt;RP2040&lt;/strong&gt; flexibilidad para manejar múltiples interrupciones de manera eficiente, permitiendo que cada núcleo responda de forma independiente a los eventos de interrupción específicos. En relación con los GPIO, cada controlador de interrupciones gestiona una única interrupción de GPIO por banco, y no una interrupción por cada pin, lo que significa que las interrupciones por pines dentro de un mismo banco son compartidas entre los pines del mismo.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Para más información de como se manejan las interrupciones en el &lt;strong&gt;RP2040&lt;/strong&gt;, puedes revisar la &lt;strong&gt;sección 2.3.2&lt;/strong&gt; del &lt;a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"




 target="_blank"
 


&gt;datasheet&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="interrupciones-con-micropython"&gt;Interrupciones con Micropython&lt;/h2&gt;




 
 






&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info &lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;A partir de este punto es necesario que el usuario tenga entendimiento de como operan la clase &lt;code&gt;Pin&lt;/code&gt; en Micropython, si ese no es el caso en el &lt;a href="#interrupciones-con-micropython"



 


&gt;&lt;strong&gt;siguiente artículo&lt;/strong&gt;&lt;/a&gt; te explico más del tema.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Para configurar las interrupciones en Micropython debemos de tener una instancia de la clase &lt;code&gt;Pin&lt;/code&gt; que encontramos en la librería &lt;code&gt;machine&lt;/code&gt;. Una vez tengas la instancia de &lt;code&gt;Pin&lt;/code&gt; el siguiente paso es asociar una interrupción al mismo, para ello haremos uso del método &lt;a href="https://docs.micropython.org/en/latest/library/machine.Pin.html#machine.Pin.irq"




 target="_blank"
 


&gt;&lt;code&gt;irq&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Este método tiene las siguientes configuraciones:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;parámetro&lt;/th&gt;
 &lt;th&gt;valor por defecto&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;handler&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Es la función que se ejecutará cuando se dispare la interrupción, esta función secibe como parámetro una instancia del &lt;code&gt;Pin&lt;/code&gt; que lo activo, si el valor es &lt;code&gt;None&lt;/code&gt; la interrupción esta desactivada&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;trigger&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;IRQ_FALLING | Pin.IRQ_RISING&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Es el comportamiento que se tendrá encuenta para activar la interrupción, mirá el &lt;a href="#tipo-de-activadores-de-interrupciones"



 


&gt;gráfico&lt;/a&gt; mas adelante, es posible mezclar mas de un tipo de activador&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;priority&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Es el nivel de prioridad que le asignarás a la interrupción, entre mayor el numero, mayor prioridad&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;wake&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Te permite controlar si la interrupción tiene la capacidad de &amp;ldquo;despertar&amp;rdquo; al procesador si esta en estado de reposo/suspención&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;hard&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Este parámetro permite definir si la interrupción será manejada por hardware o no, esto permite disminuir el delay entre la activación y la ejecución de la función de la interrupción, sin embargo tiene implicación de performance que debe considerar el desarrollador y no Micropython&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Veamos un ejemplo de como se crean interrupción con Micropython:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;machine&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;from&lt;/span&gt; &lt;span style="color:#e06c75"&gt;utime&lt;/span&gt; &lt;span style="color:#c678dd"&gt;import&lt;/span&gt; &lt;span style="color:#e06c75"&gt;sleep&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;led&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;25&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;OUT&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;value&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;btn&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;IN&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Función para manejar la interrupción&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# recibe solo un parámetro de tipo Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;interrupt_callback&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;pin&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;pin&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;led&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;toggle&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;btn&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;irq&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;handler&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;interrupt_callback&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;trigger&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#e06c75"&gt;Pin&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;.&lt;/span&gt;&lt;span style="color:#e06c75"&gt;IRQ_FALLING&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="tipo-de-activadores-de-interrupciones"&gt;Tipo de activadores de interrupciones&lt;/h3&gt;
&lt;p&gt;Micropython define los siguientes activadores de interrupciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_FALLING&lt;/code&gt; interrupción en flanco de bajada (&lt;strong&gt;falling edge&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_RISING&lt;/code&gt; interrupción en flanco de subida (&lt;strong&gt;rising edge&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_LOW_LEVEL&lt;/code&gt; interrupción en nivel bajo (&lt;strong&gt;low level&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pin.IRQ_HIGH_LEVEL&lt;/code&gt; interrupción en nivel alto (&lt;strong&gt;high level&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recuerda que una señal digital oscila entre 1 y 0, lo cual podemos ver en el tiempo como una señal cuadrada, y en base a ella es que se tienen definidas los activadores de interrupciones, como se muestra en el siguiente gráfico.&lt;/p&gt;




 
 
 
 &lt;div class="flex justify-center"&gt;
 &lt;img
 src="https://blog.dacadev.com/images/micropython/rp-interrupts-gpio/trigger-types_hu_2fa10276e580adee.webp"
 alt="Imagen guia del contenido de la página"style="width:400px"/&gt;
 &lt;/div&gt;
 
 
 

</content:encoded></item></channel></rss>