- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
* 参考サイト [#t34f3fc4]
- http://www.ev3dev.org/ (ev3devの開発元)
- https://media.readthedocs.org/pdf/python-ev3dev/latest/python-ev3dev.pdf (python-ev3のPDF文書)
- http://openrtm.org/openrtm/ja/node/5806 (産総研OpenRTM-aistのページ、日本語)
* 準備 [#q864ac9b]
http://www.ev3dev.org/docs/getting-started/ を参考に。
** OSのイメージをダウンロード [#sb77d4ec]
https://github.com/ev3dev/ev3dev/releases/download/ev3dev-jessie-2015-12-30/ev3-ev3dev-jessie-2015-12-30.img.xz
%% https://github.com/ev3dev/ev3dev/releases/download/ev3dev-jessie-2015-12-30/ev3-ev3dev-jessie-2015-12-30.img.xz %%
https://github.com/ev3dev/ev3dev/releases/download/ev3dev-jessie-2016-12-21/ev3dev-jessie-ev3-generic-2016-12-21.zip
** microSDまたはmicroSDHCにコピー [#jeaf4320]
microSDXCは使えない。microSDのデバイス名が /dev/sdb とすると、以下のようにddでイメージをメディアに書き込む。
xzcat ~/Download/ev3dev-yyyy-mm-dd.img.xz | sudo dd bs=4M of=/dev/sdb
xzcat ~/Download/ev3dev-jessie-ev3-generic-yyyy-mm-dd.img.xz | sudo dd bs=4M of=/dev/sdb
デバイス名が不明な場合は cat /proc/partitions などのコマンドで調べる。
** 起動 [#c943330c]
microSDを本体のカードスロットにセットして電源ON(真ん中の四角いボタンを押す)。microSDが入っていれば、本体のOSではなくmicroSDのOS(ev3dev)が起動する
** ネットワークの接続 [#z38ad46a]
wifiのドングルを使うのがおそらく最も簡単。
brickmanのメニューが表示されたら、
「Wireless and Networks」→「Wi-Fi」で無線ネットワークを選ぶ。
接続できたら、ディスプレイ上部に表示されている、DHCPで取得したアドレスを確認しておく。
** sshでログイン [#ia48be56]
IPアドレスが192.168.2.30の場合、パソコン側から
ssh robot@192.168.2.30
でログインできる(デフォルトのUIDは「robot」、パスワードは「maker」)。
Windowsの場合はTeraTermなどを使えばよい。
localhost:~$ ssh robot@192.168.2.30
robot@192.168.2.37's password:
_____ _
_____ _|___ / __| | _____ __
/ _ \ \ / / |_ \ / _` |/ _ \ \ / /
| __/\ 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 May 25 06:41:16 2016 from 192.168.2.21
Last login: Mon Dec 26 10:13:57 2016 from 192.168.2.21
robot@ev3dev:~$
* Python でインタラクティブに動かす [#s538f8e8]
** pythonの起動 [#id4e94b7]
デフォルトではpython 2.7 が起動する。
robot@ev3dev:~$ python
Python 2.7.9 (default, Mar 1 2015, 13:52:09)
Python 2.7.9 (default, Aug 13 2016, 17:33:10)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
また python3 というコマンドでpython 3.4を起動できる。
robot@ev3dev:~$ python3
Python 3.4.2 (default, Oct 8 2014, 14:47:30)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
** モジュールのインポート [#gb5bbf8b]
>>> import ev3dev.ev3 as ev3
** モータのインスタンスを生成 [#u9916a64]
>>> m = ev3.LargeMotor('outA')
モータの各ポート名は、'outA' 'outB' 'outC' 'outD'。
小さい方のモータは、MediumMotor。
モータ・クラスについては http://www.ev3dev.org/docs/drivers/tacho-motor-class/ を参考に。
** モータのリセット [#g87607de]
>>> m.reset()
** モータを回転させる [#s3b12bed]
モータのリセット後は、duty_cycle_sp(デューティ・サイクルのセットポイント)が0になっている。
回転させるためには、0以外の-100から100までの値を指定する。
モータのリセット後は、duty_cycle_sp(デューティ・サイクルのセットポイント)とspeed_spが0になっている。
回転させるためには、duty_cycle_spに0以外の-100から100までの値を指定し、speed_spに0から1050までの値を指定する
>>> m.run_forever(duty_cycle_sp=30)
>>> m.run_forever(duty_cycle_sp=30,speed_sp=500)
あるいは、以下でも同じ動作。
>>> m.duty_cycle_sp=30
>>> m.speed_sp=500
>>> m.run_forever()
** モータを止める [#p1e18470]
>>> m.stop()
モータの止め方は'coast' 'brake' 'hold'の3種類。デフォルトは'coast'。指定の方法は、
>>> m.stop(stop_command='brake')
>>> m.stop(stop_action='brake')
のように値を渡すか、
>>> m.stop_command='brake'
>>> m.stop_action='brake'
>>> m.stop()
のようにする。
新しいカーネル(Linux ev3dev 4.4.9-11-ev3dev-ev3)では、stop_commandがstop_actionに、
stop_commandsがstop_actionsに変更になっている。また、speed_spの値を指定しておかないとモータは回らない(最大値は1050)。
%% 新しいカーネル(Linux ev3dev 4.4.9-11-ev3dev-ev3)では、stop_commandがstop_actionに、
stop_commandsがstop_actionsに変更になっている。また、speed_spの値を指定しておかないとモータは回らない(最大値は1050)。%%
** モータを一定時間回す [#vc2bab9e]
>>> m.run_timed(time_sp=3000, duty_cycle_sp=50, stop_command='brake')
>>> m.run_timed(time_sp=3000, duty_cycle_sp=50, speed_sp=500, stop_action='brake')
timeで指定する時間の単位は1/1000秒。
** モータを一定時間回す(sleep関数を使う方法) [#h602c8c4]
>>> import time
>>> m.run_forever(duty_cycle=50)
>>> m.run_forever(duty_cycle=50,speed_sp=500)
>>> time.sleep(3)
>>> m.stop()
sleep関数を使うためにtimeモジュールをインポート。sleepで指定する時間の単位は1秒。
** モータを一定時間回す(タイマ関を使う方法) [#q4697311]
上記のsleepを使った方法だと、sleepしている間は他の命令は実行できません。
他の命令を実行したい場合には次のようにタイマを使えば簡単です。
>>> import time
>>> ts = ev3.TouchSensor('in1')
>>> t0 = time.time()
>>> m.run_forever(duty_cycle=50)
>>> m.run_forever(duty_cycle=50,speed_sp=500)
>>> while time.time()-t0 < 3:
>>> if ts.value() == 1:
>>> m.stop()
>>> m.stop()
** モータを特定の角度だけ回す [#mfa5974d]
>>> m.run_to_rel_pos(position_sp=360, duty_cycle_sp=70, stop_command='hold')
>>> m.run_to_rel_pos(position_sp=360, duty_cycle_sp=70, speed_sp=500, stop_action='hold')
これは
>>> m.reset()
>>> m.run_to_abs_pos(position_sp=360, duty_cycle_sp=70, stop_command='hold')
>>> m.run_to_abs_pos(position_sp=360, duty_cycle_sp=70, speed_sp=500, stop_action='hold')
と同じ。
** センサーの種類 [#i38f24e1]
-TouchSensor タッチセンサ
-ColorSensor カラーセンサ
-UltrasonicSensor 超音波センサ
-GyroSensor ジャイロセンサ
-SoundSensor NXTのサウンドセンサ
-LightSensor NXTのライトセンサ
-InfraredSensor EV3の赤外線センサ(距離測定用)
** 超音波センサを使う [#n9745bd7]
>>> us = ev3.UltrasonicSensor()
>>> us.value()
112
デフォルトの単位はcm(US-DIST-CM)のはずだが、なぜかmmで値が表示されている。
** 光センサを使う [#e95a60a1]
モード一覧
>>> cs=ev3.ColorSensor()
>>> cs.modes
[u'COL-REFLECT', u'COL-AMBIENT', u'COL-COLOR', u'REF-RAW', u'RGB-RAW', u'COL-CAL']
デフォルトのモードはCOL-REFLECT。
白い紙の1cmほど上で測ってみると
>>> cs.value()
58
黒い紙だと大抵ひと桁の値になる。
** タッチセンサを使う [#f3986658]
>>> ts = ev3.TouchSensor('in3')
>>> ts.value()
0
>>> ts.value()
1
タッチセンサが押されていない状態で0、押された状態で1。
** ジャイロセンサを使う [#d647d973]
>>> gs = ev3.GyroSensor()
>>> gs.modes
[u'GYRO-ANG', u'GYRO-RATE', u'GYRO-FAS', u'GYRO-G&A', u'GYRO-CAL']
>>> gs = ev3.GyroSensor()
>>> gs.mode
u'GYRO-ANG'
>>> gs.value()
-135
** 応用 [#v7ce3ef9]
>>> import ev3dev.ev3 as ev3
>>> import time
>>> ts = ev3.TouchSensor('in1')
>>> cs = ev3.ColorSensor('in2')
>>> while ts.value() == 0:
... if cs.value() > 30:
... m.run_forever(duty_cycle_sp=50)
... else:
... m.stop(stop_command='brake')
... m.stop(stop_action='brake')
... time.sleep(0.1)
...
** pythonの終了 [#s5162f6e]
control-D
* スクリプトの作成と実行 [#hbba8002]
** スクリプトの編集 [#a0a3146c]
エディタ(nanoまたはvi)で次のようなスクリプトを作る。ファイル名は例えばtest.pyのようにpyという拡張子を付けておくと便利。
robot@ev3dev:~$ nano test.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import ev3dev.ev3 as ev3
import time
motor_left = ev3.LargeMotor('outA')
motor_left.run_forever(duty_cycle_sp=50)
time.sleep(3)
motor_left.stop(stop_command='brake')
motor_left.stop(stop_action='brake')
** スクリプトを実行可能に [#ze46f97b]
robot@ev3dev:~$ chmod +x test.py
** スクリプトの実行 [#f870f300]
robot@ev3dev:~$ ./test.py
ここで./は現在のフォルダ(ディレクトリ)を表す(ファイル名だけだとパスがつながっていないのでエラーになる)
* ipython notebookで使う [#k7f451a3]
https://ipython.org/ipython-doc/1/interactive/public_server.html を参考に
** ipython-notebookのインストール [#a62079cd]
robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install ipython-notebook
** ipythonの設定 [#oa2c4567]
nbserverという名のプロフィールを作ってみる
robot@ev3dev:~$ ipython profile create nbserver
この命令を実行すると ~/.ipython/profile_nbserver というディレクトリが作成される。
その中の ipython_notebook_config.py というファイルを編集して、
とりあえず以下の指定をする。
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
** notebook serverの起動とアクセス [#zf20811a]
robot@ev3dev:~$ ipython notebook --profile=nbserver
でサーバを起動すると、パソコンのブラウザから http://192.168.2.30:8888/ のようなアドレスでnotebookにアクセスできる (ev3のIPアドレスが192.168.2.30の場合)。デフォルトのポートは8888。
* MQTTを使った通信 [#g90e4a99]
MQTTという軽量プロトコルを使った通信が
http://www.ev3dev.org/docs/tutorials/sending-and-receiving-messages-with-mqtt/
で紹介されている。
MQTTでは出版者(publisher)、購読者(subscriber)、仲介者(broker)でメッセージの伝達を行う。
サーバソフト(仲介者ソフト)としてオープンソースのmosquittoをインストールして使う。
EV3間の通信、パソコンとEV3の通信などいろいろと使えるが、以下ではEV3をbrokerとしても使う方法を紹介。
robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install mosquitto
インストールが完了すればサーバが立ち上がる。チェックするには
robot@ev3dev:~$ sudo service mosquitto status
pythonからMQTTを使うために、さらにpythonのライブラリをインストール
robot@ev3dev:~$ sudo easy_install paho-mqtt
パソコン上にもpaho-mqttをインストールしておくと便利。
2016年5月31からのこのページのだいたいの訪問者数:
本日&counter(today);
昨日&counter(yesterday);
合計&counter(all);