Sony MESH という、無線電子ブロック的なものがある。
http://meshprj.com/
Tag同士が無線で繋がり、各Tagにはバッテリーが内蔵されている。
iPadを中心としてプログラムが組め、Tag同士の提携で電子ブロック的に遊べる。
GPIOタグという、いかにもな名前のやつは、3.3Vの入出力、アナログ入力、
サーボが動かせる125HzのPWM出力を持っている。
今までは、値段は高いし、物の割にはできることが少なそうで、気にもしなかった。
確かに、プログラミングとしては非常に簡単に使え、無線で遊べるというのは面白い。
しかし、iPad上のプログラムが組める幅というのがかなり狭い。
GPIOタグの先にArduinoとかRas Piを繋げればなんでもできるが、それでは
正直315MHz帯の適当な無線リモコンをつなげるのとほとんど変わらないし。
しかし、SDKが使えるようになったと聞き、眼の色が変わった。
お高いTagを買わなくとも、iPadといろいろな機器の提携ができるとなれば、便利な環境だ。
Tagが使えればなおいい。
https://meshprj.com/sdk/
会員登録して読んでみたところ、javascriptでiPad上のTagを拡張できるようだ。
iPad上には、AND、タイマー、カウンター、マイク、カメラ、音。
あとはHueの操作ができるくらいしか機能がなかった(最近Gmailが追加された)が、
これが拡張できるのだ。
つい最近まで、一度作成したTagを編集・削除できない不具合があったが、
連絡したらさくっと翌日には直してくれた。
しかもなんと、Ajaxで外部とHTTP通信ができる。
...というか、これ以外は任意のintervalが設定できる程度の機能しかない。
しかし、単純でもHTTP/HTTPS通信が使えるなら、入出力はいくらでも思いつく。
というわけで、いくつか実装してみた。
Tweetする、IFTTTのトリガにする、端末にPush通知する。ついでに、RS-FF的な何か。
大体、HTTPリクエストを1発投げれば動き、それでいて必要そうななものはこの辺だろう。
サイトの方にJSONデータを上げておいたので、使ってみたい人はどうぞ使ってみて欲しい。
https://sites.google.com/site/gpsnmeajp/tools/mesh-custom-tags
ちなみに、天気情報を取得する、カメラを遠隔操作するとかの、より実用的なものは、
すでに公式のサンプルに存在するので、そちらを参考にして欲しい。
しかし、複数の同一Tagで通信する方法がないのかな、とか。
intervalで呼ばれるのは、inputではなくExecuteなのか、とか。
色々とクセもあるのが悩ましい。
おそらく、完成した時にはオープンで使えるようにするのだろう。その時に期待だ。
2015年09月20日
2015年07月02日
Windows上に、Eclipseを用いたRaspberry PiのC言語クロスコンパイル開発環境を作る。(ついでにBoost)
参考文献(Linux版の手順)
http://www.sadaji.net/Firmware/eclipse/index.htm
本ページでは、初心者をターゲットに説明している。
多少不快な表現があるかも知れないが、流して欲しい。
Windowsでの手順を以下に示す。
1.以下のものをダウンロードする。
・Pleiades All in One 日本語ディストリビューション [必須]
C/C++ 64bit Full Edition
http://mergedoc.osdn.jp/
バージョンは4.5 Marsで確認済み。32bit環境では当然32bit版が必要。Ultimateでもよい。
日本語が嫌いであれば、Eclipse公式でも良い。
・Windows toolchain for Raspberry/PI [必須]
GCC 4.6.3である、raspberry-gcc4.6.3.exeで動作確認済み。
http://gnutoolchains.com/raspberry/
・Boost C++ Libraries [おまけ]
Version 1.58.0で確認している。
http://www.boost.org/
・TeraTerm [おまけ]
SCPでファイル転送、コンソールアクセスする。
他に転送手段がある、SSHアクセスしないでUSBなどで渡す場合はなくても良い。
http://www.forest.impress.co.jp/library/software/utf8teraterm/
2.インストール手順
2-1.TeraTerm
適当にインストールしてください。これが出来ないなら以下読まないほうがいいです。
2-2. Eclipse - Pleiades All in One
適当なところに解凍すればそれでインストール完了です。
ただ、デスクトップなどに置くのは非常におすすめしません。
ここてば、C:\Pleiades\ に解凍したと仮定します。
C:\Pleiades\Eclipse\ に、Eclipse.exeがあればOKです。
初回起動時は、Eclipse.exeではなく、「eclipse.exe -clean.cmd」で起動します。
キャッシュのクリーンアップが行われます。
ワークスペースの選択は、「../workspace」のままで構いません。
C:\Pleiades\workspace\に保存されます。
「この選択をデフォルトとして使用し、今後この質問を表示しない」にチェックを付けてOK。
しばらくして、起動が完了したら閉じましょう。
2-3 Windows toolchain for Raspberry/PI
ダウンロードしてきたEXEファイルを起動すると、すぐにインストール直前の画面になります。
デフォルトでは「C:\SysGCC\Raspberry」にインストールするようになっています。
利用規約(GPLライセンス)を読み、同意できる場合は、
そのまま、「I accept the terms of liscense agreement」にチェックを付け、
Installボタンを押すとインストール完了です。
2-4 Boost C++ Libraries
入れる人だけ。ここではヘッダーオンリーでBoost asioを使う解説しかしないので
その場合のみ説明します。
http://sourceforge.net/projects/boost/files/boost/1.58.0/
ここからダウンロード。zipでもよいが、個人的には7zの方がオススメ。
ダウンロードしたら、解凍すれば完了。ヘッダーオンリーで使用するなら、
Bootstrapもb2も不要。
C:\boost_1_58_0\に解凍したと仮定する。
3.プロジェクトの作り方(Hello Worldをする)
3-1. まずはじめに
もうセットアップは終わっているので、プロジェクトを作りましょう。
まず、Eclipse.exeを起動。
起動したら、「ファイル(F)」→「新規(N)」→「Cプロジェクト」
3-2. 「Cプロジェクト」
プロジェクト名は適当に。ここでは「ccHello」とする。
ここで、プロジェクト・タイプは「実行可能」→「空のプロジェクト」。
ツールチェーンを「Cross GCC」とすること。
設定したら次へ。
3-3 「構成の選択」
特に何も変更せず次へ。
3-4 「クロスGCCコマンド」
重要です。
クロス・コンパイラー接頭部に「arm-linux-gnueabihf-」
クロス・コンパイラー・パスに「C:\SysGCC\Raspberry\bin」と入力。
そして完了をクリック。
3-5 ソースファイル入れよう
プロジェクトは生成されましたが、空っぽです。
ので、プロジェクトccHelloを右クリック。
「新規(N)」→「ソース・ファイル」をクリック。
「新規ソース・ファイル」というダイアログが開くので
ソース・ファイルの欄に、main.cと入力。(.cのファイル名であれば何でも良いが)
そして「完了(F)」をクリック。
3-6 Hello Worldしよう。
ソースが打ち込めるようになるので、HelloWorldを打ちましょう。
3-7 ビルドしよう
打ち込み終わったら、「ファイル(F)」→「すべて保管(Ctrl + Shift + S)」をクリック。
できたら、「プロジェクト(P)」→「すべでビルド(A)」をクリック。
ビルド結果は下に出ます。無事ビルドできましたかね?
ここで出来たバイナリは、ARM-Linux専用です。Windows上では実行できません。
3-8 ファイルを見に行こう
特にビルド設定を変えていなければ、出来上がったファイルは
「C:\pleiades\workspace\ccHello\Debug」に「ccHello」として生成されています。
これをTeraTerm等でRaspberryPiに転送。
chmod 777 ccHello
などとして、実行権限を付与した後、
./ccHello
と実行し、
「Hello World\n」と表示されれば万歳です。
4-1 C++で作る場合の注意点。
プロジェクトを上記の「Cプロジェクト」で作ってしまった場合、もれなくC++言語は
コンパイルやビルドに失敗します。
「新規(N)」→「C++ プロジェクト」から生成したプロジェクトでは、正常に行きます。
力尽きたのでここまで。
Boostを使う場合などの注意点は、あとで追記するかもしれません。
Boost aisoを使う場合のヒント。
ヒント1
当然インクルードパスの設定は必要です。ただちょっと罠がある。
GCCではなく、G++の方に設定する。
(.text+0x34): undefined reference to `main'
mainなんて関数ないヨとエラーを吐かれる時は、インクルードパスを直してると治ります。
というか、多分、ソースを保存してないだけだと思います。
デフォルトでは、ビルド時自動で保存はしてくれないです。
ヒント2
Boost Asioをヘッダオンリーで使う場合、「ライブラリがない」エラーを吐きます。
C:\boost/boost/system/error_code.hpp:221: undefined reference to `boost::system::generic_category()'
C:\boost/boost/system/error_code.hpp:222: undefined reference to `boost::system::generic_category()'
C:\boost/boost/system/error_code.hpp:223: undefined reference to `boost::system::system_category()'
./main.o: In function `error_code':
C:\boost/boost/system/error_code.hpp:322: undefined reference to `boost::system::system_category()'
./main.o: In function `boost::asio::error::get_system_category()':
C:\boost/boost/asio/error.hpp:230: undefined reference to `boost::system::system_category()'
ソースの先頭に以下の記述をすれば治ります。
#define BOOST_DATE_TIME_NO_LIB
#define BOOST_REGEX_NO_LIB
#define BOOST_ERROR_CODE_HEADER_ONLY
#define BOOST_SYSTEM_NO_LIB
ヒント3
それでもpthreadが無いエラーを吐くので
./main.o: In function `boost::asio::detail::posix_tss_ptr_create(unsigned int&)':
C:\boost/boost/asio/detail/impl/posix_tss_ptr.ipp:34: undefined reference to `pthread_key_create'
./main.o: In function `~posix_tss_ptr':
C:\boost/boost/asio/detail/posix_tss_ptr.hpp:48: undefined reference to `pthread_key_delete'
./main.o: In function `boost::asio::detail::posix_tss_ptr::context>::operator boost::asio::detail::call_stack::context*() const':
C:\boost/boost/asio/detail/posix_tss_ptr.hpp:54: undefined reference to `pthread_getspecific'
./main.o: In function `~posix_tss_ptr':
C:\boost/boost/asio/detail/posix_tss_ptr.hpp:48: undefined reference to `pthread_key_delete'
collect2: ld returned 1 exit status
make: *** [ccpHello] Error 1
ライブラリの設定にpthreadを追加してやればOKです。
以上。
http://www.sadaji.net/Firmware/eclipse/index.htm
本ページでは、初心者をターゲットに説明している。
多少不快な表現があるかも知れないが、流して欲しい。
1.以下のものをダウンロードする。
・Pleiades All in One 日本語ディストリビューション [必須]
C/C++ 64bit Full Edition
http://mergedoc.osdn.jp/
バージョンは4.5 Marsで確認済み。32bit環境では当然32bit版が必要。Ultimateでもよい。
日本語が嫌いであれば、Eclipse公式でも良い。
・Windows toolchain for Raspberry/PI [必須]
GCC 4.6.3である、raspberry-gcc4.6.3.exeで動作確認済み。
http://gnutoolchains.com/raspberry/
・Boost C++ Libraries [おまけ]
Version 1.58.0で確認している。
http://www.boost.org/
・TeraTerm [おまけ]
SCPでファイル転送、コンソールアクセスする。
他に転送手段がある、SSHアクセスしないでUSBなどで渡す場合はなくても良い。
http://www.forest.impress.co.jp/library/software/utf8teraterm/
2.インストール手順
2-1.TeraTerm
適当にインストールしてください。これが出来ないなら以下読まないほうがいいです。
2-2. Eclipse - Pleiades All in One
適当なところに解凍すればそれでインストール完了です。
ただ、デスクトップなどに置くのは非常におすすめしません。
ここてば、C:\Pleiades\ に解凍したと仮定します。
C:\Pleiades\Eclipse\ に、Eclipse.exeがあればOKです。
初回起動時は、Eclipse.exeではなく、「eclipse.exe -clean.cmd」で起動します。
キャッシュのクリーンアップが行われます。
ワークスペースの選択は、「../workspace」のままで構いません。
C:\Pleiades\workspace\に保存されます。
「この選択をデフォルトとして使用し、今後この質問を表示しない」にチェックを付けてOK。
しばらくして、起動が完了したら閉じましょう。
2-3 Windows toolchain for Raspberry/PI
ダウンロードしてきたEXEファイルを起動すると、すぐにインストール直前の画面になります。
デフォルトでは「C:\SysGCC\Raspberry」にインストールするようになっています。
利用規約(GPLライセンス)を読み、同意できる場合は、
そのまま、「I accept the terms of liscense agreement」にチェックを付け、
Installボタンを押すとインストール完了です。
2-4 Boost C++ Libraries
入れる人だけ。ここではヘッダーオンリーでBoost asioを使う解説しかしないので
その場合のみ説明します。
http://sourceforge.net/projects/boost/files/boost/1.58.0/
ここからダウンロード。zipでもよいが、個人的には7zの方がオススメ。
ダウンロードしたら、解凍すれば完了。ヘッダーオンリーで使用するなら、
Bootstrapもb2も不要。
C:\boost_1_58_0\に解凍したと仮定する。
3.プロジェクトの作り方(Hello Worldをする)
3-1. まずはじめに
もうセットアップは終わっているので、プロジェクトを作りましょう。
まず、Eclipse.exeを起動。
起動したら、「ファイル(F)」→「新規(N)」→「Cプロジェクト」
3-2. 「Cプロジェクト」
プロジェクト名は適当に。ここでは「ccHello」とする。
ここで、プロジェクト・タイプは「実行可能」→「空のプロジェクト」。
ツールチェーンを「Cross GCC」とすること。
設定したら次へ。
3-3 「構成の選択」
特に何も変更せず次へ。
3-4 「クロスGCCコマンド」
重要です。
クロス・コンパイラー接頭部に「arm-linux-gnueabihf-」
クロス・コンパイラー・パスに「C:\SysGCC\Raspberry\bin」と入力。
そして完了をクリック。
3-5 ソースファイル入れよう
プロジェクトは生成されましたが、空っぽです。
ので、プロジェクトccHelloを右クリック。
「新規(N)」→「ソース・ファイル」をクリック。
「新規ソース・ファイル」というダイアログが開くので
ソース・ファイルの欄に、main.cと入力。(.cのファイル名であれば何でも良いが)
そして「完了(F)」をクリック。
3-6 Hello Worldしよう。
ソースが打ち込めるようになるので、HelloWorldを打ちましょう。
3-7 ビルドしよう
打ち込み終わったら、「ファイル(F)」→「すべて保管(Ctrl + Shift + S)」をクリック。
できたら、「プロジェクト(P)」→「すべでビルド(A)」をクリック。
ビルド結果は下に出ます。無事ビルドできましたかね?
ここで出来たバイナリは、ARM-Linux専用です。Windows上では実行できません。
3-8 ファイルを見に行こう
特にビルド設定を変えていなければ、出来上がったファイルは
「C:\pleiades\workspace\ccHello\Debug」に「ccHello」として生成されています。
これをTeraTerm等でRaspberryPiに転送。
chmod 777 ccHello
などとして、実行権限を付与した後、
./ccHello
と実行し、
「Hello World\n」と表示されれば万歳です。
4-1 C++で作る場合の注意点。
プロジェクトを上記の「Cプロジェクト」で作ってしまった場合、もれなくC++言語は
コンパイルやビルドに失敗します。
「新規(N)」→「C++ プロジェクト」から生成したプロジェクトでは、正常に行きます。
力尽きたのでここまで。
Boostを使う場合などの注意点は、あとで追記するかもしれません。
Boost aisoを使う場合のヒント。
ヒント1
当然インクルードパスの設定は必要です。ただちょっと罠がある。
GCCではなく、G++の方に設定する。
(.text+0x34): undefined reference to `main'
mainなんて関数ないヨとエラーを吐かれる時は、インクルードパスを直してると治ります。
というか、多分、ソースを保存してないだけだと思います。
デフォルトでは、ビルド時自動で保存はしてくれないです。
ヒント2
Boost Asioをヘッダオンリーで使う場合、「ライブラリがない」エラーを吐きます。
C:\boost/boost/system/error_code.hpp:221: undefined reference to `boost::system::generic_category()'
C:\boost/boost/system/error_code.hpp:222: undefined reference to `boost::system::generic_category()'
C:\boost/boost/system/error_code.hpp:223: undefined reference to `boost::system::system_category()'
./main.o: In function `error_code':
C:\boost/boost/system/error_code.hpp:322: undefined reference to `boost::system::system_category()'
./main.o: In function `boost::asio::error::get_system_category()':
C:\boost/boost/asio/error.hpp:230: undefined reference to `boost::system::system_category()'
ソースの先頭に以下の記述をすれば治ります。
#define BOOST_DATE_TIME_NO_LIB
#define BOOST_REGEX_NO_LIB
#define BOOST_ERROR_CODE_HEADER_ONLY
#define BOOST_SYSTEM_NO_LIB
ヒント3
それでもpthreadが無いエラーを吐くので
./main.o: In function `boost::asio::detail::posix_tss_ptr_create(unsigned int&)':
C:\boost/boost/asio/detail/impl/posix_tss_ptr.ipp:34: undefined reference to `pthread_key_create'
./main.o: In function `~posix_tss_ptr':
C:\boost/boost/asio/detail/posix_tss_ptr.hpp:48: undefined reference to `pthread_key_delete'
./main.o: In function `boost::asio::detail::posix_tss_ptr
C:\boost/boost/asio/detail/posix_tss_ptr.hpp:54: undefined reference to `pthread_getspecific'
./main.o: In function `~posix_tss_ptr':
C:\boost/boost/asio/detail/posix_tss_ptr.hpp:48: undefined reference to `pthread_key_delete'
collect2: ld returned 1 exit status
make: *** [ccpHello] Error 1
ライブラリの設定にpthreadを追加してやればOKです。
以上。
2015年07月01日
仮想シリアルポートcom0comって知ってる?
仮想シリアルポートcom0comって知ってますか?
クロスケーブルで繋いだCOMポートを2つ用意したような感じのを作れるもので、
シリアル通信するアプリケーションのデバッグに非常に便利です。
が、デバイスドライバなので、いわゆる署名問題が気になるところ。
私もVistaまでは使っていたのですが、それ以降、テストモードに切り替えるのが面倒で使わなくなっていました。
最新版だと、署名されてないため、やっぱり面倒です。
しかし、あったんですね、署名済みドライバ。1つ前のバージョンです。
公式のこちらから
http://sourceforge.net/projects/com0com/files/com0com/2.2.2.0/
com0com-2.2.2.0-x64-fre-signed.zipをダウンロード。
普通にsetuoすれば、使えます。
使い方は簡単。
スタートメニューの「com0com」フォルダに「Setup Command Prompt」ができてるので起動。
>install PortName=COM10 PortName=COM11
と入力してEnter。
ドライバのインストールが走り、シリアルポートが生成されます。
listコマンドで現在あるポートのリストが出ます。
削除はremove 0とか。消えなければ、1や2などの数字を試してください。
CNCA0,CNCB0なら、remove 0
CNCA1,CNCB1なら、remove 1です。多分。
クロスケーブルで繋いだCOMポートを2つ用意したような感じのを作れるもので、
シリアル通信するアプリケーションのデバッグに非常に便利です。
が、デバイスドライバなので、いわゆる署名問題が気になるところ。
私もVistaまでは使っていたのですが、それ以降、テストモードに切り替えるのが面倒で使わなくなっていました。
最新版だと、署名されてないため、やっぱり面倒です。
しかし、あったんですね、署名済みドライバ。1つ前のバージョンです。
公式のこちらから
http://sourceforge.net/projects/com0com/files/com0com/2.2.2.0/
com0com-2.2.2.0-x64-fre-signed.zipをダウンロード。
普通にsetuoすれば、使えます。
使い方は簡単。
スタートメニューの「com0com」フォルダに「Setup Command Prompt」ができてるので起動。
>install PortName=COM10 PortName=COM11
と入力してEnter。
ドライバのインストールが走り、シリアルポートが生成されます。
listコマンドで現在あるポートのリストが出ます。
削除はremove 0とか。消えなければ、1や2などの数字を試してください。
CNCA0,CNCB0なら、remove 0
CNCA1,CNCB1なら、remove 1です。多分。
Chrono::Engineで、球体や振り子が高速回転する、妙なところでエラーを吐く、発散する場合の対処法。
Chrono::Engineで、球体や振り子が高速回転する、妙なところでエラーを吐く、発散する場合の対処法。
(glitch or bug: ball and pendulum fast spinning ,moving,or clash in Chrono::Engine.)
・ボールが突然妙な加速とともに回転しはじめませんか?
・動力のない振り子が、宇宙からエネルギーをもらいながら高速回転しませんか?
・Print Screen キーを押して連続写真が撮れるはずが、エラーで落ちませんか?
・反発係数0にするとプログラムが落ちませんか?
・Visual Studio 2010 Expressを使っていませんか?
↓
Visual Studio 2013 Express/Community/Professionalを使いましょう。
治ります。原因不明。
(glitch or bug: ball and pendulum fast spinning ,moving,or clash in Chrono::Engine.)
・ボールが突然妙な加速とともに回転しはじめませんか?
・動力のない振り子が、宇宙からエネルギーをもらいながら高速回転しませんか?
・Print Screen キーを押して連続写真が撮れるはずが、エラーで落ちませんか?
・反発係数0にするとプログラムが落ちませんか?
・Visual Studio 2010 Expressを使っていませんか?
↓
Visual Studio 2013 Express/Community/Professionalを使いましょう。
治ります。原因不明。
近藤科学のFTDI FT232RL搭載USBアダプターをRaspberry Piで使うのに苦労した話。
近藤科学のFTDI搭載USBアダプターをRaspberry Piで使うのに苦労した話。
おそらく、他のFTDIチップ搭載のUSBアダプタ、変換器でも利用できるだろう。
ただし、内容は保証しない。USBアダプターやOS、ハードウェアが恒久的に破損する危険性を
理解した上で自己責任で行うこと。
・はじめに
近藤科学のICSサーボをPCで制御するにはどうするか。
Dual USBアダプターHSという、アダプターが近藤科学から出ているので使う。
終わり。
しかし、それはWindowsの話である。
Linuxから使うにはどうするか。
1.シリアルポートおよびUSB-シリアルアダプタを加工する。
近藤科学のページ
シリアルサーボ制御方法(1) 回路編 (近藤科学)
http://kondo-robot.com/faq/serial-servo-method-tech
にて、マイコンと接続する場合の解説が乗っている。
同様に、FT232RLなどを使って接続すれば良い。
まっとうで手早い方法だ。
2. Dual USBアダプターHS を無理やり使う。
Dual USBアダプターHSは、そもそもが中身はFTDI社のFT232である。
ただ、発売元も製品も違うことになるので、独自のベンダーIDとプロダクトIDが割り当てられ
FTDI社のチップではない独自のチップとしてPCからは認識される。
Windowsでは、そのベンダーIDとプロダクトIDの違うドライバを入れれば済む話。
Linuxではどうするかというと、FTDIのドライバモジュールに
ベンダーIDとプロダクトIDを登録すれば良い。
というのは、このページに書いてある。
シリアルUSBアダプターをLinuxで使うには (近藤科学)
http://kondo-robot.com/faq/usb-adapter-for-linux
上記のページに従い、いくつかのコマンドを打てば、
通常のシリアルポートとして使えるはずである。
それでうまく行っていたらこのページは生まれない。
何が起きたかを説明する。
・前提として
Raspberry Pi + Raspbianを用いた場合、
内臓のシリアルポートは /dev/ttyAMAn
USB経由のシリアルポートは /dev/ttyUSBn として認識される。
そのため、USB経由のシリアルポートを探すには
ls /dev/ttyUSB*
と打てば良い。
無事見つかった後、単純に動作確認するなら、
echo A > /dev/ttyUSB0
とか実行すれば、出力される。
そして、事前に、FTDI社公式のICを積んだUSB-シリアル変換アダプタ
超小型USBシリアル変換モジュール (秋月電子通商) @ FT234X
http://akizukidenshi.com/catalog/g/gM-08461/
を用いて、USBシリアルポートが認識&出力できることは確認していた。
・認識されない
同様に、
まず、近藤科学のページの通り
sudo modprobe ftdi_sio vendor=0x165C product=0007
を発行した。
ちなみに、このままだと再起動等すると接続できなくなるので
/etc/rc.localなどに追記しておくと良い。
おそらく、他のFTDIチップ搭載のUSBアダプタ、変換器でも利用できるだろう。
ただし、内容は保証しない。USBアダプターやOS、ハードウェアが恒久的に破損する危険性を
理解した上で自己責任で行うこと。
・はじめに
近藤科学のICSサーボをPCで制御するにはどうするか。
Dual USBアダプターHSという、アダプターが近藤科学から出ているので使う。
終わり。
しかし、それはWindowsの話である。
Linuxから使うにはどうするか。
1.シリアルポートおよびUSB-シリアルアダプタを加工する。
近藤科学のページ
シリアルサーボ制御方法(1) 回路編 (近藤科学)
http://kondo-robot.com/faq/serial-servo-method-tech
にて、マイコンと接続する場合の解説が乗っている。
同様に、FT232RLなどを使って接続すれば良い。
まっとうで手早い方法だ。
2. Dual USBアダプターHS を無理やり使う。
Dual USBアダプターHSは、そもそもが中身はFTDI社のFT232である。
ただ、発売元も製品も違うことになるので、独自のベンダーIDとプロダクトIDが割り当てられ
FTDI社のチップではない独自のチップとしてPCからは認識される。
Windowsでは、そのベンダーIDとプロダクトIDの違うドライバを入れれば済む話。
Linuxではどうするかというと、FTDIのドライバモジュールに
ベンダーIDとプロダクトIDを登録すれば良い。
というのは、このページに書いてある。
シリアルUSBアダプターをLinuxで使うには (近藤科学)
http://kondo-robot.com/faq/usb-adapter-for-linux
上記のページに従い、いくつかのコマンドを打てば、
通常のシリアルポートとして使えるはずである。
それでうまく行っていたらこのページは生まれない。
何が起きたかを説明する。
・前提として
Raspberry Pi + Raspbianを用いた場合、
内臓のシリアルポートは /dev/ttyAMAn
USB経由のシリアルポートは /dev/ttyUSBn として認識される。
そのため、USB経由のシリアルポートを探すには
ls /dev/ttyUSB*
と打てば良い。
無事見つかった後、単純に動作確認するなら、
echo A > /dev/ttyUSB0
とか実行すれば、出力される。
そして、事前に、FTDI社公式のICを積んだUSB-シリアル変換アダプタ
超小型USBシリアル変換モジュール (秋月電子通商) @ FT234X
http://akizukidenshi.com/catalog/g/gM-08461/
を用いて、USBシリアルポートが認識&出力できることは確認していた。
・認識されない
同様に、
まず、近藤科学のページの通り
sudo modprobe ftdi_sio vendor=0x165C product=0007
を発行した。
Dual USBアダプターHSをさし込むが、シリアル・ポートして認識されない。
USB接続された機器を調べる
lsusb
というコマンドを使うと、社名不明で認識されていることがわかった。
しかし、ベンダーIDこそ0x165Cであるが、プロダクトIDが0008であった。
(これは、先ほどのページの最後の方に記載されている。)
「ああ、これが原因か」と思い、
sudo modprobe ftdi_sio vendor=0x165C product=0008
を発行するも、やはり認識されない。
近藤科学のページの通り、dmesgコマンドを実行すると、
どうやら、USB機器としては認識されているが、FTDIの機器として認識されていないことがわかった。
を発行するも、やはり認識されない。
近藤科学のページの通り、dmesgコマンドを実行すると、
どうやら、USB機器としては認識されているが、FTDIの機器として認識されていないことがわかった。
さらにログをたどると、なにやら変なメッセージが。
FTDIのドライバが
「vendorなんてオプションはない、拒否する」(意訳)
「productなんてオプションはない、拒否する」(意訳)
とエラーを吐いているのだ。
タイミング的に、sudo modprobe ftdi_sio vendor=0x165C product=0008を
打ち込んだ結果らしい。
どうも、ftdi_sio vendor=0x165C product=0008という形式のコマンドは
そもそもサポートされていないようだ。
「近藤科学のページに嘘が書かれていたのか?」
と思い検索してみると、どうもこのページが書かれたのは2009年の話。
現在は2015年。
これは怪しいぞ、と思い検索してみると、案の定英語のフォーラムで話があった。
modprobe ftdi_sio errors / Kernel & Hardware / Arch Linux Forums
[SOLVED] ttyUSB not showing up, modprobe unknown parameter 'vendor' & 'product'
どうやら、FTDIのこのコマンドは、デバッグ用か何かだったらしく、
すでに使用できなくなっているとのこと。
対処法は
echo vvvv pppp > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
のように、/sys/bus/usb-serial/drivers/ftdi_sio/new_idに
ベンダーIDとプロダクトIDを書き込んでやることらしい。
もちろん、suでなければならない。
今回の近藤科学のUSBアダプターをRaspberry Piに接続するには以下のようにする。
$ sudo su
# modprobe ftdi-sio
# echo 165C 0008 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
# exit
これで再度dmesgすると、FTDIドライバの認識メッセージが表示されるだろう。
ls /etc/ttyUSB* をすればどの番号に接続されたかわかるはずだ。
近藤科学のすべてのUSBアダプターを使用するには、以下のようにすればよいだろう。
$ sudo su
# modprobe ftdi-sio
# echo 165C 0001 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
# echo 165C 0002 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
# echo 165C 0006 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
# echo 165C 0007 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
# echo 165C 0008 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
# exit
ちなみに、このままだと再起動等すると接続できなくなるので
/etc/rc.localなどに追記しておくと良い。
以上、参考になれば幸いである。
2015年05月30日
Arduino Leonardで、JRプロポのトレーナー信号をUSBジョイスティックに変換するアダプタ作った。(ついでにFMS Interface互換の出力付き)
作り方を以下に紹介しますが。注意事項。
警告:ここでは、プロポの本来の使いからから逸脱したものを紹介しています。
一応安全に気を付け、問題のないように紹介を行っているつもりですが、
結果として、プロポの破損・発煙・炎上・データ破壊・ノーコンなどが発生する恐れがあります。
また、ここで作成した回路をPCPCなどに差し込んだ際、
PCなどが破損・発煙・炎上・データ破壊し、最悪の場合、身体の損傷や火災などを招く危険性があります。
これらリスクを理解もしくは同意のどちらか、もしくはその両方ができない場合は、行わないでください。
筆者は、生じた事故・損害・損傷・データ等に対する賠償・謝罪等の責任を一切負いません。
0. Arduino Leonardを購入します。(いわゆる32U4系ボードやAVRでも可)
1. 以下を参考に、Arduino LeonardでUSBジョイスティック扱いの操作ができるようにします。
Arduino LeonardをUSBジョイスティックにする
http://gpsnmeajp.blogspot.jp/2015/05/arduino-leonardusb.html
2.以下の回路を組み立てます。(ブレッドボードで十分だが、組み込むなら小さめに)
ただし、この回路はJRプロポの出力用なので、他のものを使う場合は
別途回路を組み替えてください。(100k抵抗をGNDに落とす程度)
コンデンサはなくても動きますし、最悪トランジスタ無しで直結した上で
プログラム上の論理を反転すれば動く気がしますが、
JRプロポは最低1万円位すると思うので、万が一のことを考え、おすすめしません。
100kの抵抗は、200kでも多分動きます。
Arduino LeonardをUSBジョイスティックにする
http://gpsnmeajp.blogspot.jp/2015/05/arduino-leonardusb.html
2.以下の回路を組み立てます。(ブレッドボードで十分だが、組み込むなら小さめに)
ただし、この回路はJRプロポの出力用なので、他のものを使う場合は
別途回路を組み替えてください。(100k抵抗をGNDに落とす程度)
コンデンサはなくても動きますし、最悪トランジスタ無しで直結した上で
プログラム上の論理を反転すれば動く気がしますが、
JRプロポは最低1万円位すると思うので、万が一のことを考え、おすすめしません。
100kの抵抗は、200kでも多分動きます。
トランジスタはNPNであれば何でも良いと思います。
私は1815を使ってますが、2001でも問題はないかと。
コンデンサも、大きすぎたり小さすぎたりしなければ問題ないと思います。
私は1815を使ってますが、2001でも問題はないかと。
コンデンサも、大きすぎたり小さすぎたりしなければ問題ないと思います。
ブレッドボードで組むとこんな感じ。
4.以下のプログラムを書き込みます。
5. USBポートに繋げば完成です。
ジョイスティックとしても動作しますし、FMSのシリアルインターフェースとしても動作するので
Arduino Unoしか持ってない、USBジョイスティックとしての機能はいらないから、
3.Arduino Leonardに繋ぎます。
JoyState_t joySt;
void setup()
{
Serial.begin(19200);
pinMode(7,INPUT_PULLUP);
pinMode(13,OUTPUT);
joySt.xAxis = 0;joySt.yAxis = 0;joySt.zAxis = 0;joySt.xRotAxis = 0;joySt.yRotAxis = 0;
joySt.zRotAxis = 0;joySt.throttle = 0;joySt.rudder = 0;joySt.hatSw1 = 0;
joySt.hatSw2 = 0;joySt.buttons = 0;
}
void loop()
{
static int ch=0;
unsigned long cnt = pulseIn(7,LOW,3000);
if(cnt == 0){
interrupts(); //USB通信許可
Joystick.setState(&joySt);
delay(2); //通信時間確保
ch=0;
Serial.write((byte)0xFF);
while(digitalRead(7) == LOW); //次のリーダーパルスまで待つ
noInterrupts(); //通信禁止
}else{
switch(ch)
{
case 0:joySt.throttle = map(cnt,700,1500,0,255);break;
case 1:joySt.xAxis = map(cnt,700,1500,0,255);break;
case 2:joySt.yAxis = map(cnt,700,1500,0,255);break;
case 3:joySt.rudder = map(cnt,700,1500,0,255);break;
case 4:joySt.xRotAxis = map(cnt,700,1500,0,255);break;
case 5:joySt.zAxis = map(cnt,700,1500,0,255); break;
}
ch++;
Serial.write((byte)map(cnt,700,1500,0,254));
}
}
ジョイスティックとしても動作しますし、FMSのシリアルインターフェースとしても動作するので
どちらでも構いません。
FMSで動けばいい、という方はこちら。
少々バタつきはあるかもしれませんが、動くと思います。
void setup()
{
Serial.begin(19200);
pinMode(7,INPUT_PULLUP);
}
void loop()
{
static int ch=0;
unsigned long cnt = pulseIn(7,LOW,3000);
if(cnt == 0){
ch=0;
Serial.write((byte)0xFF);
while(digitalRead(7) == LOW); //次のリーダーパルスまで待つ
}else{
ch++;
Serial.write((byte)map(cnt,700,1500,0,254));
}
}
ついでに、パルス幅を観測したい人向け。ターミナルで開けば数字で出ます。
void setup()
{
Serial.begin(19200);
pinMode(7,INPUT_PULLUP);
}
void loop()
{
static int ch=0;
unsigned long cnt = pulseIn(7,LOW,3000);
if(cnt == 0){
ch=0;
Serial.write((byte)0xFF);
while(digitalRead(7) == LOW); //次のリーダーパルスまで待つ
}else{
ch++;
Serial.print(ch);
Serial.print(':');
Serial.println(cnt);
}
}
Q.なんでLeonard限定なの?
A.USB通信機能を使っているからです。
USB通信機能がないと、まずジョイスティックとして認識させられないというのがひとつ。
もう一つは、超高速な仮想シリアル通信が使えるからです。
Q.ジョイスティックが6chしか反応しないんだけど?
A.私の持ってるプロポが6chだからです。ご自分でプログラムを改造すればすぐ解決します。
多分1,2行程度。ただし、ジョイスティックの入力の数には限界があるので、
8chが限界でしょう。
2015年05月28日
JRのプロポのトレーナー端子のPPM出力について(波形追加)
JR(日本遠隔制御)のプロポのトレーナー端子(トレーナージャック/トレーナーケーブル)のPPM出力について、
調べても調べてもなんか情報が混乱しているというか、微妙に出てこないのでまとめる。
というのも、JRのXG6 NET-R116Gを買ったので、それを色々使おうと思ったら
てんで情報が出てこないので、見つけた情報と説明書を参考に考えてみたものだ。
1.トレーナー信号の波形と振幅、極性
JRのプロポのトレーナー端子の出力は、率直に言ってヘンらしい。
様々なブログやサイトを見てみたが、どこも-1.2〜+0.3[V]らへんの波形を出している。
代表として以下のブログを張っておく。
Lightbridge用 8ch→11ch基板の製作1 XG8のPPM信号をオシロで見てみる - 空の履歴 - Yahoo!ブログ
http://blogs.yahoo.co.jp/helichallenge/35056811.html
実際にオシロスコープで取得した波形を示す。
確かに、-1.2V 〜 +0.2V程度の波形である。振幅Vp-pは1.5Vほどであるらしい
プロポがこんな波形を出す理由がわからない。
ICから直接出すのなら、フタバなどのように、0 〜 +5[V]になるはずである。
そもそもとして、ICなどからこんな正負に振れた波形を出すのは至極面倒なはずだ。
ありえるとするなら、コンデンサでデカップリングしているくらい... と考えていると、
以下のブログが引っかかった。
JRのDSC信号にできるかも - とりあえず「何でもぶろぐ」U
http://oteru0106.exblog.jp/22049137/
抵抗+コンデンサで、CMOS出力をJRプロポ風の出力に出来た、
また、JRのプロポ自体分解してみると出力にコンデンサがつながっていた、ということだった。
実際、オシロスコープで観測した際、最初の観測だけ、徐々に電圧が正から負へと
推移していく様子が見られた。
また、波形が明らかに訛っている。
これで謎が解ける。
JRのトレーナー端子は、ミニプラグ。
ミニプラグには弱点があり、それは「抜き差しした際に信号が短絡する」という問題だ。
中途半端な状態で差し込むと特に起きる。
JRはこの状態でプロポが破損するのを避けるために、デカップリングコンデンサを挟んだのだろう。
PPM波形は交流なので、コンデンサを通しても問題なく伝わる。
また、外部から変な直流(特に、コンデンサマイク用直流電圧)が加わっても遮断されるし、
さらに、この電圧かつ交流であれば、外部のマイク入力などにつないでも破損を起こしにくい。
そういう目的があったのだろう。
2.トレーナー端子には4chしかでてこない?
「JRのプロポはスレーブモードにすると4chしかでないのでダメだ」など、
2chなどで勘違いしている記述を見かける。
どうも、説明書を見る限り、SLAVE MODE(スレーブモード)と、PPM MODE(標準モード)の違いらしい。
結論から先に言うと、「JRのプロポはトレーナー端子に差し込んだ時点でDSCモード
(PPMスレーブモード)になってるので、SLAVEモードに切り替える必要はない」だ。
説明書でも、「親機がノーマルトレーナー (NORMAL) の場合、特に設定として項目があるわけではありませんが、トレーナー のモードを ”SLAVE” とはしないでください。」と書いてある。
SLAVEモードという名前が混乱のもとだと思うが、言い換えるなら、
無設定モード → 一般的なPPM出力スレーブモード・DSCモード
SLAVEモード → 生4chスティックPPM出力モード
らしい。
いうところ、親機と子機の設定の組み合わせが2通りあるようで、
1.親機が通常モード(chをすべてMASTERにする)
子機は何もしない(PPM MODE)
→どういう状態か?
親機は、子機から受け取った信号をそのまま無線に飛ばす。
そのため、トレーナースイッチで親機操作か子機操作かを切り替える。
子機からは、子機で設定されたすべての情報が適用された信号が出ている
結果、子機はDSCモードと等価。全チャネル出力。故に子機側は切り替えが不要。
親機のプロポのSLAVE: PPM MODE というのは、子機はPPM(DSC)モードにしろ、という意味。
XG6などの最近の機種は、トレーナーケーブルを差しこみ自動で電源が入った時点で
PPM(DSC)モードとなっている。
親が通常モードのまま、子をSLAVEモードにするとうまく動かない。
2.親機がプログラムモード(chごとにMASTER、SLAVEを選択)
子機はスレーブモード(SLAVE MODE)
→どういう状態か?
親機は、子機の操作を一旦解釈し、親機の設定を適用、スティックの置き換えをして無線送信。
子機でミキシング等の適用をされると、スティックを推定できずめちゃくちゃになる。
そのため、子機をスレーブモードにし、4chの生のスティック情報だけ出力させることで
後処理は全部親機でやる。
結果、スレーブモードでは子機から4ch分の情報しか出ない。
親機のプロポのSLAVE: SLAVE MODE というのは、子機はSLAVEモードにしろ、という意味。
実際に波形を観測してみたものを以下に示す。
まず、DSCモード。
次に、SLAVEモード。
どちらも、8ch分の出力がされていることがわかる。
しかし、XG6なので、実際に操作可能なのは6chである。
操作してみたとこ、説明書の説明とは違い、SLAVEモードでも
6chすべてが動作していることがわかった。
しかし、SLAVEモードでは、トリムやジャイロ設定は無効となっていることも確認できた。
おそらく、ミキシングなども同様に無効になっているのだろう。
3.トレーナー端子はモノラルじゃなきゃダメ?
写真を見ればわかるが、トレーナーケーブルはモノラルミニプラグである。
ステレオミニプラグを使って色々やっているブログを見ると、
「接触不良なのか、電源が入らないことがある」、「中途半端に差し込むと良い」と書いてあることが多い。
これは、モノラル端子のGND部分で電源を入れる処理をしているのが、
ステレオだとLとRに分離されていて、接触が挿入時の一瞬しかされないための誤動作と考えられる。
ただし、自分はプロポを分解していないので不明である。
素直にモノラルプラグを買ったほうが良いのでは。
マルツなどでは、ケーブル付きのL字型モノラルケーブルが売られている。
トレーナーケーブル同様、コンパクトで良い。
[マルツオンライン] 3.5mm モノラルプラグ付き 1.8m
http://www.marutsu.co.jp/pc/i/107911/
おまけ。
JRのプロポ XG6で観測した全波形を以下に示す。
なにかの参考になるかもしれない。
通常モード
波形の周期は、通説の通り、22.00msであった。
以上。
調べても調べてもなんか情報が混乱しているというか、微妙に出てこないのでまとめる。
というのも、JRのXG6 NET-R116Gを買ったので、それを色々使おうと思ったら
てんで情報が出てこないので、見つけた情報と説明書を参考に考えてみたものだ。
1.トレーナー信号の波形と振幅、極性
JRのプロポのトレーナー端子の出力は、率直に言ってヘンらしい。
様々なブログやサイトを見てみたが、どこも-1.2〜+0.3[V]らへんの波形を出している。
代表として以下のブログを張っておく。
Lightbridge用 8ch→11ch基板の製作1 XG8のPPM信号をオシロで見てみる - 空の履歴 - Yahoo!ブログ
http://blogs.yahoo.co.jp/helichallenge/35056811.html
実際にオシロスコープで取得した波形を示す。
確かに、-1.2V 〜 +0.2V程度の波形である。振幅Vp-pは1.5Vほどであるらしい
プロポがこんな波形を出す理由がわからない。
ICから直接出すのなら、フタバなどのように、0 〜 +5[V]になるはずである。
そもそもとして、ICなどからこんな正負に振れた波形を出すのは至極面倒なはずだ。
ありえるとするなら、コンデンサでデカップリングしているくらい... と考えていると、
以下のブログが引っかかった。
JRのDSC信号にできるかも - とりあえず「何でもぶろぐ」U
http://oteru0106.exblog.jp/22049137/
抵抗+コンデンサで、CMOS出力をJRプロポ風の出力に出来た、
また、JRのプロポ自体分解してみると出力にコンデンサがつながっていた、ということだった。
実際、オシロスコープで観測した際、最初の観測だけ、徐々に電圧が正から負へと
推移していく様子が見られた。
また、波形が明らかに訛っている。
これで謎が解ける。
JRのトレーナー端子は、ミニプラグ。
ミニプラグには弱点があり、それは「抜き差しした際に信号が短絡する」という問題だ。
中途半端な状態で差し込むと特に起きる。
JRはこの状態でプロポが破損するのを避けるために、デカップリングコンデンサを挟んだのだろう。
PPM波形は交流なので、コンデンサを通しても問題なく伝わる。
また、外部から変な直流(特に、コンデンサマイク用直流電圧)が加わっても遮断されるし、
さらに、この電圧かつ交流であれば、外部のマイク入力などにつないでも破損を起こしにくい。
そういう目的があったのだろう。
2.トレーナー端子には4chしかでてこない?
「JRのプロポはスレーブモードにすると4chしかでないのでダメだ」など、
2chなどで勘違いしている記述を見かける。
どうも、説明書を見る限り、SLAVE MODE(スレーブモード)と、PPM MODE(標準モード)の違いらしい。
結論から先に言うと、「JRのプロポはトレーナー端子に差し込んだ時点でDSCモード
(PPMスレーブモード)になってるので、SLAVEモードに切り替える必要はない」だ。
説明書でも、「親機がノーマルトレーナー (NORMAL) の場合、特に設定として項目があるわけではありませんが、トレーナー のモードを ”SLAVE” とはしないでください。」と書いてある。
SLAVEモードという名前が混乱のもとだと思うが、言い換えるなら、
無設定モード → 一般的なPPM出力スレーブモード・DSCモード
SLAVEモード → 生4chスティックPPM出力モード
らしい。
いうところ、親機と子機の設定の組み合わせが2通りあるようで、
1.親機が通常モード(chをすべてMASTERにする)
子機は何もしない(PPM MODE)
→どういう状態か?
親機は、子機から受け取った信号をそのまま無線に飛ばす。
そのため、トレーナースイッチで親機操作か子機操作かを切り替える。
子機からは、子機で設定されたすべての情報が適用された信号が出ている
結果、子機はDSCモードと等価。全チャネル出力。故に子機側は切り替えが不要。
親機のプロポのSLAVE: PPM MODE というのは、子機はPPM(DSC)モードにしろ、という意味。
XG6などの最近の機種は、トレーナーケーブルを差しこみ自動で電源が入った時点で
PPM(DSC)モードとなっている。
親が通常モードのまま、子をSLAVEモードにするとうまく動かない。
2.親機がプログラムモード(chごとにMASTER、SLAVEを選択)
子機はスレーブモード(SLAVE MODE)
→どういう状態か?
親機は、子機の操作を一旦解釈し、親機の設定を適用、スティックの置き換えをして無線送信。
子機でミキシング等の適用をされると、スティックを推定できずめちゃくちゃになる。
そのため、子機をスレーブモードにし、4chの生のスティック情報だけ出力させることで
後処理は全部親機でやる。
結果、スレーブモードでは子機から4ch分の情報しか出ない。
親機のプロポのSLAVE: SLAVE MODE というのは、子機はSLAVEモードにしろ、という意味。
これは、XG6などの機種の場合はSLAVEモードに設定する必要があり、
他の場合は余計な適用が行われない状態にしなければならない、ということだろう。
実際に波形を観測してみたものを以下に示す。
まず、DSCモード。
次に、SLAVEモード。
どちらも、8ch分の出力がされていることがわかる。
しかし、XG6なので、実際に操作可能なのは6chである。
操作してみたとこ、説明書の説明とは違い、SLAVEモードでも
6chすべてが動作していることがわかった。
しかし、SLAVEモードでは、トリムやジャイロ設定は無効となっていることも確認できた。
おそらく、ミキシングなども同様に無効になっているのだろう。
写真を見ればわかるが、トレーナーケーブルはモノラルミニプラグである。
ステレオミニプラグを使って色々やっているブログを見ると、
「接触不良なのか、電源が入らないことがある」、「中途半端に差し込むと良い」と書いてあることが多い。
これは、モノラル端子のGND部分で電源を入れる処理をしているのが、
ステレオだとLとRに分離されていて、接触が挿入時の一瞬しかされないための誤動作と考えられる。
ただし、自分はプロポを分解していないので不明である。
素直にモノラルプラグを買ったほうが良いのでは。
マルツなどでは、ケーブル付きのL字型モノラルケーブルが売られている。
トレーナーケーブル同様、コンパクトで良い。
[マルツオンライン] 3.5mm モノラルプラグ付き 1.8m
http://www.marutsu.co.jp/pc/i/107911/
おまけ。
JRのプロポ XG6で観測した全波形を以下に示す。
なにかの参考になるかもしれない。
通常モード
SLAVEモード時。
波形の周期は、通説の通り、22.00msであった。
出力コンデンサの影響か、訛りが見られる。
ホールドオフをこのくらいの値にすると、波形が暴れにくい(トリガがきちんと掛かりやすい)。
PPMなので、パルス幅は一定の400us。これも通説通り。
パルス間はニュートラルで1.5ms。
最小値で1.1ms。
最大値で1.9ms。
パルス-パルス間時間は、ニュートラルで1.1ms。
最小値で700us。
最大値で1.5ms。
信号。
最後のパルスから次の周期までの時間は、全最大(8ch中6ch最大)で、7.2ms
全最小(8ch中6ch最小)で、12ms。
以上。
2015年05月26日
Arduino LeonardでUSBを生かしつつ割り込みを禁止する
Arduino Leonardで、USB機能を使いつつ、タイミングシビアな信号を受け取りたい、という時。
結構単純で、ループ毎に(感覚的には500ms以内くらい?)
interrupts();
delay(2);
noInterrupts();
を実行してやれば、通信には成功する模様。
delayは1msでは失敗し、2ms以上では問題ないようだ。
また、delayでなくとも、割り込みを許可した状態で一定以上の時間があればいいようだ。
USBの仕様的には、1ループ50ms以内がいいだろう。
結構単純で、ループ毎に(感覚的には500ms以内くらい?)
interrupts();
delay(2);
noInterrupts();
を実行してやれば、通信には成功する模様。
delayは1msでは失敗し、2ms以上では問題ないようだ。
また、delayでなくとも、割り込みを許可した状態で一定以上の時間があればいいようだ。
USBの仕様的には、1ループ50ms以内がいいだろう。
2015年05月25日
Arduino LeonardをUSBジョイスティックにする
ここを参考にすれば良い。
Devel/電子工作/Arduino/ゲームコントローラー - cubic9.com
http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/Arduino/%A5%B2%A1%BC%A5%E0%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%BC/
キーとなるのはここのサイトで、このサイトのHID.hとUSBAPI.hを導入すれば、
他なんの苦労もなく、LeonardがUSBジョイスティックになる...
Turning an Arduino Leonardo into a joystick. | Imaginary Industries
http://www.imaginaryindustries.com/blog/?p=80
と良かったのだが、ならなかった。自分の環境ではコンパイルエラーとなった。
で、どうしたかというと、前者のサイトに公開されていたdiffを使って、
自分の環境のHID.hと、USBAPI.hにパッチを当てた。
それだけで正常に動くようになった。
Arduino 1.0.6でファイル置き換えが上手く動かない場合、diffにしたがってパッチを当てると良い。
パッチを当てる、というのがなんとやら、という人向けに、
パッチ済みファイルも置いておく。1.0.6なら上書きすれば動くと思う。
ただし、動作の保証もしないし、安全の保証もしない。
自己責任で。
ダウンロード↓
https://sites.google.com/site/gpsnmeajp/files/API.zip
Devel/電子工作/Arduino/ゲームコントローラー - cubic9.com
http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/Arduino/%A5%B2%A1%BC%A5%E0%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%BC/
キーとなるのはここのサイトで、このサイトのHID.hとUSBAPI.hを導入すれば、
他なんの苦労もなく、LeonardがUSBジョイスティックになる...
Turning an Arduino Leonardo into a joystick. | Imaginary Industries
http://www.imaginaryindustries.com/blog/?p=80
と良かったのだが、ならなかった。自分の環境ではコンパイルエラーとなった。
で、どうしたかというと、前者のサイトに公開されていたdiffを使って、
自分の環境のHID.hと、USBAPI.hにパッチを当てた。
それだけで正常に動くようになった。
Arduino 1.0.6でファイル置き換えが上手く動かない場合、diffにしたがってパッチを当てると良い。
パッチを当てる、というのがなんとやら、という人向けに、
パッチ済みファイルも置いておく。1.0.6なら上書きすれば動くと思う。
ただし、動作の保証もしないし、安全の保証もしない。
自己責任で。
ダウンロード↓
https://sites.google.com/site/gpsnmeajp/files/API.zip
FMS Flying-Model-Simulator メモ
久しぶりにFMSを触ったのでメモ
1.起動時のエラーは、シリアルポートが1つもないことと、D3DRM.dllが無いのが原因。
シリアルポートの場合の解決方法は
・com0comなど仮想COMポートを導入する
・USB-シリアル変換、もしくはArduinoなどのUSB-COMポートを繋ぐ
・レジストリをいじって適当なシリアルポートを作り出す
の方法がある。自分は、USB-シリアル変換を適当につないだら起動した。
1回起動すれば、以降は外しても問題ないようだ。
D3DRM.dllはどっかから持ってくればいい。
自分は前のPCから引っ張りだしたが、欲しい人は問い合わせてくれればいい。
2.キーコンフィグが失敗する場合
キーコンフィグはバグってるらしく、触らないのが吉だが、
触った上で保存してしまった場合。
HKEY_CURRENT_USER\Software\Flying-Model-Simulator\KeyForm以下を
レジストリエディタで開き、251になってるのを直してあげればOK。
とりあえず。JRプロポ届くまで待機。
1.起動時のエラーは、シリアルポートが1つもないことと、D3DRM.dllが無いのが原因。
シリアルポートの場合の解決方法は
・com0comなど仮想COMポートを導入する
・USB-シリアル変換、もしくはArduinoなどのUSB-COMポートを繋ぐ
・レジストリをいじって適当なシリアルポートを作り出す
の方法がある。自分は、USB-シリアル変換を適当につないだら起動した。
1回起動すれば、以降は外しても問題ないようだ。
D3DRM.dllはどっかから持ってくればいい。
自分は前のPCから引っ張りだしたが、欲しい人は問い合わせてくれればいい。
2.キーコンフィグが失敗する場合
キーコンフィグはバグってるらしく、触らないのが吉だが、
触った上で保存してしまった場合。
HKEY_CURRENT_USER\Software\Flying-Model-Simulator\KeyForm以下を
レジストリエディタで開き、251になってるのを直してあげればOK。
とりあえず。JRプロポ届くまで待機。
2015年04月29日
ChronoEngine導入メモ
1. IRRLICHT ENGINEのx64buildは、READMEに書いてあるとおり、VC Expressではできない。
最近だとVC Communityがあるので、そっちを使えば、なんの苦労もなく(設定調整もなく)、
x64を選択するだけでビルドできる
2.なぜか、ChronoEngineでcmakeを行う際、Irrlichtの指定が1.8.1ではなく1.8になることがある。
やったらファイル存在エラーを吐いてる時はここに注意。
3.ChronoEngineのx64も同様に。
最近だとVC Communityがあるので、そっちを使えば、なんの苦労もなく(設定調整もなく)、
x64を選択するだけでビルドできる
2.なぜか、ChronoEngineでcmakeを行う際、Irrlichtの指定が1.8.1ではなく1.8になることがある。
やったらファイル存在エラーを吐いてる時はここに注意。
3.ChronoEngineのx64も同様に。
WS2812をいじってわかったこと
WS2812をPICから点灯させようとした結果。
俗に言われる、シリアルLED、シリアルRGBLED、テープLED、LEDリングと呼ばれるもの
(自分が購入したのは、NeoPixel Ring - 12連フルカラーシリアルLED)
1.データシートによってタイミングはバラバラだが、以下のサイトの値がちょうどいい感じだった。
秋月でWS2812B買ってしまったので動かないかも知れないけれど作ってみた
http://www.mars.dti.ne.jp/~m7030/pic_room/ws2812b/index.html
確かに、Hの時間が重要で、Lの時間が長い文には問題ないらしい
2.起動一発目の通信は必ずバグるっぽい
全部0にしているのに緑が点灯したりするが、ほっといて二周目以降の通信は正常になる。
(これにだいぶハマった)
3.MPLABXのシミュレートサイクルは、供給クロックではなく、命令サイクル
つまり、32MHzで動作させているのなら8MHzに設定する。
よく読むと書いてあるが、これまたハマった。
時間調整にstopWatch機能を使用したため
4.当然だが、バイト-バイト間の時間が50uSを超えるとリセットされる。
5.光り方が変なときは、電源電流を疑え(特に、点灯数が増えるに連れ赤っぽくなる時)
6.MPASMで使えたMOVFWとかは使えない。なぜかSTATUS,Zの指定もできない(Z=2)
X8Cで、16F1705を32MHzで動作させた場合のサンプルを置いておく。
エディタではエラー表示が大量に出るが、コンパイルは問題なく通る。
asm_testが1つのLEDにデータを送る処理となる。
static volatile char cnt;
static volatile char TMP;
static volatile char asmR;
static volatile char asmG;
static volatile char asmB;
void asm_test(char R,char G,char B)
{
asmR = R;
asmG = G;
asmB = B;
#asm
MOVF _asmG,W
call SEND
MOVF _asmR,W
call SEND
MOVF _asmB,W
call SEND
goto EXIT
SEND:
MOVWF _TMP
MOVLW 8
MOVWF _cnt
LP_R:
MOVF _TMP,W
RLF _TMP,f
ANDLW 0x80
BTFSC STATUS,2
goto BIT_LOW
goto BIT_HIGH
LP_B:
DECFSZ _cnt
goto LP_R
return
BIT_LOW:
bsf LATC,0 //125ns
nop //125ns
nop //125ns
bcf LATC,0
goto LP_B
BIT_HIGH:
bsf LATC,0 //125ns
nop //125ns
nop //125ns
nop //125ns
nop //125ns
bcf LATC,0
goto LP_B
EXIT:
nop
#endasm
}
void send_led(char R[],char G[],char B[])
{
__delay_us(50); //ある程度高速に送ってやらないとダメ。
asm_test(R[0],G[0],B[0]);
asm_test(R[1],G[1],B[1]);
asm_test(R[2],G[2],B[2]);
asm_test(R[3],G[3],B[3]);
asm_test(R[4],G[4],B[4]);
asm_test(R[5],G[5],B[5]);
asm_test(R[6],G[6],B[6]);
asm_test(R[7],G[7],B[7]);
asm_test(R[8],G[8],B[8]);
asm_test(R[9],G[9],B[9]);
asm_test(R[10],G[10],B[10]);
asm_test(R[11],G[11],B[11]);
asm_test(R[12],G[12],B[12]);
}
俗に言われる、シリアルLED、シリアルRGBLED、テープLED、LEDリングと呼ばれるもの
(自分が購入したのは、NeoPixel Ring - 12連フルカラーシリアルLED)
1.データシートによってタイミングはバラバラだが、以下のサイトの値がちょうどいい感じだった。
秋月でWS2812B買ってしまったので動かないかも知れないけれど作ってみた
http://www.mars.dti.ne.jp/~m7030/pic_room/ws2812b/index.html
確かに、Hの時間が重要で、Lの時間が長い文には問題ないらしい
2.起動一発目の通信は必ずバグるっぽい
全部0にしているのに緑が点灯したりするが、ほっといて二周目以降の通信は正常になる。
(これにだいぶハマった)
3.MPLABXのシミュレートサイクルは、供給クロックではなく、命令サイクル
つまり、32MHzで動作させているのなら8MHzに設定する。
よく読むと書いてあるが、これまたハマった。
時間調整にstopWatch機能を使用したため
4.当然だが、バイト-バイト間の時間が50uSを超えるとリセットされる。
5.光り方が変なときは、電源電流を疑え(特に、点灯数が増えるに連れ赤っぽくなる時)
6.MPASMで使えたMOVFWとかは使えない。なぜかSTATUS,Zの指定もできない(Z=2)
X8Cで、16F1705を32MHzで動作させた場合のサンプルを置いておく。
エディタではエラー表示が大量に出るが、コンパイルは問題なく通る。
asm_testが1つのLEDにデータを送る処理となる。
static volatile char cnt;
static volatile char TMP;
static volatile char asmR;
static volatile char asmG;
static volatile char asmB;
void asm_test(char R,char G,char B)
{
asmR = R;
asmG = G;
asmB = B;
#asm
MOVF _asmG,W
call SEND
MOVF _asmR,W
call SEND
MOVF _asmB,W
call SEND
goto EXIT
SEND:
MOVWF _TMP
MOVLW 8
MOVWF _cnt
LP_R:
MOVF _TMP,W
RLF _TMP,f
ANDLW 0x80
BTFSC STATUS,2
goto BIT_LOW
goto BIT_HIGH
LP_B:
DECFSZ _cnt
goto LP_R
return
BIT_LOW:
bsf LATC,0 //125ns
nop //125ns
nop //125ns
bcf LATC,0
goto LP_B
BIT_HIGH:
bsf LATC,0 //125ns
nop //125ns
nop //125ns
nop //125ns
nop //125ns
bcf LATC,0
goto LP_B
EXIT:
nop
#endasm
}
void send_led(char R[],char G[],char B[])
{
__delay_us(50); //ある程度高速に送ってやらないとダメ。
asm_test(R[0],G[0],B[0]);
asm_test(R[1],G[1],B[1]);
asm_test(R[2],G[2],B[2]);
asm_test(R[3],G[3],B[3]);
asm_test(R[4],G[4],B[4]);
asm_test(R[5],G[5],B[5]);
asm_test(R[6],G[6],B[6]);
asm_test(R[7],G[7],B[7]);
asm_test(R[8],G[8],B[8]);
asm_test(R[9],G[9],B[9]);
asm_test(R[10],G[10],B[10]);
asm_test(R[11],G[11],B[11]);
asm_test(R[12],G[12],B[12]);
}
2015年04月22日
FlashAirでやったこと
サンプルスクリプト一覧
・Pushoverを通してスマホに通知
・Stewgate-Uを通してtwitterにツイート
・Pastebinからテキストファイルをダウンロード
・ポメラからLuaスクリプトを組むための補助スクリプト8_sys_pomeralua
・Dropboxへ自動アップロード
・スクリプトをHTTPサーバーからダウンロードして実行
・フリーズ試験用スクリプト
・ソフトSPIもどき(Arduino風版)
・ソフトSPIもどき(チューンアップ版)
・ソフトI2Cで秋月I2C液晶を駆動
・ソフトPWM
・隠し関数解析結果
ライブラリ的なもの
・pioduino (fa.pioをArduino風に扱う)
・pioduino for FlashAirプロトタイピングボード
(イベントで配布された非公式開発ボードのSPI-I2Cブリッジ補助関数、秋月LCD制御関数と、Arduino風GPIO制御関数)
その他表に出してないけどやったもの
・I2C経由でAquesTalk Picoを制御してしゃべる
・I2C経由でLEDマトリクスを表示
・Googleスプレッドシートに書き込み(ニコニコに動画あり)
・ソフトSPIもどきを経由して、Arduinoを通し、e-DISP(カラー液晶)を制御(ニコニコに動画あり)
・ボタンと液晶でメニュー実装して操作してみる
・FlashAir同士のIBSS通信でLチカ同期
・FlashAir同士のルータ経由の通信でLチカ同期
・FlashAir同士のAP-STA通信でLチカ同期
・ポメラ用テキストブラウザ(Google携帯電話変換利用)
・IPアドレス固定化
・ハードウェアSPI通信(fa.HTTPGetFileのバグにより頓挫)
・PCからGET経由での液晶制御(URL長さバグにより頓挫)
・ComputerCraftとの提携(Lua不使用)
・諸所の不具合調査
(URLバグ、リターンスタックバグ、CP2120GPIOの仕様...etc)
・Pushoverを通してスマホに通知
・Stewgate-Uを通してtwitterにツイート
・Pastebinからテキストファイルをダウンロード
・ポメラからLuaスクリプトを組むための補助スクリプト8_sys_pomeralua
・Dropboxへ自動アップロード
・スクリプトをHTTPサーバーからダウンロードして実行
・フリーズ試験用スクリプト
・ソフトSPIもどき(Arduino風版)
・ソフトSPIもどき(チューンアップ版)
・ソフトI2Cで秋月I2C液晶を駆動
・ソフトPWM
・隠し関数解析結果
ライブラリ的なもの
・pioduino (fa.pioをArduino風に扱う)
・pioduino for FlashAirプロトタイピングボード
(イベントで配布された非公式開発ボードのSPI-I2Cブリッジ補助関数、秋月LCD制御関数と、Arduino風GPIO制御関数)
その他表に出してないけどやったもの
・I2C経由でAquesTalk Picoを制御してしゃべる
・I2C経由でLEDマトリクスを表示
・Googleスプレッドシートに書き込み(ニコニコに動画あり)
・ソフトSPIもどきを経由して、Arduinoを通し、e-DISP(カラー液晶)を制御(ニコニコに動画あり)
・ボタンと液晶でメニュー実装して操作してみる
・FlashAir同士のIBSS通信でLチカ同期
・FlashAir同士のルータ経由の通信でLチカ同期
・FlashAir同士のAP-STA通信でLチカ同期
・ポメラ用テキストブラウザ(Google携帯電話変換利用)
・IPアドレス固定化
・ハードウェアSPI通信(fa.HTTPGetFileのバグにより頓挫)
・PCからGET経由での液晶制御(URL長さバグにより頓挫)
・ComputerCraftとの提携(Lua不使用)
・諸所の不具合調査
(URLバグ、リターンスタックバグ、CP2120GPIOの仕様...etc)
2015年04月13日
FlashAirへの要望等々
意見要望等があれば書いて欲しい、というお話があったので、
とりあえず、書くだけ書いてみる。
書いてみただけなので、需要とか、実現可能性はあまり考慮していない。
(特に可能性の低そうなものは優先度低としている)
>不具合対応
FA9CAW3AW3.00.01で修正された
・関数をネストした時、特にfa.requestなどを使った際に、SDカード機能ごとフリーズして
ホスト機器を巻き込むのをやめてほしい。
Luaインタプリタ側でエラーを吐いて止めて、メモリをクリーンアップしてくれるのが一番だが、
できなくとも、せめてSDカード機能は死守してほしい。可能ならWebサーバー機能も。
・dofile、requireで2KB以上のファイルを読み込んだ時に、組み込み関数の動作が不安定に
なる(もしくはフリーズする)問題も同様である。
→改善されたようです。
・fa.HTTPGetfileの、受信に失敗してゴミデータを生成する状態、および、
受信には成功しているがデータに異常が発生する状態をどうにかしてほしい。
→取得成功するか、失敗して空ファイルが出来上がるか、だけになったようです。
・URLの長さ制限が142文字なのはいいとしても、それを超えるとエラー無しに
URLが切れ、ゴミデータがつくのはやめてほしい。
無理ならば、128Byteくらいで414 Request URI too long を返してほしい。
(あまりにも長いようなら、500が帰ってきているようだが)
→124文字で414 Request-URI Too Largeが帰るようになりました。
・URLゴミ蓄積問題(数十回の長いURL呼び出しでWebサーバーが落ちる問題)をどうにかしてほしい。
おそらく、Lua外のメモリがリークしているか、開放されずに食いつぶされているようにみえる。
上記の不具合については、以下のURLに詳細を掲示しているので参照してほしい。
https://sites.google.com/site/gpsnmeajp/flashairnobagu-de-ju-dong
・fa.requestにおいて、http://192.168.1.3:8080/ のようなポート番号付きURLのアクセスに対応していない問題を解決してほしい。
→新板でも改善していない。
>改善要望
*優先度高
・fa.requestおよび、HTTPGetFileで、独自のユーザーエージェントを設定してほしい。
サーバ管理者がアクセス元を識別できず、困ったことになる。
(デフォルトで設定し、別に指定したいものがあれば上書きできるようにすると良いと思う)
・HTTPGetFileで、ヘッダの編集機能を追加してほしい。
現在はHTTP/1.1と、Hostと、BASIC認証しかなく、取得したいものが取りにいけない場合がある。
・command.cgi、upload.cgiにある機能はすべてLuaから操作できるようにしてほしい。
共有メモリや、ホスト機器書き込みプロテクトが特に必要。
→共有メモリは実装された。
・STAモードで接続した時、flashair/にアクセスするとリダイレクトループに巻き込まれるのを
どうにかしてほしい。
→治った?
・iPhoneから、誤ったファイルにアクセスした際、またflashair/にアクセスした際、
リダイレクトループに巻き込まれるのをどうにかしてほしい。
・Luaからしかアクセス出来ない領域がほしい。
(ホスト機器からFAT破壊を起こされる心配のない、Luaからしか見えない
ファイル領域があるとすごく嬉しい(16MBくらい))
→現在は、破壊を受ける心配のないホスト機器のみに厳選し、
タイミングを計って操作する必要がある。専用領域があれば、その心配なく
すべでの機器で、アップロード次のファイル管理などが出来る様になる。
専用領域は開発者用ツールなどで操作できると嬉しいが、できなくてもよい。
ファイルシステムが無理なら、せめてArduinoのEEPROMライブラリのようなものが
あれば、最悪何とかなる。
・fa.reqestにタイムアウト設定がほしい。
(よく、応答なくなったまま帰ってこなくなる)
・ブラウザからfa.requestを呼び出してflashair自身にアクセスすると
503エラーを出すのを何とかしてほしい。
(成功するか、もしくは、関数側で拒否してほしい)
・起動時などのLuaスクリプトを動作させながら、ブラウザからLuaスクリプトを呼び出すと
ブラウザの応答がなくなるのをどうにかしてほしい(エラーを返してほしい)
*優先度低
・GoogleChromeでアクセスした際に応答が遅いのを何とかできないだろうか。
(iPhone等でもたまに非常に応答が悪い場合がある)
・GETのみでなく、POSTを受け付けてほしい。
また、POSTを受け取るための関数か、環境変数を用意してほしい。
・東芝設定ツールの「初期化」でクイックフォーマットをしてほしい。
(設定の初期化と、ファイルの削除くらいしかしていないように見える)
現在は、FATが破損した際、WindowsかSDアソシエーションのフォーマッタから
クイックフォーマットの上、さらに設定ツールで初期化をするため、無駄に手間がかかる。
・PIO関数でなく、ホスト機器から初期化されているか否かチェックできる関数がほしい。
・HTTPでない、生のソケット通信ができると嬉しい
サーバーとして受付できるとさらに嬉しい
これらができると、他の無線モジュールと同等の立ち位置で使用できる。
・ComputerCraftのように、イベント駆動のプログラムが組めるようになると嬉しい。
例えば、fa.request_nonblockというように、要求だけ先に送り、
あとから受け取れる機能があると嬉しい。
(sleepの間に実行ということになるだろうが)
http://computercraft.info/wiki/Os.pullEvent
・同様に、タイマー(アラーム)、IO変化などの割り込みがあると嬉しい。
・エンコードの変換関数があると嬉しい。
(SJIS←→UTF-8など)
→実装された。
・再起動関数および、command.cgiからの再起動があると良い。
・LUA_SD_EVENTで起動する際、引数にトリガになったファイルのパスを
入れてくれると、非常に汎用性が上がる。(いちいちディレクトリスキャンをせずにすむ)
・APモードおよびIBSSモードで、接続している子機のMACアドレスとIPアドレスの対応テーブルが
あると、なにかと便利である。強制切断がLuaから行えると、セキュリティにもなる。
・CGI実行時、アクセス元のIPアドレスとMACアドレスが取得できると、
業務用アプリケーションにおいて、簡易な不正防止が実装できる。
(Wi-Fiのパスワードはクラックされる危険がそこそこに高いので)
可能であれば、ユーザーエージェントなど、通常CGIでえられる環境変数をすべて取得できると
より良い。
・現在隠し(未公開/非公開)となっている関数を正式にサポートしてほしい。
ドキュメントがあると嬉しいが、ないのなら、せめて存在していることだけでも公式に示してほしい。
(政治上の理由等で不可能であるのなら無理にとは言わない)
→fa.spiは公開された。
とりあえず、書くだけ書いてみる。
書いてみただけなので、需要とか、実現可能性はあまり考慮していない。
(特に可能性の低そうなものは優先度低としている)
>不具合対応
FA9CAW3AW3.00.01で修正された
→改善されたようです。
→取得成功するか、失敗して空ファイルが出来上がるか、だけになったようです。
→124文字で414 Request-URI Too Largeが帰るようになりました。
・fa.requestにおいて、http://192.168.1.3:8080/ のようなポート番号付きURLのアクセスに対応していない問題を解決してほしい。
→新板でも改善していない。
>改善要望
*優先度高
・fa.requestおよび、HTTPGetFileで、独自のユーザーエージェントを設定してほしい。
サーバ管理者がアクセス元を識別できず、困ったことになる。
(デフォルトで設定し、別に指定したいものがあれば上書きできるようにすると良いと思う)
・HTTPGetFileで、ヘッダの編集機能を追加してほしい。
現在はHTTP/1.1と、Hostと、BASIC認証しかなく、取得したいものが取りにいけない場合がある。
→共有メモリは実装された。
→治った?
・iPhoneから、誤ったファイルにアクセスした際、またflashair/にアクセスした際、
リダイレクトループに巻き込まれるのをどうにかしてほしい。
・Luaからしかアクセス出来ない領域がほしい。
(ホスト機器からFAT破壊を起こされる心配のない、Luaからしか見えない
ファイル領域があるとすごく嬉しい(16MBくらい))
→現在は、破壊を受ける心配のないホスト機器のみに厳選し、
タイミングを計って操作する必要がある。専用領域があれば、その心配なく
すべでの機器で、アップロード次のファイル管理などが出来る様になる。
専用領域は開発者用ツールなどで操作できると嬉しいが、できなくてもよい。
ファイルシステムが無理なら、せめてArduinoのEEPROMライブラリのようなものが
あれば、最悪何とかなる。
・fa.reqestにタイムアウト設定がほしい。
(よく、応答なくなったまま帰ってこなくなる)
・ブラウザからfa.requestを呼び出してflashair自身にアクセスすると
503エラーを出すのを何とかしてほしい。
(成功するか、もしくは、関数側で拒否してほしい)
・起動時などのLuaスクリプトを動作させながら、ブラウザからLuaスクリプトを呼び出すと
ブラウザの応答がなくなるのをどうにかしてほしい(エラーを返してほしい)
*優先度低
・GoogleChromeでアクセスした際に応答が遅いのを何とかできないだろうか。
(iPhone等でもたまに非常に応答が悪い場合がある)
・GETのみでなく、POSTを受け付けてほしい。
また、POSTを受け取るための関数か、環境変数を用意してほしい。
・東芝設定ツールの「初期化」でクイックフォーマットをしてほしい。
(設定の初期化と、ファイルの削除くらいしかしていないように見える)
現在は、FATが破損した際、WindowsかSDアソシエーションのフォーマッタから
クイックフォーマットの上、さらに設定ツールで初期化をするため、無駄に手間がかかる。
・PIO関数でなく、ホスト機器から初期化されているか否かチェックできる関数がほしい。
・HTTPでない、生のソケット通信ができると嬉しい
サーバーとして受付できるとさらに嬉しい
これらができると、他の無線モジュールと同等の立ち位置で使用できる。
・ComputerCraftのように、イベント駆動のプログラムが組めるようになると嬉しい。
例えば、fa.request_nonblockというように、要求だけ先に送り、
あとから受け取れる機能があると嬉しい。
(sleepの間に実行ということになるだろうが)
http://computercraft.info/wiki/Os.pullEvent
・同様に、タイマー(アラーム)、IO変化などの割り込みがあると嬉しい。
→実装された。
・LUA_SD_EVENTで起動する際、引数にトリガになったファイルのパスを
入れてくれると、非常に汎用性が上がる。(いちいちディレクトリスキャンをせずにすむ)
・APモードおよびIBSSモードで、接続している子機のMACアドレスとIPアドレスの対応テーブルが
あると、なにかと便利である。強制切断がLuaから行えると、セキュリティにもなる。
・CGI実行時、アクセス元のIPアドレスとMACアドレスが取得できると、
業務用アプリケーションにおいて、簡易な不正防止が実装できる。
(Wi-Fiのパスワードはクラックされる危険がそこそこに高いので)
可能であれば、ユーザーエージェントなど、通常CGIでえられる環境変数をすべて取得できると
より良い。
・現在隠し(未公開/非公開)となっている関数を正式にサポートしてほしい。
ドキュメントがあると嬉しいが、ないのなら、せめて存在していることだけでも公式に示してほしい。
(政治上の理由等で不可能であるのなら無理にとは言わない)
→fa.spiは公開された。
・コルーチン機能を、次期バージョン(W-04)でもいいので実装されるとうれしい。
Windows8.1でアドホックネットワークを作る・接続する
Windows8.1でアドホックネットワークを作る・接続する手順。
探してもなかなか出てこないので。
ソフトAPはここじゃないです。この1つ前の記事を参照すると幸せになれます。
ここを見れば一発ですが、日本語で書いておく。
Windows 8.1 connecting to Ad Hoc networks
https://social.technet.microsoft.com/forums/windows/en-US/56ff83ff-1f15-4fc1-aa37-6651340d46fa/windows-81-connecting-to-ad-hoc-networks
1.「ネットワークと共有センター」を開く
2.「新しい接続またはネットワークのセットアップ」を開く
3.「ワイヤレス ネットワークに手動で接続します」を選ぶ
4.「ネットワーク名」にSSIDを選び、セキュリティの種類を選ぶ。
正しいアドホックネットワークでは、オープンアクセスかWEPが望ましいが、
より強固なセキュリティでは、接続できる機器とできない機器が現れる。
5.「この接続を自動的に開始します(T)」がオンでないことを確認する
(WEPを選ぶとチェックが入るので外す)
6.次へ
7.正常に(SSID)を追加しました が出たら、閉じる。
8.管理者権限のあるコマンドプロンプトを開く
9. netsh wlan set profileparameter connectiontype=ibss
(ネットワークの種別を通常の物から、アドホックに変更する)
10. netsh wlan connect
(アドホックネットワークを開始する)
11. IPアドレスは自分で設定しましょう。
12. netsh wlan disconnect
(アドホックネットワークから切断する)
13. netsh wlan delete profile
(作ったプロファイルを削除する)
※netshでネットワークプロファイルを作成するのは面倒っぽい
探してもなかなか出てこないので。
ソフトAPはここじゃないです。この1つ前の記事を参照すると幸せになれます。
あくまで「アドホックネットワーク」「Adhoc」「IBSS」の接続でやりたい方に
(いろいろ問題があるので、可能なら使わないことをお勧めしますが)
Windows 8.1 connecting to Ad Hoc networks
https://social.technet.microsoft.com/forums/windows/en-US/56ff83ff-1f15-4fc1-aa37-6651340d46fa/windows-81-connecting-to-ad-hoc-networks
1.「ネットワークと共有センター」を開く
2.「新しい接続またはネットワークのセットアップ」を開く
3.「ワイヤレス ネットワークに手動で接続します」を選ぶ
4.「ネットワーク名」にSSIDを選び、セキュリティの種類を選ぶ。
正しいアドホックネットワークでは、オープンアクセスかWEPが望ましいが、
より強固なセキュリティでは、接続できる機器とできない機器が現れる。
5.「この接続を自動的に開始します(T)」がオンでないことを確認する
(WEPを選ぶとチェックが入るので外す)
6.次へ
7.正常に(SSID)を追加しました が出たら、閉じる。
8.管理者権限のあるコマンドプロンプトを開く
9. netsh wlan set profileparameter
(ネットワークの種別を通常の物から、アドホックに変更する)
10. netsh wlan connect
(アドホックネットワークを開始する)
11. IPアドレスは自分で設定しましょう。
12. netsh wlan disconnect
(アドホックネットワークから切断する)
13. netsh wlan delete profile
(作ったプロファイルを削除する)
※netshでネットワークプロファイルを作成するのは面倒っぽい
Windows8.1でソフトウェアアクセスポイントを起動するためのバッチファイル
Windows8.1で、PCを親機としたソフトAPを使いたいことがあると思う。
GUIから設定できなくなったらしい。
以下のバッチを使えば、自動でソフトAPを起動&終了することができる。
一時的に使用せざるを得ない状況になった時に使うといい。
@echo off
echo 管理者権限で実行せよ。中止するならCtrl+Cを押せ。
SET /P SSID=Enter_SSID:
SET /P KEY=Enter_KEY:
netsh wlan set hostednetwork mode=allow
netsh wlan set hostednetwork ssid=%SSID% key=%KEY%
netsh wlan start hostednetwork
echo ソフトAPモード開始
echo なにかキーを押すとソフトAPモードを停止する
echo SSIDは%SSID%、キーは%KEY%
pause > NUL
netsh wlan stop hostednetwork
echo ソフトAPを停止した。なにかキーを押すと終了する。
pause >NUL
GUIから設定できなくなったらしい。
以下のバッチを使えば、自動でソフトAPを起動&終了することができる。
一時的に使用せざるを得ない状況になった時に使うといい。
@echo off
echo 管理者権限で実行せよ。中止するならCtrl+Cを押せ。
SET /P SSID=Enter_SSID:
SET /P KEY=Enter_KEY:
netsh wlan set hostednetwork mode=allow
netsh wlan set hostednetwork ssid=%SSID% key=%KEY%
netsh wlan start hostednetwork
echo ソフトAPモード開始
echo なにかキーを押すとソフトAPモードを停止する
echo SSIDは%SSID%、キーは%KEY%
pause > NUL
netsh wlan stop hostednetwork
echo ソフトAPを停止した。なにかキーを押すと終了する。
pause >NUL
2015年04月09日
Windows リソース保護により、破損したファイルが見つかりましたが、それらの一部は修復できませんでした。 と出た時。
sfc /scannnow で
Windows リソース保護により、破損したファイルが見つかりましたが、それらの
一部は修復できませんでした。
と表示された時。
結論
DISM.exe /Online /Cleanup-image /ScanHealth さらに高機能な自動検査
DISM.exe /Online /Cleanup-image /Restorehealth さらに高機能な自動修復
つまり、Windows 8以上なら
DISM.exe /Online /Cleanup-image /Restorehealth
を実行すれば修復してくれる。
---以下、実行したときのログ---
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\windows\system32>sfc /scannow
システム スキャンを開始しています。これにはしばらく時間がかかります。
システム スキャンの検証フェーズを開始しています。
検証 100% が完了しました。
Windows リソース保護により、破損したファイルが見つかりましたが、それらの
一部は修復できませんでした。詳細は CBS.Log windir\Logs\CBS\CBS.log に
含まれています。例: C:\Windows\Logs\CBS\CBS.log。ただし、オフライン
サービス シナリオでのログの記録は現在サポートされていません。
C:\windows\system32>Dism /Online /Cleanup-Image /ScanHealth
展開イメージのサービスと管理ツール
バージョン: 6.3.9600.17031
イメージのバージョン: 6.3.9600.17031
[==========================100.0%==========================]
コンポーネント ストアは修復できます。
操作は正常に完了しました。
C:\windows\system32>DISM.exe /Online /Cleanup-image /Restorehealth
展開イメージのサービスと管理ツール
バージョン: 6.3.9600.17031
イメージのバージョン: 6.3.9600.17031
[==========================100.0%==========================]
復元操作は正常に完了しました。壊れたコンポーネント ストアは修復されました。
操作は正常に完了しました。
C:\windows\system32>sfc /scannow
システム スキャンを開始しています。これにはしばらく時間がかかります。
システム スキャンの検証フェーズを開始しています。
検証 100% が完了しました。
Windows リソース保護は、整合性違反を検出しませんでした。
C:\windows\system32>
Windows リソース保護により、破損したファイルが見つかりましたが、それらの
一部は修復できませんでした。
と表示された時。
結論
DISM.exe /Online /Cleanup-image /ScanHealth さらに高機能な自動検査
DISM.exe /Online /Cleanup-image /Restorehealth さらに高機能な自動修復
つまり、Windows 8以上なら
DISM.exe /Online /Cleanup-image /Restorehealth
を実行すれば修復してくれる。
---以下、実行したときのログ---
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\windows\system32>sfc /scannow
システム スキャンを開始しています。これにはしばらく時間がかかります。
システム スキャンの検証フェーズを開始しています。
検証 100% が完了しました。
Windows リソース保護により、破損したファイルが見つかりましたが、それらの
一部は修復できませんでした。詳細は CBS.Log windir\Logs\CBS\CBS.log に
含まれています。例: C:\Windows\Logs\CBS\CBS.log。ただし、オフライン
サービス シナリオでのログの記録は現在サポートされていません。
C:\windows\system32>Dism /Online /Cleanup-Image /ScanHealth
展開イメージのサービスと管理ツール
バージョン: 6.3.9600.17031
イメージのバージョン: 6.3.9600.17031
[==========================100.0%==========================]
コンポーネント ストアは修復できます。
操作は正常に完了しました。
C:\windows\system32>DISM.exe /Online /Cleanup-image /Restorehealth
展開イメージのサービスと管理ツール
バージョン: 6.3.9600.17031
イメージのバージョン: 6.3.9600.17031
[==========================100.0%==========================]
復元操作は正常に完了しました。壊れたコンポーネント ストアは修復されました。
操作は正常に完了しました。
C:\windows\system32>sfc /scannow
システム スキャンを開始しています。これにはしばらく時間がかかります。
システム スキャンの検証フェーズを開始しています。
検証 100% が完了しました。
Windows リソース保護は、整合性違反を検出しませんでした。
C:\windows\system32>
2015年04月04日
GoogleSitesにガジェットを挿入する手順(Google Driveの公開機能を使う)
GoogleSitesにガジェットを挿入する手順(Google Driveの公開機能を使う)
(Googleガジェットエディタが使用不能になってりるので)
(Googleガジェットエディタが使用不能になってりるので)
1.外部公開フォルダを作る
2.そこにXMLファイルを保存する
使いたいjavascript
]]>
3.その共有リンクを取得する
https://drive.google.com/folderview?id=[[ フォルダID ]]&usp=sharing
4.そこから外部アクセス用URLに加工し、アクセス(シンプルなファイル一覧になる)
https://googledrive.com/host/[[フォルダID]]
5.XMLファイルを開き、そこからURLを作成する
(めっちゃ長いアドレスです)
6.サイトから挿入(その他のガジェット)
2015年03月27日
#FlashAir をいじっている記録
※本情報は、参考のために残しており、古い情報を含みます。
現在主に更新しているのはwikiですので、最新の情報はwikiを参照してください。
---
現在進行形でいじってるので、ブログにまとめるのも面倒ということで、Togetterのほうに適時まとめてます。
FlashAirをいじった記録 - Togetterまとめ http://togetter.com/li/800274
いじりながらつぶやいていることをまとめているので、誤りや
誤解、愚痴など混ざっていますので、参考にされる場合ご注意ください。
だって、他の人がLua使えるSDカードとしていじってる話、全然聞かないんだもの。
2015年03月25日
FlashAir上でLuaスクリプトのエラーを表示する
FlashAir III(W-03)でLuaスクリプトを動かす際、一番厄介なのは エラーメッセージが出力されないことだと思います。 文法ミス1つでもあればこう。
昔懐かしいCGIのよう。

