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);
  }
}

Nenhum comentário:

Postar um comentário