Contrôlons les moteurs et capteurs EV3 avec Python

Cet article est une entrée pour ET Robocon Advent Calendar 2016 12/22.


Bonjour, c'est Haneuma.

Jusqu'à l'année dernière, notre équipe "Galaxy Haneuma" participait à ET Robocon à Java, Cette année, j'ai changé d'avis et essayé de participer à Python.

Cependant, même lorsque j'ai recherché les informations pour l'essayer, je n'ai pas trouvé les informations dont j'avais besoin. Donc, j'espère que cela sera utile pour ceux qui veulent exécuter LEGO Mindstorms EV3 avec Python à partir de maintenant. J'ai décidé d'écrire cet article. Cet article est destiné à Windows car il semble avoir de nombreux utilisateurs.

À l'avenir, je publierai des articles sur l'environnement de développement Python et l'environnement de compilation croisée ev3dev.

Environnement d'exécution

OS: ev3dev 2016-10-17 Release version (Linux basé sur Debian) Bibliothèque utilisée: python-ev3dev 0.8.0 (Il existe une bibliothèque appelée ** python-ev3 **, mais attention car elle est différente) Version Python: Python 3.4.2 (Assurez-vous d'utiliser Python3 car python-ev3dev 0.8.0 ne prend pas en charge Python2)

Installer / démarrer ev3dev

[Référence] Premiers pas avec ev3dev-ev3dev.org

  1. Téléchargez l'image du système d'exploitation sur le site officiel d'ev3dev Cliquez sur "Télécharger pour EV3" sur le lien ci-dessous pour télécharger le fichier ZIP. Downloads-ev3dev.org (La version au moment de la rédaction est la version 2016-10-17)

  2. Extrayez le fichier ZIP téléchargé Le fichier image de ev3dev est développé. (Dans la version 2016-10-17, le nom du fichier image est "ev3dev-jessie-ev3-generic-2016-10-17.img")

  3. Ecrivez le fichier image sur la carte SD Utilisez Win32DiskImager pour écrire le fichier image extrait sur la carte SD. La procédure d'écriture est décrite sur le site suivant, veuillez donc vous y référer. → [Préparation de la carte SD-OpenRTM-aist](http://openrtm.org/openrtm/ja/content/sd-%E3%82%AB%E3%83%BC%E3%83%89%E3%81 % AE% E6% BA% 96% E5% 82% 99)

Les cartes SD prises en charge sont ** 2 Go ~ 32 Go </ font> ** ** microSD ou microSDHC </ font> **. Veuillez noter que microSDXC n'est pas pris en charge.

  1. Insérez la carte SD écrite dans EV3 et démarrez EV3. Le journal de démarrage est sorti et, après un certain temps, l'écran de menu s'affiche. Si l'écran de menu est affiché, cela réussit.

Connectez ev3dev au réseau

Il existe plusieurs façons de connecter l'EV3 à votre réseau:

--Connectez à l'aide d'un câble USB (Type A-mini B) → Opération confirmée avec le câble USB connecté à la version éducative LEGO Mindstorm EV3 Basic Set V2

--Connectez-vous à l'aide du Bluetooth intégré → Opération non confirmée

  • Lors de la connexion au LAN, il est nécessaire de définir l'adresse IP manuellement ou dans un environnement où DHCP peut être utilisé.

Connexion à distance à EV3 avec SSH

Connectez-vous à ev3dev en utilisant SSH. Ici, nous nous connectons en utilisant TeraTerm.

  1. Après avoir démarré TeraTerm, entrez l'adresse IP EV3 dans l'hôte et cliquez sur le bouton "OK". ssh_1.png
  • L'adresse IP est affichée dans le coin supérieur gauche de l'écran de l'unité principale EV3.
  1. Si une fenêtre d'avertissement de sécurité s'affiche, cliquez sur le bouton "Continuer". ssh_2.png

  2. Entrez votre nom d'utilisateur et votre mot de passe (mot de passe). ID: ** robot ** / Pass: ** fabricant ** ssh_3.png

  3. La connexion est réussie et le logo ev3dev s'affiche sur le terminal. ssh_4.png

mise à jour python-ev3dev

python-ev3dev inclus dans la version Release de ev3dev 2016-10-17 sera mis à jour car la version est 0.7.0. (Étant donné que l'API autour du capteur a légèrement changé dans python-ev3dev 0.8.0, veuillez faire attention si vous avez le code source implémenté dans la version précédente)

robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install --only-upgrade python3-ev3dev
  • Vous serez invité à entrer le mot de passe au milieu de la commande, alors entrez maker.

Exemple de programme

Les exemples de programmes pour la commande du moteur et la commande du capteur sont décrits ci-dessous. Enregistrez le code de caractère du programme sous UTF-8.

Contrôle moteur

motor.py


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import ev3dev.ev3 as ev3
import time

#Instancier la classe de moteur
m = ev3.LargeMotor('outA')
#Faites tourner le moteur pendant 3 secondes
m.run_timed(time_sp=3000, speed_sp=500)

#5 boucles
for i in range(0,5):
    #Afficher l'état du moteur sur la sortie standard
    print(m.state())
    #Dormez pendant 1 seconde
    time.sleep(1)

Contrôle du capteur (capteur de couleur)

color.py


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import ev3dev.ev3 as ev3

#Instanciez la classe de capteur de couleur
c = ev3.ColorSensor('in1')

#Affiche l'intensité de réflexion lumineuse de la LED rouge
print(c.reflected_light_intensity)
#Afficher le mode capteur
print(c.mode)

#Afficher la valeur RVB
print(c.raw)
#Afficher le mode capteur
print(c.mode)

#Afficher la couleur acquise(0:incolore, 1:noir, 2:Bleu, 3:vert, 4:Jaune, 5:rouge, 6:blanc, 7:thé)
print(c.color)
#Afficher le mode capteur
print(c.mode)

Contrôle moteur + capteur

motor_color.py


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import ev3dev.ev3 as ev3
import time

#Instancier la classe de moteur
m = ev3.LargeMotor('outA')

#Instanciez la classe de capteur de couleur
c = ev3.ColorSensor('in1')

#Faire tourner le moteur(Continuez à tourner jusqu'à ce que vous appeliez stop)
m.run_forever(speed_sp=300)

#Boucle jusqu'à ce que le capteur de couleur détecte le noir
while c.color != 1:
    #Afficher la couleur acquise(0:incolore, 1:noir, 2:Bleu, 3:vert, 4:Jaune, 5:rouge, 6:blanc, 7:thé)
    print(c.color)
    #Dormez pendant 1 seconde
    time.sleep(1)
    
#Arrêtez le moteur(Après l'arrêt, arrêtez-vous pour fixer la position du moteur_Spécifiez la suspension pour action)
m.stop(stop_action="hold")

Transfert d'un exemple de programme

Comme ev3dev peut utiliser SFTP par défaut, il est recommandé d'utiliser WinSCP lors du transfert d'exemples de programmes depuis Windows. J'omettrai la méthode de fonctionnement de WinSCP.

Les paramètres utilisés pour la connexion sont les suivants. Protocole de transfert: SFTP Nom d'hôte: adresse IP affichée dans le coin supérieur gauche de l'écran EV3 Numéro de port: 22 Nom d'utilisateur: robot Mot de passe: fabricant

Exécuter un exemple de programme

Cette fois, nous utiliserons l'exemple de programme motor.py comme exemple.

Lors de l'exécution depuis le terminal

robot@ev3dev:~$ pwd
/home/robot
robot@ev3dev:~$ ls
color.py  motor.py  motor_color.py
robot@ev3dev:~$ python3 motor.py

Résultat d'exécution

robot@ev3dev:~$ python3 motor.py
['running', 'stalled']
['running']
['running']
[]
[]
robot@ev3dev:~$ 

Lors du démarrage à partir de l'unité principale EV3

Lors du démarrage d'un programme à partir de l'unité principale EV3, il est nécessaire d'accorder au préalable le droit d'exécution au programme cible. Utilisez la commande chmod pour accorder des droits d'exécution.

robot@ev3dev:~$ pwd
/home/robot
robot@ev3dev:~$ ls -l
total 12
-rw-r--r-- 1 robot robot 522 Dec 21 07:55 color.py
-rw-r--r-- 1 robot robot 236 Dec 21 04:19 motor.py
-rw-r--r-- 1 robot robot 735 Dec 21 08:03 motor_color.py
robot@ev3dev:~$ chmod +x motor.py
robot@ev3dev:~$ ls -l
total 12
-rw-r--r-- 1 robot robot 522 Dec 21 07:55 color.py
-rwxr-xr-x 1 robot robot 236 Dec 21 04:19 motor.py
-rw-r--r-- 1 robot robot 735 Dec 21 08:03 motor_color.py
robot@ev3dev:~$

Après avoir accordé le droit d'exécution, sélectionnez File Browser sur l'écran de l'unité principale EV3. Le curseur peut être déplacé avec les boutons haut et bas de l'unité principale EV3, et la décision peut être prise avec le bouton central.

Lorsque vous ouvrez le navigateur de fichiers, vous verrez d'abord sous / home / robot, alors sélectionnez motor.py. Si le droit d'exécution a été accordé avec succès, un astérisque s'affiche à côté du nom du fichier.

Après avoir sélectionné un fichier, le programme s'exécutera et, une fois terminé, vous serez renvoyé à l'écran du navigateur de fichiers.

Résultat d'exécution

['running', 'stalled']
['running']
['running']
[]
[]

problème

Voici quelques-uns des problèmes que j'ai remarqués pendant le développement.

  • La bibliothèque de pendule inversé à deux roues n'est pas fournie → ET Robocon 2016 a officiellement annoncé que les classes primaires ne peuvent pas participer. Informations sur la plate-forme disponibles - ET Robocon 2016

  • La LED du capteur de couleur ne peut pas être éteinte → En raison des spécifications du système d'exploitation, la LED du capteur de couleur ne peut pas être éteinte, de sorte qu'une trace de ligne bâclée ne peut pas être effectuée.

  • Une erreur se produit lorsque les valeurs RVB sont acquises en continu par le capteur de couleur. → Si vous utilisez un capteur de couleur, une erreur peut survenir lors de l'acquisition de la valeur. La vérification avec dmesg sous Linux est-elle liée à l'erreur de dépassement de tampon? (Si quelqu'un connaît la cause, merci de me le faire savoir)

  • La vitesse de traitement est lente → La vitesse de traitement étant plus lente que les RTOS comme TOPPERS, cela peut être désavantageux face à la concurrence d'ET Robocon.

API Voici un exemple d'utilisation de certaines des API de classe de moteur.

motorApiTest.py


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import ev3dev.ev3 as ev3
import time

l = ev3.LargeMotor('outA')  #Servomoteur interactif EV3 L
m = ev3.MediumMotor('outB') #Servomoteur interactif EV3 M

print(l.count_per_rot) #Nombre de moteurs par tour

l.speed_sp = 200 #Définir la vitesse cible(200 coups par seconde)
print(l.speed_sp) #Afficher la valeur de vitesse cible définie

l.run_forever() #Faire tourner le moteur
m.run_forever(speed_sp=200) #Il est également possible de régler la vitesse en même temps que la rotation

time.sleep(2)

l.speed_sp = 300 #Changer la vitesse de rotation du moteur
l.run_forever()

m.speed_sp = -200 #Rotation inverse du moteur
m.run_forever()

time.sleep(2)

l.stop_action = 'hold' #Réglez l'état du moteur à l'arrêt sur «fixe»
print(l.stop_action) #Afficher le fonctionnement après l'arrêt du moteur

l.stop() #Arrêtez le moteur
m.stop(stop_action='brake') #Arrêtez le moteur(Réglez l'état du moteur à l'arrêt sur "frein"

print(l.position) #Afficher la valeur de comptage du moteur

#Faites tourner le moteur sur 100 points
l.run_to_abs_pos(position_sp=l.position_sp+100) #Spécification de la valeur absolue
m.run_to_rel_pos(position_sp=100) #Spécification de la valeur relative

Recommended Posts