Fundamentos · 10 min de leitura

O que é MicroPython? Comandos básicos, REPL e primeiros programas

O que é MicroPython e como ele difere do Python? REPL, machine.Pin, PWM, ADC, I2C, ticks_ms, main.py, Thonny, mpremote, mip e configuração do Pico e ESP32.

MicroPython é uma reimplementação pequena e rápida da linguagem Python 3 para microcontroladores. Depois que você carrega o MicroPython em uma placa como Raspberry Pi Pico ou ESP32, a placa executa código Python por conta própria: você digita um comando, sem etapa de compilação, e vê o LED acender imediatamente. Se aprendeu Python na escola ou no computador, pode usar a mesma sintaxe para ler pinos, acionar motores, coletar dados de sensores e se conectar ao Wi-Fi.

Neste guia, você vai aprender como o MicroPython difere do Python comum, conhecer o REPL, que permite conversar com a placa instantaneamente, e os módulos que mais vai usar, como machine.Pin, PWM, ADC e I2C, com exemplos de código. Depois, verá a diferença entre time.sleep e ticks_ms, os arquivos main.py e boot.py executados na inicialização, o carregamento de arquivos com Thonny e mpremote, a adição de bibliotecas com mip e a gravação do firmware no Pico e ESP32. Na última seção, comparamos MicroPython e Arduino C++ lado a lado.

Raspberry Pi Pico executando MicroPython
Raspberry Pi Pico: a placa mais fácil para começar com MicroPython. Basta arrastar e soltar o arquivo UF2.

O que é MicroPython e como ele difere do Python?

MicroPython é um projeto de código aberto iniciado por Damien George em 2013 para uma pequena placa e hoje oferece suporte a dezenas de microcontroladores. O firmware que você carrega na placa contém o interpretador Python, os módulos básicos e um pequeno sistema de arquivos. Primeiro, seu código é convertido em bytecode na placa; depois, o interpretador executa esse bytecode passo a passo. Como é impossível colocar todo o Python do computador em algumas centenas de KB de RAM, a linguagem continua a mesma, mas a maioria das bibliotecas é reduzida ou totalmente ausente. Em troca, foi acrescentado algo que o Python de computador não tem: o módulo machine, que dá acesso direto ao hardware.

TópicoPython (computador)MicroPython (placa)
Onde é executadoUm computador com gigabytes de RAMUm microcontrolador com centenas de KB de RAM
Biblioteca padrãoMuito ampla: datetime, threading, urllib...Um pequeno subconjunto: time, os, json, re, struct, random, math...
Pacotesnumpy, pandas e milhares de outros via pipSem numpy ou pandas; pacotes de micropython-lib via mip
Acesso ao hardwareNenhum; precisa de bibliotecas extrasO módulo machine: Pin, PWM, ADC, I2C, SPI, UART, Timer
Números de ponto flutuante64 bits (cerca de 15 dígitos)32 bits no Pico e ESP32 (cerca de 7 dígitos)
Tempotime.time(), datetime (funções de tempo do Python padrão)time.sleep_ms(), time.ticks_ms(), machine.RTC (funções de tempo do MicroPython)
Início do programaVocê o executa pela linha de comandoboot.py e main.py são executados automaticamente na inicialização

Placas que executam MicroPython

PlacaArquivo de firmwareRAM totalObservação
Raspberry Pi Pico (RP2040)RPI_PICO (.uf2)264 KBA placa mais fácil para começar
Raspberry Pi Pico WRPI_PICO_W (.uf2)264 KBMódulo network para Wi-Fi; o firmware do Pico comum não ativa o Wi-Fi aqui
Raspberry Pi Pico 2 (RP2350)RPI_PICO2 (.uf2)520 KBMais rápido, mais memória
ESP32 (WROOM)ESP32_GENERIC (.bin)520 KB (o Wi-Fi usa uma parte)Wi-Fi e Bluetooth; muito mais memória nos modelos com PSRAM
ESP8266 (NodeMCU, Wemos D1 Mini)ESP8266_GENERIC (.bin)Cerca de 80 KBFunciona, mas a memória é limitada; escolha um ESP32 para projetos novos
Arduino Uno (ATmega328P)Nenhum2 KBNão consegue executar MicroPython; é programado em C++

