USD

Conceptos básicos de CircuitPython para el desarrollo y creación de prototipos basados en microcontroladores rápidos

Por Steve Leibson

Colaboración de Editores de Digi-Key de América del Norte

Si bien el lenguaje Python facilitó la programación, se diseñó para ejecutarse en PC y otras máquinas con muchos recursos de procesamiento, memoria y periféricos. La versión optimizada para microcontroladores, llamada MicroPython, se volvió popular entre los sistemas integrados que enfrentan restricciones de recursos e interfaz más estrictas. Tanto es así que la comunidad de código abierto adaptó MicroPython a microcontroladores y placas de desarrollo específicos para apoyar el desarrollo de microcontroladores con seriedad.

Este artículo presentará estas adaptación, CircuitPython de Adafruit. Después de una breve discusión sobre Python, en comparación con el lenguaje de desarrollo integrado C++ clásico, el artículo analizará cómo Python evolucionó a MicroPython y ahora a CircuitPython. Luego describirá el proceso de escritura del software utilizando CircuitPython antes de introducir varias placas de desarrollo de Adafruit y otros proveedores que son compatibles con el entorno de CircuitPython.

La razón de Python

La placa de desarrollo Arduino original y sus muchos sucesores han sido placas de desarrollo de microcontroladores muy populares para proyectos de creadores, estudiantes y aficionados, así como para prototipos integrados. Sin embargo, el IDE (entorno completo de desarrollo integrado) y el lenguaje de programación de Arduino se basan en C++, un lenguaje compilado potente pero complejo con una sintaxis de aspecto extraño y reglas de puntuación estrictas que los programadores principiantes encuentran desagradables.

Python es un lenguaje de programación más nuevo. Es un lenguaje interpretado, interactivo y orientado a objetos que combina un notable poder de programación con una sintaxis muy clara. Es conocido por su capacidad de escritura y legibilidad, así como por su sintaxis más simple. Estas características se combinan para reducir el número de errores de programación y hacer que la reutilización del código sea más fácil, y así acelerar el desarrollo del software.

La naturaleza interpretativa del lenguaje proporciona información inmediata del programador que fomenta la experimentación y el aprendizaje rápido. Por estas razones, Python es ahora el primer lenguaje de programación que muchos estudiantes y creadores aprenden.

Un inconveniente es que Python fue diseñado para ejecutarse en PC y máquinas más grandes con mucha memoria RAM, grandes cantidades de almacenamiento masivo y una interfaz de usuario completa con un teclado, una pantalla grande y un mouse. No fue diseñado para ser un lenguaje de programación incorporado. Sin embargo, ha surgido una implementación eficiente del lenguaje de programación Python 3, llamado MicroPython, que se creó y optimizó específicamente para ejecutarse dentro de los recursos limitados de un microcontrolador.

Al reconocer la promesa de MicroPython como un lenguaje de programación integrado, la comunidad de código abierto lo adoptó a ciertos microcontroladores y placas de desarrollo para apoyar el desarrollo de microcontroladores. Por ejemplo, Adafruit ha desarrollado su propio tipo de MicroPython, llamado CircuitPython. Diseñado para simplificar la experimentación y aprender a programar en placas de microcontroladores de bajo costo, se adapta a los microcontroladores y los recursos de hardware disponibles en las placas de desarrollo de Adafruit. CircuitPython está disponible preinstalado en varias de las placas de desarrollo de Adafruit y se puede instalar en otras.

Diferencias entre C++ y Python

Debido al impulso y la presencia del IDE de Arduino y las muchas placas de desarrollo de Arduino ahora disponibles, es razonable preguntarse por qué una versión de Python podría ser necesaria para el desarrollo integrado. Una comparación de los lenguajes proporciona la respuesta.

C++ es una extensión del lenguaje C más antiguo con extensiones orientadas a objetos. Incluso con estas extensiones, el código C++ es un tanto codificado porque conserva la sintaxis C que Kernigan y Ritchie crearon originalmente en los laboratorios Bell a finales de los años sesenta y principios de los setenta. C fue diseñado intencionalmente para ser fácilmente asignado en las instrucciones de la máquina para un procesador de destino. Este sesgo hacia las necesidades de la máquina sobre las del programador es evidente en la sintaxis del lenguaje. Debido a que los microprocesadores comerciales no aparecieron hasta 1971, C se desarrolló originalmente para minicomputadoras. Los compiladores de C para microprocesadores evolucionaron gradualmente en herramientas útiles durante los años ochenta. C siempre ha sido un lenguaje compilado, al igual que C++.

