Python e Arduino. Simples, rápido e bonito

Muitas vezes, iniciantes e não apenas desenvolvedores têm perguntas. Como controlar com o Arduino a partir de um computador? E se o computador não for um Raspberry Pi, mas um computador doméstico comum? E se você não deseja sofrer com o ESP8266 e gerenciar através da interface da web? É realmente necessário abrir o IDE do Arduino a cada vez e enviar comandos pelo Monitor de porta ? Vou falar sobre como criar meu próprio aplicativo GUI para controlar o Arduino.

Equipamento


Recentemente, recebi uma placa muito interessante: Arduino SS Micro . Essa placa, semelhante ao Digispark Attiny 85, ainda é uma versão chinesa do Arduino Micro, com uma saída USB.



Não falarei sobre isso em detalhes, porque um usuário do YouTube com o apelido iomoio já fez isso e sua resenha pode ser encontrada aqui .

Parece-me que este é um dispositivo bastante interessante e conveniente para pequenos projetos domésticos, porque os fios têm uma superpropriedade: se perder no momento mais inoportuno.

Um MacBook Pro com sistema operacional macOS Mojave foi usado como computador de controle, mas não feche o artigo se você usa Windows ou Linux - tudo o que está descrito no artigo funcionará sem alterações em qualquer sistema operacional.

Esboço para Arduino


Como exemplo, será usado um esboço que liga e desliga o LED, sob comando da porta serial.

ATENÇÃO

O LED no Arduino SS Micro trava na porta SS e, portanto, apaga-se automaticamente. Apesar disso, o exemplo padrão do Blink é um LED piscando.

char inChar; #define LED_PIN SS void setup() { pinMode(LED_PIN, OUTPUT); //   Serial.begin(115200); //  Serial -  } void loop() { if (Serial.available() > 0) { inChar = Serial.read(); if (inChar=='e') // e - Enable -  { digitalWrite(LED_PIN,HIGH); } } else if (inChar=='d') // d - Disable -  { digitalWrite(LED_PIN,LOW); } else if (inChar=='b') // b - Blink -    { while (true){ digitalWrite(LED_PIN,HIGH); delay(1000); digitalWrite(LED_PIN,LOW); delay(1000); } } } 

Se você usar outro Arduino - não esqueça de mudar o pino do LED.

Código do computador


Uma das vantagens do Python, além de sua plataforma cruzada, é a presença de um grande número de bibliotecas. Vamos precisar de:

  • PySerial - biblioteca para trabalhar com porta serial
  • PyQT5 - biblioteca para criar uma interface gráfica

Instalação


Para instalar, use o gerenciador de pacotes embutido - pip.

 pip install pyserial pyqt5 

Para a conveniência de criar uma GUI, você pode instalar o programa QTDesigner.

Interface


Como este programa tem mais probabilidade de demonstrar os recursos, o usuário pode selecionar a porta dentre as propostas, bem como a velocidade com que a comunicação ocorrerá.



Código fonte


Todo o trabalho com o dispositivo é graças à biblioteca PySerial. Mas existem algumas nuances. Por exemplo, como você sabe a qual porta o dispositivo está conectado?

Em todo o conhecido site stackoverflow , um usuário com o apelido Thomas sugeriu uma solução pronta, que eu usei.

 def serial_ports(): """ Lists serial port names :raises EnvironmentError: On unsupported or unknown platforms :returns: A list of the serial ports available on the system """ if sys.platform.startswith('win'): ports = ['COM%s' % (i + 1) for i in range(256)] elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'): # this excludes your current terminal "/dev/tty" ports = glob.glob('/dev/tty[A-Za-z]*') elif sys.platform.startswith('darwin'): ports = glob.glob('/dev/tty.*') else: raise EnvironmentError('Unsupported platform') result = [] for port in ports: try: s = serial.Serial(port) s.close() result.append(port) except (OSError, serial.SerialException): pass return result 

Além disso, você deve manter uma lista de velocidades disponíveis:

 speeds = ['1200','2400', '4800', '9600', '19200', '38400', '57600', '115200'] 

Agora vamos montar o design (criado no QtDesigner e convertido usando o utilitário pyuic5 em um arquivo .py), funções para verificar portas e o código do programa principal .

A classe principal que contém toda a lógica do programa

 class LedApp(QtWidgets.QMainWindow, design.Ui_Form): def __init__(self): super().__init__() self.setupUi(self) self.Port.addItems(serial_ports()) self.Speed.addItems(speeds) self.realport = None self.ConnectButton.clicked.connect(self.connect) self.EnableBtn.clicked.connect(self.send) def connect(self): try: self.realport = serial.Serial(self.Port.currentText(),int(self.Speed.currentText())) self.ConnectButton.setStyleSheet("background-color: green") self.ConnectButton.setText('') except Exception as e: print(e) def send(self): if self.realport: self.realport.write(b'b') 

As variáveis self.Port e self.Speed são listas suspensas que contêm os valores de portas e velocidades disponíveis.

Quando você clica no botão self.ConnectButton , a função de conexão é chamada, na qual é feita uma tentativa de conectar-se a uma determinada porta em uma determinada velocidade. Se a conexão for bem-sucedida, o botão fica verde e o rótulo muda.



A função send envia uma string de bytes para a nossa porta - forçando-nos a ativar o modo intermitente.

Assim, você pode controlar vários dispositivos conectados ao USB.

Este artigo é introdutório e geral, informações mais completas podem ser encontradas, por exemplo, aqui:


O código fonte completo para o esboço do Arduino e o programa está hospedado no GitHub .

Source: https://habr.com/ru/post/pt443326/


All Articles