Gravação do firmware MicroPython no Pico e ESP32

  1. Pico: Mantenha o botão BOOTSEL da placa pressionado enquanto conecta o cabo USB e depois solte. Uma unidade chamada RPI-RP2 aparece no computador (RP2350 no Pico 2).
  2. Baixe o arquivo .uf2 correto para sua placa na página oficial de downloads do MicroPython (RPI_PICO para o Pico, RPI_PICO_W para o Pico W) e arraste-o para essa unidade.
  3. Quando a cópia termina, a placa reinicia automaticamente e a unidade desaparece; o MicroPython está instalado. No Thonny, escolha MicroPython (Raspberry Pi Pico) em Ferramentas > Opções > Interpretador.
  4. ESP32: Se o Python estiver instalado no computador, digite pip install esptool na linha de comando. Conecte a placa e encontre sua porta (por exemplo, COM3 no Windows, /dev/ttyUSB0 no Linux).
  5. Primeiro, apague a memória flash: esptool.py --chip esp32 --port COM3 erase_flash. Se a placa não conectar, mantenha o botão BOOT pressionado enquanto o comando é executado.
  6. Grave o firmware: esptool.py --chip esp32 --port COM3 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-....bin. No ESP32-S3 e ESP32-C3, o endereço é 0x0. A opção Install or update MicroPython (esptool) do Thonny faz a mesma tarefa por uma janela.
Gravar o firmware apaga o programa e os arquivos antigos da placa, incluindo código carregado pela Arduino IDE. Da mesma forma, carregar código pela Arduino IDE em uma placa que executa MicroPython apaga o MicroPython; para voltar, você precisa gravar o firmware novamente. Se o sistema de arquivos do Pico for corrompido ou a placa travar, o arquivo oficial flash_nuke.uf2 apaga completamente a memória flash. Os pinos do Pico e um passo a passo da primeira configuração, tela por tela, estão em O que é o Raspberry Pi Pico.

O REPL: conversando com a placa instantaneamente

O REPL (Read-Eval-Print Loop) é a linha de comando que a placa disponibiliza pela porta serial. O prompt >>> que aparece na janela Shell, na parte inferior do Thonny, significa que o REPL está esperando por você. Digite 1 + 1 e a placa calcula e retorna 2; digite from machine import Pin seguido de Pin("LED", Pin.OUT).value(1) e o LED do Pico acende naquele instante. Não há maneira mais rápida que o REPL de ler o valor de um sensor, conferir se um pino está conectado corretamente ou explorar como uma biblioteca funciona, tudo sem esperar pela compilação e pelo carregamento.

Atalho ou comandoO que faz
Ctrl+CInterrompe o programa em execução (KeyboardInterrupt) e retorna ao REPL
Ctrl+DReinicialização suave; boot.py e main.py são executados novamente
Ctrl+EModo de colagem: cole código longo sem alterar a indentação e execute com Ctrl+D
TabPreenchimento automático; digite machine. e pressione Tab para listar tudo no módulo
help("modules")Lista todos os módulos do firmware
import gc; gc.mem_free()Mostra a RAM livre disponível para o programa, em bytes
import os; os.listdir()Lista os arquivos da placa

Primeiro programa e seu equivalente em Arduino C++

MicroPython
1# İlk program: dahili LED'i yakıp söndür / First program: blink the onboard LED
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT)        # Pico ve Pico W; ESP32'de Pin(2, Pin.OUT) / Pico and Pico W; Pin(2, Pin.OUT) on ESP32
6
7while True:
8    led.value(1)                 # yak / on
9    time.sleep(0.5)              # saniye cinsinden / in seconds
10    led.value(0)                 # söndür / off
11    time.sleep(0.5)
C++ (Arduino IDE)
1// Aynı program Arduino C++ ile / The same program in Arduino C++
2void setup() {
3  pinMode(LED_BUILTIN, OUTPUT);
4}
5
6void loop() {
7  digitalWrite(LED_BUILTIN, HIGH);
8  delay(500);                    // milisaniye cinsinden / in milliseconds
9  digitalWrite(LED_BUILTIN, LOW);
10  delay(500);
11}

Os dois programas fazem a mesma tarefa, mas têm estruturas diferentes. MicroPython não tem setup() nem loop(): o arquivo é executado uma vez, de cima para baixo, e você cria o laço infinito com while True:. Em vez de chaves e ponto e vírgula, ele usa indentação; todas as linhas dentro do laço devem ter o mesmo recuo (geralmente 4 espaços). A espera também usa uma unidade diferente: time.sleep(0.5) recebe segundos, enquanto delay(500) do Arduino recebe milissegundos. No MicroPython, você usa time.sleep_ms() para milissegundos e time.sleep_us() para microssegundos. Os fundamentos do lado do Arduino estão em Fundamentos de programação com Arduino.

machine.Pin: entrada e saída digital

MicroPythonEquivalente em Arduino C++Descrição
led = Pin(15, Pin.OUT)pinMode(15, OUTPUT)Configura o pino como saída
led.value(1) ou led.on()digitalWrite(15, HIGH)Define o pino como HIGH; value(0) ou off() define como LOW
buton = Pin(14, Pin.IN, Pin.PULL_UP)pinMode(14, INPUT_PULLUP)Entrada com o resistor de pull-up interno
buton.value()digitalRead(14)Retorna 0 ou 1
led.toggle()digitalWrite(15, !digitalRead(15))Inverte o estado; disponível no Pico, use value(not led.value()) no ESP32
buton.irq(trigger=Pin.IRQ_FALLING, handler=f) (configuração de interrupção no MicroPython)attachInterrupt(..., f, FALLING)Chama a função f quando o pino muda de estado

time.sleep e ticks_ms: medindo o tempo sem bloqueio

time.sleep() faz a placa esperar completamente; enquanto isso, nenhum botão é lido e nenhum sensor é verificado. Para executar várias tarefas ao mesmo tempo, você usa o equivalente em MicroPython à abordagem com millis() do Arduino: time.ticks_ms() informa os milissegundos desde a inicialização, e time.ticks_diff(new, old) calcula a diferença entre dois instantes. É importante obter a diferença com ticks_diff em vez de uma subtração simples; o contador volta ao início depois de atingir determinado valor, e uma subtração simples dá o resultado errado nesse ponto. O código abaixo pisca o LED sem bloqueio enquanto monitora um botão por uma interrupção (IRQ); cada pressionamento muda a velocidade das piscadas.

MicroPython
1# delay kullanmadan iki iş: LED yanıp söner, buton kesmeyle modu değiştirir
2# Two jobs without blocking: the LED blinks, a button interrupt switches the mode
3from machine import Pin
4import time
5
6led = Pin(15, Pin.OUT)                       # LED + 220 Ω, GP15
7buton = Pin(14, Pin.IN, Pin.PULL_UP)         # buton GP14 ile GND arasında / button between GP14 and GND
8
9hizli = False
10son_basma = 0
11son_degisim = time.ticks_ms()
12
13def buton_kesme(pin):                        # kesme fonksiyonu kısa olmalı / keep the handler short
14    global hizli, son_basma
15    simdi = time.ticks_ms()
16    if time.ticks_diff(simdi, son_basma) > 200:   # 200 ms debounce / 200 ms debounce
17        son_basma = simdi
18        hizli = not hizli
19
20buton.irq(trigger=Pin.IRQ_FALLING, handler=buton_kesme)   # basınca HIGH'dan LOW'a iner / goes HIGH to LOW when pressed
21
22while True:
23    aralik = 100 if hizli else 500
24    if time.ticks_diff(time.ticks_ms(), son_degisim) >= aralik:   # taşmaya karşı güvenli / safe against wrap-around
25        son_degisim = time.ticks_ms()
26        led.value(not led.value())
27    # burada başka işler yapılabilir / other work can run here
Mantenha a função que trata a interrupção curta: apenas inverta uma flag ou guarde uma marcação de tempo e deixe as tarefas longas para o laço principal. Para variáveis que você altera na interrupção, não se esqueça de escrever global no início da função; caso contrário, o Python cria uma nova variável local com o mesmo nome dentro da função, e o laço principal nunca vê a mudança. O lado do Arduino dessa mesma ideia está em millis versus delay.

PWM: brilho, servos e som

