Inhaltsverzeichnis:

Servotreiber-Board mit Python-GUI und Arduino - Gunook
Servotreiber-Board mit Python-GUI und Arduino - Gunook

Video: Servotreiber-Board mit Python-GUI und Arduino - Gunook

Video: Servotreiber-Board mit Python-GUI und Arduino - Gunook
Video: PID 2024, November
Anonim
Servotreiber-Board mit Python-GUI und Arduino
Servotreiber-Board mit Python-GUI und Arduino

Beim Prototyping oder dem Bau von Modellflugzeugen stößt man oft auf das Problem, dass man den Servoweg überprüfen oder Servos in die Mittelstellung bringen muss.

Falls Sie nicht Ihre gesamte RC-Anlage aufbauen oder testen möchten, wie weit Sie das Servo schieben können oder wo die Mittelstellung ist, dann ist dieses Board genau das Richtige für Sie! Es ermöglicht Ihnen, das Servo in bestimmte Positionen zu bewegen oder hin und her zu fahren.

Es funktioniert überraschend gut, sogar mit 6 Servos, die in der Schleife von einer Position zur anderen rasen.

Es ist auch ein schönes Projekt, um die Kommunikation zwischen Python-GUI und Arduino mit Serial zu lernen.

Schritt 1: Was Sie brauchen…

Für dieses Projekt benötigen Sie Folgendes:

Hardware

  • Arduino Nano mit Kabel. Ich habe einen Klon verwendet, und der Python-Code erwartet tatsächlich einen CH340-Chip eines Klons
  • Ein Prototyping-Board. 7x5cm ist genug
  • Einige 2, 54mm Header und Pins
  • 1-6 Servos
  • Stromversorgung für die Servos (ich habe ein Akkupack mit 4 Akkus verwendet)

Software

  • Python 3:
  • Ein USB-Treiber für die CH340-Chips: Einfach nach Treibern für CH340-Treiber googeln
  • Arduino-IDE:

Schritt 2: Löten der Platine

Löten der Platine
Löten der Platine

Das Löten ist laut Fritzing auf dem Bild eigentlich unkompliziert. Achten Sie nur darauf, dass Sie die Servos problemlos an die 3-Pin-Reihen anschließen können.

  • Die 3-Pin-Reihen werden an die digitalen Pins 3, 5, 6, 9, 10 und 11 des Arduino nano angeschlossen.
  • Das rote Kabel wird an den 5V-Pin des Arduino angeschlossen
  • Das schwarze Kabel wird mit dem GND-Pin des Arduino verbunden
  • Das Pin-Paar unter den 3-Pin-Reihen dient zum Anschluss einer typischen RC-Empfänger-Stromversorgung, Sie können beliebig Anschlüsse hinzufügen, wie Schraubklemmen, XT-Anschlüsse, JST oder… oder…

Persönlich mag ich Reihen von weiblichen Headern, um das Arduino einzubauen, aber das liegt an Ihnen.

Bitte beachten Sie, dass die kurzgeschlossenen Buchsenleisten ein Jumper sind, mit dem Sie das Servo zu Testzwecken über die 5V-Quelle des Arduino versorgen können. Wenn Sie es zu stark belasten, wird das Arduino zurückgesetzt und verliert das richtige Tempo. Sie MÜSSEN entfernt werden, bevor ein weiteres Netzteil angeschlossen wird.

Schritt 3: Einrichten des Arduino

Installieren Sie die Arduino IDE und flashen Sie den Arduino Nano mit der beigefügten Skizze.

Schritt 4: Python einrichten

Python einrichten
Python einrichten

Installieren Sie Python 3, nachdem Sie es heruntergeladen haben. Stellen Sie sicher, dass Sie die Option zum Erstellen einer "PATH"-Variablen aktivieren.

Sie müssen zwei weitere Pakete mit pip installieren. Drücken Sie dazu die "Windows"-Taste, geben Sie "cmd" ein und drücken Sie "Enter". Geben Sie in der Eingabeaufforderung die folgenden Befehle ein:

  • pip install seriell
  • piip installiere pyserial
  • pip install tkinter