El científico informático danés Bjarne Stroustrup comenzó a desarrollar C++ en 1979. Su primer libro de texto sobre el lenguaje apareció en 1985. C++ no se convirtió en un lenguaje de programación estándar hasta 1998. Al igual que C, el lenguaje C++ de Stroustrup originalmente estaba dirigido a computadoras más grandes. El IDE de Arduino, desarrollado en 2003, hizo que C++ fuera útil para los microcontroladores.

Python es también un lenguaje orientado a objetos. Fue desarrollado por el programador holandés Guido van Rossumin y lanzado por primera vez en 1991. El diseño sintáctico de Python hace hincapié en la legibilidad del código, para los seres humanos, que es una diferencia clave entre Python y C++. La capacidad de escritura, estrechamente asociada con la legibilidad, es otro rasgo a favor de Python. La capacidad de escritura significa que a Python generalmente se le atribuye la posibilidad de permitir a los programadores escribir aplicaciones más rápidamente, lo que fomenta la experimentación y puede acortar los ciclos de creación de prototipos y desarrollo.

Una segunda diferencia importante es que Python es un lenguaje interpretado, muy parecido al lenguaje de programación Basic que apareció por primera vez para minicomputadoras en la década de 1960 y realmente floreció en la década de 1970 con la introducción de las microcomputadoras. Al igual que en Basic, la naturaleza interpretativa de Python fomenta la experimentación y, por lo tanto, aprende prescindiendo del ciclo de desarrollo de edición/compilación/descarga/ejecución utilizado para los lenguajes de programación compilados. Sin embargo, a diferencia de Basic, Python es un lenguaje moderno, de nivel superior, orientado a objetos que incorpora el valor de medio siglo de avances en ciencias de la computación que han aparecido desde que Basic se desarrolló por primera vez.

Por ejemplo, las variables de Python no necesitan declararse o escribirse antes de su uso. Los programadores no deben preocuparse de si una variable debe ser un número entero o un punto flotante. El intérprete de Python lo resuelve todo y toma las decisiones apropiadas en el tiempo de ejecución.

Dos diferencias más entre C++ y Python son el manejo de cadenas y la puntuación. Muchos programadores consideran que el manejo de cadenas en C++ es obtuso y confuso. El manejo de cadenas de Python es mucho más simple y recuerda mucho a las sencillas y populares capacidades de manejo de cadenas de Basic, consideradas durante mucho tiempo como un punto fuerte para Basic.

De manera similar, la puntuación de C y C++, especialmente las llaves ({}), son otro obstáculo frecuente para los programadores nuevos e incluso experimentados. Se siente como que siempre hay un número impar de llaves en un programa, lo que significa que el programador debe buscar en el código para encontrar dónde debe ir la llave que falta. Python no tiene una puntuación tan delicada, pero sí usa sangría, lo que le da al código de Python su legibilidad.

Los orígenes de MicroPython

Al igual que C y C++, Python fue diseñado originalmente para ejecutarse en computadoras más grandes. En consecuencia, el lenguaje requería demasiados recursos para la programación de los microcontroladores. El programador y físico australiano Damien George, por lo tanto, desarrolló una versión de Python llamada MicroPython que podría ejecutarse en los recursos más limitados de un microcontrolador. Las placas de desarrollo Arduino fueron los primeros objetivos de hardware para MicroPython.

La naturaleza interactiva de MicroPython se centra en la interfaz de comandos, llamada formalmente la ventana REPL (lectura, evaluación, impresión, bucle), que generalmente opera a través de una conexión en serie que conecta una PC de host a una placa de desarrollo con microcontrolador. La interfaz REPL se parece mucho a las interfaces de línea de comandos básicas de los años setenta y ochenta. Acepta entradas de usuario (expresiones individuales o declaraciones), las evalúa y luego entrega los resultados al usuario a través de la ventana REPL o ejecuta el comando incrustado en la declaración.

