EV3を動かしてみる (1) 〜 シェルでモータを動かす 〜

ロボティクス入門ゼミ 教材 2017-10-13

EV3側での設定

EV3が起動したら、まず以下の設定をする。

[Wireless and Networks] -> [Wifi] を選択し、 [Powered]にチェックを入れ[Start Scan]でネットワークを調べる。

信州大学では[ASAHI-PUBLIC]を選んで接続する。 無線LAN(ASAHI-PUBLIC)に接続できれば、上のほうにIPアドレスが表示される。 自宅や他の環境で作業する場合には、 そこでの無線LANを選ぶ(無線LANのパスキーの設定も行う)。

EV3へのログイン

使用しているOSである ev3dev のデフォルトのユーザ名とパスワードは以下の通り。

 ユーザー名: robot

 パスワード: maker

パソコンの端末ソフトから sshでEV3にログインする。 例えばEV3のIPアドレスが 10.61.1.123 の場合、

ssh robot@10.61.1.123

と入力すると、

robot@10.61.1.123's password:

とパスワードを聞かれるので、maker と入力する。 ただし、入力したパスワードは表示されない。

ログインに成功すると、以下のような画面が表示される。

             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/

Debian jessie on LEGO MINDSTORMS EV3!

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Sep  6 09:24:58 2017 from 10.61.1.118
robot@ev3dev:~$

最後に表示されている、

robot@ev3dev:~$

はプロンプトと呼ばれ、シェルの入力(命令)待ちの状態を表す。 以下の例ではプロンプトを表示しているが、もちろんプロンプトを入力する必要はない。

以下ではマウスを使わずに、キーボードだけを使用して、いろいろな命令を実行してみる。

シェルコマンドに慣れる

現在の時刻を表示する。

robot@ev3dev:~$ date

エンターキーを押すと

Fri Oct 13 04:44:15 UTC 2017

のように時刻が表示される。

現在作業しているフォルダ名(ディレクトリ名)を表示する。

robot@ev3dev:~$ pwd

(pwd は print working directory に由来)

エンターキーを押して

/home/robot

が表示されればOK。

現在の作業ディレクトリにあるファイルやディレクトリを表示する。

robot@ev3dev:~$ ls

(ls は list に由来)

新規にディレクトリ(フォルダ)を作る。

robot@ev3dev:~$ mkdir work

(mkdir は make directory に由来)

これでworkという名前のディレクトリが作成される。実際に確認してみる。

robot@ev3dev:~$ ls

作業ディレクトリ work に移動する。

robot@ev3dev:~$ cd work

(cd は change directory に由来)

移動できたかどうか pwd で確認する。

robot@ev3dev:~/work$ pwd

ちなみに作業ディレクトリがプロンプトの一部として表示されるように設定されている。

ファイルの一覧を見る

robot@ev3dev:~/work$ ls

中身はまだない。

新たにファイルを作ってみる。

robot@ev3dev:~/work$ touch foo

foo という名前のファイルができたかどうか確認してみる。

robot@ev3dev:~/work$ ls

foo の中身を確認。

robot@ev3dev:~/work$ cat foo

foo の中身はまだ空なので何も表示されない。

foo に何か書き込んでみる。

robot@ev3dev:~/work$ echo aaa > foo

再度中身を確認する。ちなみに > foo がないと、aaa という文字列を 単に画面に表示するだけ。

robot@ev3dev:~/work$ cat foo

書き込んだaaaが表示されればOK。

さらに書き込んでみる。

robot@ev3dev:~/work$ echo bbb > foo

中身を確認

robot@ev3dev:~/work$ cat foo

bbb は書き込まれているが先程書き込んだ aaa は消えている。

もとの内容を消さずに、追加で書き込む。

robot@ev3dev:~/work$ echo ccc >> foo

中身を確認。今度は以前書き込んだ文字列 bbb が上書きされていない。

robot@ev3dev:~/work$ cat foo

ファイルをコピーする。

robot@ev3dev:~/work$ cp foo bar

(cp は copy に由来)

bar というファイルが生成されたかどうか確認する。

robot@ev3dev:~/work$ ls

bar の中身も確認する。

robot@ev3dev:~/work$ cat foo

ファイルを削除する。

robot@ev3dev:~/work$ rm foo

(rm は remove に由来)

削除できたかどうか確認する。

robot@ev3dev:~/work$ ls

一つ上の作業ディレクトリに移動。

robot@ev3dev:~/work$ cd ..

一つ上のディレクトリを .. で表すことに注意する。

作業ディレクトリを確認。

robot@ev3dev:~$ pwd

作業ディレクトリにあるファイルとディレクトリを確認。

robot@ev3dev:~$ ls

workというディレクトリを削除する。

robot@ev3dev:~$ rmdir work

(rmdir は remove directory に由来)

workの中が空でないと削除できない。

workの中のbarというファイルも削除する。

robot@ev3dev:~$ rm work/bar

work/bar は、現在作業しているディレクトリの下にある work というディレクトリの下にある bar というファイルを表すことに注意。

再度ディレクトリを削除してみる。

robot@ev3dev:~$ rmdir work

削除できたかどうか確認。

robot@ev3dev:~$ ls

ログアウトする。

robot@ev3dev:~$ exit

再度ログインする。

ssh robot@10.61.1.123

シェルからモータを動かしてみる

python で動かす前に、シェルから直接動かしてみる。

まず、モータの「ディレクトリ」に移動する。 Linuxではモータやセンサ、それらの設定や値などは 「ディレクトリ」や「ファイル」として表されている。

robot@ev3dev:~$ cd /sys/class/tacho-motor/motor0/

ls で中身をみる。

robot@ev3dev:/sys/class/tacho-motor/motor0$ ls

次のようなファイル一覧が表示されるはず。

address        duty_cycle_sp  ramp_down_sp  stop_actions
command        hold_pid       ramp_up_sp    subsystem
commands       max_speed      speed         time_sp
count_per_rot  polarity       speed_pid     uevent
device         position       speed_sp
driver_name    position_sp    state
duty_cycle     power          stop_action

ここで末尾に _sp がついたファイル名は書き込み可能で ユーザが値を指定することができる (sp は set point の意味)。 _sp 付きのファイルに対応した _sp なしのファイルは、 現在の値を表し、読み込み可能だが書き込みはできない。

例えば、speed_sp に値を書き込んでみる。

その前に speed_sp の現在の値(中身)を確認。

robot@ev3dev:/sys/class/tacho-motor/motor0$ cat speed_sp

デフォルトでは 0 のはず。

値を書き込む (0〜1560)

robot@ev3dev:/sys/class/tacho-motor/motor0$ echo 500 > speed_sp

値が変わったどうか確認。

robot@ev3dev:/sys/class/tacho-motor/motor0$ cat speed_sp

モータ関連でどのようなコマンドがあるのか調べる。 それらは commands というファイルに記述されているので、 ファイルの中身を表示してみる。 複数形の commands というファイル名になっていることに注意。

robot@ev3dev:/sys/class/tacho-motor/motor0$ cat commands

次のようなコマンドがあるのがわかる。

run-forever run-to-abs-pos run-to-rel-pos run-timed run-direct stop reset

ではモータを回してみる。 命令を実行するには、command というフィアルに 上のコマンドのどれかを書き込む。 ファイル名が単数形になっていることに注意。

robot@ev3dev:/sys/class/tacho-motor/motor0$ echo run-forever > command

これでモータが回ればOK。

モータを止める。

robot@ev3dev:/sys/class/tacho-motor/motor0$ echo stop > command

モータのアドレスを確認。

robot@ev3dev:/sys/class/tacho-motor/motor0$ cat address

EV3本体の端子Aに接続したモータの場合には、outA のような結果が得られればOK。

回転させる時間を指定する。

robot@ev3dev:/sys/class/tacho-motor/motor0$ echo 3000 > time_sp

上で指定した時間だけモータを回転させる。

robot@ev3dev:/sys/class/tacho-motor/motor0$ echo run-timed > command

ブレーキモードを調べる。

robot@ev3dev:/sys/class/tacho-motor/motor0$ cat stop_actions

指定できるのは coast brake hold の3種類。

現在のモードを表示する。

robot@ev3dev:/sys/class/tacho-motor/motor0$ cat stop_action

デフォルトでは coast になっている。 これを brake に変更する。

robot@ev3dev:/sys/class/tacho-motor/motor0$ echo brake > stop_action

実際に有効になっているかどうか確認。

robot@ev3dev:/sys/class/tacho-motor/motor0$ echo run-timed > command