Wie Sie sehen, benötige ich die Module sowohl seriell als auch pyserial, was wahrscheinlich nicht das effizienteste ist, da pyserial serielle ersetzen sollte. Trotzdem funktioniert es und ich fange gerade erst an zu lernen;).

Öffnen Sie das Python-Skript in der IDE und führen Sie es aus, oder führen Sie es direkt aus dem Terminal aus.

Im Drop-Down-Menü können Sie zwischen zwei Modi wählen, „Go Straight“und „Ping Pong“:

  • Go Straight: Geben Sie in der ersten Spalte eine Servo-Position in Mikrosekunden ein und klicken Sie auf "Start", um das Servo in die angegebene Position zu bewegen.
  • Ping Pong: Geben Sie in der zweiten und dritten Spalte eine untere Grenze und eine obere Grenze ein. Das sind die untere und obere Position, zwischen denen das Servo hin und her geht. In der Spalte "Ping Pong Time" können Sie eine Zeit in Millisekunden angeben, die das Servo wartet, wenn es die obere oder untere Position erreicht hat. Drücken Sie "Start" und das Servo beginnt sich hin und her zu bewegen, drücken Sie "Stop" und das Servo stoppt.

Schritt 5: Wo die Magie passiert

Zu guter Letzt möchte ich auf einige Details im Code hinweisen, für diejenigen, die ein bisschen in die serielle Kommunikation zwischen Python und Arduino einsteigen möchten.

Was passiert nun im Python-Programm?

Das Programm prüft zunächst, was an den COM-Ports in dieser Zeile angeschlossen ist und speichert es in einer Liste:

self. COMPortsList = list(serial.tools.list_ports.comports())

Dann durchläuft er die Liste, bis er einen berüchtigten CH340-Chip findet, speichert ihn und baut dann nach der for-Schleife eine serielle Verbindung auf. Beachten Sie, dass die for-Schleife unterbrochen wird, sobald der erste CH340 gefunden wird.

for p in self. COMPortsList: if "CH340" in p[1]: # Auf der Suche nach einem Arduino-Klon self. COMport = p[0] break else: pass self. Ser = serial. Serial(self. COMPort, 57600)

Die serielle Verbindung wird über den COM-Port mit einer Baudrate von 57600 hergestellt.

Und was macht der Arduino-Code? Nun, da der Arduino nur einen COM-Port hat, ist die serielle Verbindung nur eine Zeile:

Serial.begin (57600);

Jetzt können wir die beiden Ports zur Kommunikation verwenden. In diesem Fall nur Nachrichten vom Python zum Arduino. Die Nachrichten werden hier von Python gesendet. Die serielle Verbindung überträgt standardmäßig Bytes. Das ist auch der schnellste Weg zum Datenversand und meines Wissens auch noch recht weit verbreitet. Die Ints für die Nummer des Servos (damit der Arduino weiß, welches Servo zu bewegen ist) und die Position in Mikrosekunden werden in ein Byte umgewandelt.

Command = struct.pack('>B', self. Place) # Die int-Variable "self. Place" wird in ein Byte umgewandelt

self. Ser.write(Command) # Byte auf dem Serial-Port schreiben Command = int(self. ServoPos.get())//10 # Eingabe aus dem Feld lesen und abgeben int Command = struct.pack(' >B', Command) # Int in ein Byte umwandeln self. Ser.write(Command) # Schreiben des Bytes auf den Serial-Port

Außerdem braucht das Parsen von Daten Zeit (zum Beispiel das Interpretieren von vier Bytes "1", "2", "3" und "0" als int 1230, nicht als vier verschiedene Zeichen) und es ist besser, dies nicht auf dem Arduino zu tun.

Auf der Arduino-Seite werden die gesendeten Informationen wie folgt abgeholt:

if(Serial.available()>1){// Wenn serielle Daten verfügbar sind, wird die Schleife eingegeben c = Serial.read(); // Das erste Byte (Anzahl der Servos) wird in einer Variablen gespeichert Micros = Serial.read (); // Hier wird die Position des Servos gespeichert Micros = Micros * 10; }

Empfohlen: