久々更新の今回は、LEGO Mindstorms で Python を使って開発する場合に Visual Studio 2015 を開発環境として利用する方法についてまとめてみようと思います。
そもそも、LEGO Mindstorms で python を使ったプログラミング環境として、とりあえず、自分が思いつくのは、 純正 LEGO Mindstorms EV3 の OSを ev3dev にして利用するパターン、Dexter Industories社の BrickPi をコントローラにするパターン、Mindsensors社の PiStorms をコントローラにするパータンで、これらで python による開発をする場合を想定します。そういう意味では、LEGO に限らず、Dexter Industories社の GoPiGoロボットやGrovePi なんかでも同じように利用できます。
まず、Windows 側でソリューションを作成するフォルダの共有を行い、Linux側ユーザからフルコントロールアクセスできるように設定しておきます。たとえば、 pi ユーザをWindows側に作成し、このユーザでフルコントロールアクセスできる共有フォルダ(仮に Workspace とする)を用意しいておきます。
Linux側で cifsマウントで Windows側の共有フォルダを適宜マウントします。
cd ~
mkdir Workspace
sudo mount.cifs -o username=pi,password=raspberry //winpc_name_or_ip.local/Workspace ~/Workspace
ev3dev 以外の通常の Debian Jessie Linux環境ではデフォルトでcifsマウントが可能ですが、ev3dev ではcifsマウントを行うには カーネル再構築 が必要です。手間がかかるので Windows側で作成した pythonソースファイルをデバッグ時に ev3dev へコピーする方法もあります。
次に Linux側に ptvsd (Python Tools for Visual Studio remote Debugging server) をインストールします。ptvsd は pip でインストールできます。
sudo apt-get update
sudo apt-get install python-pip
sudo pip install ptvsd
もし、Firewallが稼働している場合は、ポート:5678 を開ける必要があります。
Visual Studio で 「新しいプロジェクト」→「Python」→「Python Application」のように選択して、新しい python プロジェクトを作成します。
python のソース冒頭付近にデバッグ用の記述を入れます。以下は一例です。
import ptvsd
import platform
ptvsd.enable_attach(secret = 'ptvsd')
print 'Waiting for attach...'
if platform.system() != 'Windows' :
ptvsd.wait_for_attach()
デバッグ対象のソースを cifsマウントしたものをLinux側から実行するか、Linux側にコピーして実行すると、待ち状態になります。
次にVisual Studio 側で 「デバッグ」→「プロセスにアタッチ」を選択して、
「トランスポート」で「Pyton remote (ptvsd)」を選択して、修飾子に secretキー@ホスト名 を入力すると選択可能なプロセスにターゲットのプロセスが表示されるので「アタッチ」ボタンをクリックしてアタッチします。
デバッグが開始されます。上の画面ではブレークポイントで一時停止して、変数の値を参照しています。
2016年7月8日金曜日
2016年3月31日木曜日
irMagician と GrovePi でIoTリモコン - ブラウザ操作と音声認識によるリモコン操作 -
ハードウェアは準備出来たので、色々と機能を載せていこうと思います。まずは、irMagician をブラウザから操作して家電のOn/Offをできるようにして、PCやVPN接続でスマホで外出先からの制御ができるようにしたいと思います。また、ブラウザ操作相当の操作を音声認識により実現したいと思います。
この手の「Raspberry Piを学習リモコンにしてスマホ等で操作する」とか「音声認識学習リモコン」とかはすでによくやられていて、前例がたくさんあります。今回は、そういった有益な銃砲をネットに公開してくださっている先達の知恵に甘えます。参考にしたサイトを幾つか挙げておきます。感謝です。
今回は python + tornado でサーバ側でpostを受け取って、irMagicianの json形式リモコン信号データを再生するプログラムをテスト的に作成しました。といっても、上記リンク先やネットに公開されていたコードをつなぎあわせただけですが。
部屋の照明のリモコンとエアコンのそれぞれのOn/Off信号のjsonファイルを下記のHTML(ブラウザ)側からpostされてくる 1 or 2 ・・の文字で判定してハードコーディングで処理しています。
スマートフォンでGrovePiにアクセスすると、次のような画面で操作できます。
また、julius 音声認識をモジュールモードで動かして、julius 側ポート 10500 とソケット通信で音声認識結果を受け取って、ブラウザページでの操作に相当するpostを送信するような以下のプログラムも走らせます。なお、juliusには認識してい欲しい言葉だけの辞書セットを作っています。
これで、julius -音声認識結果→ test_recognition_client.py -post→ test_irMagicianServer.py と連携して、音声で家電操作ができるようになりました。でも、静かな状態ならいいんですが、BGMとかをかけたりすると誤認識して、勝手にエアコンがOn/Off したり、突然部屋の明かりが消えたり・・・。う~ん、実用には遠い状態。認識語の組み合わせやマイク感度調整等で向上するのかな?
irMagician と GrovePi でIoTリモコン - ハードウェア準備編 -
今回のがらくたはDexter Industries社の「GrovePi」です。
現在、販売されているのは「GrovePi+」という新型になっていて、自分の手元には新旧一つずつあるのですが、今回使っているのは古いタイプの「GrovePi」(ATMegaがDIPタイプ)です。
このGrovePi(+)ですが、手に入れては見たものの、割りとすぎに飽きてしまい、放置されていました・・・。だって、あんまり動きがないので・・・。
なんでまた、飽きて放置されていたGrovePiを引っ張り出してきたかというと、なんとなく久しぶりに学習リモコンを作ってみようかなと思いついたわけです。以前にArduinoで作ったことはあったんだけどPCにUSB接続して使う形態だったのでPCの電源を切っていると、(例えば)エアコンのスイッチを入れるのにまずPCを起動するっていう・・・リモコン普通に探せばいいじゃんってなってしまう展開でした。まあ、実用的なものを作るつもりはこれっぽっちも無いわけですが、Raspberry Pi 3 発売直前でRSコンポーネントとかでRaspberry Pi 2が値引き販売していたので、つい買ってしまい、なにか使いみちがないかと考えたところ、Raspberry Piなら電源入れっぱなしにして、学習リモコンとかその他IoTハブ的な感じで、家の中なら音声認識や無線LAN経由のタブレット操作で、家の外からもVPNでスマホなどで色々コントロールできると面白いんじゃないかってことで。
で、使ってないGrovePiに白羽の矢が立ち、はじめはGroveの赤外線リモコンモジュールを使って、lircというLinuxで学習リモコンするときに定番らしいソフトで実現するつもりでしたが、日本のエアコン等の複雑(長い)で独自プロトコルな信号は再現できない場合がある(NEC/家製協/SONYフォーマット等のある程度決められたフォーマットを前提にしているため、独自の信号形式だと上手く行かないことがる)らしく、ネットで学習リモコンについて調べていたところ、大宮技研さんの「irMagician」というのを見つけました。このirMagicianはリモコン信号を時分割したOn/Off信号として記録するため、信号フォーマットによらずに比較的柔軟に色々なリモコン信号に対応できるらしいです。そこで、途中までGrovePiで進めてきたのをirMagicianを採用する方向に変更しました。
準備したハード構成としては、下写真のような感じです。
Raspberry Pi のUSBコネクタに、Juliusで音声認識させるための USBマイク と irMagician を接続してあります。irMagicain は Raspberry Pi からは CDC-ACMつまりシリアルポート(ttyACM0等)として認識されます。
irMagician の本体は、GrovePiのケース(旧タイプのBrickPiのケースを使用しています。)に固定した中華安パン・チルトカメラ台に両面テープで貼り付けて、カメラとともにサーボで方向をコントロールできるようにしました。
ところが、ここで困ったことが一つ発覚、Groveシリーズ(元のArduino)ではサーボの制御もできるので、GrovePiでも当然できると思っていたのですが、GrovePiのドキュメントを見ると「サーボは対象外、ノイズとか面倒だから」となっていて、GrovePiでのサーボ制御が出来ないことが判明しました。しかたがないので、Raspberry Pi の UART (GPIOのTx,Rx)ポートにレベル変換をかましてGrovePi上にPISER(Pi の UART)端子というのが出ているので、このPISER端子にArduino(Sainsmartの互換機)を接続して、Arduino経由でパン・チルトのサーボを制御するようにしました。
なんか、強引ですが、とりあえずパン・チルト駆動はできました。Arduino側のサーボコントロールプログラムは、サーボの向きを変える時だけPWM信号を出力して、あとは信号出力を停止しておくようにしました。乗っているものがRaspberry PiカメラモジュールとirMagicianだけなので、常にトルク(制御)を掛けておかなくてもサーボの向きが変わってしまう(重さで下を向くとか)ことは無いので、常にPWMをかけておく無駄と「チーッ」という発信音がサーボからたまに出るのを防ぐことが出来ます。
irMagician に関しては、とりあえず、部屋の証明のOn/Off と Panasonic のエアコンのOn/Off は動作確認できました。Panasonicのエアコンに関しては、リモコン側に状態を持っている(リモコンの電源OnOffボタンを押すたびに本体とは関係なくリモコン側の画面・ステータスが変わる)ことに今回はじめて気が付きました。たまに、電池切れかけの時などにエアコンが反応していないのにリモコン側はスイッチがOnになったことになっていて、あれっ?て思ったことがあったんですが、今までは全く気が付かない(というか考えていなかった)でいました。たしかに、本体とリモコンが相互通信でもしないかぎり、それぞれに状態を持っていているんだから、それがずれることだってあるでしょうよと、妙に納得しました。
ちなみに irMagician の使い方については 大宮技研さんのこの辺りの情報とか、netbuffaloさんのこちらとかこちらを参考にさせていただきました。特に、Raspberry Pi 上でリモコン信号をキャプチャ、再生、ファイル保存をするpythonのプログラムをまんま利用させてもらっています。ありがとうございます。
また、折角なので、追加で PIRモーションセンサも追加しました。
サーボやirMagic、各Groveセンサはサンプルプログラム等で単体の動作は一通り確認できました。Raspberry Piカメラモジュールもここらへんを参考にmjpg-streamerでブラウザから画像が見れるようになりました。あとはリモコン信号の登録、Julius音声認識の辞書設定、ブラウザ操作のための仕組み構築といったあたりですが、最後のブラウザ操作でGPIOをどんな仕組みでやるか検討中です。GrovePi が pythonのサンプルが豊富なので pythonのtornado でやるか、node.js でやるか(一応GrovePiに node.js用のライブラリも提供されているみたいですが、サンプルが少ないので、どっちの知識も薄い自分的には python のほうがとっつきやすそう。)
現在、販売されているのは「GrovePi+」という新型になっていて、自分の手元には新旧一つずつあるのですが、今回使っているのは古いタイプの「GrovePi」(ATMegaがDIPタイプ)です。
このGrovePi(+)ですが、手に入れては見たものの、割りとすぎに飽きてしまい、放置されていました・・・。だって、あんまり動きがないので・・・。
なんでまた、飽きて放置されていたGrovePiを引っ張り出してきたかというと、なんとなく久しぶりに学習リモコンを作ってみようかなと思いついたわけです。以前にArduinoで作ったことはあったんだけどPCにUSB接続して使う形態だったのでPCの電源を切っていると、(例えば)エアコンのスイッチを入れるのにまずPCを起動するっていう・・・リモコン普通に探せばいいじゃんってなってしまう展開でした。まあ、実用的なものを作るつもりはこれっぽっちも無いわけですが、Raspberry Pi 3 発売直前でRSコンポーネントとかでRaspberry Pi 2が値引き販売していたので、つい買ってしまい、なにか使いみちがないかと考えたところ、Raspberry Piなら電源入れっぱなしにして、学習リモコンとかその他IoTハブ的な感じで、家の中なら音声認識や無線LAN経由のタブレット操作で、家の外からもVPNでスマホなどで色々コントロールできると面白いんじゃないかってことで。
で、使ってないGrovePiに白羽の矢が立ち、はじめはGroveの赤外線リモコンモジュールを使って、lircというLinuxで学習リモコンするときに定番らしいソフトで実現するつもりでしたが、日本のエアコン等の複雑(長い)で独自プロトコルな信号は再現できない場合がある(NEC/家製協/SONYフォーマット等のある程度決められたフォーマットを前提にしているため、独自の信号形式だと上手く行かないことがる)らしく、ネットで学習リモコンについて調べていたところ、大宮技研さんの「irMagician」というのを見つけました。このirMagicianはリモコン信号を時分割したOn/Off信号として記録するため、信号フォーマットによらずに比較的柔軟に色々なリモコン信号に対応できるらしいです。そこで、途中までGrovePiで進めてきたのをirMagicianを採用する方向に変更しました。
準備したハード構成としては、下写真のような感じです。
Raspberry Pi のUSBコネクタに、Juliusで音声認識させるための USBマイク と irMagician を接続してあります。irMagicain は Raspberry Pi からは CDC-ACMつまりシリアルポート(ttyACM0等)として認識されます。
irMagician の本体は、GrovePiのケース(旧タイプのBrickPiのケースを使用しています。)に固定した中華安パン・チルトカメラ台に両面テープで貼り付けて、カメラとともにサーボで方向をコントロールできるようにしました。
ところが、ここで困ったことが一つ発覚、Groveシリーズ(元のArduino)ではサーボの制御もできるので、GrovePiでも当然できると思っていたのですが、GrovePiのドキュメントを見ると「サーボは対象外、ノイズとか面倒だから」となっていて、GrovePiでのサーボ制御が出来ないことが判明しました。しかたがないので、Raspberry Pi の UART (GPIOのTx,Rx)ポートにレベル変換をかましてGrovePi上にPISER(Pi の UART)端子というのが出ているので、このPISER端子にArduino(Sainsmartの互換機)を接続して、Arduino経由でパン・チルトのサーボを制御するようにしました。
なんか、強引ですが、とりあえずパン・チルト駆動はできました。Arduino側のサーボコントロールプログラムは、サーボの向きを変える時だけPWM信号を出力して、あとは信号出力を停止しておくようにしました。乗っているものがRaspberry PiカメラモジュールとirMagicianだけなので、常にトルク(制御)を掛けておかなくてもサーボの向きが変わってしまう(重さで下を向くとか)ことは無いので、常にPWMをかけておく無駄と「チーッ」という発信音がサーボからたまに出るのを防ぐことが出来ます。
irMagician に関しては、とりあえず、部屋の証明のOn/Off と Panasonic のエアコンのOn/Off は動作確認できました。Panasonicのエアコンに関しては、リモコン側に状態を持っている(リモコンの電源OnOffボタンを押すたびに本体とは関係なくリモコン側の画面・ステータスが変わる)ことに今回はじめて気が付きました。たまに、電池切れかけの時などにエアコンが反応していないのにリモコン側はスイッチがOnになったことになっていて、あれっ?て思ったことがあったんですが、今までは全く気が付かない(というか考えていなかった)でいました。たしかに、本体とリモコンが相互通信でもしないかぎり、それぞれに状態を持っていているんだから、それがずれることだってあるでしょうよと、妙に納得しました。
ちなみに irMagician の使い方については 大宮技研さんのこの辺りの情報とか、netbuffaloさんのこちらとかこちらを参考にさせていただきました。特に、Raspberry Pi 上でリモコン信号をキャプチャ、再生、ファイル保存をするpythonのプログラムをまんま利用させてもらっています。ありがとうございます。
また、折角なので、追加で PIRモーションセンサも追加しました。
サーボやirMagic、各Groveセンサはサンプルプログラム等で単体の動作は一通り確認できました。Raspberry Piカメラモジュールもここらへんを参考にmjpg-streamerでブラウザから画像が見れるようになりました。あとはリモコン信号の登録、Julius音声認識の辞書設定、ブラウザ操作のための仕組み構築といったあたりですが、最後のブラウザ操作でGPIOをどんな仕組みでやるか検討中です。GrovePi が pythonのサンプルが豊富なので pythonのtornado でやるか、node.js でやるか(一応GrovePiに node.js用のライブラリも提供されているみたいですが、サンプルが少ないので、どっちの知識も薄い自分的には python のほうがとっつきやすそう。)
2015年2月22日日曜日
GrovePi お試し。
本日のガラクタは、GrovePi です。一ヶ月以上も前に Dexter Industries社に直接発注してあったんですが、Dexter社は即日発送してくれたにもかかわらず、その後USPS(アメリカの郵便局?)に荷物が渡った後、トラッキング照会すると、3週間以上前にシカゴに着いたまま荷動きがありません。通関業務で止まってしまっているのか?このまま、どこかへ消滅してしまうのかはわかりませんが、そんなこんなしている間に、スイッチサイエンスさんから GrovePi+ が発売されていたので、まずは、そちらで手に入れました。GrovePi+ は GrovePi の改良版で、GrovePi を Raspberry Pi B+ にスタックするとLANコネクタやUSBコネクタで基盤裏側のパーツのハンダランドがショートしてしまうのですが、GrovePi+ では裏側に部品のランドが出ない(内層)形になっています。それに合わせて、Arduino部分のチップがDIPから表面実装に変わっています。あと、カメラのフラットケーブルを通せるスリットが開いています。それ以外の違いは、自分はわかりませんが、以前のGrovePi (+じゃない)でも、LAN、USBコネクタの位置にGrovePiの裏側にマスキングテープなどを貼れば、問題なく使えるはずです。
で、GrovePi は、Arduino の Grove System シリーズのセンサーなどをRaspbery Piで利用できるようにするベースシールド的なものですが、通常のベースシールドはArduinoの各ピンと接続されているわけですが、GrovePi ではGrove コネクタがRaspberry Pi にすべて直に接続されているわけではなく(されているコネクタもある。UARTとかI2Cとか。)て、間にArduino相当のマイコンを挟んでいます。
GrovePi のWikiにある画像を借りると、
上記のような感じで、 Raspberry Pi から UARTとI2CがGroveコネクタにつながっているほか、Raspberry Pi と GrovePi(上のArduino)がSPIとI2Cで接続されいて、GrovePiのSerial, Digital IO(PWMも), Analog入力を利用できるようになっています。自分がよく使う Raspberry Pi と Arduino (Micro) をUSBかUARTで接続して組み合わせるパターンに似ていますが、GrovePIではI2CでArduinoを制御して、SPI接続でRasperyy PI側からAVRのファームの書き換えも行えるようになっているようです。
もともと、Grove のセンサやLCD等をいくつか持っているので、このGrovePi も試してみようと思っていました。
以下、開封したところ。
裏側。
Raspberry Pi B+ にスタックしたところ。
以下、Grove RGB LCD をサンプルソースで動かしてみたところです。GrovePi を利用するためのライブラリは Python で提供されていますので、コードは Python で記述することになりますが、適用されているPythonのサンプルとライブラリのソースを見れば、各GroveモジュールやAVRとのI2Cでのやりとりは解析できそうなので、C/C++などでも利用することは可能ではないでしょうか。
Grove はハンダ付け無しでブロック感覚で色々遊べるのが楽しいですが、ブレッドボードと併用して、ちょっとした試作にも便利だと思います。
で、GrovePi は、Arduino の Grove System シリーズのセンサーなどをRaspbery Piで利用できるようにするベースシールド的なものですが、通常のベースシールドはArduinoの各ピンと接続されているわけですが、GrovePi ではGrove コネクタがRaspberry Pi にすべて直に接続されているわけではなく(されているコネクタもある。UARTとかI2Cとか。)て、間にArduino相当のマイコンを挟んでいます。
GrovePi のWikiにある画像を借りると、
上記のような感じで、 Raspberry Pi から UARTとI2CがGroveコネクタにつながっているほか、Raspberry Pi と GrovePi(上のArduino)がSPIとI2Cで接続されいて、GrovePiのSerial, Digital IO(PWMも), Analog入力を利用できるようになっています。自分がよく使う Raspberry Pi と Arduino (Micro) をUSBかUARTで接続して組み合わせるパターンに似ていますが、GrovePIではI2CでArduinoを制御して、SPI接続でRasperyy PI側からAVRのファームの書き換えも行えるようになっているようです。
もともと、Grove のセンサやLCD等をいくつか持っているので、このGrovePi も試してみようと思っていました。
以下、開封したところ。
裏側。
Raspberry Pi B+ にスタックしたところ。
以下、Grove RGB LCD をサンプルソースで動かしてみたところです。GrovePi を利用するためのライブラリは Python で提供されていますので、コードは Python で記述することになりますが、適用されているPythonのサンプルとライブラリのソースを見れば、各GroveモジュールやAVRとのI2Cでのやりとりは解析できそうなので、C/C++などでも利用することは可能ではないでしょうか。
Grove はハンダ付け無しでブロック感覚で色々遊べるのが楽しいですが、ブレッドボードと併用して、ちょっとした試作にも便利だと思います。
登録:
投稿 (Atom)