Skip to Content

Encontrar os pinos padrão I2C e SPI

Encontrar os pinos padrão I2C e SPI

Neste tutorial, vais aprender como encontrar os pinos padrão/hardware para as interfaces I2C e SPI nos microcontroladores suportados pelo Arduino IDE, como Arduino, ESP32 e ESP8266.

Muitos dispositivos externos, como ecrãs ou sensores, usam o protocolo I2C ou SPI para comunicar com o teu microcontrolador. O I2C é um protocolo de dois fios que usa os sinais SDA e SCL, e o SPI é um protocolo de quatro fios com SS, MOSI, MISO, SCK.

I2C and SPI wiring
Ligação dos fios I2C e SPI (source)

Para ligar um dispositivo I2C ou SPI ao teu microcontrolador, precisas de saber quais os pinos do microcontrolador que são osI2C (SDA, SCL) ou osSPI (SS, MOSI, MISO, SCK).

I2C and SPI pins on Arduino Uno
Pinos I2C e SPI no Arduino Uno

Para as placas de desenvolvimento mais comuns, como a maioria das placas Arduino, esses pinos estão geralmente bem documentados, fáceis de encontrar ou identificados na placa. No entanto, para algumas placas mais exóticas, antigas ou clones, especialmente da família ESP8266 e ESP32, a documentação é muitas vezes escassa.

Imprimir os pinos padrão I2C e SPI

Desde que consigas ver a tua placa (ou uma placa compatível) no Board Manager, há uma forma simples de imprimir os pinos padrão para as interfaces I2C e SPI. A captura de ecrã abaixo mostra como selecionar o Arduino Uno no Board Manager, e também quais outras placas Arduino estão disponíveis:

Board Manager in Arduino IDE
Board Manager no Arduino IDE

Depois de selecionares a tua placa, podes executar o seguinte código. Ele utiliza as constantes para esses pinos que estão definidas para todas ou a maioria das placas de desenvolvimento paraprint them to the Serial Monitor.

void print(const char* name, int pin) {
  Serial.print(name);
  Serial.println(pin);
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  print("LED:  ", LED_BUILTIN);

  print("SDA:  ", SDA);
  print("SCL:  ", SCL);

  print("SS:   ", SS);
  print("MOSI: ", MOSI);
  print("MISO: ", MISO);
  print("SCK:  ", SCK);

  delay(5000);
}

Só tens de garantir que configuras a velocidade correta (baud rate) para o Serial Monitor. Pode variar dependendo da placa que selecionares. Outras velocidades que não 9600 também funcionam, mas a velocidade no código (Serial.begin()) e no Serial Monitor têm de coincidir, caso contrário vais ver caracteres estranhos.

Set baud rate for Serial Monitor
Configurar a velocidade (9600) para o Serial Monitor

Se carregares e executares o código acima num Arduino Uno, deverás ver a seguinte saída no Serial Monitor:

I2C and SPI default pins printed to Serial Monitor
Pinos padrão I2C e SPI impressos no Serial Monitor

Podes encontrar as definições dos pinos no ficheiro pins_arduino.h para os Arduinos padrão. Para variantes como Mega, Leonardo e outras, procura na subpasta variants.

I2C e SPI para ESP32 e ESP8266

O código acima funciona da mesma forma para a maioria das placas ESP32 ou ESP8266, mas tens de ter o core ESP32 ou ESP8266 instalado primeiro. Dá uma vista de olhos no nosso tutorial sobre How to Program ESP32 with Arduino ID, se tiveres dificuldades a instalar o core ESP32.

A instalação do core ESP8266 funciona da mesma forma. Mas se precisares de ajuda, vê o tutorial Game of Life on a Dot Matrix Display with MAX7219, onde explico detalhadamente como instalar o core ESP8266.

Para cada tipo de placa, haverá definições de pinos diferentes no ficheiro pins_arduino.h. Os diferentes tipos de placa estão organizados numa subpasta chamada “variants“. Vê ESP32 board variants e o ESP8266 board variants. A captura de ecrã abaixo mostra a estrutura de pastas com a pasta variants para as placas ESP32:

GitHub Repo with ESP32 variants
Repositório GitHub com variantes ESP32 (source)

Cada uma das subpastas específicas para cada placa terá um ficheiro pins_arduino.h. Por exemplo, aqui está o pins_arduino.h para o ESP32 padrão e aqui está o pins_arduino.h para a WEMOS LOLIN32 lite – uma placa que uso frequentemente.

Note que estas são as definições de pinos padrão e para a maioria das placas ESP32 e ESP8266 podes alterar quais os pinos que queres usar para I2C e SPI. Também, dependendo da placa, algumas definições podem estar em falta e outras terão definições adicionais, por exemplo A0, A1, … para entradas analógicas ou TX e RX para a interface serial.

Conclusões

Espero que este pequeno pedaço de código seja útil e, se tiveres alguma dúvida, não hesites em perguntar.

Boas experiências ; )