Python & Arduino. Einfach, schnell und schön

Sehr oft haben Anfänger und nicht nur Entwickler Fragen. Wie steuere ich mit Arduino von einem Computer aus? Und wenn der Computer kein Raspberry Pi ist, sondern ein normaler Heimcomputer? Und wenn Sie nicht mit ESP8266 leiden und über das Webinterface verwalten möchten? Ist es wirklich notwendig, die Arduino IDE jedes Mal zu öffnen und Befehle über den Port Monitor zu senden? Ich werde darüber sprechen, wie ich meine eigene GUI-Anwendung zur Steuerung von Arduino erstelle.

Ausrüstung


Ich habe kürzlich ein sehr interessantes Board bekommen: Arduino SS Micro . Dieses Board, das dem Digispark Attiny 85 ähnelt, ist dennoch eine chinesische Version des Arduino Micro mit USB-Ausgang.



Ich werde nicht im Detail darüber sprechen, da ein YouTube-Nutzer mit dem Spitznamen iomoio dies bereits getan hat und seine Rezension hier zu finden ist .

Es scheint mir, dass dies ein ziemlich cooles und praktisches Gerät für kleine Heimprojekte ist, da die Drähte eine Super-Eigenschaft haben: Verlieren Sie sich im ungünstigsten Moment.

Als Steuerungscomputer wurde ein MacBook Pro mit dem Betriebssystem macOS Mojave verwendet. Schließen Sie den Artikel jedoch nicht, wenn Sie Windows oder Linux verwenden. Alles, was im Artikel beschrieben wird, funktioniert ohne Änderungen unter jedem Betriebssystem.

Skizze für Arduino


Als Beispiel wird eine Skizze verwendet, die die LED auf Befehl der seriellen Schnittstelle ein- und ausschaltet.

WARNUNG

Die LED im Arduino SS Micro hängt am SS-Anschluss und erlischt daher automatisch. Trotzdem ist das Standard- Blink- Beispiel eine blinkende 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); } } } 

Wenn Sie ein anderes Arduino verwenden, vergessen Sie nicht, den Pin der LED zu wechseln.

Computercode


Einer der Vorteile von Python neben seiner plattformübergreifenden Nutzung ist das Vorhandensein einer großen Anzahl von Bibliotheken. Wir werden brauchen:

  • PySerial - Bibliothek für die Arbeit mit serieller Schnittstelle
  • PyQT5 - Bibliothek zum Erstellen einer grafischen Oberfläche

Installation


Verwenden Sie zur Installation den integrierten Paketmanager - pip.

 pip install pyserial pyqt5 

Zum bequemen Erstellen einer GUI kann QTDesigner installiert werden.

Schnittstelle


Da dieses Programm eher die Funktionen demonstrieren soll, kann der Benutzer den Port aus den vorgeschlagenen auswählen sowie die Geschwindigkeit, mit der die Kommunikation stattfinden wird.



Quellcode


Alle Arbeiten mit dem Gerät sind der PySerial-Bibliothek zu verdanken. Aber es gibt ein paar Nuancen. Woher wissen Sie beispielsweise, an welchen Port das Gerät angeschlossen ist?

Auf der gesamten bekannten Stackoverflow- Site schlug ein Benutzer mit dem Spitznamen Thomas eine vorgefertigte Lösung vor, die ich verwendete.

 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 

Außerdem müssen Sie eine Liste der verfügbaren Geschwindigkeiten führen:

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

Lassen Sie uns nun das Design (erstellt in QtDesigner und konvertiert mit dem Dienstprogramm pyuic5 in eine .py-Datei), Funktionen zum Scannen von Ports und den Hauptprogrammcode zusammenstellen .

Die Hauptklasse, die die gesamte Programmlogik enthält

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

Die Variablen self.Port und self.Speed sind Dropdown-Listen mit den Werten der verfügbaren Ports und Geschwindigkeiten.

Wenn Sie auf die Schaltfläche self.ConnectButton klicken, wird die Verbindungsfunktion aufgerufen, bei der versucht wird, mit einer bestimmten Geschwindigkeit eine Verbindung zu einem bestimmten Port herzustellen . Wenn die Verbindung erfolgreich hergestellt wurde, wird die Schaltfläche grün und die Beschriftung ändert sich.



Die Sendefunktion sendet eine Byte-Zeichenfolge an unseren Port und zwingt uns, den Blinkmodus einzuschalten.

So können Sie verschiedene an USB angeschlossene Geräte steuern.

Dieser Artikel ist einführend und übersichtlich. Vollständigere Informationen finden Sie beispielsweise hier:


Der vollständige Quellcode sowohl für die Skizze für Arduino als auch für das Programm wird auf GitHub gehostet .

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


All Articles