Communication de socket avec Python LEGO Mindstorms

Si vous développez la programmation de robots, etc. en utilisant LEGO Mindsotrms EV3 (ci-après EV3) dans l'environnement Python, appliquez naturellement une analyse telle que l'apprentissage automatique Parfois je veux contrôler. Dans un tel cas, la première chose à penser est d'envoyer la valeur du capteur EV3 à un PC et de l'utiliser pour l'analyse. Il peut y avoir plusieurs méthodes, mais cette fois j'écrirai une méthode pour envoyer la valeur du capteur du côté PC et envoyer un message du côté PC à l'EV3 en utilisant la communication par socket.

référence

Cet article est basé sur les articles suivants. Étudions la communication socket avec python

Qu'est-ce que la communication par socket?

Une socket est une passerelle entre des applications communicantes (deux programmes python dans ce cas), et peut être exprimée par une combinaison d'adresse IP et de numéro de port. Il existe des normes de communication TCP (Transmission Control Protocol) et UDP (User Diagram Protocol) pour la communication socket, et cette fois TCP est utilisé. La différence entre les deux est que TCP met l'accent sur la fiabilité, tandis que UDP est une norme de communication qui met l'accent sur le haut débit.

Relations de communication cette fois

Cette fois, les deux types de communication suivants seront effectués. Nous décrirons comment chacun d'eux fait serveur et client. Partie 1 1.png .png

Partie 2 2.png 4.png

Environnement d'exploitation

PC: Serveur / EV3: Client

Tout d'abord, le PC est côté serveur et l'EV3 est le client. Cependant, il n'y a pas de grande différence dans ce qui peut être fait car le serveur et le client peuvent envoyer et recevoir des données. Puisque le serveur accepte le client à partir de l'état d'attente de connexion lors de l'établissement de la communication, le côté serveur doit être dans l'état d'attente de connexion lorsque le client demande une connexion.

Préparation

Veuillez vous référer aux articles suivants pour l'environnement et la construction d'EV3. Apprentissage automatique avec la construction de l'environnement EV3 Partie 1

Après avoir connecté EV3 au PC via Bluetooth, ouvrez une invite de commande sur le PC et vérifiez l'adresse IP utilisée pour la connexion Bluetooth entre le PC et EV3. Lorsque le PC et l'EV3 sont connectés via Bluetooth, l'adresse locale du lien «169.254.XXX.YYY» est attribuée. Suivez les étapes ci-dessous pour connaître l'adresse IP.

  1. Ouvrez une invite de commande
  2. Exécutez la commande ʻipconfig`
  3. Notez l'adresse IP affichée dans l '«Adresse réseau Bluetooth de l'adaptateur Ethernet» affichée 6.png

programme

Voici le programme serveur côté PC

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

Entrez l'adresse IP de «l'adresse réseau Bluetooth de l'adaptateur Ethernet» mentionnée ci-dessus dans les parenthèses de «s.bind».

Ce qui suit est le programme client côté EV3

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

Entrez l'adresse IP de «l'adresse réseau Bluetooth de l'adaptateur Ethernet» mentionnée ci-dessus dans les parenthèses de «s.connect».

Courir

Essayez d'exécuter le programme. Exécutez du côté PC, qui est un programme serveur.

À partir de l'invite de commande, utilisez la commande cd pour accéder au dossier dans lequel le programme côté PC est stocké. Ci-dessous, un dossier appelé test est créé sur le bureau et PC_server.py y est créé. 5.png Lorsque le programme serveur est exécuté, «Démarrer le programme ...» s'affiche et la connexion est attendue.

Ensuite, le côté EV3, qui est le programme client, est exécuté. Veuillez vous référer à Machine Learning Part 1 Environment Construction pour l'exécution du programme EV3 avec le code VSC. 6.png Après l'exécution, «connecté» s'affiche lorsque la communication de socket est établie. Après cela, lorsque vous appuyez sur les boutons haut, bas, gauche et droite d'EV3, le message correspondant est envoyé au programme côté PC, et lorsqu'il est reçu, il s'affiche sur l'invite de commande. 17.png    7.png Si vous appuyez sur le bouton en haut à gauche, les programmes du côté PC et du côté EV3 prendront fin. Vous pouvez voir que des chaînes de caractères telles que HAUT et DROITE peuvent être envoyées au programme côté PC via la communication par socket. Pour être précis, les données qui peuvent être envoyées par la communication socket sont de type octet, donc la chaîne de caractères est convertie en ʻencode` puis envoyée, et lorsqu'elle est reçue, elle est reconvertie en chaîne de caractères puis imprimée.

Appendix

Enregistrer la valeur reçue par la communication socket dans un fichier CSV

En réécrivant le programme côté serveur, la valeur reçue peut être stockée dans le fichier CSV.

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 et ʻos.path` sont nouvellement utilisés pour le module. Lorsque vous exécutez le programme, vous pouvez voir qu'un fichier CSV est généré et la chaîne de caractères reçue est enregistrée dans chaque cellule. 13.png

Recommended Posts

Communication de socket avec Python LEGO Mindstorms
Communication de socket avec Python
Communication de socket en utilisant le serveur de socket avec python maintenant
Communication série avec Python
Communication série avec python
Communication HTTP avec Python
LEGO Mindstorms 51515 Programmation Python
Afficher la communication Python avec Fiddler
Module de socket Python 3 et flux de communication de socket
J'ai essayé la communication SMTP avec Python
Communication socket et traitement multi-thread par Python
Communication socket par langage C et Python
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Exemple de communication Python Socket / outil de lancement de données simple
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
Traitement de la communication par Python
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python