terça-feira, maio 04, 2021

MicroPython ou CircuitPython?

As placas que estou usando atualmente (a Franzininho WiFi e a Raspberry Pi Pico) possuem suporte tanto do MicroPython como do CircuitPython. O que são estes dois ambientes e o que tem de igual e diferente entre eles?


MicroPython

O MicroPython surgiu em 2013, na forma de uma campanha de Damien P. George no KickStarter. O objetivo era gerar uma versão otimizada do Python que pudesse ser executada diretamente em um microcontrolador. A versão atual está disponível no site oficial e os fontes estão no github.

O MicroPython implementa grande parte da linguagem e bibliotecas do Python 3 e acrescenta recursos específicos para microcontroladores. Um dos recursos do MicroPython é a operação interativa através de uma comunicação serial (a REPL read–eval–print loop ou seja você digita um comando ele executa, imprime o resultado e volta a esperar outro comando). Tipicamente você usa o MicroPython através de uma IDE que saiba conversar com a REPL, como o Thonny.

No MicroPython o acesso aos recursos específicos do microcontrolador é feito através de um módulo chamado machine. A Raspberry Pi Foundation fornece suporte ao MicroPython desde o lançamento da PiPico, incluindo um módulo machine específico (com suporte ao PIO), documentação e exemplos.

O exemplo abaixo pisca um LED na PiPico:

import machine
import utime

led_onboard = machine.Pin(25, machine.Pin.OUT)
while True:
    led_onboard.value(1)
    utime.sleep(5)
    led_onboard.value(0)
    utime.sleep(5)

CircuitPython

O CircuitPython é um fork do MicroPython, patrocinado pela Adafruit. A maior parte do código é idêntica, a versão atual está disponível no site oficial e os fontes estão no github.

Uma lista das diferenças pode ser vista no README, vou me concentrar no que considero mais importante:

  • O CircuitPython usa a USB nativa das placas para implementar uma unidade de disco. Para executar um programa basta gravá-lo neste disco com um nome especial.
  • A interface com os recursos do microcontrolador é diferente. No lugar do módulo machine temos vários outros, procurando oferecer uma interface universal (porém os nomes do pinos variam conforme a placa).
  • Não suporta execução concorrente (interrupções e threading).
O pisca LED para a PiPico fica assim:
import board
import digitalio
import time

led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)
Veredito

A minha experiência até agora com os dois softwares foi bem limitada.

A primeira coisa que você vai reparar ao olhar os sites oficiais é que o CircuitPython lista um número bem maior de placas suportadas. Além disso ele tem um número maior de bibliotecas para suporte a sensores e módulos, algo que é importante para o uso no dia a dia (a não ser que você goste de criar suas próprias bibliotecas).

Não fosse o suporte da Raspberry Pi Foundation e eu esqueceria o MicroPython por enquanto. Uma coisa que pode impactar em projetos mais complexos é a ausência de suporte a concorrência no CircuitPython.

Quem quiser acompanhar as minhas brincadeiras com CircuitPython na Franzininho WiFi pode olhar no meu github: https://github.com/dquadros/FranzininhoWiFi.

Nenhum comentário: