Introdução
Bem-vindo à Demonstração Multi-Protocolo Pico! Neste tutorial, exploraremos como usar o Raspberry Pi Pico (RP2040) para se comunicar por meio de vários protocolos simultaneamente: Serial, I2C, SPI e ADC. Este é um exemplo avançado que reúne várias habilidades essenciais para o desenvolvimento embarcado. Construiremos o circuito no simulador Velxio, escreveremos o código e analisaremos cada parte passo a passo.

Análise do Circuito
Vamos observar os componentes e a fiação. O circuito usa um Raspberry Pi Pico (Nano RP2040 Connect) e vários periféricos:
- LED Azul (led-i2c): Conectado ao pino D12 (GP12) através de um resistor limitador de corrente. O ânodo (A) conecta-se ao D12, o cátodo (C) ao GND.
- LED Amarelo (led-spi): Conectado ao pino D7 (GP7) de forma similar.
- Potenciômetro (pot-adc): O pino de sinal (SIG) conecta-se a A0 (GP26). O VCC vai para 3,3V, o GND para GND.
- LED Verde (led-gpio): Conectado ao pino D2 (GP2).
Todos os LEDs compartilham um terra comum. O potenciômetro é alimentado pela linha de 3,3V. A fiação é direta, mas observe que estamos usando os periféricos I2C e SPI integrados do Pico (embora não mostrados explicitamente no esquema, o código assume que eles estão disponíveis nos pinos padrão).
Análise do Código
O código é escrito em Arduino C++ e usa as bibliotecas Wire e SPI. Vamos detalhá-lo seção por seção.
Configuração
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
delay(500);
Serial.println("==============================");
Serial.println(" Pico Multi-Protocol Demo");
Serial.println("==============================");
Serial.println();
Começamos inicializando o LED integrado e a Serial a 115200 baud. O delay dá tempo para o monitor serial conectar.
1. Scanner I2C
Wire.begin();
Serial.println("[I2C] Scanning bus...");
int found = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
found++;
Serial.print(" Found device at 0x");
if (addr < 16) Serial.print('0');
Serial.println(addr, HEX);
}
}
Serial.print(" Total devices: "); Serial.println(found);
Serial.println();
Isso escaneia todos os endereços I2C possíveis (1-126) e relata qualquer um que confirme. No simulador, você pode ver dispositivos virtuais em endereços como 0x50 (EEPROM) e 0x68 (RTC).
2. Leitura/Escrita EEPROM I2C
Serial.println("[I2C] EEPROM test at 0x50...");
Wire.beginTransmission(0x50);
Wire.write(0x00); // register 0
Wire.write(0x42); // data
Wire.endTransmission();
delay(5);
Wire.beginTransmission(0x50);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(0x50, 1);
if (Wire.available()) {
byte val = Wire.read();
Serial.print(" Wrote 0x42, Read 0x");
Serial.print(val, HEX);
Serial.println(val == 0x42 ? " — OK" : " — FAIL");
}
Serial.println();
Escrevemos o valor 0x42 no registrador 0 da EEPROM no endereço 0x50, depois o lemos de volta para verificar. Isso testa a leitura/escrita básica do I2C.
3. RTC I2C
Serial.println("[I2C] Reading DS1307 RTC at 0x68...");
Wire.beginTransmission(0x68);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(0x68, 3);
if (Wire.available() >= 3) {
byte sec = ((Wire.read() & 0x7F) >> 4) * 10 + (Wire.read() & 0x0F);
byte min2 = Wire.read();
(void)sec; (void)min2;
Serial.println(" RTC responded OK");
}
Serial.println();
Aqui tentamos ler os registradores de tempo de um RTC DS1307 no endereço 0x68. O código lê três bytes (segundos, minutos, horas), mas apenas verifica se o dispositivo respondeu.
4. Loopback SPI
Serial.println("[SPI] Loopback test...");
SPI.begin();
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
byte tx = 0xAB;
byte rx = SPI.transfer(tx);
Serial.print(" TX: 0x"); Serial.print(tx, HEX);
Serial.print(" RX: 0x"); Serial.println(rx, HEX);
SPI.endTransaction();
Serial.println();
Isso realiza um loopback SPI simples: envia 0xAB e lê de volta o que for recebido. No simulador, o MISO e o MOSI não estão conectados externamente, então o valor recebido pode ser 0xFF ou algo diferente. Isso testa o hardware SPI.
5. ADC
Serial.println("[ADC] Reading analog channels...");
analogReadResolution(12);
int a0 = analogRead(A0);
Serial.print(" A0 (GP26): "); Serial.println(a0);
Serial.println();
Definimos a resolução do ADC para 12 bits e lemos o valor de A0 (GP26). A tensão do wiper do potenciômetro é lida, fornecendo um valor entre 0 e 4095.
6. Piscar GPIO
Serial.println("[GPIO] Blinking LED...");
for (int i = 0; i < 3; i++) {
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(200);
}
Serial.println(" 3 blinks done");
Serial.println();
Serial.println("=== All protocol tests complete ===");
}
Finalmente, piscamos o LED integrado três vezes para indicar que a configuração está completa.
Loop
void loop() {
// Heartbeat
static unsigned long last = 0;
if (millis() - last >= 3000) {
last = millis();
Serial.print("[Heartbeat] ");
Serial.print(millis() / 1000);
Serial.println("s");
}
}
O loop imprime uma mensagem de heartbeat a cada 3 segundos para mostrar que o programa ainda está em execução.
Conceitos-Chave
- Integração multi-protocolo: Combinar Serial, I2C, SPI e ADC em um único sketch ensina como gerenciar vários periféricos sem conflitos.
- Endereçamento I2C: Entender como escanear e se comunicar com dispositivos em endereços específicos.
- Configuração SPI: Definir velocidade do clock, ordem dos bits e modo.
- Resolução do ADC: Usar
analogReadResolution()para obter maior precisão. - Depuração Serial: Usar o Monitor Serial para exibir dados em tempo real.
Armadilhas Comuns e Dicas de Depuração
- Resistores de pull-up I2C: O Pico tem pull-ups internos, mas podem ser necessários externos para fios mais longos. No simulador, isso é tratado automaticamente.
- Loopback SPI: Sem um loopback físico, os dados recebidos podem ser lixo. Use um fio jumper entre MOSI e MISO para um teste de loopback real.
- Ruído do ADC: Potenciômetros podem ser ruidosos; adicionar um capacitor entre o wiper e o terra ajuda.
- Incompatibilidade de taxa de transmissão Serial: Certifique-se de que seu Monitor Serial está configurado para 115200 baud.
Extensões Sugeridas
- Adicione um sensor I2C externo (por exemplo, temperatura/umidade) e exiba suas leituras.
- Use SPI para controlar um display OLED.
- Implemente um registrador de dados simples que leia o ADC e armazene valores na EEPROM.
- Adicione um botão para acionar diferentes modos de teste.
Experimente Você Mesmo!
Pronto para experimentar? Abra o exemplo ao vivo no Velxio e execute a simulação. Você pode modificar o código, adicionar componentes e ver os resultados instantaneamente.
Inicie a Demonstração Multi-Protocolo Pico no Velxio



Feliz programação!