MicroPython
1# PWM: LED parlaklığı ve servo açısı / PWM: LED brightness and servo angle
2from machine import Pin, PWM
3import time
4
5led = PWM(Pin(15))
6led.freq(1000)                               # 1 kHz: titreme görünmez / no visible flicker
7
8for d in range(0, 65536, 2048):              # duty_u16: 0 (kapalı) ... 65535 (tam) / 0 (off) ... 65535 (full)
9    led.duty_u16(d)
10    time.sleep_ms(20)
11led.duty_u16(0)
12
13servo = PWM(Pin(16))
14servo.freq(50)                               # servolar 50 Hz (20 ms) ister / servos expect 50 Hz (20 ms)
15
16def servo_aci(derece):
17    us = 500 + derece * 2000 // 180          # 0° = 0,5 ms, 180° = 2,5 ms; servona göre ayarla / tune for your servo
18    servo.duty_ns(us * 1000)
19
20for a in (0, 90, 180, 90):
21    servo_aci(a)
22    time.sleep(1)

O objeto PWM liga e desliga um pino muito rapidamente para definir uma potência média. freq() define quantas vezes por segundo isso se repete, e duty_u16() define por quanto tempo o pino fica ligado, com um número entre 0 e 65.535; 32.768 significa aproximadamente 50 por cento. Essa escala oferece passos muito mais finos que a faixa de 0–255 do analogWrite do Arduino. Servos esperam um sinal de 50 Hz e uma largura de pulso entre 0,5 e 2,5 ms; duty_ns() define a duração do pulso diretamente em nanossegundos, o que torna o código do servo muito mais simples. Você também pode tocar notas atribuindo diferentes valores de freq() a um buzzer passivo. O ciclo de trabalho e a frequência são explicados em detalhes em O que é PWM.

ADC: leitura analógica

MicroPython
1# ADC: potansiyometre ve Pico'nun dahili sıcaklık sensörü
2# ADC: a potentiometer and the Pico's internal temperature sensor
3from machine import ADC, Pin
4import time
5
6pot = ADC(Pin(26))                           # GP26 = ADC0; ESP32'de ADC(Pin(34)) / ADC(Pin(34)) on ESP32
7yonga = ADC(4)                               # 4. kanal: dahili sıcaklık / channel 4: internal temperature
8
9def ortalama(adc, n=16):                     # gürültüyü azalt / reduce noise
10    toplam = 0
11    for _ in range(n):
12        toplam += adc.read_u16()
13    return toplam // n
14
15while True:
16    ham = ortalama(pot)                      # 0-65535 (12 bit ölçüm 16 bite ölçeklenir) / 12-bit reading scaled to 16 bits
17    volt = ham * 3.3 / 65535
18    v_t = ortalama(yonga) * 3.3 / 65535
19    derece = 27 - (v_t - 0.706) / 0.001721   # RP2040 veri sayfasındaki formül / formula from the RP2040 datasheet
20    print("Pot: {} ({:.2f} V)  Yonga / chip: {:.1f} C".format(ham, volt, derece))
21    time.sleep(1)

read_u16() retorna um valor entre 0 e 65.535 em todas as placas, então o mesmo código funciona no Pico e no ESP32. O ADC do Pico é, na verdade, de 12 bits, e a leitura é convertida para uma escala de 16 bits. O Pico tem três pinos analógicos acessíveis ao usuário: GP26 (ADC0), GP27 (ADC1) e GP28 (ADC2); o quarto canal é o sensor de temperatura dentro do chip, que mede a temperatura do chip, não a do ambiente. No ESP32, você precisa de adc.atten(ADC.ATTN_11DB) para ler toda a faixa de 0–3,3 V, e os pinos ADC2 não podem ser usados enquanto o Wi-Fi está ligado, então escolha os pinos ADC1 entre GPIO 32 e 39. A média de 16 amostras no código reduz perceptivelmente o ruído do ADC. Conceitos como resolução e tensão de referência são abordados em O que é um ADC.

I2C: conectando sensores e displays

MicroPython
1# I2C: hattı tara ve SSD1306 OLED'e yaz / I2C: scan the bus and write to an SSD1306 OLED
2from machine import Pin, I2C
3import ssd1306                               # önce: mpremote mip install ssd1306 / first: mpremote mip install ssd1306
4
5i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)   # Pico; ESP32'de I2C(0, sda=Pin(21), scl=Pin(22))
6adresler = i2c.scan()
7print("Bulunan / found:", [hex(a) for a in adresler])   # OLED genelde 0x3c / OLED is usually 0x3c
8
9if 0x3C in adresler:
10    oled = ssd1306.SSD1306_I2C(128, 64, i2c)
11    oled.fill(0)
12    oled.text("MicroPython", 0, 0)
13    oled.text("I2C: " + hex(adresler[0]), 0, 16)
14    oled.show()

