とりちらかったもろもろの言葉たち

ちょっと大きめのつぶやきにすぎない戯言をとりあえず書いてみました

カテゴリーアーカイブ: ちょこっとノウハウ

Bluetooth Developer Studioの利用例

Bluetooth Developer Studio(BDS)でAndroidのプログラムを作ったら超絶簡単だったので記録しておく。

最初にAndroid Clientのプラグインをインストールする。といっても、BDSの「Plugin」フォルダーに、Pluginのサンプル(ここにあったヤツを使ったけど、そもそもBDSのExamplesに入っているヤツでもよさそう)をフォルダーごと放り込んであげればいい。

まずAndroidのプロジェクトを先に作っておこう(後でもいいけど)。ポイントはここでPackage名につける名前。ドメイン名識別という例のアレだが、これをBDSと同じにしておくと何も考えなくてよくて便利。

Step1

ということでBDSで新規プロジェクトを作成する。

Step2

で、先ほども言ったけどNAMESPACEに同じ名前を入れるのがポイント。今回はAndroidアプリ側なので、UUIDとかはきっとつなぐ相手が存在するはず。その相手のUUIDとかを入れておく。本当はBASE UUIDはあんまり意味ないのかもしれないが、おまじないだと思ってやった。Step3

OKをクリックすると「New Profile」というしごくシンプルな画面が出てくる。何もないとつながりようがないので、「CUSTOM SERVICE」をクリックする。Step4

順番が逆だったかもしれない。ちょっと記憶をたどりながらなのであやふやだけど、いろいろと「へぇここクリックするんだ」みたいなところがある。例えばこの画面で「New Profile」をクリックすると、プロファイルを編集できる。上の画面で「New Profile」をクリックしてもきっといいはず。

Step5

で、プロファイルの編集画面が出てくる。BASE UUIDはさっきのものが入っているはず。プロファイル名を編集して、BASE UUIDとNAMESPACEを確認したら「SAVE」をクリックする。Step6

で、次にサービスを定義する。「NEW PROFILE NEW SERVICE」をクリックすると、サービスの編集画面になる。今回はLightBlue Beanにつなぐために作ったので、サービス名は敬意を表して「LightBlue Service」としたが、名前は何でもいいだろう。またここで、該当するBLEデバイスのサービスのUUIDを入力すること。このUUIDはBASE UUIDから勝手に生成してくれるのだが、当然正しいとは限らない(というか、クライアント作成用としては違っている可能性が高い)ので、よく確認すること。なまじ末尾とか合っているので、気づかず進めたこと2回くらいあった。Step7

サービスの定義が済んだら、今度は個別のCharactersiticを定義する。まずは「+」ボタンをクリック。Step8

名前とかもろもろ編集。まあ最初に名前をScratch1とか(LightBlue Beanの呼び名)、役割とかで適当に。またUUIDも、サーバーによって定義されているだろうから正しく入力する。Step9a

同じ画面の下の方に移ると、その属性が定義できる。ここで「READ」とか「WRITE」とかはクライアントから見た時の役割。つまり、AndroidからそのCharactersiticに書き込みたいときは「WRITE」を「MANDATORY」にする。読みだしたいときは「READ」を「MANDATORY」に。OPTIONALにするとコードを生成してくれないからEXCLUDEから変える必要もないのだけど、まあそこは気は心というか。で、値の読み書き設定を加えると、下の「ADD FIELDS」というのが出てくるので、こいつをクリックする。Step9b

フィールドを追加したいので、「ADD」をクリックする。Step10

Characteristicを通じてやり取りするデータの型などを入れる。LightBlue Beanだと基本8ビットの配列で定義していたから、そうしておいた。ただこれ、コードで型チェックを生成してくれたりするので、もっと詳細なプロトコルを定めている場合はそれに従ってちゃんと記述するとよいように思う。VALUEも1個じゃないので、複数個を並べてもよさそうだ。まあ今回はこれでやったので。Step11

で、正しくCharacteristicを定義したら、TOOLメニューの「GENERATE」でコードを生成する。最初はServerだけど、Clientのコードも生成できる。Step12