Usando la interfaz REPL, es posible consultar una variable, alternar una línea de E/S o enviar una cadena de caracteres a un periférico conectado. La línea se interpreta y se ejecuta inmediatamente tan pronto como se presiona la tecla enter. Esa es la naturaleza de un lenguaje interpretado.

Esta característica de MicroPython facilita la programación exploratoria y la depuración de errores y es uno de los aspectos de MicroPython que hace que el lenguaje sea fácil de usar tanto para principiantes como para programadores experimentados. La interfaz de usuario REPL admite ciclos de desarrollo más rápidos en comparación con el ciclo clásico de edición, compilación, ejecución y depuración del IDE de Arduino. Incluso los programadores experimentados se benefician de poder experimentar con nuevos tipos de periféricos interactivamente utilizando la interfaz de usuario REPL de MicroPython.

Soporte CircuitPython para placas de desarrollo

Cada microcontrolador cuenta con un conjunto único de periféricos, y cada placa de desarrollo se suma a esa lista. Estos periféricos requieren bibliotecas de soporte. Esto es cierto tanto para el IDE de Arduino como para MicroPython. Además, hay muchos dispositivos periféricos adicionales, como el LED RGB direccionable NeoPixel 1655 de Adafruit, que también requieren soporte de biblioteca.

Para brindar un mayor grado de soporte, Adafruit desarrolló su propia versión de MicroPython, llamada CircuitPython, para cumplir con los requisitos específicos de varios de los tableros de desarrollo de microcontroladores de la empresa. La empresa, que ya proporcionaba un gran número de bibliotecas de soporte periférico para CircuitPython, también convirtió muchas bibliotecas periféricas de la inmensa colección Arduino en bibliotecas CircuitPython.

Adafruit diseñó una línea de placas de desarrollo de microcontroladores explícitamente para admitir CircuitPython. Estos incluyen:

  • La 3333 Circuit Playground Express con diez LED RGB controlables y direccionables (Figura 1)

Imagen de la 3333 Circuit Playground Express de Adafruit

Figura 1: La 3333 Circuit Playground Express de Adafruit cuenta con diez LED RGB controlables y direccionables. (Fuente de la imagen: Adafruit)

  • Placa de desarrollo 3500 Trinket M0 que mide solo 27 mm x 15.3 mm x 2.75 mm (Figura 2)

Imagen de la placa de desarrollo 3500 Trinket M0 de Adafruit

Figura 2: La placa de desarrollo 3500 Trinket M0 de Adafruit mide solo 27 mm x 15.3 mm x 2 mm. (Fuente de la imagen: Adafruit)

  • La 3501 Gemma M0 es aproximadamente del tamaño de una moneda de 25 centavos de dólar estadounidense (un cuarto) y se puede alimentar desde su puerto USB o desde un puerto de batería separado (Figura 3)

Imagen de 3501 Gemma M0 de Adafruit

Figura 3: La 3501 Gemma M0 de Adafruit tiene aproximadamente el tamaño de una moneda de 25 centavos de dólar estadounidense y se puede alimentar desde su puerto USB o desde un puerto de batería separado. (Fuente de la imagen: Adafruit)

  • La 3403 Feather M0 Express es una placa de desarrollo que cuenta con una pequeña área de tablero de prueba para circuitos personalizados (Figura 4)

Imagen de la placa de desarrollo 3403 Feather M0 Express de Adafruit

Figura 4: La placa de desarrollo 3403 Feather M0 Express de Adafruit cuenta con una pequeña área de tablero de prueba para circuitos personalizados. (Fuente de la imagen: Adafruit)

Estas cuatro placas de desarrollo de microcontroladores Adafruit se basan en los microcontroladores SAMD21 de Microchip Technology (antes Atmel) con soporte nativo de USB. Sin embargo, CircuitPython admite más que las placas de desarrollo de Adafruit y el microcontrolador SAMD21. También están comenzando a aparecer versiones de CircuitPython para otras placas de desarrollo con otros microcontroladores, como la 3406 Feather NRF52 de Adafruit y la nRF52-DK de Nordic Semiconductor, ambas basadas en el microcontrolador nRF52832 de Nordic Semiconductor. Además, la placa de desarrollo nRF52840-DK de Nordic Semiconductor (Figura 5), basada en el microcontrolador nRF52840 de la empresa, también es compatible con CircuitPython. Los dos microcontroladores en los que se basan estas tres placas cuentan con BLE (Bluetooth de bajo consumo) integrado en el chip, con el soporte de software adecuado.

