ずっと以前に Raspberry Pi のクロス開発環境構築 というのをやったんですが、実際に自分でC/C++でRaspberry Piの開発を行うときは VisualGBD というツールを使って Visual Studio でリモートデバッグ or クロス開発をしています。この VisualGDB はとってもおすすめなんですが、有料で決して安くはない価格です。
そこで、今回は Visua C++ for Linux Development という 無料で利用できるMicrosoft純正の Visual Studio用 Linuxリモートデバッグ開発ツールを試してみようと思います。
まずは、拡張機能のインストールです。Visual Studio 2015 の「ツール」→「拡張機能と更新プログラム」を選択して、「オンライン」の「Visual Studio ギャラリー」で右上の検索ボックスに「Visual C++ for Linux」的な言葉を入れて検索します。「Visual C++ for Linux Development」というのが見つかるはずなので「ダウンロード」ボタンをクリックしてダウンロードして、インストールを行います。Visual Studioの再起動が必要かと思います。
Visual Studio の「ファイル」→「新規作成」→「プロジェクト」で新しいプロジェクトダイアログが表示されたら、右側のテンプレートから「インストール済み」→「テンプレート」→「Visual C++」→「クロスプラットフォーム」→「Linux」を選択、右側の「Blink(Raspberry Pi)」を選択して、プロジェクト名を入力してプロジェクトを作成します。
WiringPi を使って、17pin に接続したLEDを 0.5秒間隔で点滅させるサンプルコードが main.cpp として作成されるようです。
今回はサンプルとして トラ技2016年8月号に基板(だけ)が付録としてついてきた ApplePi をターゲットにしてみたいと思います。まずはターゲットの接続情報を設定します。Visual Studioの「ツール」→「オプション」でオプションダイアログを表示して、左のツリーで「Cross Platform」→「C++」→「Linux」→「Connection Manager」と選択して、右側の「Add」ボタンをクリックすると接続情報を設定するダイアログが表示されるので、ApplePiへの接続情報を入力します。
例えば、ホスト名が "ApplePi"とすると以下のような感じになります。SSHログインが出来るようにRaspberry Pi側を設定しておく必要があるかと思います。自分は以前に設定してあったので、特にその部分を気にすること無く接続できてしまいました。
SSHサーバや gcc(g++)の開発環境自体まだ使っていない場合は、
sudo apt-get install -y openssh-server g++ gdb gdbserver freeglut3-dev
として、SSHと開発ツールをインストールして下さい。
以下、接続設定が成功した場合の表示例です。
次に Raspberry Pi 側の include ファイルのフォルダを共有して Visual Studio の include 参照先に設定することで intellisense等を有効にします。この辺の設定は こちらを参考にしています。
まず、sambaをまだインストールしていない場合は、
sudo apt-get install -y samba
共有フォルダを追加するために /etc/samba/smb.conf の末尾に記述を追加します。
sudo vi /etc/samba/smb.conf
以下を追記。
[share]
path = /home/pi
writable = yes
guest ok = yes
guest only = yes
create mode = 0777
directory mode = 0777
share mode = yes
force user = pi
[usr_include]
path = /usr/include
writable = no
guest ok = yes
guest only = yes
[share]フォルダは pi ユーザのホームディレクトリをWindows側から操作できるようにするのと、このホームディレクトリをに ApplePi のインストールファイルを展開してあるので、その中に bcm2835.h , bcm2835.c 等のApplePi のプロジェクトで参照したいファイルが存在するために共有しました。[usr_include]は一般的なincludeファイルを参照するための共有でリードオンリーに設定しています。ここで、サービスを再起動します。
sudo service smbd restart
これで Windows 側から Raspberry Pi の /home/pi = "share" と /usr/include = "usr_include" が参照可能になります。
Raspberry Pi 側で Avahi を設定していない、あるいは、Windows 側が Windows 10 ではない(Win 7とか)だと名前ではアクセス出来ないかもしれません。その場合はIPでアクセスします。
次にプロジェクトの各種設定を行っていきます。プロジェクトのプロパティ画面を開いて、「構成」を「すべての構成」(またはDebug)を選択して、「構成プロパティ」の「General」の「Configuration Type」を「Application (.out)」を選択します。
次に Includeパスに Raspberry Pi の共有フォルダを追加します。同プロジェクトのプロパティ画面の「VC++ Directories]の「Include Directories」に共有フォルダのパス、この例では、「\\ApplePi\usr_inclue」と「\\ApplePi\share\bcm2835-1.50/src」(ここに bcm2835.h がある)を設定します。
次はリンクするライブラリの設定です。作成されたプロジェクトでは wiringPi のライブラリが設定されていますが、今回は ApplePi を使うので bcm2835 をライブラリに指定します。
念のため、「Remote settings」の「Target machine」が正しく設定されていることを確認しておきます。選ばれていない場合はプルダウンで選択します。
main.cpp の内容をそっくり全て置き換えます。
これで「Remote GDB Debugger」ボタン(「デバッグの開始」)でクロスコンパイルが行われ、プログラムが実行されます。ApplePiのボード上の2つのLEDが交互に点滅します。
ブレークポイントを置いてステップ実行したり、ブレーク中に変数にマウスを合わせて値をポップ表示させたりもできます。下記は条件ブレーク(条件 i==5)を設定してブレークをかけたところです。
2016年7月13日水曜日
2016年7月8日金曜日
Visual Studio で LEGO の python をデバッグする
久々更新の今回は、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キー@ホスト名 を入力すると選択可能なプロセスにターゲットのプロセスが表示されるので「アタッチ」ボタンをクリックしてアタッチします。
デバッグが開始されます。上の画面ではブレークポイントで一時停止して、変数の値を参照しています。
そもそも、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年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 したり、突然部屋の明かりが消えたり・・・。う~ん、実用には遠い状態。認識語の組み合わせやマイク感度調整等で向上するのかな?
2016年3月20日日曜日
Dexter Industries GoPiGo 組み立て
今回のガラクタは Dexter Industries社の GoPiGo です。
Raspberry Pi + ATMega328 (Arudino相当) で構成される車輪ロボットで、モータ・タイヤ・アクリルのフレームと ATMega328 の載った基板等でキットになっています。
パッケージ。
開けたところ。
ボディはDexter Industries お得意のいつものアクリル板をレーザ加工したものとネジ、支柱での組み合わせです。まずは、底板にギアモータを取り付けます。ギアモータはaitendo等でも売っている中華製のあれです。格安ですが両軸出ています。
ギアモータは底面板にネジ止めするのではなくアクリルのT字型の小さな板で挟みこむような形でギアモータに空いている貫通穴と一緒に長いネジを通してナットで止めるのですが、自分はここを足回りなのでキツ目に締め込んでおこうと思ってドライバで締めた際に「ミシッ」という嫌な音がして小さな板にヒビが入ってしまいました。Dexterの組立てビデオを後から見たのですが、ここはドライバを使わず手でナットを締める程度にしておくみたいです。走らせた時ゆるまないのかな?
ギアモータの内側の軸にスペーサ2枚とエンコーダ円盤を挿しこみます。ここもネジ止めなどはなく、挿すだけです。子供でも作りやすいようにドライバでのネジ止めも最低限にしてあるってことでしょうか。
ひっくり返して、底板の上面に制御ボードを取り付けます。この制御ボードにはATMega328Pが載っていて、ファームウェアはArduinoのスケッチとして作成されているようです。GoPiGo は他のDexter Industries社製品同様に各種情報がオープンソースで提供されています。GoPiGoはこちらのGitHubに情報が公開されています。BrickPi や GrovePi も同様に Dexter Industries社はオープンにしてくれているのには感謝です。(Mindsensors社も各種センサの設計情報公開してくれないかな?)
ちなみにGoPiGoの主なハード構成を回路図から見てみると、前述のとおり RPi と制御ボード上のATMega328P (ファームウェアを見るとArduinoのスケッチ、~.inoになっています)がやり取りをする構成です。回路図を見るとRPiとArduino(制御ボードのATmega328P)がUART、I2C、SPIでそれぞれ接続されているように見えますが、RPi側のライブラリとArduino側のスケッチを見ると RPi がI2CマスタでArduino側がI2Cスレーブとなっているようです。SPIとUARTの接続はArduino側のファーム書き換え用ではないでしょうか。また、モータのドライブはArduinoのPWM出力を HブリッジのICに入れているようです。また、フォトインタラプタの間にエンコーダ円盤を挟んでカウント信号をArduinoのInterrupt入力端子で受けているようです。
次にボールキャスタを取り付けます。あとで気がついたんですが、上の写真はボールキャスタを前後間違えて取り付けています。ちょうどいい穴があったので画像向かって左側に間違って付けてしまいましたが、最終的に右側に取り付け直しています。
制御ボードにRaspberry Piを裏返した状態で取り付けます。ボールキャスタの位置を取り付け直しています。
電池ボックスをマジックテープで取り付けます。
裏返したところ。
Raspberry Pi のOSはRaspbianをDexter Industries社がカスタマイズした Raspbian for Robots をダウンロードして使いました。
続けて、ライントレース用センサオプションを取り付け。
やっぱり、アクリル板と支柱の組み合わせ。
こんな感じで取り付けられます。
続いて、サーボマウント(パン=水平方向の首振り)オプションを取り付け。
アクリル板とネジ・・・。
組み立てて、Raspberry Piのカメラモジュールを取り付けました。
それと、Groveの超音波センサを両面テープで取付。
これで、とりあえず、ハードの組み立ては終了です。
さて、何をして遊ぼうか?
Raspberry Pi + ATMega328 (Arudino相当) で構成される車輪ロボットで、モータ・タイヤ・アクリルのフレームと ATMega328 の載った基板等でキットになっています。
パッケージ。
開けたところ。
ボディはDexter Industries お得意のいつものアクリル板をレーザ加工したものとネジ、支柱での組み合わせです。まずは、底板にギアモータを取り付けます。ギアモータはaitendo等でも売っている中華製のあれです。格安ですが両軸出ています。
ギアモータは底面板にネジ止めするのではなくアクリルのT字型の小さな板で挟みこむような形でギアモータに空いている貫通穴と一緒に長いネジを通してナットで止めるのですが、自分はここを足回りなのでキツ目に締め込んでおこうと思ってドライバで締めた際に「ミシッ」という嫌な音がして小さな板にヒビが入ってしまいました。Dexterの組立てビデオを後から見たのですが、ここはドライバを使わず手でナットを締める程度にしておくみたいです。走らせた時ゆるまないのかな?
ギアモータの内側の軸にスペーサ2枚とエンコーダ円盤を挿しこみます。ここもネジ止めなどはなく、挿すだけです。子供でも作りやすいようにドライバでのネジ止めも最低限にしてあるってことでしょうか。
ひっくり返して、底板の上面に制御ボードを取り付けます。この制御ボードにはATMega328Pが載っていて、ファームウェアはArduinoのスケッチとして作成されているようです。GoPiGo は他のDexter Industries社製品同様に各種情報がオープンソースで提供されています。GoPiGoはこちらのGitHubに情報が公開されています。BrickPi や GrovePi も同様に Dexter Industries社はオープンにしてくれているのには感謝です。(Mindsensors社も各種センサの設計情報公開してくれないかな?)
ちなみにGoPiGoの主なハード構成を回路図から見てみると、前述のとおり RPi と制御ボード上のATMega328P (ファームウェアを見るとArduinoのスケッチ、~.inoになっています)がやり取りをする構成です。回路図を見るとRPiとArduino(制御ボードのATmega328P)がUART、I2C、SPIでそれぞれ接続されているように見えますが、RPi側のライブラリとArduino側のスケッチを見ると RPi がI2CマスタでArduino側がI2Cスレーブとなっているようです。SPIとUARTの接続はArduino側のファーム書き換え用ではないでしょうか。また、モータのドライブはArduinoのPWM出力を HブリッジのICに入れているようです。また、フォトインタラプタの間にエンコーダ円盤を挟んでカウント信号をArduinoのInterrupt入力端子で受けているようです。
次にボールキャスタを取り付けます。あとで気がついたんですが、上の写真はボールキャスタを前後間違えて取り付けています。ちょうどいい穴があったので画像向かって左側に間違って付けてしまいましたが、最終的に右側に取り付け直しています。
制御ボードにRaspberry Piを裏返した状態で取り付けます。ボールキャスタの位置を取り付け直しています。
裏返したところ。
Raspberry Pi のOSはRaspbianをDexter Industries社がカスタマイズした Raspbian for Robots をダウンロードして使いました。
続けて、ライントレース用センサオプションを取り付け。
やっぱり、アクリル板と支柱の組み合わせ。
こんな感じで取り付けられます。
続いて、サーボマウント(パン=水平方向の首振り)オプションを取り付け。
アクリル板とネジ・・・。
組み立てて、Raspberry Piのカメラモジュールを取り付けました。
これで、とりあえず、ハードの組み立ては終了です。
さて、何をして遊ぼうか?
2015年5月3日日曜日
Windows IoT for Raspberry Pi 2 で Lチカ
今回は Windows IoT ネタです。以前に GalileoでWinIoT を試したことがありましたが、先日、Windows IoT for Raspberry Pi 2 のプレビュー版が公開されたので、早速、試してみることにしました。
やることは、サンプルプログラムを元にLチカを最も簡単なプログラムでかつ新しいプロジェクトの作成から試してみることです。すぐに出来るだろうと思って調べ始めたところ、とんでもなく面倒でした。書くのも面倒なので・・・全ては書く気にもならないですが、手順の一部を載せておこうと思います。
まず、Get Start のページで必要環境を確認したところで、心が折れます。開発する側の環境として、 Windows 10 Insider Preview と Visual Studio 2015 RC が必要になります。Visual Studio 2015 RC はいいとして、Windows 10 のプレビュー版をインストールできる端末の余分がないとできないわけです。自分は幸か不幸か仕事柄も最新のOSの動向などは知っておく必要があるので、思い切って現用端末の内の一台をWindows8→Windows10Previewへのアップグレードインストールを行って、環境を用意しました。
次に Windows IoT for Raspberry Pi 2 Preview をダウンロード してzipファイルを解答すると、microSDに書き込むためのOSイメージとVisual StudioにWinIoTの開発機能を拡張するためのインストーラが展開されます。
イメージ展開用のmicroSDをWindows10にマウントして、コマンドプロンプトで
diskpart
list disk
exit
としてドライブ番号をリスト表示させて確認します。(例えば、ディスク N だったとします)
OSイメージ Flash.ffu のあるフォルダに移動して、以下のコマンドを実行します。
dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck
PhysicalDriveN のNは実際にはディスク番号の数字です。
これで展開されたmicroSDをRPi2に挿して起動すればOKです。初回起動時は時間がかかるので気長に待ちましょう。うまく起動すれば、先の拡張ツールと一緒にインストールされた検出ツールで minWin というPC名で検出されるはずです。自分はモニタは使っていませんが、モニタを接続しておけば、以下の様な画面が確認できるそうです。