PC上で試しに動かしてから書き込めばいいのですが、それも面倒といえば面倒。 しかし、Luaにはpcallという、エラーをハンドリングする機能があります。 それを使ってやると、FlashAir側には正常なように処理しつつ、Luaのエラーを ブラウザに出力することができます。 まず、debug.luaとして以下のものを用意。 f = loadfile("body.lua") local flag, ret = pcall(f) if not flag then
print("HTTP/1.1 500 Internal Server Error\n\n") print("Hello World!! ") print("
このようにエラー内容が表示されて停止します。 また、body.luaを次のようにしてみます。 print("WoW") HELLO print("WoW") body.luaを直接実行すると、HELLOが文法エラーのため、なにも実行されずに停止します。 debug.luaを通して実行すると
のように表示されます。 いかがでしょうか。 printの代わりにファイルに出力するようにすれば、自動実行や書き込み時実行の luaファイルも同様にデバッグ可能になると思います。 参考になると幸いです。
ちなみに、この機能も含めてブラウザ上で動く簡易IDEがあります。
https://sites.google.com/site/gpsnmeajp/tools/flashair_tiny_lua_editer
昔懐かしいCGIのよう。

PC上で試しに動かしてから書き込めばいいのですが、それも面倒といえば面倒。 しかし、Luaにはpcallという、エラーをハンドリングする機能があります。 それを使ってやると、FlashAir側には正常なように処理しつつ、Luaのエラーを ブラウザに出力することができます。 まず、debug.luaとして以下のものを用意。 f = loadfile("body.lua") local flag, ret = pcall(f) if not flag then
print("HTTP/1.1 500 Internal Server Error\n\n") print("
") print("!!! Lua error detected.!!!\n") print("------------\n") print(ret) print("\n------------\n") print("") else print("") end 次に、デバッグしたいLuaファイルをbody.luaとして用意。 ここでは以下のものをサンプルとして用意 print("
Hello World!
") error("Hell World") print("Have a nice day!") print("") これらを同じフォルダに置き、debug.luaを実行。 ここでは、body.luaのほうにerror関数があるので、実行中にエラーが発生します。 そのため、body.lua単体で実行すると尻切れトンボになりますが debug.luaを通して実行するとこのようにエラー内容が表示されて停止します。 また、body.luaを次のようにしてみます。 print("WoW") HELLO print("WoW") body.luaを直接実行すると、HELLOが文法エラーのため、なにも実行されずに停止します。 debug.luaを通して実行すると
のように表示されます。 いかがでしょうか。 printの代わりにファイルに出力するようにすれば、自動実行や書き込み時実行の luaファイルも同様にデバッグ可能になると思います。 参考になると幸いです。
ちなみに、この機能も含めてブラウザ上で動く簡易IDEがあります。
https://sites.google.com/site/gpsnmeajp/tools/flashair_tiny_lua_editer