Clientを選んで「ANDROID CLIENT PLUGIN」を選択して、GENERATEをクリックすればコードを生成してくれる。Step13

最後に、生成したコードの中にバッチファイル「copy_to_android_studio.bat」があるので、こいつを実行してアタマで作成したAndroid Studioのプロジェクトに放り込んであげれば完了。とりあえず一通り、Characteristicを通じてBLEデバイスと値をやり取りするアプリが作成できる。

そういえば、そもそも日本語環境だとBluetooth.comのサイトがまともに表示されないという問題があるんだった。ボクは英語版のブラウザー環境を一つ用意しているので、そっちを使ってアクセスしたらあっさり問題が解消したのだった。どうでもいいが、早く直せよ。

Metaware Cを使う(その1)

Android版SDKに意外とアンドキュメントなことが多かった。つか、まだできてないから「多い」か。いずれにせよ、後の自分のためにメモ。

  • 「Library Setup」のセクション。Android Studioとgraidleの仕組みを知っていればどうってことないんだろうけど、「ivy」リポジトリの指定はRootのbuild.gradleに記述。「compile」の記述は「app」フォルダーのbuild.gradleに記述する。
  • Binding the Serviceのサンプルコードに間違いというか、キャストを要求される。これ、ほかのサンプルとかで通っているみたいなんだけど、何か違うのかなぁ。
  • 「MetaWareBoard」のセクション。binder.getMetaWareBoardはたぶん間違っている(その場で書いていないので記憶違いかも)。
  • なんか「Scanner」というのが使えるみたいだけど、何も書いてない。

というわけで、まだ自前のMetaware Cを見つけてデータを取るところまですらたどり着いていない。先は長い。

PowerShellを初期設定に使ってみた

某雑誌のセミナーでハンズオンをやるので、ときどき大量のパソコンの初期設定をしなければならなくなる。PowerShellのスクリプトは、クライアントWindowsだと実行ポリシーで制限がかかっているので、まあムリだろうとあきらめていた。

しかしWindows 8.1にしたら、今まで使っていたVBSのスクリプトがまともに動かない。しかたがないので慌てて代替手段を探した。条件としては、(1)管理者権限で動作する(いろいろと管理者での操作が必要なのだ)、(2)コンソールによる対話処理は極力なくす(手間軽減と誤り軽減のため)、(3)PowerShellの実行制限はいじらない(正確に言えば実行後元に戻ればOK)。

某雑誌の連載の樋口さんに書いていただいた記事で、PowerShellスクリプトのファイルを右クリックして「PowerShellで実行」とすると、Windowsの実行制限に引っかからないで実行できるというのを教えてもらっていた。これが管理者権限で実行できればいいわけなので、まずはPowerShellで実行権限をエスカレーションする方法を探した。そこで見つけたのが、牟田口さんのブログで「スクリプトを管理者権限で実行する」。これで管理者権限が必要なスクリプトが素直に動いてくれたら、もはやそれで完了だったのだが、残念ながらなかで管理者にエスカレーションしたところでスクリプトを実行しようとして、結局実行制限に引っかかる。

さてどうしよう、と探していたら、ここにバッチで実行ポリシーを変更するという記述を見つけた。よく読んでみると、ふむ。なんだ。PowerShellで1行実行しているだけじゃん。

ということでこういうバッチを作って、バッチを右クリックして「管理者権限で実行」すればいいということがわかった。「setuppc1.ps1」がメインの設定スクリプト。

powershell.exe -Command "Set-ExecutionPolicy Remotesigned -Scope LocalMachine -Confirm"
powershell -File %~dp0setuppc1.ps1
powershell.exe -Command "Set-ExecutionPolicy Restricted -Scope LocalMachine -Confirm"

USBメモリーで指してそこでバッチを実行させるので、実行フォルダーを取得するため「%~dp0」を付けているくらいで、あまり特殊なことはしていない。と思って改めて探したらここにちゃんとした説明があったのだった。

