Como usar a comunicação SPI com Arduino e Raspberry Pi

A interface periférica em série (SPI) é um protocolo de comunicação serial síncrona amplamente utilizada para comunicação de curta distância, principalmente em sistemas incorporados. A combinação da versatilidade do Arduino com o poder computacional do Raspberry Pi através do SPI pode abrir uma infinidade de possibilidades de projeto. Nesta postagem do blog, exploraremos como configurar e usar a comunicação SPI entre um Arduino e um Raspberry Pi.

Entendendo o SPI

O SPI é um protocolo de comunicação duplex completo que opera no modo mestre-escravo. Ele usa quatro linhas principais:

  • Mosi (mestre em escravo): Transfere dados de mestre para escravo.
  • Miso (mestre em escravo): Transfere dados do escravo para o mestre.
  • SCLK (relógio serial): Sincroniza a transmissão de dados gerada pelo mestre.
  • SS/CS (Selecione/Selecionar CHIP): Seleciona o dispositivo escravo.

O SPI é favorecido por sua simplicidade e velocidade, tornando -o ideal para aplicações que exigem troca de dados rápida entre dispositivos.

Por que usar SPI com Arduino e Raspberry Pi?

A combinação de um Arduino com um Raspberry Pi aproveita os pontos fortes de ambas as plataformas. O Arduino se destaca no controle de hardware em tempo real, enquanto o Raspberry Pi oferece recursos de processamento de alto nível, conectividade de rede e um rico ambiente de sistema operacional. O uso do SPI permite que esses dois dispositivos se comuniquem com eficiência, permitindo projetos complexos, como sistemas de automação residencial, robótica e aplicativos de log de dados.

Configurando o hardware

Para estabelecer a comunicação SPI entre um Arduino e um Raspberry Pi, você precisará dos seguintes componentes:

  • Arduino Uno (ou qualquer placa Arduino compatível)
  • Raspberry Pi (qualquer modelo com pinos GPIO)
  • Fios de jumper
  • Breadboard (opcional)

Ligando o Arduino e Raspberry Pi para SPI

A fiação cuidadosa é crucial para garantir uma comunicação adequada. Veja como conectar o Arduino e o Raspberry Pi usando o SPI:

Pino GPIO de Raspberry Pi Pino Arduino Descrição
Gpio10 (mosi) Pino 11 (Mosi) Mestre escravo em
Gpio9 (miso) Pino 12 (miso) Mestre em escravo
GPIO11 (SCLK) Pino 13 (SCLK) Relógio em série
Gpio8 (CE0) Pino 10 (SS) Selecionar escravo
Gnd Gnd Terreno comum
3.3V 5V Fonte de alimentação (Use o nível de mudança, se necessário)

Observação: O Raspberry Pi opera em níveis lógicos de 3,3V, enquanto o Arduino UNO usa 5V. Recomenda -se usar um conversor de nível lógico para evitar possíveis danos ao Raspberry Pi.

Configurando o Arduino

O Arduino atuará como o dispositivo SPI Slave. Abaixo está uma amostra de esboço do Arduino para configurá -lo:


// Arduino as SPI Slave

#include 

volatile byte receivedData = 0;

void setup() {
  // Initialize serial communication for debugging
  Serial.begin(9600);

  // Set MISO as output
  pinMode(MISO, OUTPUT);

  // Enable SPI in Slave Mode
  SPCR |= _BV(SPE);
  SPI.attachInterrupt();
}

ISR(SPI_STC_vect) {
  receivedData = SPDR;
}

void loop() {
  if (receivedData) {
    Serial.print("Received: ");
    Serial.println(receivedData);
    receivedData = 0;
  }
}

Explicação:

  • Spi.attachinterrupt (); Ativa a interrupção do SPI, permitindo que o Arduino lidera dados de entrada.
  • Na rotina de serviço de interrupção ISR(SPI_STC_vect), os dados recebidos são armazenados para processamento.
  • O loop() A função verifica os dados recebidos e os imprime no monitor serial.

Configurando o Raspberry Pi

O Raspberry Pi atuará como o dispositivo SPI Master. Usaremos Python com o spidev Biblioteca para lidar com a comunicação SPI. Primeiro, verifique se o SPI está ativado:

  • Abra a ferramenta de configuração do Raspberry Pi:
    sudo raspi-config
  • Navegar para Opções de interface > Spi > Habilitar
  • Reinicie o Raspberry Pi se solicitado.

Instale o spidev biblioteca se ainda não estiver instalado:

sudo apt-get install python3-spidev

Aqui está um amostra de script python para o Raspberry Pi:

# Raspberry Pi as SPI Master

import spidev
import time

# Open SPI bus 0, device (CS) 0
spi = spidev.SpiDev()
spi.open(0, 0)

# Set SPI speed and mode
spi.max_speed_hz = 50000
spi.mode = 0

def send_data(data):
    """Send a single byte to the SPI slave"""
    response = spi.xfer2([data])
    return response

try:
    while True:
        data = 42  # Example data byte
        print(f"Sending: {data}")
        resp = send_data(data)
        print(f"Received: {resp[0]}")
        time.sleep(1)

except KeyboardInterrupt:
    spi.close()

Explicação:

  • spi.open (0, 0) abre o barramento SPI 0, dispositivo 0 (CE0).
  • spi.xfer2 ([dados]) envia o byte de dados e, simultaneamente, recebe dados do escravo.
  • O script envia um byte (por exemplo, 42) a cada segundo e imprime a resposta do Arduino.

Testando a comunicação

Depois de configurar o Arduino e o Raspberry Pi:

  1. Carregue o esboço do Arduino para a placa Arduino.
  2. Conecte o Arduino ao Raspberry Pi através da fiação SPI.
  3. Execute o script Python no Raspberry Pi:
    python3 spi_master.py
  4. Abra o Monitor serial do Arduino para visualizar os dados recebidos:
    Tools > Serial Monitor

Você deve ver o Arduino recebendo os dados enviados pelo Raspberry Pi e exibindo -os no monitor serial. Da mesma forma, o Raspberry Pi exibirá os dados que envia e a resposta que recebe.

Dicas de solução de problemas

  • Verifique a fiação: Verifique se todas as conexões entre o Arduino e o Raspberry Pi estão seguras e mapeadas corretamente.
  • Níveis de tensão: Use um conversor de nível lógico para corresponder aos 3.3V do Raspberry Pi com os 5V do Arduino.
  • Ativar SPI: Verifique se o SPI está ativado no Raspberry Pi usando raspi-config.
  • Permissões: Verifique se o seu usuário possui as permissões necessárias para acessar os dispositivos SPI. Pode ser necessário executar seu script python com sudo.
  • Taxa de transmissão: Verifique se o monitor serial e o esboço do Arduino estão usando a mesma taxa de transmissão.
  • Configurações do SPI: Certifique -se de que o mestre e o escravo estejam configurados com o mesmo modo SPI e velocidade.

Conclusão

O uso da comunicação SPI entre um Arduino e um Raspberry Pi permite aproveitar os pontos fortes de ambas as plataformas de maneira eficaz. Esteja você construindo um sistema de robótica complexo, desenvolvendo uma rede de sensores ou experimentando o registro de dados, a compreensão do SPI é inestimável. Seguindo as etapas descritas neste guia, você pode configurar a comunicação SPI confiável e embarcar em projetos empolgantes incorporados que alavancam o poder de Arduino e Raspberry Pi.

Feliz mexer!

Deixe um comentário

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.