17 de maio de 2020

Comunicação Python com Arduino

Através da comunicação serial, o Arduino troca informações com um programa Python no computador.


O Python pode receber informações de sensores conectados ao Arduino e enviar comandos para serem executados.

Para trabalhar com a comunicação serial no Python utilizamos a biblioteca pyserial.

No Python é necessário informar qual a porta de comunicação serial o Arduino está conectado e qual a taxa de transferência (baud rate) que está configurado.

Montei um exemplo mostrando o Python recebendo a informação de dois botões sendo pressionados e, ao mesmo tempo, podendo enviar comandos ao Arduino para acionar dois LEDs.

Esquema de ligação no Arduino:


Código fonte Python:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
"""
Programa : PYTHON - ARDUINO
Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
Data     : 16/05/2020
"""
import serial
print("\n## PYTHON - ARDUINO ##")
print("www.efeitonerd.com.br")

ports = []
for n in range(50):
    try:
        ports.append(serial.Serial("COM" + str(n)).port)
    except:
        pass

if len(ports) == 0:
    input("\nArduino não conectado.")
    quit()
elif len(ports) == 1:
    port_com = ports[0]
else:
    print("\nPortas disponíveis:")
    for n in ports:
        print("\t" + n)
    port_com = "COM" + input("\nInforme o número da porta: ")

try:
    port = serial.Serial(port_com, 115200, timeout=0.5)
    print("\nEscutando o Arduino... (Pressione Ctrl+C sempre que necessário enviar um valor ao Arduino)\n")

    while port.is_open:
        try:
            arduino = str(port.readline().decode())
            if arduino != "":
                print("Arduino -> " + arduino)
        except KeyboardInterrupt:
            value = input("\nValor para enviar ao Arduino: ")
            port.write(value.encode())

except Exception as ex:
    input("\nERRO: " + str(ex))

Código fonte Arduino:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*---------------------------------------------------------
  Programa : PYTHON - ARDUINO
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 16/05/2020
  ---------------------------------------------------------*/
#define BUTTON_A 2
#define BUTTON_B 3
#define LED_BLUE 4
#define LED_RED  5

void setup() {
  //Configuração dos pinos
  pinMode(BUTTON_A, INPUT_PULLUP);
  pinMode(BUTTON_B, INPUT_PULLUP);
  pinMode(LED_BLUE, OUTPUT);
  pinMode(LED_RED, OUTPUT);

  //Inicia a comunicação serial
  Serial.begin(115200);
}

void loop() {
  String value = "";

  //Verificando a serial
  while (Serial.available() > 0) {
    value += Serial.readString();
    delay(25);
  }

  //Verifica os valores recebidos através da serial
  if (value == "blue_on") {
    digitalWrite(LED_BLUE, HIGH);
    Serial.println("LED azul ligado!");

  } else if (value == "blue_off") {
    digitalWrite(LED_BLUE, LOW);
    Serial.println("LED azul desligado.");

  } else if (value == "red_on") {
    digitalWrite(LED_RED, HIGH);
    Serial.println("LED vermelho ligado!");

  } else if (value == "red_off") {
    digitalWrite(LED_RED, LOW);
    Serial.println("LED vermelho desligado.");

  } else if (value == "blink_leds") {
    Serial.print("Piscando leds...");
    for (int i = 0; i < 70; i++) {
      digitalWrite(LED_BLUE, !digitalRead(LED_BLUE));
      digitalWrite(LED_RED, !digitalRead(LED_RED));
      delay(50);
    }
    Serial.println("Pisca finalizado.");

  } else if (value != "") {
    Serial.println("Valor não reconhecido.");
  }

  //Botão A
  if (digitalRead(BUTTON_A) == LOW) {
    Serial.println("Botão (A) pressionado!");
    delay(500);
  }

  //Botão B
  if (digitalRead(BUTTON_B) == LOW) {
    Serial.println("Botão (B) pressionado!");
    delay(500);
  }
}

5 comentários:

  1. oba amigo tranquilo olhei o seu código do python é semelhante ao que procuro receber e enviar msm simulteneamente do arduino utilizei uma fração do seu código(python) mas o retorno do arduino não esta bom o retorno se repete mesmo digitando caracteres diferentes pode me da uma ajuda. um abraço

    ResponderExcluir
  2. Boa tarde! Poderia explicar melhor sobre esse retorno que se repete? Não entendi muito bem.

    ResponderExcluir
  3. Oba tranquilo bom é assim eu envio um caracter para acender o led o arduino me retorna a palavra ligado ai quando eu envio um caracter para apagar o led ele me retorna ligado onde era para me retornar desligado e vise versa o led acende e apaga numa boa obriga pela atenção

    ResponderExcluir
    Respostas
    1. Bom dia! Se quiser me enviar via e-mail, acho que poderemos analisar melhor o trecho do código fonte. Fiz uns testes aqui com esse código que postei e não obtive problemas. Abraços! fellipe.couto@yahoo.com.br

      Excluir
  4. oba boa noite eu me achei deu bom consegui obrigado

    ResponderExcluir