VBSとPowerShellだと、スクリプトの開発効率は結構違う。試しに実行しても、VBSだと結構手探りでデバッグしなきゃならない。PowerShellならISE使えるので全然楽。これで管理者権限の必要なスクリプトをISE使ってデバッグできるようになったので、今後楽になるなぁと期待している。

 

FreeSoC2とかいう開発キットでLチカまでの道

ETでCypress Semiconductorが配っていたSparkFunのPSoC5LP開発ボード。日本語の情報はあんまりないみたいだし、意外と動かすまでに手間だったのでメモ。まあぶっちゃけSparkFunが公開している文書を読めばわかるっちゃわかる。英語だけど結構丁寧に書いてあるし。

Arduino IDEの準備をする

まずArduino IDEが1.6.4以降が必要。とりあえず今ダウンロードすると、1.6.6になる模様。ウチのMac/PCには1.0.6までしか入れてなかったので、入れ替える必要があった。

それからハードウエア情報の追加。ARMプロセッサー対応を取り込む必要がある。まずArduino IDEのコンパイラーでCortex-M3のコードを生成できるようにする。これは比較的簡単で、「ツール」メニューの「ボード」項目を選ぶとリスとされるボードの中にある、「ボードマネージャー」を選ぶ。そうすると、使うボードのグループみたいなものだなこれは。Cortex-M0のコンパイラーとかボードとかもここで追加できる。本来はこのリストの中に「FreeSoC2」というのがはいるべきだし、そうしたいみたいだが、まだそこまではできていないという状況だ。

ボードマネージャー

次に、githubのリポジトリから、PSoCのサポートファイルをダウンロードする。zipファイルなのでこれを展開して、そのなかにある「Hardware」フォルダーをArduino IDEの「スケッチブックの保存場所」にコピーする。Hardwareフォルダーがすでにある場合は、中身を追加すればよい。これでようやく、ボードとしてSparkFunの「PSoC Dev Board」が選択できるようになる。

Arduinoのブートローダーを書き換える

さて、ここからが問題だ。ここで試しにUSBケーブルを「Target」に指してみても、シリアルポートドライバーが認識してくれない。「USBUART」という謎のデバイスがつながっていることになっている。

まあまずは、こいつをダウンロードしておく。Windowsのドライバーとか入っているくさいのでインストール。しかしCypress PSoC Programmerをインストールしてもとりあえずドライバーは認識しない。ドキュメント通りに「Debugger」ポートにつないでみるが、こちらもいろいろと謎のデバイス状態になっている。

これはとりあえずドライバーをインストールしてしまおう。C:\Program Files (x86)\Cypress\Programmer\driversフォルダーにインストール用のバッチファイルがあるので、これを実行してみる。これでDebuggerポートに接続した状態では謎デバイスがなくなったが、相変わらず「Target」は認識しない。

たぶんここが問題で、Arduino用のBootloaderを書き換えてやらなければいけないのだろう(と、この時点では思っていた。実際は違うことが後から判明した)。

ドキュメントに従い、ここで「PSoC Programmer」を起動する。あれ?認識してない。起動する前に接続していたせいかもしれないので、一度USBケーブルを抜いてから挿し直す。これで認識した。

Programmer1

これで「File」-「Open」でPSoCのサポートファイルにある「D:\Documents\Arduino\Hardware\SparkFun\psoc\bootloader.hex」を開く。ファイルを開くアイコンの隣にある「Program」ボタンをクリックすると、ブートローダーが書き込まれる。

これで認識するかと思いきや、「ドライバーはD:\Documents\Arduino\Hardware\SparkFun\psocにある」ときたもんだ。なので、このブートローダー更新作業をしなくてもホントは認識して作業できんじゃね?みたいなことは試していない。

さてドライバーをインストールしてめでたしめでたし…かと思いきや、落とし穴が待っていた。Arduino IDEが「コンパイルエラー」となる。

arm-none-eabi-gcc: error: C:\Temp\build9c9ef3bdfe2fccb480bc6e4bac749e41.tmp/core.a: No such file or directory