Imagen de la placa de desarrollo nRF52840-DK de Nordic Semiconductor

Figura 5: La placa de desarrollo nRF52840-DK de Nordic Semiconductor cuenta con soporte de BLE integrado. (Fuente de la imagen: Nordic Semiconductor)

Desarrollando con CircuitPython

Adafruit adoptó un enfoque único para colocar CircuitPython en placas de desarrollo diseñadas para admitir directamente el lenguaje. Conecte una de estas tarjetas al puerto USB de una PC host y la tarjeta aparece como una unidad de disco en la PC. El directorio raíz de esta unidad de disco muestra los archivos críticos de CircuitPython, incluido el intérprete, el programa del usuario y una carpeta que contiene los archivos de la biblioteca. Esta disposición facilita el acceso por parte de la PC host a la placa de desarrollo utilizando el sistema de archivos y los controladores existentes.

La interfaz de usuario de CircuitPython en la PC host requiere un editor de código abierto, descargable y gratuito, y una interfaz REPL. Adafruit recomienda una aplicación de código abierto llamada Mu que se muestra en la Figura 6. La pantalla Mu se divide en una ventana de código, donde se realiza la edición, y la ventana de monitoreo y control REPL, donde el programador controla el intérprete CircuitPython de la placa de desarrollo.

Imagen de la interfaz de programación de código abierto de Adafruit llamada Mu

Figura 6: Adafruit recomienda el uso de una interfaz de programación de código abierto llamada Mu. La pantalla Mu se divide en una ventana de código, donde se realiza la edición, y la ventana de monitoreo y control REPL, donde el programador controla el intérprete CircuitPython de la placa de desarrollo. (Fuente de la imagen: codewith.mu/en/tutorials/1.0/adafruit)

Al escribir un programa en la ventana del código y hacer clic en el botón "Guardar" de Mu, el código se guarda en las placas de desarrollo CircuitPython de Adafruit en la gran memoria flash en chip del microcontrolador SAMD21. Todo el código de CircuitPython reside en la placa de desarrollo de la memoria flash del microcontrolador. Recuerde, la placa CircuitPython parece una unidad de disco para la PC, por lo que no es un acto poco natural desde la perspectiva del sistema operativo.

Conclusión

El lenguaje Python ofrece a los programadores muchos beneficios, incluida la programación interactiva, la experimentación y la depuración. Tiene una sintaxis de lenguaje simplificada más parecida a la de un ser humano, sin necesidad de declaraciones de variables ni de escritura, ni puntuación meticulosa. MicroPython es una variación de Python 3 que hace posible la programación del microcontrolador en Python.

Como se muestra, Adafruit ha adaptado MicroPython para derivar CircuitPython para soporte directo de hardware para simplificar aún más la experimentación y el aprendizaje y acelerar el desarrollo de software. CircuitPython ya es compatible con varias placas de desarrollo de microcontroladores de bajo costo basadas en los microcontroladores SAMD21 de Microchip, así como otras placas de desarrollo basadas en los microcontroladores nRF habilitados con BLE de Nordic Semiconductor.

Descargo de responsabilidad: Las opiniones, creencias y puntos de vista expresados por los autores o participantes del foro de este sitio web no reflejan necesariamente las opiniones, las creencias y los puntos de vista de Digi-Key Electronics o de las políticas oficiales de Digi-Key Electronics.

Acerca de este autor

Steve Leibson

Steve Leibson fue ingeniero de sistemas para HP y Cadnetix, editor en jefe de EDN y Microprocessor Report, blogger tecnológico de Xilinx y Cadence (entre otros), y se desempeñó como experto en tecnología en dos episodios de "The Next Wave with Leonard Nimoy". Ha ayudado a los ingenieros de diseño a desarrollar sistemas mejores, más rápidos y más confiables durante 33 años.

Acerca de este editor

Editores de Digi-Key de América del Norte