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.
Cet article est basé sur les articles suivants. Étudions la communication socket avec python
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.
Cette fois, les deux types de communication suivants seront effectués. Nous décrirons comment chacun d'eux fait serveur et client. Partie 1
Partie 2
PC Windows10 Python 3.7.3
EV3 ev3dev2-python Python 3.5.3
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.
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.
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».
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éé.
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. 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. 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
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.
Recommended Posts