Basicamente tudo o que podemos fazer com o Arduino pode ser feito também com um Raspberry Pi (e vice-versa). Há coisas que são fáceis de fazer com Arduino (conectar sensores, por exemplo). Mas outras coisas (como trabalhar com servidores REST, bancos de dados…) são “complicadas” com Arduino e C++ (são possíveis, mas exigem muitas operações de baixo nível) e muito simples com o Raspberry Pi e Python (pelo menos para mim e por causa do meu conhecimento prévio).
Com este pequeno projeto, quero usar uma placa Arduino e Raspberry Pi trabalhando juntos. A ideia é acender dois LEDs. Um (o verde) será controlado por Raspberry Pi diretamente via GPIO, e o outro (o vermelho), será controlado pela placa Arduino. Raspberry Pi será o “cérebro” do projeto e irá dizer à placa Arduino quando ligar/desligar seu led. Vamos ver o código.
import RPi.GPIO as gpio import serial import time import sys import os def main(): gpio.setmode(gpio.BOARD) gpio.setup(12, gpio.OUT) s = serial.Serial('/dev/ttyACM0', 9600) status = False while 1: gpio.output(12, status) status = not status print status s.write("1\n" if status else "0\n") time.sleep(1) if __name__ == '__main__': try: main() except KeyboardInterrupt: print 'Interrupted' gpio.cleanup() try: sys.exit(0) except SystemExit: os._exit(0)
Como podemos ver, o script é um simples loop de acender o led (usando o pino 12) com um intervalo de um segundo. Nossa placa Arduino está conectada diretamente ao Raspberry Pi via cabo USB e enviamos comandos via interface serial.
Finalmente, o programa Arduino:
#define LED 11 String serialData = ""; boolean onSerialRead = false; void setup() { // initialize serial: Serial.begin(9600); serialData.reserve(200); } void procesSerialData() { Serial.print("Data " + serialData); if (serialData == "1") { Serial.println(" LED ON"); digitalWrite(LED, HIGH); } else { Serial.println(" LED OFF"); digitalWrite(LED, LOW); } serialData = ""; onSerialRead = false; } void loop() { if (onSerialRead) { procesSerialData(); } } void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); if (inChar == '\n') { onSerialRead = true; } else { serialData += inChar; } } }
Aqui, a nossa placa Arduino está fazendo um listening da interface serial (com serialEvent) e cada vez que recebemos “\n” o loop principal ligará/desligará o led dependendo do valor (1 – Ligar, 0 – Desligar)
Podemos usar o I2C e outras maneiras para conectar Arduino e Raspberry Pi, mas neste exemplo estamos usando a maneira mais simples de fazer isso: um cabo USB. Só precisamos de um cabo USB A/B. Não é necessário nenhum outro hardware extra (como resistores) e a parte de software é bastante simples também.
Hardware:
- Arduino UNO
- Raspberry Pi 3
- Dois LEDs e dois resistores
Código na minha conta no 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/08/arduino-and-raspberry-pi-working-together/