Lassen Sie uns EV3-Motoren und -Sensoren mit Python steuern

Dieser Artikel ist ein Eintrag für ET Robocon Adventskalender 2016 12/22.


Hallo, das ist Haneuma.

Bis letztes Jahr hat unser Team "Galaxy Haneuma" an ET Robocon in Java teilgenommen, Dieses Jahr habe ich meine Meinung geändert und versucht, an Python teilzunehmen.

Selbst als ich die Informationen nachgeschlagen habe, um sie auszuprobieren, konnte ich die benötigten Informationen nicht finden. Ich hoffe, es ist eine Referenz für diejenigen, die von nun an LEGO Mindstorms EV3 mit Python ausführen möchten. Ich habe beschlossen, diesen Artikel zu schreiben. Dieser Artikel ist für Windows gedacht, da er anscheinend viele Benutzer hat.

In Zukunft werde ich Geschichten über die Python-Entwicklungsumgebung und die ev3dev-Cross-Compilation-Umgebung veröffentlichen.

Ausführungsumgebung

Betriebssystem: ev3dev 2016-10-17 Release-Version (Debian-basiertes Linux) Verwendete Bibliothek: python-ev3dev 0.8.0 (Es gibt eine Bibliothek namens ** python-ev3 **, aber seien Sie vorsichtig, weil sie anders ist.) Python-Version: Python 3.4.2 (Verwenden Sie unbedingt Python3, da Python-ev3dev 0.8.0 Python2 nicht unterstützt.)

Ev3dev installieren / starten

[Referenz] Erste Schritte mit ev3dev-ev3dev.org

  1. Laden Sie das Betriebssystem-Image von der offiziellen Website von ev3dev herunter Klicken Sie unter dem folgenden Link auf "Download for EV3", um die ZIP-Datei herunterzuladen. Downloads-ev3dev.org (Die Version zum Zeitpunkt des Schreibens ist die Version 2016-10-17)

  2. Extrahieren Sie die heruntergeladene ZIP-Datei Die Bilddatei von ev3dev wird erweitert. (In der Version 2016-10-17 lautet der Name der Bilddatei "ev3dev-jessie-ev3-generic-2016-10-17.img")

  3. Schreiben Sie die Bilddatei auf die SD-Karte Verwenden Sie Win32DiskImager, um die extrahierte Bilddatei auf die SD-Karte zu schreiben. Der Schreibvorgang wird auf der folgenden Website beschrieben. Bitte beziehen Sie sich darauf. → [SD-Kartenvorbereitung-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)

Die unterstützten SD-Karten sind ** 2 GB ~ 32 GB </ font> ** ** microSD oder microSDHC </ font> **. Bitte beachten Sie, dass microSDXC nicht unterstützt wird.

  1. Legen Sie die geschriebene SD-Karte in EV3 ein und starten Sie EV3. Das Startprotokoll wird ausgegeben und nach einer Weile wird der Menübildschirm angezeigt. Wenn der Menübildschirm angezeigt wird, ist er erfolgreich.

Verbinden Sie ev3dev mit dem Netzwerk

Es gibt verschiedene Möglichkeiten, den EV3 mit Ihrem Netzwerk zu verbinden:

  • Drahtlose LAN-Verbindung mit WLAN-Dongle → EV3-Python-Programmierumgebung (ev3dev), WLAN-Verbindungsprozedur-Afrel

  • Verdrahtete LAN-Verbindung mit USB-LAN-Adapter → Bestätigter Betrieb mit Buffalo LUA3-U2-ATX

  • Verbinden Sie die Verbindung mit einem USB-Kabel (Typ A-mini B). → Der Betrieb wurde mit dem an die Lernversion LEGO Mindstorm EV3 Basic Set V2 angeschlossenen USB-Kabel bestätigt

  • Verbinden Sie sich mit integriertem Bluetooth → Betrieb nicht bestätigt

  • Wenn Sie eine Verbindung zum LAN herstellen, müssen Sie die IP-Adresse manuell oder in einer Umgebung festlegen, in der DHCP verwendet werden kann.

Remote-Login bei EV3 mit SSH

