Back-End

2 jun, 2017

Arduino e Raspberry Pi trabalhando juntos – Parte 02 (agora com I2C)

Publicidade

A maneira mais fácil de conectar nossa placa Arduino com nosso Raspberry Pi é utilizando o cabo USB, mas às vezes essa comunicação se torna um pesadelo, especialmente porque não existe um sinal de clock para sincronizar nossos aparelhos e nós temos que confiar na taxa de bits. Existem maneiras diferentes de conectar nosso Arduino ao nosso Raspberry Pi, como o I2C, SPI e serial utilizando GPIO. Hoje vamos falar sobre o I2C, especialmente porque é bem simples se tomarmos cuidado com algumas coisas. Vamos começar.

O I2C utiliza duas linhas SDA (dados) e SCL (clock), além to GND (terra). O SDA é bidirecional, então precisamos garantir, de alguma maneira, quem está enviando os dados (mestre ou escravo). Com o I2C, apenas o mestre pode iniciar a comunicação e controlar o sinal do clock. Cada aparelho tem 7 bits de direção, então podemos conectar 128 aparelhos ao mesmo barramento.

Se quisermos conectar uma placa Arduino e uma Raspberry Pi, devemos garantir que a Raspberry Pi é a mestre. Isso acontece porque o Arduino trabalha com 5v e o Raspberry Pi com 3.3V. Isso significa que nós precisamos utilizar resistores de entrada se não quisermos destruir nosso Raspberry Pi. Mas o Raspberry Pi tem resistores de 1k8 ohms para a linha de energia de 3.3 V, então podemos conectar ambos os aparelhos (se conectarmos outros equipamentos I2C ao barramento, eles deverão ter seus resistores de pull-up removidos).

Isto é o que precisamos para conectar nosso Raspberry Pi ao nosso Arduino:

  • SDA do Raspberry Pi para entrada analógica 4 do Arduino
  • SCL do Raspberry Pi para entrada analógica 5 do Arduino
  • GND do Raspberry Pi para o GND do Arduino

Agora vamos construir um protótipo simples. O Raspberry Pi vai piscar um led (GPI017) a cada segundo e também vai enviar uma mensagem (via I2C) para o Arduino piscar outro led. Esta é a parte em Python:

import RPi.GPIO as gpio
import smbus
import time
import sys
 
bus = smbus.SMBus(1)
address = 0x04
 
def main():
    gpio.setmode(gpio.BCM)
    gpio.setup(17, gpio.OUT)
    status = False
    while 1:
        gpio.output(17, status)
        status = not status
        bus.write_byte(address, 1 if status else 0)
        print "Arduino answer to RPI:", bus.read_byte(address)
        time.sleep(1)
 
 
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Interrupted'
        gpio.cleanup()
        sys.exit(0)

E finalmente o programa no Arduino. O Arduino também responde ao Raspberry Pi com o valor que está sendo enviado, e o Raspberry Pi vai armazenar a resposta no console.

#include <Wire.h>
 
#define SLAVE_ADDRESS 0x04
#define LED  13
 
int number = 0;
 
void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData);
 
  Serial.println("Ready!");
}
 
void loop() {
  delay(100);
}
 
void receiveData(int byteCount) {
  Serial.print("receiveData");
  while (Wire.available()) {
    number = Wire.read();
    Serial.print("data received: ");
    Serial.println(number);
 
    if (number == 1) {
      Serial.println(" LED ON");
      digitalWrite(LED, HIGH);
    } else {
      Serial.println(" LED OFF");
      digitalWrite(LED, LOW);
    }
  }
}
 
void sendData() {
  Wire.write(number);
}

Hardware:

  • Arduino UNO
  • Raspberry Pi
  • Dois leds e dois resistores.

O código estão disponível no meu GitHub.

***

Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://gonzalo123.com/2017/05/22/arduino-and-raspberry-pi-working-together-part-2-now-with-i2c/.