つぎは、Lチカプログラムです。ここにあるように GPIO5(29ピン)と3.3VをLEDと抵抗で接続します。(下の画像は前述のここのものをそのままコピーさせてもらいました)


Visual Studio 2015 RC でC#の新しいプロジェクトを作成して、空のWindows Universalアプリ(Blank App(Windows Universal))を選択します。
プロジェクトへの参照の追加で「Windows IoT Extension SDK」を追加します。
MainPage.xaml.cs を編集します。まず、using Windows.Devices.Gpio; を追加します。
Lチカのソースは次のような感じにしました。Arduinoのような単純な待ち時間を取らせる方法がわからなかったので、サンプルプロジェクトを参考にしてタイマでLチカ動作するような方法としました。
プロジェクトのプロパティのビルドタグでプラットフォームタイプでARMを選択します。
DebugタブでプラットフォームをARM、Start optionsのTarget device をリモートコンピュータにして、Remote machineにRPi2のPC名(デフォルトだとminWin、下記の画像の例だとWinIoTPiに変えてあります)かまたはIPアドレスを指定、Use authenticationのチェックを外します。
ビルドの構成がARMになっていることを確認して、ビルド・実行します。
プロジェクトがビルドされて、リモートコンピュータ(RPi2)にダウンロードされて実行されます。
なんか、Lチカやるだけで、すごく大掛かりになってしまったんだけど・・・。
やることは、サンプルプログラムを元にLチカを最も簡単なプログラムでかつ新しいプロジェクトの作成から試してみることです。すぐに出来るだろうと思って調べ始めたところ、とんでもなく面倒でした。書くのも面倒なので・・・全ては書く気にもならないですが、手順の一部を載せておこうと思います。
まず、Get Start のページで必要環境を確認したところで、心が折れます。開発する側の環境として、 Windows 10 Insider Preview と Visual Studio 2015 RC が必要になります。Visual Studio 2015 RC はいいとして、Windows 10 のプレビュー版をインストールできる端末の余分がないとできないわけです。自分は幸か不幸か仕事柄も最新のOSの動向などは知っておく必要があるので、思い切って現用端末の内の一台をWindows8→Windows10Previewへのアップグレードインストールを行って、環境を用意しました。
次に Windows IoT for Raspberry Pi 2 Preview をダウンロード してzipファイルを解答すると、microSDに書き込むためのOSイメージとVisual StudioにWinIoTの開発機能を拡張するためのインストーラが展開されます。
イメージ展開用のmicroSDをWindows10にマウントして、コマンドプロンプトで
diskpart
list disk
exit
としてドライブ番号をリスト表示させて確認します。(例えば、ディスク N だったとします)
OSイメージ Flash.ffu のあるフォルダに移動して、以下のコマンドを実行します。
dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck
PhysicalDriveN のNは実際にはディスク番号の数字です。
これで展開されたmicroSDをRPi2に挿して起動すればOKです。初回起動時は時間がかかるので気長に待ちましょう。うまく起動すれば、先の拡張ツールと一緒にインストールされた検出ツールで minWin というPC名で検出されるはずです。自分はモニタは使っていませんが、モニタを接続しておけば、以下の様な画面が確認できるそうです。
つぎは、Lチカプログラムです。ここにあるように GPIO5(29ピン)と3.3VをLEDと抵抗で接続します。(下の画像は前述のここのものをそのままコピーさせてもらいました)
Visual Studio 2015 RC でC#の新しいプロジェクトを作成して、空のWindows Universalアプリ(Blank App(Windows Universal))を選択します。
プロジェクトへの参照の追加で「Windows IoT Extension SDK」を追加します。
MainPage.xaml.cs を編集します。まず、using Windows.Devices.Gpio; を追加します。
Lチカのソースは次のような感じにしました。Arduinoのような単純な待ち時間を取らせる方法がわからなかったので、サンプルプロジェクトを参考にしてタイマでLチカ動作するような方法としました。
プロジェクトのプロパティのビルドタグでプラットフォームタイプでARMを選択します。
DebugタブでプラットフォームをARM、Start optionsのTarget device をリモートコンピュータにして、Remote machineにRPi2のPC名(デフォルトだとminWin、下記の画像の例だとWinIoTPiに変えてあります)かまたはIPアドレスを指定、Use authenticationのチェックを外します。
ビルドの構成がARMになっていることを確認して、ビルド・実行します。
プロジェクトがビルドされて、リモートコンピュータ(RPi2)にダウンロードされて実行されます。
なんか、Lチカやるだけで、すごく大掛かりになってしまったんだけど・・・。
2015年3月29日日曜日
RAPIRO のRaspberry Pi を Pi BからPi 2へ交換
今回のガラクタは久々登場のRAPIROです。RAPIRO はArduino互換の制御ボードで小型のサーボ11個を制御して動かす小型のロボットキットです。サーボの制御は腰部に内蔵したArdino互換ボードですが、自分でRaspberry Pi モデルB を用意して、RAPIROの頭部に実装して、UARTで通信させることができるようになっています。今回は、今まで取り付けてあった RPi BをRPi 2に交換しました。
頭部を開けたところ。RPi Bの上に自作物も色々スタックしているので、まず、これをどけて。
RPi B の載せた状態。
RAPIROの首の部品の一部を加工します。写真手前側の基板を押さえる詰めがRPi 2だとオーディオコネクタに当たるので、ニッパー等で半分だけ切り取ってしまいます。
また、写真右のポールの先端にRPi Bのネジ穴にささるようにピンが立っていますが、これがRPi 2では邪魔になるので、同じくニッパーで切り落としてしまいます。
RPi 2 を載せたところ。
自作の追加ボード(センサやスピーカ用のアンプが載っている)とスピーカも取り付けて、蓋(頭)を閉じます。
RPi を交換したので、無線LAN接続とSSH、VNC接続等を確認して、SSHターミナル(TeraTermとか)でログインして、手動でRPi 2 → Arduino にコマンドを送って動作確認してみます。
まず、RPi 2 でシリアルポートにコマンドを送信するために cu をインストール。
sudo apt-get install cu
RPi 2 と Arduino 間は 57600bps での通信なので、
cu -l /dev/ttyAMA0 -s 57600
で通信開始。コマンド #M1 で前進、 #M0 で停止。簡単に動作は確認できました。
さて、RPi を置き換えたので、新環境で色々セットアップをし直さないといけないわけですが、その際に音声認識のJuliusのセットアップを以前の記述を備忘録として再度行おうとしたのですが、なぜか、記事の後半部分がすっぽりの抜けてる・・・。こんなことってあるの?もうすっかり、忘れちまってるよ・・・。調べ直しかよ・・・。
仕方ないので、Julius公式サイトから本体ソース、ディクテーションキット、文法キットをダウンロードします。(前述のリンクは、記述辞典の最新版へのリンクなので、公式トップからそのときの最新を探すほうが良いと思います。)今回はwgetでうまく落とせなかったので、GUIのブラウザでダウンロードは行いました。
piユーザのホームにこれらの
julius-4.3.1.tar.gz
dictation-kit-v4.3.1-linux.tgz
grammar-kit-v4.1.tar.gz
があるとして、まず、julius本体を解凍して、makeして、インストール。
tar xvzf julius-4.3.1.tar.gz
cd julius-4.3.1
./configure -with-mictype=alsa
make
sudo make install
次に、・・・。この先が思い出せません。Googleで検索して、こちらのサイトを参考にさせて頂きました。・・・ディクテーションキットと文法キットを適当なフォルダを作って解凍。
cd ~
mkdir julius-kit
cd julius-kit
tar xvzf ~/dictation-kit-v4.3.1-linux.tgz
tar xvzf ~/grammar-kit-v4.1.tar.gz
入力デバイスの設定。
export ALSADEV=plughw:0,0 (ハードウェア番号は arecord -l 等で調べてください)
次は、単語リストを作成。
vi ~/julius-kit/dictation-kit-v4.3.1-linux/rapiro.dic
エディタで任意のファイル名でファイルを作成して、認識語リストを作成します。[認識結果語][tab][(認識用音声文字での)読み]のようにリストを作成します。
<sil> silB
<sil> silE
<sp> sp
こんにちは k o N n i ch i w a
前進 z e N sh i N
後退 k o u t a i
停止 t e i sh i
右 m i g i
左 h i d a r i
パンチ p a N ch i
みたいな感じで。記述方法はこの辺とかを参照。
次に設定ファイルですが、正直、設定ファイルの詳細は理解できていません。参考ページなどにあるものをコピーしてきて、辞書ファイル名等を一部を変更しただけです。
vi ~/julius-kit/dictation-kit-v4.3.1-linux/rapiro.jconf
として、以下の内容で作成します。
-w rapiro.dic
-v model/lang_m/bccwj.60k.htkdic
-h model/phone_m/jnas-tri-3k16-gid.binhmm
-hlist model/phone_m/logicalTri
-n 5
-output 1
-input mic
-input alsa
-rejectshort 800
-lv 1500
-demo
これで、
julius -C ~/julius-kit/dictation-kit-v4.3.1-linux/rapiro.jconf
とすると、認識が開始されるはずです。
"<<< please speak >>>" というのが表示されるので、登録されている語句をマイクに話しかけると認識ます。限らた語句で辞書を作って認識させる方式だと、かなりの認識率で認識してくれます。そのかわり、違う言葉も強引に辞書内の単語に当てはめようとします。たとえば、「ぱんつ」と言うと「パンチ」に、「変身」というと「前進」として認識します。認識率が悪い場合は、マイクの音量不足の可能性もあるので、
amixer -c 0 sset Mic 80%
などとして、マイク音量を調整してみてください。
音声認識ができたら、認識結果をコマンドと知って、制御用Arduino側に送信するプログラムを試してみます。まずは、辞書ファイル rapiro.dic の認識結果をシリアル送信するコマンドで書き換えます。
<sil> silB
<sil> silE
<sp> sp
#M6 k o N n i ch i w a
#M1 z e N sh i N
#M2 k o u t a i
#M0 t e i sh i
#M3 m i g i
#M4 h i d a r i
#M9 p a N ch i
JuliusLib を使って、認識結果をシリアルに送信するプログラムはこちら。以前に動かした時の動画です。
次は、OpenCV。これは、過去の記述を参考に行いました。RPi 2 だとコンパイル時間が短くてすみます(っていっても2時間くらいかかるけど)。
sudo apt-get -y install build-essential cmake cmake-qt-gui pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools
sudo apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev libdc1394-22-dev libdc1394-22 libdc1394-utils swig libv4l-0 libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev libgtk2.0-dev pkg-config
wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip
unzip opencv-2.4.10.zip
cd OpenCV-2.4.2/
mkdir build
cd build
cmake-gui (これはGUI画面で行う)
CMake GUI画面で Configureして、必要なオプションを追加後、Genarateします。その後
make (時間がかかります)
sudo make install
となります。
ん~今日はここまで。
頭部を開けたところ。RPi Bの上に自作物も色々スタックしているので、まず、これをどけて。
RPi B の載せた状態。
RAPIROの首の部品の一部を加工します。写真手前側の基板を押さえる詰めがRPi 2だとオーディオコネクタに当たるので、ニッパー等で半分だけ切り取ってしまいます。
また、写真右のポールの先端にRPi Bのネジ穴にささるようにピンが立っていますが、これがRPi 2では邪魔になるので、同じくニッパーで切り落としてしまいます。
RPi 2 を載せたところ。
自作の追加ボード(センサやスピーカ用のアンプが載っている)とスピーカも取り付けて、蓋(頭)を閉じます。
RPi を交換したので、無線LAN接続とSSH、VNC接続等を確認して、SSHターミナル(TeraTermとか)でログインして、手動でRPi 2 → Arduino にコマンドを送って動作確認してみます。
まず、RPi 2 でシリアルポートにコマンドを送信するために cu をインストール。
sudo apt-get install cu
RPi 2 と Arduino 間は 57600bps での通信なので、
cu -l /dev/ttyAMA0 -s 57600
で通信開始。コマンド #M1 で前進、 #M0 で停止。簡単に動作は確認できました。
さて、RPi を置き換えたので、新環境で色々セットアップをし直さないといけないわけですが、その際に音声認識のJuliusのセットアップを以前の記述を備忘録として再度行おうとしたのですが、なぜか、記事の後半部分がすっぽりの抜けてる・・・。こんなことってあるの?もうすっかり、忘れちまってるよ・・・。調べ直しかよ・・・。
仕方ないので、Julius公式サイトから本体ソース、ディクテーションキット、文法キットをダウンロードします。(前述のリンクは、記述辞典の最新版へのリンクなので、公式トップからそのときの最新を探すほうが良いと思います。)今回はwgetでうまく落とせなかったので、GUIのブラウザでダウンロードは行いました。
piユーザのホームにこれらの
julius-4.3.1.tar.gz
dictation-kit-v4.3.1-linux.tgz
grammar-kit-v4.1.tar.gz
があるとして、まず、julius本体を解凍して、makeして、インストール。
tar xvzf julius-4.3.1.tar.gz
cd julius-4.3.1
./configure -with-mictype=alsa
make
sudo make install
次に、・・・。この先が思い出せません。Googleで検索して、こちらのサイトを参考にさせて頂きました。・・・ディクテーションキットと文法キットを適当なフォルダを作って解凍。
cd ~
mkdir julius-kit
cd julius-kit
tar xvzf ~/dictation-kit-v4.3.1-linux.tgz
tar xvzf ~/grammar-kit-v4.1.tar.gz
入力デバイスの設定。
export ALSADEV=plughw:0,0 (ハードウェア番号は arecord -l 等で調べてください)
次は、単語リストを作成。
vi ~/julius-kit/dictation-kit-v4.3.1-linux/rapiro.dic
エディタで任意のファイル名でファイルを作成して、認識語リストを作成します。[認識結果語][tab][(認識用音声文字での)読み]のようにリストを作成します。
<sil> silB
<sil> silE
<sp> sp
こんにちは k o N n i ch i w a
前進 z e N sh i N
後退 k o u t a i
停止 t e i sh i
右 m i g i
左 h i d a r i
パンチ p a N ch i
みたいな感じで。記述方法はこの辺とかを参照。
次に設定ファイルですが、正直、設定ファイルの詳細は理解できていません。参考ページなどにあるものをコピーしてきて、辞書ファイル名等を一部を変更しただけです。
vi ~/julius-kit/dictation-kit-v4.3.1-linux/rapiro.jconf
として、以下の内容で作成します。
-w rapiro.dic
-v model/lang_m/bccwj.60k.htkdic
-h model/phone_m/jnas-tri-3k16-gid.binhmm
-hlist model/phone_m/logicalTri
-n 5
-output 1
-input mic
-input alsa
-rejectshort 800
-lv 1500
-demo
これで、
julius -C ~/julius-kit/dictation-kit-v4.3.1-linux/rapiro.jconf
とすると、認識が開始されるはずです。
"<<< please speak >>>" というのが表示されるので、登録されている語句をマイクに話しかけると認識ます。限らた語句で辞書を作って認識させる方式だと、かなりの認識率で認識してくれます。そのかわり、違う言葉も強引に辞書内の単語に当てはめようとします。たとえば、「ぱんつ」と言うと「パンチ」に、「変身」というと「前進」として認識します。認識率が悪い場合は、マイクの音量不足の可能性もあるので、
amixer -c 0 sset Mic 80%
などとして、マイク音量を調整してみてください。
音声認識ができたら、認識結果をコマンドと知って、制御用Arduino側に送信するプログラムを試してみます。まずは、辞書ファイル rapiro.dic の認識結果をシリアル送信するコマンドで書き換えます。
<sil> silB
<sil> silE
<sp> sp
#M6 k o N n i ch i w a
#M1 z e N sh i N
#M2 k o u t a i
#M0 t e i sh i
#M3 m i g i
#M4 h i d a r i
#M9 p a N ch i
JuliusLib を使って、認識結果をシリアルに送信するプログラムはこちら。以前に動かした時の動画です。
次は、OpenCV。これは、過去の記述を参考に行いました。RPi 2 だとコンパイル時間が短くてすみます(っていっても2時間くらいかかるけど)。
sudo apt-get -y install build-essential cmake cmake-qt-gui pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools
sudo apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev libdc1394-22-dev libdc1394-22 libdc1394-utils swig libv4l-0 libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev libgtk2.0-dev pkg-config
wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip
unzip opencv-2.4.10.zip
cd OpenCV-2.4.2/
mkdir build
cd build
cmake-gui (これはGUI画面で行う)
CMake GUI画面で Configureして、必要なオプションを追加後、Genarateします。その後
make (時間がかかります)
sudo make install
となります。
ん~今日はここまで。
登録:
投稿 (Atom)









































