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