Manual

do

Maker

.

com

Comunicação serial Arduino com Python

Comunicação serial Arduino com Python

Esse é um post bem simples, mas acredito que necessário. Isso porque sempre fazemos comunicação com Arduino através de alguma IDE, normalmente para testar e depurar erros, mas e quando queremos fazer uma comunicação entre computador e Arduino através de programas? Bem, comunicando o Arduino com Python a coisa fica fácil, não importa o sistema operacional, basta passar a porta serial correta.

Arduino com Python

Primeiramente, não tenha preconceito com a linguagem por não ser C/C++. Utilizar Python para a comunicação serial é mais simples que fazer um blink no Arduino, de verdade. No Linux o Python é um interpretador nativo e você terá que instalar apenas o PySerial como adicional. Já no Windows, você terá que instalar Python, mas é simples. Depois, com 3 linhas você estará escrevendo dados na serial do Arduino. Vamos ver?

Instalar Python no Windows

Vamos começar pela instalação, já que a maioria das pessoas usa Windows. Vá ao Python.org e baixe a última versão. Tem instalador, não precisa de tutorial para dar um clique, certo?

Tendo instalado o Python, agora você precisará instalar o PySerial. Pegue-o aqui, também com instalador. Ou seja, até agora você precisa de 2 cliques para 2 programas, ok?

IDE para programar em Python no Windows

Eu recomendo a mesma que utilizo no Linux. Pegue o Pycharm nesse link. A versão free não lhe deixará nada a desejar. Instale-a pelos meios tradicionais (click,click,click), se necessário for, aponte o caminho do interpretador (o diretório no qual você instalou o Python) e já estará hábil a utilizá-lo. A partir de agora já podemos falar da comunicação do Arduino com Python.

PySerial no Linux

Nas distribuições que tenho utilizado o PySerial não vem instalado por padrão. No Debian normalmente utilizo aptou pip para instalá-lo.

Utilizando o pip

Para instalar com o pip, basta executar o comando:

sudo pip install pyserial

Se não tiver o pip instalado, execute o comando:

sudo apt-get install python-pip

Utilizando apt

Com apt, basta executar o seguinte comando:

sudo apt-get install python-serial

Vale lembrar que estou utilizando Debian e esse comando vale para suas variáveis também (Linux Mint, Ubuntu, Xubuntu etc).

Utilizando rpm, zypper ou yum

Se for uma distribuição baseada em Red-Hat, use o comando rpm para instalá-lo. Você pode baixar pacotes binários da internet ou utilizar o zypper (gerenciador de pacotes do Red-Hat ou Fedora, não sei ao certo a propriedade) ou o yum (esse foi criado pelo Linux SuSE).

Exemplificando com zypper:

zypper search -s serial

Veja o que retorna e instale o pacote correto. E daí por diante, esse tutorial não é de Linux, então vamos lá; a partir desse ponto você já deve conseguir utilizar seu Arduino com Python na comunicação serial.

Programa de exemplo para Arduino

Peguei um Arduino UNO e coloquei o LED com catodo no pino 7 e anodo no 5V, com um resistor de 330ohms. O código para o Arduino ficou assim:

String line         = "";
bool stringComplete = false;

void setup() {
  Serial.begin(9600);
  pinMode(7,OUTPUT);
  digitalWrite(7,HIGH);

}

void loop() {
  if (stringComplete){
    if (line.equals("on\n")){
      digitalWrite(7,LOW);
    }
    else if (line.equals("off\n")){
      digitalWrite(7,HIGH);
    }
    stringComplete = false;
    line = "";
  }

}

void serialEvent(){
  while(Serial.available()){
    char inChar = (char)Serial.read();
    line += inChar;
    if (inChar == '\n'){
      stringComplete = true;
      Serial.print(line);
    }
  }
}

Nesse exemplo, utilizei um recurso importante; o serialEvent, que recebe eventos advindos da porta serial. Assim não é necessário ficar fazendo polling para ver se tem algo na porta serial e com isso o Arduino fica livre para executar outras tarefas enquanto não chega nada no barramento serial. É importante que você tenha esse recurso em mente porque estou finalizando um artigo bem bacana e será fundamental utilizar esse recurso.

Tudo o que o programa espera é um array de char com terminador de linha; "on\n" para ligar, "off\n" para desligar. Perceba que como GND vai ao pino digital, LOW liga e HIGH desliga o LED. De resto, nada especial, apenas uma flag a ser verificada no loop, de modo que quando o Arduino passar por lá, verificará esse status e atuará conforme a respectiva condicional.

Programa de exemplo para o Python

Se você não conhece Python ainda, olhe só que maravilha. Bastam essas linhas para a coisa acontecer:

import serial

#use ttyUSB0 se for o caso, ou se for Windows, COMx.
arduino = serial.Serial('/dev/ttyACM0',9600,timeout=2)

arduino.write("on\n")

Estupidamente simples, hum? Suba o sketch no Arduino e execute esse programa Python em seguida. O LED se acenderá. Para ler a resposta, simplesmente use:

arduino.read_until('\n')

Você pode guardar a resposta em uma variável para tratamento posterior em seu programa, seja para saber a resposta a um determinado comando ou simplesmente para consultar status de sensores do seu Arduino com Python.

Muitos artigos que escrevi sobre ESP8266 (e até sobre o ESP32) utilizei o firmware MicroPython, que dá ao programador a mesma facilidade que se tem em um desktop. Se lhe interessar, dê uma olhada nesse artigo,, ou vá até a caixa de pesquisa (a lupa no canto superior direito) e procure por "micropython" para ver outros artigos.

Se precisar de Arduino UNO, não tem pretesto para não pegá-lo na UsinaInfo.

Pra finalizar o artigo, você tem o mesmo recurso para Raspberry, Orange Pi, Banana Pi, VoCore, Onion Omega, Carambola e qualquer outra board que rode distribuições Linux completas e com gerenciador de pacotes, portanto, divirta-se!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.