Socket-Kommunikation mit Python LEGO Mindstorms

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.

Referenz

Dieser Artikel basiert auf den folgenden Artikeln. Lassen Sie uns die Socket-Kommunikation mit Python untersuchen

Was ist Socket-Kommunikation?

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.

Kommunikationsbeziehungen diesmal

Dieses Mal werden die folgenden zwei Kommunikationsarten ausgeführt. Wir werden beschreiben, wie jeder von ihnen Server und Client macht. Teil 1 1.png .png

Teil 2 2.png 4.png

Betriebsumgebung

PC: Server / EV3: Client

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.

Vorbereitung

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.

  1. Öffnen Sie eine Eingabeaufforderung
  2. Führen Sie den Befehl ipconfig aus
  3. Notieren Sie sich die IP-Adresse, die in der angezeigten Bluetooth-Netzwerkadresse des Ethernet-Adapters angezeigt wird 6.png

Programm

Das 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.

Lauf

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. 5.png 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. 6.png 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. 17.png    7.png 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

Notieren Sie den von der Socket-Kommunikation empfangenen Wert in einer CSV-Datei

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. 13.png

Recommended Posts

Socket-Kommunikation mit Python LEGO Mindstorms
Socket-Kommunikation mit Python
Socket-Kommunikation über Socket-Server mit Python jetzt
Serielle Kommunikation mit Python
Serielle Kommunikation mit Python
HTTP-Kommunikation mit Python
LEGO Mindstorms 51515 Python-Programmierung
Python 3-Socket-Modul und Socket-Kommunikationsfluss
Ich habe die SMTP-Kommunikation mit Python versucht
Socket-Kommunikation und Multithread-Verarbeitung durch Python
Socket-Kommunikation in C-Sprache und Python
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Python Socket-Kommunikationsbeispiel / einfaches Tool zum Werfen von Daten
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
Kommunikationsverarbeitung durch Python
1.1 Erste Schritte mit Python
Tweets mit Python sammeln
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Tweets mit Python posten
Fahren Sie WebDriver mit Python
Verwenden Sie Mecab mit Python 3
[Python] Mit CGIHTTPServer umleiten
Sprachanalyse mit Python