確認すると、確かにそこに「core.a」ファイルはない。テンポラリフォルダーの「core」フォルダーの下になら存在する。しかたがないので、ハードウエア情報の定義ファイルというか、platform.txtを書き換えた。D:\Documents\Arduino\Hardware\SparkFun\psoc\platform.txtを開いて「core」を検索すると、1カ所見つかる。その「core.a」を「core/core.a」と書き換えたら、無事コンパイルできて、スケッチもアップロードできた。これは定義ファイルだからとりあえず処置としては正しいのだけど、なんかそのうち引っかかるかもしれないので、備忘録としても公開しておこう。

 

 

ミニリノセロス改造の解説?

某京都大学のセンセイが「解説求む!」というので、ちょっと書いてみたり。

ミニリノセロスの動きがかな~りノンビリしていたので、うちわで扇ぐのに疲れてしまい、電動化を決意した。で、どうせなら単にモーター付けるだけじゃつまらないので、スマホでリモコン化しようと考えたわけだ。考えてみれば、これはゴールデンウィークの工作だったのだから、半年近く「鋭意制作中」だったわけだ。

基本コンセプトは「無改造」。ミニリノセロス側には何も手を入れない。だって手を入れて電動オンリーにしたら、なんかせっかく「風を食べる生物」感がなくなっちゃうし。ということでまず考えたのが、どうやって駆動するか。まあマブチモーターだよね。だったらまあArduinoじゃ駆動できないよね。などと考えて、次のような結論に落ち着いたわけだ。

temp1

見つけたのはDRV8832。データシートを見たら、まあコンデンサーをどう使えばいいのかまではわからないけど、とりあえず抵抗2本もあれば±3Vとか出せそうだというのが読み取れたので、抵抗値とか適宜計算したりして、電気的な計画はほぼ即日で終了。5月7日の投稿はこのあたりまでの作業。

問題は物理的な取り付け方法だったりするのだけれど、結局適当な方法も思いつかなかったので、しばらく放置。まあ使えそうなものを、ということで、ギアボックスとプラバンなどをゲット。これが5月14日にアマゾンでオーダーしているから、このあたりは割と素直に進んでいるな。一番悩んだのはモーターの回転系をどう連結させるかなんだけど、これはミニリノセロスを手動で動かすためのパーツを見て、「ああ、これで行けそう」と感じた。要はゴムチューブで連結させるんだけど、幸いなことに、たまたま受け側の形状が似ていたからこれで接続できた。3Dプリンターとかあれば、こう言うのを悩む必要がなくていいんだけど。で、ギアボックスを組み立てたところでしばし中断。このときはまだ、取り付け方法を思いついていなかった。

次は電子部品の手配。秋月のページで見ると大きさがわからないよね。実際には、とても小さくてこのままじゃ工作なんてできそうにない。幸いなことに、秋月では2.54mmピッチで引き出してくれた基板付きの製品を扱っていたので、そちらを購入した。抵抗とコンデンサーも適当に。これいつ買ったんだっけなぁ。たぶんセミナーの準備とかのついでに行ったから、たぶん6月19日とかそんなもんじゃないかな。

ここまでやって、しばし完全に放置。取り付け方は、まあ結局プラバンからつり下げるようにすればいいだろうと思ったのだけど、ちゃんと測って…とかが面倒だったんだろうなぁ。たぶん。

ようやく9月のシルバーウィークで、いいかげん宿題を片付ける気になって、つり下げ用のネジ類を手配したりした。

そして9月26日に取り付け確認。10月4日に電動化完了というのがこれまでの経緯。

電子回路の構成はこんな感じ。

temp2

まあ要するにただのデジタルOut2本で制御するだけなので、Bluetoothでいきなり制御できればそれでOKだったわけだ。ところがハンダ付けの失敗の結果、使用モジュールを変更したのでBLE制御になった。BLEではホストとデバイスの間で任意のデータをやり取りするのに「Characteristic」を使う。Arduino側は0.1秒間隔でCharacteristicをチェックし、その値で「前」「後」「停止」の3状態に対応させる。ホスト側はBLEに対しCharactersiticを書き込むことで操作する。Characteristicを書き込むのは、LightBlueアプリが使えるのでこれで実現したと。

えっと、たぶんこの最後の話さえあれば十分だったのではないかという気がする。