I2C(0, sda=..., scl=...) inicia a unidade I2C de hardware nos pinos escolhidos, e scan() retorna uma lista dos endereços de todos os dispositivos que respondem no barramento. Se um sensor não estiver funcionando, essa varredura é a primeira coisa a fazer: uma lista vazia significa que o problema está na fiação, e um endereço inesperado significa que você deve corrigir o endereço no código. No Pico, os pinos que cada unidade I2C pode usar são fixos; por exemplo, os pares GP0-GP1, GP4-GP5 ou GP8-GP9 funcionam para I2C0, e escolher um par errado gera um ValueError. No ESP32, o I2C pode ser atribuído a quase qualquer pino. Os detalhes do display estão em display OLED de 0,96 polegada, e os do protocolo em si em O que é I2C.

main.py e boot.py: código executado na inicialização

Quando você pressiona Executar no Thonny, o código só é executado naquele momento, sem ser salvo na placa; ele desaparece quando você desconecta o USB. Para que o código seja executado automaticamente toda vez que a placa iniciar, é preciso salvar o arquivo na placa como main.py. Na inicialização, boot.py é executado primeiro, seguido de main.py. boot.py serve para preparações feitas uma única vez, como conectar ao Wi-Fi ou ajustar o relógio; o firmware do ESP32 cria esse arquivo automaticamente, enquanto no Pico ele geralmente não existe. Seu programa principal sempre fica em main.py. Você pode trazer funções escritas em outros arquivos para main.py com import e salvar leituras no sistema de arquivos da placa com open().

MicroPython
1# main.py: kart her açıldığında otomatik çalışır / runs automatically every time the board starts
2import time
3from machine import Pin
4
5time.sleep(3)                                # Ctrl+C ile durdurmak için güvenlik payı / a safety window for Ctrl+C
6led = Pin("LED", Pin.OUT)
7sayac = 0
8
9try:
10    while True:
11        sayac += 1
12        led.value(sayac % 2)
13        print("Calisiyor / running", sayac)
14        time.sleep(1)
15except KeyboardInterrupt:                    # Thonny'de Stop ya da Ctrl+C / Stop in Thonny or Ctrl+C
16    led.value(0)
17    print("Durduruldu / stopped")
Se main.py contiver um laço infinito sem nenhuma pausa, o Thonny pode não conseguir se conectar à placa e exibir Device is busy or does not respond. Primeiro, pressione o botão Parar do Thonny algumas vezes ou tente Ctrl+C no Shell. Se isso não funcionar, você precisará iniciar o Pico com BOOTSEL e apagá-lo com flash_nuke.uf2, ou apagar a memória flash e gravar o firmware novamente no ESP32. A espera de 3 segundos na inicialização do código dá tempo para interromper o programa antes de chegar a essa situação.

Carregamento de arquivos: Thonny e mpremote

Se você está começando, o Thonny é o caminho mais fácil: escreva o código, escolha Arquivo > Salvar como, selecione Raspberry Pi Pico ou Dispositivo MicroPython na janela que abrir e dê ao arquivo o nome main.py. Abra Exibir > Arquivos para ver os arquivos do computador e da placa lado a lado e copiar de um para o outro com um clique do botão direito. Para quem gosta da linha de comando e usa um editor como o VS Code, a ferramenta oficial é mpremote; instale com pip install mpremote, e ela se conecta automaticamente à primeira placa MicroPython que encontrar.

Comando mpremoteO que faz
mpremoteConecta à primeira placa encontrada e abre o REPL (sair: Ctrl+X)
mpremote lsLista os arquivos da placa
mpremote cp main.py :main.py (comando para copiar arquivo para a placa)Copia um arquivo do computador para a placa; os dois-pontos (:) indicam a placa
mpremote run test.py (comando para executar arquivo)Executa o arquivo sem salvá-lo na placa e mostra sua saída
mpremote mip install ssd1306 (comando para instalar biblioteca)Baixa a biblioteca pela conexão de internet do computador e a instala na pasta /lib da placa
mpremote resetReinicia a placa
mpremote connect COM3 lsConecta à placa em uma porta específica (como /dev/ttyACM0 no macOS e Linux)

