Wenn Sie Roboterprogrammierung usw. mit LEGO Mindsotrms EV3 (im Folgenden EV3) in einer Python-Umgebung entwickeln, wenden Sie natürlich Analysen wie maschinelles Lernen an Manchmal möchte ich kontrollieren. In einem solchen Fall müssen Sie zunächst den EV3-Sensorwert an einen PC senden und zur Analyse verwenden. Es kann verschiedene Methoden geben, aber dieses Mal werde ich eine Methode schreiben, um den Sensorwert an die PC-Seite zu senden und eine Nachricht von der PC-Seite an den EV3 über die Socket-Kommunikation zu senden.
Dieser Artikel basiert auf den folgenden Artikeln. Lassen Sie uns die Socket-Kommunikation mit Python untersuchen
Ein Socket ist ein Gateway zwischen kommunizierenden Anwendungen (in diesem Fall zwei Python-Programme) und kann durch eine Kombination aus IP-Adresse und Portnummer ausgedrückt werden. Es gibt TCP-Kommunikationsstandards (Transmission Control Protocol) und UDP-Kommunikationsstandards (User Diagram Protocol) für die Socket-Kommunikation, und diesmal wird TCP verwendet. Der Unterschied zwischen beiden besteht darin, dass TCP die Zuverlässigkeit betont, während UDP ein Kommunikationsstandard ist, der die hohe Geschwindigkeit betont.
Dieses Mal werden die folgenden zwei Kommunikationsarten ausgeführt. Wir werden beschreiben, wie jeder von ihnen Server und Client macht. Teil 1
Teil 2
PC Windows10 Python 3.7.3
EV3 ev3dev2-python Python 3.5.3
Erstens ist der PC die Serverseite und der EV3 der Client. Es gibt jedoch keinen großen Unterschied, was getan werden kann, da sowohl der Server als auch der Client Daten senden und empfangen können. Da der Server den Client beim Herstellen der Kommunikation aus dem Wartezustand der Verbindung akzeptiert, muss sich die Serverseite im Wartezustand der Verbindung befinden, wenn der Client eine Verbindung anfordert.
In den folgenden Artikeln finden Sie Informationen zur Umgebung und zum Aufbau von EV3. Maschinelles Lernen mit EV3 Teil 1 Umgebungskonstruktion
Öffnen Sie nach dem Verbinden von EV3 mit dem PC über Bluetooth eine Eingabeaufforderung auf dem PC und überprüfen Sie die IP-Adresse, die für die Bluetooth-Verbindung zwischen PC und EV3 verwendet wird. Wenn der PC und der EV3 über Bluetooth verbunden sind, wird die lokale Verbindungsadresse "169.254.XXX.YYY" zugewiesen. Führen Sie die folgenden Schritte aus, um die IP-Adresse zu ermitteln.
ipconfig
ausDas folgende ist das PC-seitige Serverprogramm
import socket
import sys
import time
ev3_massage = None
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('169.254.85.105', 50010)) # your PC's Bluetooth IP & PORT
s.listen(1)
print('Start program...')
while True:
conn, addr = s.accept()
with conn:
while True:
ev3_massage = conn.recv(1024)
if ev3_massage is not None:
ev3_massage = ev3_massage.decode()
print('get' + ev3_massage)
time.sleep(1.0)
if ev3_massage == 'BACKSPACE':
break
ev3_massage = None
print('End program')
sys.exit()
Geben Sie die IP-Adresse der oben genannten "Ethernet-Adapter-Bluetooth-Netzwerkadresse" in die Klammern von "s.bind" ein.
Das folgende ist das EV3-seitige Client-Programm
import socket
import sys
import time
from ev3dev2.button import Button
from ev3dev2.display import Display
import ev3dev2.fonts as fonts
definition
button = Button()
screen = Display()
font = fonts.load('luBS12')
ev3_message = None
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(('169.254.85.105', 50010)) # your PC's Bluetooth IP & PORT
print('connected')
while not(button.backspace):
if button.up:
screen.draw.text((10,10), 'UP Button Pressed', font=font)
ev3_message = 'UP'
s.send(ev3_message.encode())
time.sleep(0.5)
if button.down:
screen.draw.text((10,10), 'DOWN Button Pressed', font=font)
ev3_message = 'DOWN'
s.send(ev3_message.encode())
time.sleep(0.5)
if button.left:
screen.draw.text((10,10), 'LEFT Button Pressed', font=font)
ev3_message = 'LEFT'
s.send(ev3_message.encode())
time.sleep(0.5)
if button.right:
screen.draw.text((10,10), 'RIGHT Button Pressed', font=font)
ev3_message = 'RIGHT'
s.send(ev3_message.encode())
time.sleep(0.5)
screen.update()
screen.clear()
screen.draw.text((10,10), 'ENTER Button Pressed', font=font)
ev3_message = 'BACKSPACE'
s.send(ev3_message.encode())
screen.clear()
print('End program')
sys.exit()
Geben Sie die IP-Adresse der oben genannten "Ethernet-Adapter-Bluetooth-Netzwerkadresse" in die Klammern von "s.connect" ein.
Versuchen Sie, das Programm auszuführen. Von der PC-Seite ausführen, bei der es sich um ein Serverprogramm handelt.
Verwenden Sie an der Eingabeaufforderung den Befehl cd, um in den Ordner zu wechseln, in dem das PC-seitige Programm gespeichert ist. Unten wird auf dem Desktop ein Ordner mit dem Namen "test" erstellt, in dem PC_server.py erstellt wird. Wenn das Serverprogramm ausgeführt wird, wird "Programm starten ..." angezeigt und auf die Verbindung gewartet.
Als nächstes wird die EV3-Seite, die das Client-Programm ist, ausgeführt. Informationen zur Ausführung des EV3-Programms mit VSC-Code finden Sie unter Maschinelles Lernen, Teil 1, Umgebungskonstruktion. Nach der Ausführung wird "verbunden" angezeigt, wenn die Socket-Kommunikation hergestellt ist. Wenn Sie danach die Tasten Auf, Ab, Links und Rechts von EV3 drücken, wird die entsprechende Nachricht an das Programm auf der PC-Seite gesendet und beim Empfang an der Eingabeaufforderung angezeigt. Wenn Sie die Taste oben links drücken, werden sowohl das PC-seitige als auch das EV3-seitige Programm beendet. Sie sehen, dass Zeichenketten wie UP und RIGHT per Socket-Kommunikation an das Programm auf der PC-Seite gesendet werden können. Um genau zu sein, sind die Daten, die per Socket-Kommunikation gesendet werden können, vom Bytetyp. Die Zeichenfolge wird also vor dem Senden "codiert" und konvertiert. Wenn sie empfangen wird, wird sie "decodiert" und vor der Druckausgabe wieder in eine Zeichenfolge konvertiert.
Appendix
Durch Umschreiben des Programms auf der Serverseite kann der empfangene Wert in der CSV-Datei gespeichert werden.
import socket
import sys
import time
import os.path
import csv
ev3_massage = None
if os.path.exists('button.csv') == False:
writedata = ['button']
f = open('button.csv', 'w', newline='')
writer = csv.writer(f)
writer.writerow(writedata)
f.close()
def write(data):
f = open('button.csv', 'a', newline='')
writer = csv.writer(f)
writer.writerow([data])
f.close()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('169.254.85.105', 50010)) # your PC's Bluetooth IP & PORT
s.listen(1)
print('Start program...')
while True:
conn, addr = s.accept()
with conn:
while True:
ev3_massage = conn.recv(1024)
if ev3_massage is not None:
ev3_massage = ev3_massage.decode()
print('get' + ev3_massage)
write(ev3_massage)
time.sleep(1.0)
if ev3_massage == 'BACKSPACE':
break
ev3_massage = None
print('End program')
sys.exit()
Csv
und os.path
werden neu für das Modul verwendet.
Wenn Sie das Programm ausführen, können Sie sehen, dass eine CSV-Datei generiert und die empfangene Zeichenfolge in jeder Zelle aufgezeichnet wird.
Recommended Posts