The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

ev3dev

ev3devDebian Linux ベースのOSで、LEGOとは無関係の ev3dev.org というコミュニティーによって独自にMindstorms EV3(以後EV3と書く)のために開発されたソフトウェア・プラットフォームです。EV3用のセンサ、モータ等のハードウェアの低レベルのドライバがコミュニティ・メンバーによって開発され、多くの言語でのプログラミングをサポートするように作られているので、EV3を高級言語でプログラムするには最適の環境だと言えます。
https://www.ev3dev.org/

このev3devを使ってEV3を動かすプログラムをPythonで開発する方法については、上記サイトおよび下記のサイトに詳しく書かれていて大変参考になります。
https://sites.google.com/site/ev3devpython/
しかし、それらは大量の情報を含んでいるために全体を理解するのはなかなか大変です。そこで、本ブログではその大要を把握するために要点を以下にまとめておくことにします。

ステップは次のとおりです。
1. ev3dev.orgのサイトからev3devのイメージ(最新版は ev3dev-stretch-ev3-generic-2020-04-10.zip )をダウンロードします。

そこにも書かれていますが、LEGOが承認してるev3dev-stretch-ev3のバージョンはそれとは異なるもので、下記のLEGOのサイトからダウンロードできます。
education.lego.comLEGOがそのなかで採用しているのはMicro-Pythonで、Pythonのサブセットになるので両者を混同しないように注意する必要がありますが、それについては後述します。

2. ev3devのイメージがダウンロード出来たら、下図のようにEtcher等を利用してそれをマイクロSDに書き込みます。

3. そのマイクロSDをEV3にセットして電源をいれると、ブートのメッセージが流れ、オレンジのLEDが点滅します。1’45"ほどすると、brickman loading... というメッセージが表示され、2分程度で緑のLEDが点灯して起動が完了し、LCDには下のような表示が出ます。

4. ev3devはLinuxで、WiFiBluetoothを使って無線でPCに接続する機能を有しています。ハードウェア的にはBluetoothはEV3に内蔵されていますが、Wi-Fiを使うためにはUSBドングルを挿しておく必要があります。
それらの通信機能を設定するには、起動後の画面のメニューから”Wireless and Network”を選択します。

Wi-Fiで接続するには次に”Wi-Fi”を選択します。そして”Powered”をチェックすると利用可能なWi-Fiネットワークが表示されるので、選択してパスキーを設定します。そのWi-Fiネットワークに接続されると、下の図のように、LCDの右上にWi-Fi電波のマーク、左上にIPアドレスが表示されます。

Bluetoothで接続するには"Bluetooth"を選択します。そしてPoweredをチェックしてオンすると、下の図のようにLCDの右上にBluetoothマークが表示されます。

次に”Scan”を押して目的のPCが表示されたらそれを選択し、”Network Connection”を押します。右上のBluetoothマークが白黒反転すればEV3とPCの接続が完了です。

5. EV3でPythonスクリプトを実行するには、PC上でスクリプトを書き、それをEV3に転送するのですが、それにはMicrosoftVisual Studio Code (VS Code)が最適です。そこで、MicrosoftのサイトからVS Codeをダウンロードし、PCにインストールします。VSCodeを起動すると下のような画面になります。

6. VS Codeはアクティブ・バーのエクステンションから拡張機能を追加することにより機能をカストマイズできます。ここでは目的のために、先ず、Python、ev3dev-borowserを選択してインストールします。さらにJapanese Language Pack for Visual Studio Code、PrintCodeを追加して入れておくと日本語を使った開発が容易になります。

7. PCからEV3上にPythonスクリプトを送って実行するためには、実行するPythonスクリプトといくつかの必要なファイルが入ったプロジェクト・フォルダをVSCodeで開かなければなりません。そのプロジェクト・フォルダそのフォルダのひな形がvscode-hello-python-master.zipとしてhttps://github.com/ev3dev/vscode-hello-pythonにあるので最初はそれを利用します。

8. PC上の適当な場所にそのzipファイルを解凍するとvscode-hello-python-masterというフォルダができます。フォルダの中にはいくつかのファイルが入っていますが、ここで必要なファイルは、実行したいスクリプトのファイルと.vscodeファルダの中の、launch.json、settings.jsonだけなので、分かりやすくするために、それ以外のファイルは削除しておきます。 VSCodeのメニューの「フォルダを開く」を使ってこのプロジェクト・フォルダを開きます。

9. 4.でPCとEV3はハードウェアレベルで通信できる状態になっているので、次にソフトウェアレベルでVSCodeとev3dev接続します。VSCodeエクスプローラでEV3DEV DEVICE BROWSERを表示し、”Click here to connect to a device”をクリックすると、上部に接続可能なデバイス名のリストが出てくるので、そこから対象となるev3devを選択します。

EV3DEV DEVICE BROWSERにev3devが表示され、接続中であることを示す黄色の〇が表示されます。
〇が緑に変わると接続完了です。
VSCodeとev3devの接続・遮断・再接続はここを右クリックして実行できます。

10. VSCodeでプロジェクトフォルダを開き、ev3devを接続した状態で「実行」を選択すると、プロジェクトフォルダとなっているvscode-hello-python内のスクリプトがEV3に転送されて実行されます。

新たに別のプロジェクトを作るときは、先ずそのプロジェクトのフォルダを作り、そこにlaunch.json、settings.jsonの入った.vscodeファルダをコピーしていれます。そしてスクリプトを記述したファイルを作成します。実行するときには、そのプロジェクトフォルダを開き、その中のスクリプト・ファイルを指定して実行します。
ev3devで実行できるpaythonスクリプトの先頭部分は共通しているので以下のようなテンプレートが利用できます。

#!/usr/bin/env python3
from time import sleep
from ev3dev2.motor import LargeMotor, OUTPUT_A, OUTPUT_B, SpeedPercent, MoveTank
from ev3dev2.sensor import INPUT_1
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.led import Leds

# TODO: Add code here

ここで、1行目で使用するPythonインタープリターが python3 であることを宣言しています。また、ev3devのver.2を意味する ev3dev2 からライブラリを読み込むことが記述されています。

ーーーーーーーーーーーーー

前述したように、LEGOがEV3用として承認しているのは、MicroPythonです。機能を絞ってコンパクトにしていいるので、速度の点では有利になります。これを使うためには、VSCodeのエクステンションで検索してLEGO MINDSTORMS EV32 MicroPythonを追加します。

そうするとアクティビティ・バーにそのアイコンが表示され、それをクリックすると、サイドバーにメニューが表示されます。
プロジェクトを新規に作成するためには、そのなかからCreate project を選んでプロジェクト名を指定します。そうするとその名前のフォルダができ、その中に、.vscode というフォルダと main.py というひな形のスクリプトが自動的に作られます。その main.py の先頭部分は、下のようになっており、上述した ev3dev 用のプクリプトとは異なるものになっています。

#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                 InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile

ev3 = EV3Brick()

1行目で使用するPythonインタープリターが pybricks-micropython であることを指定します。また、ライブラリはpybricks 以下に置かれています。それらについてのドキュメントは以下からアクセスすることができます。
pybricks.com