Adição de bibliotecas: mip

Não há pip no MicroPython; em seu lugar, usa-se o pequeno gerenciador de pacotes mip. Em uma placa que pode acessar a internet, como Pico W ou ESP32, primeiro você se conecta ao Wi-Fi e depois digita import mip e mip.install("ssd1306") no REPL; o pacote é baixado do repositório oficial micropython-lib e colocado na pasta /lib da placa. Você também pode instalar um driver do GitHub com mip.install("github:user/repo"). Para um Pico sem Wi-Fi, faça o mesmo pelo computador com o comando mpremote mip install ou pelo menu Ferramentas > Gerenciar pacotes do Thonny. Copiar um driver de arquivo único (por exemplo, um arquivo .py escrito para um sensor) para a placa também funciona; desde que o arquivo esteja na raiz ou em /lib, você pode carregá-lo com import. Os passos para conectar ao Wi-Fi estão em Wi-Fi no Pico W.

MicroPython ou Arduino C++?

CaracterísticaMicroPythonArduino C++
LinguagemSintaxe do Python 3C++ e o core do Arduino
Como é executadoUm interpretador na placa executa bytecodeCompilado para código de máquina no computador
Tempo para testarInstantâneo no REPL; salvar leva 1–2 segundosCompilação e carregamento a cada alteração, 10–60 segundos
VelocidadeLaços em Python puro são cerca de 10–100 vezes mais lentosVelocidade nativa
TemporizaçãoO coletor de lixo faz pequenas pausas ocasionalmentePrevisível na escala de microssegundos
Sistema de arquivosSim: main.py, arquivos de dados e configuraçõesNão; precisa de EEPROM ou de uma biblioteca extra
Bibliotecasmicropython-lib e drivers da comunidadeO enorme ecossistema de bibliotecas do Arduino
PlacasPico, ESP32, ESP8266Quase todas, incluindo Uno, Nano e Mega
Mensagens de erroMensagens claras com números de linha durante a execuçãoErros de compilação; Serial.print para acompanhar durante a execução
Mais indicado paraAprendizado, experimentos rápidos, Wi-Fi e processamento de dadosTemporização precisa, placas com pouca memória, muitas bibliotecas prontas

Na prática, seu projeto determina a escolha. Ler um sensor e enviar os dados por Wi-Fi, servir uma página web ou acionar um display exige menos linhas e fica pronto mais rápido em MicroPython. Gerar sinais com precisão de microssegundos, atualizar centenas de LEDs muito rapidamente ou ter apenas uma placa pequena como o Uno favorece o C++. Você pode acelerar uma função lenta com o decorador @micropython.native e reduzir as pausas do coletor de lixo evitando criar novas listas e strings dentro dos laços. Para escolher uma placa, veja também Arduino ou ESP32.

Erros comuns e soluções

Erro ou sintomaCausaSolução
ImportError: no module named 'ssd1306'A biblioteca não está na placaInstale com mip ou mpremote mip, ou copie o arquivo .py para a placa
IndentationErrorIndentação inconsistente, espaços e tabulações misturadosUse 4 espaços em todo o arquivo; o Thonny faz isso por você
OSError: [Errno 5] EIO (I2C)O dispositivo não responde: fiação, endereço ou alimentaçãoConfira o endereço com scan() e verifique SDA e SCL
ValueError: bad SCL pinOs pinos escolhidos não pertencem àquela unidade I2CEscolha o par correto de I2C0 ou I2C1 na pinagem do Pico
O código funciona no Thonny, mas não depois de desconectar o USBO arquivo não foi salvo na placa como main.pyUse Salvar como para salvá-lo na placa com o nome main.py
MemoryError: memory allocation failed (mensagem de erro: falha na alocação de memória)A RAM está cheia: uma lista grande, uma string longa ou um buffer grandeProcesse os dados em partes, chame gc.collect() e use bytearray
Thonny: Device is busy or does not respond (mensagem do Thonny: dispositivo ocupado ou sem resposta)main.py está em um laço sem pausa ou outro programa está usando a portaUse Parar ou Ctrl+C, feche o outro programa e apague a memória flash se necessário

