Projetos

Como Conectar o Arduino com o Python

Eletrogate 12 de julho de 2021

Introdução

Neste post você irá aprender como conectar seu Arduino a um Script em Python via serial, através do módulo para Python, PySerial, além de conhecer seus principais comandos e funcionalidades. Ao final, criaremos dois pequenos projetos, um para ligar um led pelo terminal do Python, e outro saber se um botão foi pressionado ou não.

Esta biblioteca será utilizada para o envio e recebimento dos dados via cabo USB, como se estivéssemos utilizando o próprio Monitor Serial do Arduino, mas devemos tomar alguns cuidados.


Comunicação Serial

O tipo de comunicação que iremos utilizar é a comunicação serial. Este tipo de comunicação é baseado no envio de bits, um após o outro, e um exemplo dessa comunicação é o Código Morse, onde cada “caractere” é enviado, e só após isso o outro sinal é enviado. Este tipo de comunicação difere da comunicação paralela, a qual os bits são enviados juntos, ou seja, todos ao mesmo tempo.

A comunicação serial é também o principal tipo de comunicação utilizado nas redes de computadores. No Arduino, ela é utilizada principalmente para o upload dos sketches para a placa e na utilização do Monitor Serial.


Como Instalar o Python

Para instalar o Python, é necessário entrar no site oficial, python.org, e ir para a aba de downloads. Ao escolher a sua plataforma e instalar o instalador, pode executá-lo e começar o processo de instalação do próprio Python. Esta instalação é simples e do tipo “next, next”, entretanto, na última etapa, antes de clicar em “Install Now”, é importantíssimo que a opção “Add Python to PATH”, isso permitirá a execução de certas bibliotecas sem problemas.

blog-eletrogate-instalando-python


PySerial

blog-eletrogate-py-serialEste módulo do Python permitirá que você se comunique com dispositivos através de uma comunicação serial, não só o Arduino. Ele irá enviar e receber dados através de uma entrada USB do computador, que deverá ser especificada no script. Também será necessário definir o baud-rate da comunicação, no nosso caso, 9600.

Esta biblioteca está disponível para Windows, MacOs e Linux, e pode ser instalada via Prompt de Comando, ao executar o seguinte comando. (Lembre-se que o Python já deve ter sido instalado para que seja possível a execução do “pip”)

pip install pyserial

Principais Funcionalidades

Todas as funções a serem explicadas a seguir serão utilizadas após a criação do objeto responsável pela comunicação, algo que será feito no nosso exemplo para demonstrar as funcionalidades mais à frente.

Envio de dados

Para o envio dos dados utilizaremos o comando ”write”, porém, não podemos apenas enviar os dados puros, e sim, um “encode()” dessa informação. Utilize como base o exemplo abaixo.

serial.write(dado.encode())

Leitura dos dados

Para ler os dados, iremos utilizar o comando “readline()” que irá nos retornar todo o texto que for recebido, entretanto, ele também irá retornar coisas como o “\n” que vem junto a string. Por isso, para “limpar” essa string, temos que utilizar o fatiamento de strings do Python, logo, a função também será transformada para este formato. Para imprimir estes dados lidos, siga o comando abaixo.

texto = str(serial.readline())
print(texto[2:-5])

Limpeza da comunicação

Sempre que alguma funcionalidade for utilizada, é de extrema importância que limpemos a nossa comunicação, evitando interferências e um mau funcionamento do projeto. Por isso, utilizaremos o comando “flush()”, como mostra o exemplo abaixo.

serial.flush()

Exemplos Práticos

Para exemplificar as funções vistas anteriormente, criaremos dois simples sistemas, ambos utilizando o mesmo esquemático abaixo. O primeiro irá demonstrar o processo de escrita, em que através do terminal do Python poderemos ligar ou desligar o led. No segundo, para demonstrar o processo de leitura, utilizaremos o botão, e sempre que este for pressionado, uma mensagem será impressa no terminal do Python. 

Note, também, que os códigos são bem simples, como se estivéssemos utilizando apenas o Monitor Serial do Arduino.

Esquemático dos projetos

Processo de envio dos dados

  • Código em Python
'''
 Blog Eletrogate - Como conectar o Arduino com Python
 Miguel Sena
 blog.eletrogate.com
'''

import serial #Importa a biblioteca

while True: #Loop para a conexão com o Arduino
    try:  #Tenta se conectar, se conseguir, o loop se encerra
        arduino = serial.Serial('COM4', 9600)
        print('Arduino conectado')
        break

    except:
        pass

while True: #Loop principal
    cmd = input('Digite "l" para ligar e "d" para desligar. ') #Pergunta ao usuário se ele deseja ligar ou desligar o led

    if cmd == 'l': #Se a resposta for "l", ele envia este comando ao Arduino
        arduino.write('l'.encode())

    elif cmd == 'd': #Senão, envia o "d"
        arduino.write('d'.encode())

    arduino.flush() #Limpa a comunicação
  • Código para o Arduino
/*
 * Blog Eletrogate - Como conectar o Arduino com Python
 * Miguel Sena
 * blog.eletrogate.com
 */

char cmd;                     //Define a variável dos comandos seriais

void setup() {
  Serial.begin(9600);         //Inicia o Monitor Serial
  pinMode(3, OUTPUT);         //Define o pino como saída
  digitalWrite(3, LOW);
}

void loop() {
  cmd = Serial.read();        //Realiza a leitura do serial
  if (cmd == 'l') {           //Se o comando for "l", liga o led
    digitalWrite(3, HIGH); 
  }

  else if (cmd == 'd') {      //Se o comando for "d", desliga o led
    digitalWrite(3, LOW);
  }
}

Processo de leitura dos dados

  • Código em Python
'''
 Blog Eletrogate - Como conectar o Arduino com Python
 Miguel Sena
 blog.eletrogate.com
'''

import serial #Importa a biblioteca

while True: #Loop para a conexão com o Arduino
    try:  #Tenta se conectar, se conseguir, o loop se encerra
        arduino = serial.Serial('COM4', 9600)
        print('Arduino conectado')
        break

    except:
        pass

while True: #Loop principal
    msg = str(arduino.readline()) #Lê os dados em formato de string
    msg = msg[2:-5] #Fatia a string
    print(msg) #Imprime a mensagem

    arduino.flush() #Limpa a comunicação
  • Código para o Arduino
/*
 * Blog Eletrogate - Como conectar o Arduino com Python
 * Miguel Sena
 * blog.eletrogate.com
 */


void setup() {
  Serial.begin(9600);                       //Inicia o Monitor Serial
  pinMode(3, INPUT_PULLUP);                 //Define o pino como entrada
}

void loop() {
  int estado = digitalRead(3);              //Defina uma variável que realizará a leitura do botão

  if (estado == LOW) {                      //Verifica se o botão for pressionado
    Serial.println("Botao pressionado");    //Imprime a mensagem no monitor serial
    delay(1000);                            //Delay de 1 segundo
  }
}

Conclusão

Após isso tudo, você agora poderá integrar outras funções em seus projetos com a ajuda do Python e do PySerial. Se quiser ver outra aplicação prática do que foi feito hoje, sugiro que leia este post.

Se tiver alguma dúvida, deixe nos comentários!

Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.


Sobre o Autor


Miguel Sena
@arduuno

Estudante e hobbista na parte de eletrônica e programação. Gosto de desenvolver projetos no Arduino e ESP-32 voltados á robótica e automação residencial, e de desenvolver projetos em Python, assim como a integração dele com o Arduino.


Eletrogate

12 de julho de 2021

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!