Voltar

Demonstração Multi-Protocolo Pico: Serial, I2C, SPI e ADC no RP2040

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.

Diagrama do circuito pico-multi-protocol na tela do simulador Velxio

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:

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

Armadilhas Comuns e Dicas de Depuração

Extensões Sugeridas

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

Barra de ferramentas do editor Velxio com controles de compilar e executar

Barra de ferramentas da tela Velxio acima da janela de simulação

Modal do seletor de componentes Velxio navegando por peças por categoria

Feliz programação!


Compartilhar em:
David Montero

Escrito por

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Artigos relacionados


Artigo anterior
Velxio vs Wokwi, Tinkercad, Proteus e Fritzing: uma comparação honesta
Próximo artigo
Leia Sensores Analógicos no Raspberry Pi Pico com Velxio