Python y Arduino. Simple, rapido y hermoso

Muy a menudo, los principiantes y no solo los desarrolladores tienen preguntas. ¿Cómo controlar con Arduino desde una computadora? ¿Y si la computadora no es una Raspberry Pi, sino una computadora doméstica normal? ¿Y si no desea sufrir con ESP8266 y administrar a través de la interfaz web? ¿Es realmente necesario abrir el IDE de Arduino cada vez y enviar comandos a través del Monitor de puerto ? Hablaré sobre cómo crear mi propia aplicación GUI para controlar Arduino.

Equipo


Recientemente obtuve una placa muy interesante: Arduino SS Micro . Esta placa, que se parece al Digispark Attiny 85, es una versión china del Arduino Micro con salida USB.



No hablaré de ello en detalle, porque un usuario de YouTube con el apodo iomoio ya lo ha hecho, y su reseña se puede encontrar aquí .

Me parece que este es un dispositivo bastante bueno y conveniente para pequeños proyectos de viviendas, porque los cables tienen una súper propiedad: perderse en el momento más inoportuno.

Se usó un MacBook Pro con sistema operativo macOS Mojave como computadora de control, pero no cierre el artículo si usa Windows o Linux; todo lo descrito en el artículo funcionará sin cambios en ningún sistema operativo.

Boceto para Arduino


Como ejemplo, se utilizará un boceto que enciende y apaga el LED, según el comando del puerto serie.

ADVERTENCIA

El LED en el Arduino SS Micro se cuelga en el puerto SS y, por lo tanto, se apaga automáticamente. A pesar de esto, el ejemplo de parpadeo estándar es un LED parpadeante.

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

Si va a utilizar otro Arduino, no olvide cambiar el pin del LED.

Código de computadora


Una de las ventajas de Python, además de su multiplataforma, es la presencia de una gran cantidad de bibliotecas. Necesitaremos:

  • PySerial - biblioteca para trabajar con puerto serie
  • PyQT5 - biblioteca para crear una interfaz gráfica

Instalación


Para instalar, use el administrador de paquetes incorporado - pip.

 pip install pyserial pyqt5 

Para la conveniencia de crear una GUI, puede instalar el programa QTDesigner.

Interfaz


Dado que este programa tiene más probabilidades de demostrar las capacidades, el usuario puede seleccionar el puerto de los propuestos, así como la velocidad con la que se producirá la comunicación.



Código fuente


Todo el trabajo con el dispositivo es gracias a la biblioteca PySerial. Pero hay algunos matices. Por ejemplo, ¿cómo sabe a qué puerto está conectado el dispositivo?

En todo el conocido sitio stackoverflow , un usuario con el apodo de Thomas sugirió una solución preparada, que utilicé.

 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 

Además, debe mantener una lista de velocidades disponibles:

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

Ahora juntemos el diseño (creado en QtDesigner y convertido usando la utilidad pyuic5 a un archivo .py), funciones para escanear puertos y el código del programa principal .

La clase principal que contiene toda la lógica del 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') 

Las variables self.Port y self.Speed son listas desplegables que contienen los valores de puertos y velocidades disponibles.

Cuando hace clic en el botón self.ConnectButton , se llama a la función de conexión , en la que se intenta conectarse a un puerto determinado a una velocidad determinada. Si la conexión es exitosa, el botón se vuelve verde y la etiqueta cambia.



La función de envío envía una cadena de bytes a nuestro puerto, lo que nos obliga a activar el modo parpadeante.

Por lo tanto, puede controlar varios dispositivos conectados a USB.

Este artículo es introductorio y general, se puede encontrar información más completa, por ejemplo, aquí:


El código fuente completo tanto para el boceto para Arduino como para el programa está alojado en GitHub .

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


All Articles