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/.