MicroPython é o caminho mais curto para o mundo dos microcontroladores se você já sabe Python: você vê o resultado no instante em que testa um pino no REPL, e poucas linhas bastam para ler um sensor e se conectar ao Wi-Fi. Depois de aprender os módulos básicos, a ideia de main.py e a temporização sem bloqueio com ticks_ms, seus projetos crescem rapidamente. No app BlueGrays, você encontra projetos com Raspberry Pi Pico usando LEDs, semáforo, botões e PWM, com diagramas de fiação passo a passo e código MicroPython.

Perguntas frequentes

O que é MicroPython?

MicroPython é uma versão pequena da linguagem Python 3 feita para microcontroladores. Graças ao firmware carregado na placa, placas como Raspberry Pi Pico e ESP32 executam código Python diretamente; o módulo machine dá acesso aos pinos, ao PWM, ao ADC e ao I2C.

MicroPython é a mesma coisa que Python?

A sintaxe é a mesma, mas o MicroPython é um subconjunto reduzido do Python de computador. Bibliotecas grandes como numpy e pandas não estão disponíveis, a biblioteca padrão é reduzida e os números de ponto flutuante são de 32 bits no Pico e ESP32. Em troca, o módulo machine foi adicionado para dar acesso direto ao hardware.

Qual é melhor, MicroPython ou Arduino?

Depende do seu objetivo. MicroPython é mais prático para aprender, fazer experimentos rápidos e projetos que enviam dados por Wi-Fi; Arduino C++ executa mais rápido, tem temporização mais precisa e oferece muito mais bibliotecas prontas. O Pico e o ESP32 podem ser programados das duas formas.

MicroPython funciona no Arduino Uno?

Não. O chip ATmega328P do Arduino Uno tem apenas 2 KB de RAM e 32 KB de memória flash, e o interpretador MicroPython não cabe nesse espaço. Se quiser usar MicroPython, escolha uma placa mais potente, como Raspberry Pi Pico ou ESP32.

Como instalar uma biblioteca no MicroPython?

Em uma placa conectada à internet, digite import mip e mip.install("package_name") no REPL. Em placas sem Wi-Fi, faça o mesmo pelo computador com o comando mpremote mip install package_name ou com o gerenciador de pacotes do Thonny. Copiar drivers de arquivo único para a placa também funciona.

Como salvar código permanentemente no Pico?

No Thonny, escolha Raspberry Pi Pico em Arquivo > Salvar como e dê ao arquivo o nome main.py. Toda vez que a placa inicia, boot.py é executado primeiro e depois main.py é executado automaticamente; mesmo que você desconecte o USB do computador e o conecte a outra fonte de 5 V, o programa continua funcionando.

Ver todos os projetos
Piscar o LED integrado do Raspberry Pi Pico (Pico e Pico W)
#147Iniciante

Piscar o LED integrado do Raspberry Pi Pico (Pico e Pico W)

O primeiro projeto da série Raspberry Pi Pico! Fazemos o LED verde integrado piscar para verificar se a placa funciona — um primeiro experimento no estilo clássico "Hello World". SEM componentes externos, apenas o Pico e um cabo USB. O código foi escrito em MicroPython (a linguagem com suporte oficial da Raspberry Pi Foundation). Aprenda a usar a classe machine.Pin, o modo Pin.OUT, os métodos led.on()/off() e time.sleep() no Thonny IDE.

5.0(1)
10
Raspberry Pi Pico: controle de LED externo (protoboard)
#148Iniciante

Raspberry Pi Pico: controle de LED externo (protoboard)

O próximo passo após o LED integrado do Pico: conectar um LED externo à protoboard e controlá-lo pelo pino GP14. Neste projeto, você aprende a usar qualquer pino GPIO de uso geral do Pico como saída, a polaridade do LED (terminal longo = ânodo/+, terminal curto = cátodo/–) e por que um resistor limitador de corrente (220Ω) é necessário. Sem o resistor, uma corrente excessiva passa pelo LED e pode queimá-lo. O circuito é muito simples: Pico GP14 → resistor de 220Ω → LE

4.5(2)
7
Raspberry Pi Pico: dois LEDs alternados (padrão flip-flop)
#149Iniciante

