Python和Arduino。 简单,快速,美观

很多时候,初学者,不仅是开发人员都有疑问。 如何通过计算机使用Arduino进行控制? 如果计算机不是Raspberry Pi,而是普通家用计算机? 并且,如果您不想遭受ESP8266的困扰并通过Web界面进行管理? 确实有必要每次都打开Arduino IDE并通过Port Monitor发送命令吗? 我将讨论如何创建自己的GUI应用程序来控制Arduino。

配套设备


我最近得到了一个非常有趣的板: Arduino SS Micro 。 尽管如此,该板类似于Digispark Attiny 85,还是带有USB输出的Arduino Micro中文版。



我不会详细讨论,因为昵称为iomoio的YouTube用户已经做到 ,其评论可以在这里找到。

在我看来,这对于小型家庭项目而言是一种非常酷且方便的设备,因为电线具有超强的性能:在最不适当的时刻迷路。

装有macOS Mojave操作系统的MacBook Pro被用作控制计算机,但是如果使用Windows或Linux,则不要关闭该文章-本文中描述的所有内容都可以在任何操作系统上进行更改而无需更改。

Arduino的草图


作为示例,将使用一个草图,根据来自串行端口的命令打开和关闭LED。

警告

Arduino SS Micro中的LED挂在SS端口上,因此它会自动关闭。 尽管如此,标准的眨眼示例还是一个闪烁的LED。

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

如果您要使用另一个Arduino,请不要忘记更改LED的引脚。

电脑代码


除了跨平台之外,Python的优点之一是存在大量的库。 我们将需要:

  • PySerial-使用串口的库
  • PyQT5-用于创建图形界面的库

安装方式


要安装,请使用内置的软件包管理器-pip。

 pip install pyserial pyqt5 

为了方便创建GUI,可以安装QTDesigner程序。

介面


由于此程序旨在更可能证明其功能,因此用户可以从建议的端口中选择端口以及进行通信的速度。



源代码


设备的所有工作都归功于PySerial库。 但是有一些细微差别。 例如,您如何知道设备连接到哪个端口?

在整个著名的stackoverflow网站上,昵称Thomas的用户提出了一个现成的解决方案,我使用了该解决方案。

 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 

此外,您必须保留可用速度的列表:

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

现在,我们将设计 (在QtDesigner中创建并使用pyuic5实用程序转换为.py文件), 扫描端口的功能主程序代码放在一起。

包含所有程序逻辑的主类

 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') 

变量self.Portself.Speed是包含可用端口和速度值的下拉列表。

当您单击self.ConnectButton按钮时, 调用connect函数,其中尝试以给定速度连接到给定端口。 如果连接成功,按钮将变为绿色,并且标签会更改。



send函数将字节字符串发送到我们的端口-迫使我们打开闪烁模式。

因此,您可以控制连接到USB的各种设备。

本文是介绍性和概述性的,例如,可以在这里找到更完整的信息:


Arduino草图和程序的完整源代码都托管在GitHub上

Source: https://habr.com/ru/post/zh-CN443326/


All Articles