🧪 Novos tutoriais em andamento — do braço robótico ao sensor
Ir para o conteúdo

Arduino: Comunicação IIC ​

📁 Estrutura de arquivos ​

Plain
IIC_Voice/
├── IIC_Voice.ino    # Programa principal
├── bsp_iic.hpp         # Arquivo de cabeçalho (endereços e declarações de funções)
├── bsp_iic.cpp         # Arquivo de implementação
└── README.md            # Este tutorial

🔌 Conexão de hardware ​

Imagem 1


🔧 Compilação e upload ​

Primeiro passo: abrir o Arduino IDE ​

  1. Abra o arquivo IIC_Voice.ino

  2. Selecione o modelo da sua placa de desenvolvimento (como o Arduino Uno)

  3. Selecione a porta serial correspondente

Segundo passo: compilar e enviar ​

  1. Clique no botão ✔️ para compilar

  2. Clique no botão ➡️ para enviar à placa de desenvolvimento


📡 Teste da porta serial ​

Abrir o monitor serial no Arduino IDE ​

  • Taxa de transmissão: 115200

  • Caractere de fim de linha: Nenhum

Saída esperada ​

Após energizar, você deve ver:

IIC Voice Module Initialized

Diga a palavra de ativação e a palavra de comando ao módulo e o ID correspondente será exibido:

Plain
ID: 1
ID: 2
ID: 10

📚 Mapeamento de registradores ​


📚 Descrição da interface BSP ​

IIC_Init() ​

Plain
void IIC_Init(void);

Função: inicializa o barramento I2C

Exemplo:

Plain
void setup() {
  IIC_Init();
}

IIC_ReadCommand() ​

Plain
int IIC_ReadCommand(void);

Função: lê o ID do comando reconhecido pelo módulo de voz

Valor de retorno:

  • 0 - nenhum comando reconhecido

  • 1~254 - ID do comando

  • -1 - erro de comunicação

Exemplo:

Plain
int id = IIC_ReadCommand();
if (id > 0) {
  Serial.print("识别到命令: ");
  Serial.println(id);
}

IIC_SetPassiveVoice() ​

Plain
void IIC_SetPassiveVoice(uint8_t voiceID);

Função: define a voz de reprodução passiva

Parâmetros:

  • 0x00 - tipo de frase de reprodução passiva

Exemplo:

Plain
IIC_SetPassiveVoice(0x00);
delay(200);

IIC_SetFunctionVoice() ​

Plain
void IIC_SetFunctionVoice(uint8_t voiceID);

Função: define a voz de reprodução das palavras de função

Parâmetros:

  • 0x00 - tipo de frase de reprodução de palavras de função

Exemplo:

Plain
IIC_SetFunctionVoice(0x00);
delay(200);

IIC_SetCommandVoice() ​

Plain
void IIC_SetCommandVoice(uint8_t voiceID);

Função: define a voz de reprodução das palavras de comando

Parâmetros:

  • 0x00 - tipo de frase de reprodução de palavras de comando

Exemplo:

Plain
IIC_SetCommandVoice(0x00);
delay(200);

🎯 Descrição da lógica do programa principal ​

JavaScript
void setup() {
  Serial.begin(115200);
  IIC_Init();

  Serial.println("IIC Voice Module Initialized");

  IIC_SetCommandVoice(0x00);  // Ao energizar, reproduzir a voz das palavras de comando
  delay(200);
}

void loop() {
  int commandId = IIC_ReadCommand();

  if (commandId >= 0) {
    // Filtrar valores inválidos para evitar saída duplicada
    if (commandId != 0 && commandId != 255 && commandId != lastCommandId) {
      Serial.print("ID: ");
      Serial.println(commandId);
      lastCommandId = commandId;

      // Exemplo: controlar a reprodução conforme o comando reconhecido
      if (commandId == 1) {
        IIC_SetCommandVoice(0x00);  // Comando 1 reconhecido; reproduzir a voz das palavras de comando
      } else if (commandId == 2) {
        IIC_SetCommandVoice(0x00);  // Comando 2 reconhecido; reproduzir a voz das palavras de comando
      }
    } else if (commandId == 0 || commandId == 255) {
      if (lastCommandId != 0) {
        lastCommandId = 0;  // Redefinir o estado
      }
    }
  } else {
    Serial.println("IIC Read Error");
    delay(1000);
  }

  delay(50);
}

🔍 Solução de problemas ​

Q1: A porta serial mostra apenas "IIC Read Error" ​

Possíveis causas:

  1. Cabeamento incorreto ou não conectado

  2. Módulo sem alimentação

  3. Endereço I2C incorreto

Solução:

  • Verifique se SDA/SCL estão invertidos

  • Verifique se o GND está aterrado em comum

  • Verifique se a alimentação de 5V está normal

  • Use um programa de varredura I2C para confirmar o endereço do dispositivo


Q2: Nenhuma saída ​

Possíveis causas:

  1. Taxa de transmissão da porta serial incorreta

  2. O módulo não foi ativado

Solução:

  • Confirme se a taxa de transmissão da porta serial é 115200

  • Primeiro diga a palavra de ativação, depois a palavra de comando


Q3: Saída de "ID: 255" ou "ID: 0" ​

Observação: isso é normal

  • 0 = nenhum comando reconhecido

  • 255 = nenhum novo dado

Esses valores já são filtrados no código, por isso normalmente não são exibidos. Se você vir essa saída, significa que o código não está em vigor.


💡 Vantagens da arquitetura BSP ​

Camadas de código bem definidas ​

  • bsp_iic.hpp - contém apenas as declarações, não a implementação

  • bsp_iic.cpp - detalhes concretos da implementação

  • IIC_Voice.ino - trata apenas da lógica de negócio

Fácil de portar ​

Se você trocar para outra plataforma (como STM32 ou ESP32), basta modificar a implementação de bsp_iic.cpp; o programa principal não precisa ser alterado.

Fácil de manter ​

As alterações no código relacionado ao I2C ficam apenas em bsp_iic.cpp; uma única alteração vale em todos os lugares.


🚀 Exemplos de funções estendidas ​

Exemplo 1: acionar diferentes reproduções conforme o comando ​

Plain
if (commandId == 1) {
  IIC_SetCommandVoice(0x00);      // Reproduzir palavras de comando
} else if (commandId == 2) {
  IIC_SetFunctionVoice(0x00);     // Reproduzir palavras de função
} else if (commandId == 3) {
  IIC_SetPassiveVoice(0x00);      // Reproduzir voz passiva
}

Exemplo 2: controlar o LED ​

Plain
if (commandId == 10) {
  digitalWrite(LED_PIN, LOW);    // Apagar a luz
  IIC_SetCommandVoice(0x00);     // Reproduzir confirmação
}

Exemplo 3: controlar o motor ​

Plain
if (commandId == 11) {
  motor_stop();
  IIC_SetCommandVoice(0x00);     // Reproduzir confirmação
}