Raspberry Pi Pico: dois LEDs alternados (padrão flip-flop)

O próximo passo após um único LED no Pico: dois LEDs piscam alternadamente no clássico padrão flip-flop. Quando um apaga, o outro acende — o exemplo mais básico de coordenação entre vários GPIOs. Neste projeto, dois LEDs de cores diferentes (vermelho no GP14, verde no GP13) trocam de estado a cada 500ms. O método Pin.toggle() do MicroPython deixa o código curto e claro. Essa mesma lógica é a base de semáforos, luzes policiais, LEDs sequenciais e todas as animações com vários LEDs.

5.0(2)
19
Raspberry Pi Pico: semáforo (3 LEDs em sequência)
#150Iniciante

Raspberry Pi Pico: semáforo (3 LEDs em sequência)

Simulamos um semáforo real com LEDs vermelho, amarelo e verde — o primeiro projeto com 3 LEDs da série Pico! Verde por 4 segundos: "siga"; amarelo por 1,5 segundo: "prepare-se"; vermelho por 3 segundos: "pare"; e vermelho+amarelo por 1 segundo: "saída" (padrão de semáforo europeu). Aprenda definição de funções (def all_off()), lógica de máquina de estados (sequência) e sincronização de vários GPIOs.

4.0(1)
12
Raspberry Pi Pico: LED controlado por botão (enquanto pressionado)
#155Iniciante
Premium

Raspberry Pi Pico: LED controlado por botão (enquanto pressionado)

Primeiro projeto de entrada com o Pico — leitura de botão! O LED acende enquanto o botão está pressionado e apaga ao soltá-lo. O grande passo depois das animações com LEDs: entrada de sinais do mundo para o Pico. Aprenda a usar Pin.IN (modo de entrada), Pin.PULL_UP (pull-up interno — padrão para botões) e a leitura com button.value(). LED no GP14, botão no GP2. Pressionado = LOW (0), solto = HIGH (1) — essa lógica invertida confunde no início, mas é padrão da indústria.

0.0(0)
11
Raspberry Pi Pico: debounce de botão com IRQ ou consulta por software
#159Intermediário
Premium

Raspberry Pi Pico: debounce de botão com IRQ ou consulta por software

Você pressiona o botão uma vez e o código conta 3-4? Isso é oscilação dos contatos — os contatos metálicos oscilam por microssegundos! Compare 2 métodos de contagem lado a lado no Monitor Serial: consulta sem filtro (detecta as oscilações e conta a mais) e IRQ + debounce por software (contagem correta). Aprenda a física da oscilação dos contatos, debounce por software (ticks_diff() > 50ms), registro de interrupção com Pin.irq(), disparo IRQ_FALLING, rotinas ISR, global e…

0.0(0)
12
Raspberry Pi Pico: variação de brilho do LED com PWM (efeito de respiração)
#160Iniciante

Raspberry Pi Pico: variação de brilho do LED com PWM (efeito de respiração)

O LED não só pisca — ele respira! Com o PWM (modulação por largura de pulso) do Raspberry Pi Pico, o brilho do LED aumenta e diminui lentamente, como a luz de um MacBook em repouso. Aprenda a usar a classe machine.PWM, duty_u16() (brilho de 16 bits, de 0–65535), frequência PWM (freq(1000) — 1.000 ciclos de ligar/desligar por segundo, sem cintilação visível), laços com passos usando range() (crescentes e decrescentes) e saída semelhante à analógica em um pino digital.

0.0(0)
4
Ciclo de cores com LED RGB no Raspberry Pi Pico (PWM de 3 canais)
#161Iniciante

Ciclo de cores com LED RGB no Raspberry Pi Pico (PWM de 3 canais)

Um LED, milhões de cores! Um LED RGB contém, na verdade, 3 LEDs: vermelho, verde e azul. Controlar cada um com seu próprio canal PWM do Pico mistura as cores: vermelho + verde = amarelo, verde + azul = ciano, os três = branco. Aqui, o LED alterna entre 8 cores. Aprenda sobre múltiplos canais PWM, definição de funções (def set_color(...)), mistura de cores RGB (como funcionam telas e lâmpadas inteligentes), conversão de 8 bits → 16 bits (x257 converte 0–255 em…

0.0(0)
6