[PYTHON] Essayez de communiquer avec EV3 et PC! (MQTT)

Je suis en train de créer une machine qui aligne automatiquement 2 * 2 * 2 cubes de lubook avec LEGO en lisant les couleurs avec un capteur de couleur.

introduction

J'ai essayé d'exécuter un programme qui résout un cube rubic 2 * 2 * 2 avec l'algorithme IDA * sur EV3. Cependant, en raison des faibles performances du processeur d'EV3 (et de ma mauvaise compréhension de l'algorithme), il a fallu près de 10 minutes pour résoudre le cube Rubik qui peut être résolu avec 9 mains, donc en utilisant MQTT, j'ai utilisé MQTT.

  1. EV3 lit la couleur du cube rubic et envoie l'état du cube rubic à l'ordinateur.
  2. L'ordinateur personnel demande la solution du cube rubic et l'envoie à EV3.
  3. EV3 aligne les cubes Rubik en fonction de la solution

Je vais essayer de le faire sous la forme de. Dans cet article, nous dirons même: «EV3 envoie l'état du Rubik Cube à un ordinateur, le résout sur l'ordinateur et envoie la solution à EV3».

Qu'est-ce que MQTT?

MQTT est un protocole de communication léger basé sur TCP / IP développé par IBM. Parce qu'il est léger, il semble qu'il soit souvent utilisé pour les appareils IoT. La communication est divisée en trois rôles: éditeur (expéditeur), courtier (intermédiaire) et abonné (destinataire). Tout d'abord, l'Abonné décide de l'en-tête des informations que vous souhaitez recevoir et attend. Ensuite, ajoutez un en-tête aux informations que Publisher souhaite envoyer et envoyez-le une fois à Broker. Le courtier envoie ensuite ces informations à l'abonné qui tente de recevoir les informations pour cette rubrique.

Spécifications PC / EV3, etc.

PC OS : Windows10 CPU : Intel Core i5-8600K @ 3.60GHz RAM : 16GB Python : 3.8.0 (Veuillez avoir le pip disponible)

EV3 OS: EV3 MicroPython (je ne sais pas si c'est le nom officiel) CPU : ARM9 @ 300MHz RAM : 64MB Python : 3.5.3

EV3 MicroPython DL ・ L'utilisation principale est À partir d'ici À propos, cet EV3 MicroPython est ev3dev avec la bibliothèque d'exécution Pybricks MicroPython, vous pouvez donc utiliser les fonctions d'ev3dev telles quelles.

Préparation

Fondamentalement, pour communiquer entre eux à l'aide de MQTT, il est nécessaire de connecter l'appareil à Internet, mais comme l'EV3 n'a pas de module Wi-Fi en premier lieu, cette fois le PC et EV3 sont directement connectés au câble USB. Connectez-vous et communiquez avec. Si vous souhaitez communiquer via Internet, vous devez acheter un dongle Wi-Fi séparément.

Connexion SSH

Après avoir connecté EV3 et PC avec un câble, l'étape suivante consiste à vous connecter à EV3 à partir d'un PC avec SSH. Si vous utilisez Linux ou macOS, vous pouvez vous connecter depuis le terminal avec la commande ssh (l'ID utilisateur par défaut est «robot», le mot de passe est «créateur»). Pour Windows, utilisez un logiciel appelé TeraTerm (pour Windows 10 version 1903 ou ultérieure, vous pouvez vous connecter avec la commande ssh à l'aide du logiciel appelé «Windows Terminal»).

Lorsque vous lancez TeraTerm, la fenêtre suivante apparaît. TeraTerm-新しい接続.JPG Entrez robot @ ev3dev.local dans" Host "et cliquez sur" OK ". Si vous vous connectez à Internet, vous pouvez utiliser l'adresse IP dans ʻev3dev.local(commerobot @ 192.168.xx.xx`).

Ensuite, la fenêtre "Avertissement de sécurité" n'apparaîtra que lorsque vous vous connectez pour la première fois, alors sélectionnez simplement "Continuer".

Il vous sera demandé votre mot de passe, tapez «créateur» et sélectionnez OK. TeraTerm-SSH認証.JPG

Si ce qui suit s'affiche, la connexion SSH est terminée.


Linux ev3dev 4.14.96-ev3dev-2.3.2-ev3 #1 PREEMPT Sun Jan 27 21:27:35 CST 2019 armv5tejl```
             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/
```
Debian stretch on LEGO MINDSTORMS EV3!
 Dernière connexion: (date et heure) du ...
robot@ev3dev:~$ 

Installation du courtier

Installez un courtier pour la communication MQTT entre EV3 et PC. Utilisez des moustiques. Vous pouvez le mettre sur PC ou EV3, mais cette fois, nous l'installerons dans EV3. Exécutez la commande suivante.


robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install mosquitto

Après l'installation, vérifiez si le courtier est en cours d'exécution avec la commande suivante.


robot@ev3dev:~$ sudo service mosquitto status
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated; vendor preset: enabled)
 Actif: actif (en cours) depuis (date et heure)
     Docs: man:systemd-sysv-generator(8)
  Process: 1282 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mosquitto.service
           mq1289 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

 (Date et heure) ev3dev systemd [1]: Démarrage de LSB: mosquitto MQTT v3.1 message broker ...
 (Date et heure) ev3dev mosquitto [1282]: Démarrage du démon réseau :: mosquitto.
 (Date et heure) ev3dev systemd [1]: LSB démarré: Mosquitto MQTT v3.1 message broker.

● Si la partie «active (en cours)» est verte, elle a démarré correctement. Le numéro de port par défaut est 1883

Si vous voyez ce qui suit, cela signifie qu'il n'a pas démarré.


robot@ev3dev:~$ sudo service mosquitto status
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

Alors, exécutez la commande suivante et vérifiez si elle est redémarrée.


robot@ev3dev:~$ sudo service mosquitto start

Installation de la bibliothèque

Ensuite, installez la bibliothèque pour gérer MQTT à partir de Python. Exécutez la commande suivante sur EV3.


robot@ev3dev:~$ sudo pip3 install paho-mqtt

Installez-le également sur votre PC de la même manière.



#### **`\Users\(Nom d'utilisateur)>pip install paho-mqtt`**
```c

Vous êtes maintenant prêt.

Programme annexe EV3

main.py


#!/usr/bin/env python3

import paho.mqtt.client as mqtt  #Importer la bibliothèque MQTT
import subprocess
from time import sleep

get_way = False

def on_connect(client, userdata, flags, rc):     #Définition de la fonction de rappel à exécuter lors de la connexion à Broker
	print("Connected with result code "+str(rc)) #Si la connexion réussit, rc vaut 0
	client.subscribe("pc/solve_way")             # "pc/solve_way"Lire la rubrique

def on_message(client, userdata, message):       #Définition d'une fonction de rappel à exécuter lors de la réception d'un message
	print(message.topic + " " + str(message.payload))  #Le sujet est le nom de l'en-tête et la charge utile est le message.
	global get_way
	get_way = True

def main():
	client = mqtt.Client()                #Générer une instance du client MQTT
	client.on_connect = on_connect        #Passer la fonction de rappel de connexion définie ci-dessus
	client.on_message = on_message        #Passer la fonction de rappel entrant définie ci-dessus

	client.connect("localhost", 1883, 60) # Broker(moi même)Connectez-vous au port 1883(Keep Alive dure 60 secondes)
	
	client.publish("ev3/cube_state", "5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0") #Trouvez dans le premier argument et prenez des informations dans le deuxième argument
	# "5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0"L'énumération des nombres représente l'état du Rubik Cube
	
	print("published")
	client.loop_start()       #Démarrer la boucle de réception des messages

	while not get_way:
		sleep(0.01)

	client.loop_stop()        #Arrêter la boucle de réception
	client.disconnect()       #Déconnecter

if __name__ == '__main__':
	main()

Programme côté PC

pc-main.py


import paho.mqtt.client as mqtt  #Importer la bibliothèque MQTT
from time import sleep
import rcSolver as solver        # 2*2*2 Programme pour résoudre Rubik Cube

get_state = False
solve_way = ""

def on_connect(client, userdata, flags, rc):     #Définition de la fonction de rappel à exécuter lors de la connexion à Broker
	print("Connected with result code "+str(rc)) #Si la connexion réussit, rc vaut 0
	client.subscribe("ev3/cube_state")           # "ev3/cube_state"Lire la rubrique

def on_message(client, userdata, message):       #Définition d'une fonction de rappel à exécuter lors de la réception d'un message
	print(message.topic + " " + str(message.payload))  #Le sujet est le nom de l'en-tête et la charge utile est le message.
	cpco_s = message.payload.decode("utf-8").split(":")
	cp_s = cpco_s[0].split(",")
	co_s = cpco_s[1].split(",")
	cp = [int(s) for s in cp_s]
	co = [int(s) for s in co_s]
	cube_state = solver.State(cp, co)            #Stocke l'état du Rubik Cube
	global solve_way
	solve_way = solver.solve(cube_state)         #Résolvez le Rubik Cube et stockez la solution
	print("solve way:", solve_way)
	global get_state
	get_state = True

def main():
	client = mqtt.Client()                   #Générer une instance du client MQTT
	client.on_connect = on_connect           #Passer la fonction de rappel de connexion définie ci-dessus
	client.on_message = on_message           #Passer la fonction de rappel entrant définie ci-dessus

	client.connect("ev3dev.local", 1883, 60) # Broker(EV3)Connectez-vous au port 1883(Keep Alive dure 60 secondes)
	client.loop_start()       #Démarrer la boucle de réception des messages

	while not get_state:
		sleep(0.01)

	client.loop_stop()        #Arrêter la boucle de réception
	sleep(0.5)                #Attendez un moment pendant que le programme du côté EV3 se connecte à Broker
	
	client.publish("pc/solve_way", solve_way) #Trouvez dans le premier argument et prenez des informations dans le deuxième argument
	
	print("published")
	client.disconnect()       #Déconnecter

if __name__ == '__main__':
	main()

Essayez de courir

Tout d'abord, exécutez pc-main.py du côté PC.



#### **`\Users\(Nom d'utilisateur)>python pc-main.py`**
```c

Connected with result code 0

Si «Connecté avec le code de résultat 0» est affiché, exécutez également «main.py» du côté EV3.


robot@ev3dev:~$ ./main.py

Sommaire des résultats

Côté PC



#### **`\Users\(Nom d'utilisateur)>python pc-main.py`**
```c

Connected with result code 0
ev3/cube_state b'5,2,6,3,4,7,1,0:0,0,0,0,0,1,2,0'
solve time: 3.744987964630127
solve way: U2 R2 U R' U2 R' F2 U2 R'
published

Côté EV3


robot@ev3dev:~$ ./main.py
published
Connected with result code 0
pc/solve_way b"U2 R2 U R' U2 R' F2 U2 R'"

Si vous utilisez un PC, vous pouvez résoudre le Rubik Cube qui peut être résolu avec 9 mains en moins de 4 secondes, et le résultat s'affiche fermement sur l'EV3!

Les références

EV3 - Introduction à la robotique

Pour savoir comment exprimer l'état du Rubik Cube, je me suis référé ici. [Series] Écrivons un programme pour résoudre le Rubik Cube (Partie 1)

Recommended Posts

Essayez de communiquer avec EV3 et PC! (MQTT)
Essayez de lier iTunes et Hue of Collection Case avec MQTT
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Essayez de défier le sol par récursif
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Communiquez avec FX-5204PS avec Python et PyUSB
Essayez de profiler avec ONNX Runtime
Essayez de produire de l'audio avec M5 STACK
Essayez d'afficher la carte google et la carte géographique avec python
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
Communiquez entre Elixir et Python avec gRPC
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Essayez de convertir les coordonnées de latitude / longitude et du monde entre elles avec python
Fractal pour faire et jouer avec Python
Essayez de créer foldl et foldr avec Python: lambda. Aussi mesure du temps
Essayons gRPC avec Go et Docker
Essayez de prédire les fleurs de cerisier avec XG Boost
Essayez de convertir en données ordonnées avec les pandas
Essayez rapidement de visualiser votre ensemble de données avec des pandas
Premier YDK à essayer avec Cisco IOS-XE
Essayez de générer une image avec aliénation
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Essayez de créer votre propre AWS-SDK avec bash
Essayez de résoudre le problème du fizzbuzz avec Keras
Grattage de la nourriture avec python et sortie en CSV
Essayez d'exécuter Google Chrome avec Python et Selenium
Essayez de résoudre le diagramme homme-machine avec Python
Essayez d'extraire le document Azure document DB avec pydocumentdb
Essayez de dessiner une courbe de vie avec python
Comment essayer l'algorithme des amis d'amis avec pyfof
Essayez de créer un code de "décryptage" en Python
Comment communiquer de manière asynchrone uniquement avec Touch Designer
Gérez les transitions d'état et communiquez avec les compteurs intelligents
Essayez de générer automatiquement des documents Python avec Sphinx
MQTT Radicon Car avec Arduino et Raspberry
Script pour tweeter avec des multiples de 3 et des nombres avec 3 !!
Contrôlons les moteurs et capteurs EV3 avec Python
Essayez de créer un groupe de dièdre avec Python
[Dédié à Telewa! ] J'utilise un PC avec une webcam.
Essayez de rendre le client FTP le plus rapide avec Pythonista
Essayez de détecter les poissons avec python + OpenCV2.4 (inachevé)
Introduction à MQTT (Introduction)
Effectuez une recherche Twitter à partir de Python et essayez de générer des phrases avec la chaîne de Markov.
Connectez realsense D435 à un PC sur lequel Ubuntu 16.04 est installé et enregistrez la vidéo de profondeur avec python
Essayez de créer un site Web simple avec responder et sqlite3
Procédure pour charger MNIST avec python et sortie en png
Essayez de résoudre le livre des défis de programmation avec python3
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
IoT facile pour démarrer avec Raspeye et MESH
Faisons un outil de veille de commande avec python
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
Je veux gérer l'optimisation avec python et cplex
Essayez de créer un Checkbutton dynamiquement avec Tkinter en Python
Visualisons la pièce avec tarte aux râpes, partie 1
Essayez de résoudre le problème d'affectation du médecin de formation avec Python