Back-End

17 mai, 2017

Arduino e Raspberry Pi trabalhando juntos

Publicidade

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/