Melden Sie sich mit SSH bei ev3dev an. Hier verbinden wir uns mit TeraTerm.

  1. Geben Sie nach dem Starten von TeraTerm die EV3-IP-Adresse in den Host ein und klicken Sie auf die Schaltfläche "OK". ssh_1.png
  • Die IP-Adresse wird oben links auf dem Bildschirm des EV3-Hauptgeräts angezeigt.
  1. Wenn ein Sicherheitswarnfenster angezeigt wird, klicken Sie auf die Schaltfläche "Weiter". ssh_2.png

  2. Geben Sie Ihren Benutzernamen und Ihre Passphrase (Passwort) ein. ID: ** Roboter ** / Pass: ** Hersteller ** ssh_3.png

  3. Die Anmeldung ist erfolgreich und das ev3dev-Logo wird auf dem Terminal angezeigt. ssh_4.png

python-ev3dev Update

python-ev3dev, das in der Release-Version von ev3dev 2016-10-17 enthalten ist, wird aktualisiert, da die Version 0.7.0 ist. (Da sich die API um den Sensor in python-ev3dev 0.8.0 geringfügig geändert hat, seien Sie bitte vorsichtig, wenn Sie den Quellcode in der vorherigen Version implementiert haben.)

robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install --only-upgrade python3-ev3dev
  • Sie werden aufgefordert, das Passwort in der Mitte des Befehls einzugeben. Geben Sie daher den Hersteller ein.

Beispielprogramm

Die Beispielprogramme für die Motorsteuerung und Sensorsteuerung werden nachfolgend beschrieben. Speichern Sie den Zeichencode des Programms als UTF-8.

Motorsteuerung

motor.py


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

#Motorklasse instanziieren
m = ev3.LargeMotor('outA')
#Drehen Sie den Motor 3 Sekunden lang
m.run_timed(time_sp=3000, speed_sp=500)

#5 Schleifen
for i in range(0,5):
    #Motorstatus am Standardausgang anzeigen
    print(m.state())
    #1 Sekunde schlafen
    time.sleep(1)

Sensorsteuerung (Farbsensor)

color.py


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

#Farbsensorklasse instanziieren
c = ev3.ColorSensor('in1')

#Zeigt die Lichtreflexionsintensität der roten LED an
print(c.reflected_light_intensity)
#Sensormodus anzeigen
print(c.mode)

#RGB-Wert anzeigen
print(c.raw)
#Sensormodus anzeigen
print(c.mode)

#Zeigen Sie die erfasste Farbe an(0:farblos, 1:schwarz, 2:Blau, 3:Grün, 4:Gelb, 5:rot, 6:Weiß, 7:Tee)
print(c.color)
#Sensormodus anzeigen
print(c.mode)

Motor + Sensorsteuerung

motor_color.py


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

#Motorklasse instanziieren
m = ev3.LargeMotor('outA')

#Farbsensorklasse instanziieren
c = ev3.ColorSensor('in1')

#Den Motor drehen(Drehen Sie weiter, bis Sie Stop rufen)
m.run_forever(speed_sp=300)

#Schleife, bis der Farbsensor Schwarz erkennt
while c.color != 1:
    #Zeigen Sie die erfasste Farbe an(0:farblos, 1:schwarz, 2:Blau, 3:Grün, 4:Gelb, 5:rot, 6:Weiß, 7:Tee)
    print(c.color)
    #1 Sekunde schlafen
    time.sleep(1)
    
#Stoppen Sie den Motor(Halten Sie nach dem Anhalten an, um die Position des Motors zu fixieren_Geben Sie Hold for Action an)
m.stop(stop_action="hold")

Übertragung des Beispielprogramms

Da ev3dev standardmäßig SFTP verwenden kann, wird empfohlen, WinSCP zu verwenden, wenn Beispielprogramme von Windows übertragen werden. Ich werde die Operationsmethode von WinSCP weglassen.

Die für die Verbindung verwendeten Einstellungen sind wie folgt. Übertragungsprotokoll: SFTP Hostname: IP-Adresse, die oben links auf dem EV3-Bildschirm angezeigt wird Portnummer: 22 Benutzername: Roboter Passwort: Hersteller

Beispielprogramm ausführen

Dieses Mal verwenden wir das Beispielprogramm motor.py als Beispiel.

Bei der Ausführung vom Terminal

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

Ausführungsergebnis

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

Beim Starten vom EV3-Hauptgerät

Wenn Sie ein Programm von der EV3-Haupteinheit aus starten, müssen Sie dem Zielprogramm im Voraus das Ausführungsrecht gewähren. Verwenden Sie den Befehl chmod, um Ausführungsrechte zu erteilen.

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:~$

Nachdem Sie das Ausführungsrecht erteilt haben, wählen Sie auf dem Bildschirm des EV3-Hauptgeräts die Option Dateibrowser. Der Cursor kann mit den Auf- und Ab-Tasten am EV3-Hauptgerät bewegt werden, und die Entscheidung kann mit der mittleren Taste getroffen werden.

Wenn Sie den Dateibrowser öffnen, wird zuerst unter / home / robot angezeigt. Wählen Sie daher motor.py aus. Wenn das Ausführungsrecht erfolgreich gewährt wurde, wird neben dem Dateinamen ein Sternchen angezeigt.

Nach Auswahl einer Datei wird das Programm ausgeführt. Nach Abschluss des Programms kehren Sie zum Bildschirm "Dateibrowser" zurück.

Ausführungsergebnis

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

Problem

Hier sind einige der Probleme, die mir während der Entwicklung aufgefallen sind.

  • Die Bibliothek mit zwei invertierten Pendeln ist nicht vorhanden → ET Robocon 2016 hat offiziell angekündigt, dass Grundschulklassen nicht teilnehmen können. Verfügbare Plattforminformationen - ET Robocon 2016

  • Die LED des Farbsensors kann nicht ausgeschaltet werden → Aufgrund der technischen Daten des Betriebssystems kann die LED des Farbsensors nicht ausgeschaltet werden, sodass keine schlampige Linienverfolgung durchgeführt werden kann.

  • Ein Fehler tritt auf, wenn der Farbsensor kontinuierlich RGB-Werte erfasst. → Wenn Sie einen Farbsensor verwenden, kann beim Erfassen des Werts ein Fehler auftreten. Wenn Sie unter Linux mit dmesg prüfen, hängt dies mit dem Pufferüberlauffehler zusammen? (Wenn jemand die Ursache kennt, lass es mich wissen)

  • Die Verarbeitungsgeschwindigkeit ist langsam → Da die Verarbeitungsgeschwindigkeit langsamer ist als bei RTOS wie TOPPERS, kann dies im Wettbewerb von ET Robocon nachteilig sein.

API Hier ist ein Beispiel für die Verwendung einiger APIs der Motorklasse.

motorApiTest.py


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

import ev3dev.ev3 as ev3
import time

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

print(l.count_per_rot) #Motoranzahl pro Umdrehung

l.speed_sp = 200 #Zielgeschwindigkeit einstellen(200 Zählungen pro Sekunde)
print(l.speed_sp) #Zeigen Sie den eingestellten Zielgeschwindigkeitswert an

l.run_forever() #Den Motor drehen
m.run_forever(speed_sp=200) #Es ist auch möglich, die Geschwindigkeit gleichzeitig mit der Drehung einzustellen

time.sleep(2)

l.speed_sp = 300 #Motordrehzahl ändern
l.run_forever()

m.speed_sp = -200 #Rückwärtsdrehung des Motors
m.run_forever()

time.sleep(2)

l.stop_action = 'hold' #Stellen Sie den Motorzustand beim Anhalten auf "fest".
print(l.stop_action) #Zeigen Sie den Betrieb an, nachdem der Motor gestoppt wurde

l.stop() #Stoppen Sie den Motor
m.stop(stop_action='brake') #Stoppen Sie den Motor(Stellen Sie den Motorzustand beim Anhalten auf "Bremse".

print(l.position) #Motorzählwert anzeigen

#Drehen Sie den Motor um 100 Zählimpulse
l.run_to_abs_pos(position_sp=l.position_sp+100) #Absolutwertspezifikation
m.run_to_rel_pos(position_sp=100) #Relative Wertespezifikation

Recommended Posts