Monthly Archives: April 2014

細かいセッティングは続く

事務所の住所のゴム印を製作したが、スタンプ台を購入するのを忘れてしまっていた。でも、100均で買えたのでコストはかえって低くて済んだかもしれない。今日から発売開始。早速、注文が来た。初動が早いw。
既に基板を20枚以上作って、色々と実験している。n=20であるが、これでも色々な結果が出てきて、面白い。今のところ、全て公差に収まっているようだ。
 まぁ、ゆっくりやろうと思う。

けじめ (irMagicianのリリース)

ここ4年来の懸案が一つ片づいた。直接のきっかけは2つで以下のとおり

  1. 大学院での赤外線ビーコンとしての利用
  2. irKitの発売

 最初はiPhone用のリモコンが作りたかった。L5remoteなんかを見て、そう思った。ただ、iPhoneのコネクタを使う為には、アップルとの契約が必要だ。ちょっと難しい。そこで音声信号を利用するタイプを考えた。リモコンデータはサーバからダウンロードするタイプだ。その為にはリモコンデータを集める必要がある。その為の治具の製作に挑戦し始めたのが、2010年頃だった。最初は手慣れたEZ-USBを使っていたが、ソフトのサンプリングではUSBの割込が入ると信号を取りこぼしてしまった。そこで、CDC-ACMベースでPCと接続でき、シェルで動作を設定できるUBWを使うことにした。タイマを駆使し、変調周波数の38KHzからサンプリングやPCとのやりとりまで全て、ワンチップで処理できた。ただ、現実解になるかと言うとそうではなかった。その時の結論は、「内蔵RAMの容量が少ないので、全てのリモコンの信号を学習できない。そのため、これを解決するには大容量のRAMを搭載したマイコンにポートする必要がある。」だった。ソフトはブートローダであるUBWとその上で動作するファームウェア。UBWはアメリカ人が開発していて、コンタクトを取り、容量の大きいマイコンの評価ボードを送ってポートをしてもらうことにしたが、ポートは出来たが、うまく焼き込めなかったらしい。そうこうしているうちに、このプロジェクトはお蔵入りになった。

 やがて、大学院に入学してロボットの研究を始めることになった。ロボットの位置決めに赤外線ビーコンを使うこととした。これに上記の赤外線リモコンを使うことにした。問題なく動作し、それなりの評価ももらうことが出来た。また、いじり始めて「あぁ、もう少し改良したいな…。」と思ったが、サラリーマン大学院生にその改良時間を捻出することは出来なかった。

 インターネット家電が流行り出しているが、結局はスマホで外出先からエアコンのOn/Offが出来るくらいしか今はない。その方向性からirKitは発売された。非常に良い着眼点だと思った。自分でも考えたが、「エアコンのリモコンはどうにもならんよなぁー」と思った。大学院も修了し少し時間が出来たので、自分自身での新マイコンのUBWへのポートも視野に入れて、もう一度コードを見直すことにした。また、現在では他の人たちはどのような実装をしているのかを調べることにした。

 赤外線リモコンには様々なフォーマットが存在する。それらに合わせて学習リモコンのソフトをインプリしている例も数多い。ただ、その場合だとそれらのフォーマットにロックインされ汎用性が少なくなる。irMagicianでは当初から、信号をまるごと記憶する方法を採用していたので、この問題はなかったのだ。ただ、絶対的に容量が少なかったのだ。そこで、そのあたりを中心として改良を試みた。まずはデータ長を2バイトから1バイトにすることだった。マイコンのタイマにはプリスケーラと呼ばれる分周器がある。これの最大値に設定してもリモコンの波形は2バイトになってしまう。そこでその結果のダイナミックレンジを1バイト内で収まる除数の最大値を設定した。ポストスケールさせて、結果を1バイトに収めた。これで容量は2倍になったが、絶対的に容量が足りない。いよいよメモリマップの見直しに着手した。USBスタックでの利用、変数やサブルーチンコールでのスタックやグローバル変数の利用などを精査した。メモリアロケーションとアクセス方法を実験し最大で640バイトが確保できた。これは最初に作ったタイプの4倍以上の利用効率である。これでエアコンのリモコンの学習も出来るようになった。

 開発が中断していた4年間での変化した環境はラズパイやBBB、ガリレオなどのボードコンピュータの台頭である。irMagicianはCDC-ACMなのでこれらにも問題なく使える。ただ、現状のMacではドライバの関係でそのままでは動作しないが、知人のデベロッパが Work around で動作するドライバを現行OS用にリビルドしてくれた。これでPCの三大プラットフォームである Win, OSx, Linuxに対応できた。Linuxに対応できることは、現在の様々なボードコンピュータでも活用できることを意味する。プラグアンドプレイで利用できるネットワーク対応リモコンが自由に構築できるのだ。

 赤外線リモコン自身はTeamKNOxがゲームボーイカラーをやっていたことに遡る。当時の仲間にこの技術に詳しい人がいて、彼がゲームボーイカラー用の赤外線リモコンを実装してくれた。我々の仲間内では「赤外線の魔術師」と呼んでいた。そんな彼に敬意を表して、このシステムを「irMagician」と呼ぶことにした。魔法のように解決したいの願いも込めて。その彼におよそ5年ぶりにコンタクトが取れた。出来上がった基板を送った。残念なことに既にこれらへの興味を失ってしまっていたようだったが、完成には喜んでくれた。

 俺自身はまったく成長していないな…

Web ページ作り

 ほとんど、一日がかりでweb-page を作成していた。けっこう、時間がかかるものだなと今さらながら痛感。もう、1−2ページ作成したら、英語用のページを作る予定。写真とかは今はスマホのカメラの性能が向上したので、こちらが使える。しかもcloudだから、転送しなくてもそのまま転送されてしまうので、こちらも便利になったよ。

 本を読み始めたけど、進みが遅いね。PCがあるとダラダラ、いじってしまうので本を読む為の環境を作らないとダメかもしれないな。色々とやることがあるので、整理して望むことにする。

本を溺愛する

 大学院が修了しても、本を読む時間が取れていない。時間は作るものであるので、本を数冊借りてきて、無理にでも読むつもりだ。と言う事で、図書館に行ってきた。お目当ての本、「Uボート」の小説があった。最近、「蒼き鋼のアルペジオ」を読んでから、潜水艦に興味が出てきた。あれは「伊-401」なので、今度はそっち系を読んでみる。図書館の帰りに、本屋に寄ってみた。マンガと専門誌の物色だ。とりあえず、最新刊を買ったし、インターフェイスも買ってみた。インターフェイスを買うなんて、何年ぶりだろう?ここ10年くらいは、たまに原稿も書くし、担当だった編集者さんに頼めば、献本してもらえるので全然買ったりしていなかった。インターフェイスとの出会いは中学生になると思う。当時、コンピュータに興味が出てきて、専門誌も何冊か購入した。その中で、巻末の広告に対して、マークするはがきが付いていて、マークするとその製品のカタログが送られてくるものだった。中二を大人扱いしてくれていたと当時は思っていた。今で言うワンボードマイコンが殆どだったが、インターネットが無い時代は貴重な情報源だった。

 帰宅後、少し回路をいじり始めた。組み立てる速度は上がってきた。まぁ、沢山売れれば、早く組み立てるのも意味があるが、そうでなければ…?と自虐的になってくる。

 後は撮り溜めたアニメの消化。これは連休中はこのモードになりそう。

休みの日

 朝の6:00から取り組んでみた。慎重に作業したら、ポーティングは完了したが、性能は出なかった。割込駆動のフレームワークだから、リソースの奪い合いになってしまう。1.0.1 ならWindows/Linuxでも動作するので、ドライバを対応させた上でこっちを使うのが良さそうだな。

フレームワークの成果物の調査

1.4.3 〜 1.4.9 まで、出ている。1.4.8 を使うことに決めた。

Framework を探すたびに出る

USB のフレームワークを作るわけには行かないので、使えそうなフレームワークを探して、色々とさまよった。結局、2種類を組み合わせて使い始めた。今はまだナントカなっている。でも、だんだんアプリの容量が増えてきたら、無理ゲーになってしまうかもしれない。でも、やってみる。

Framework issue

 ドライバの動作も結局、ダメなようだけどファームウェアの作りでどうにかなりそうなので、チャレンジしてみることにした。結構大変そう。とりあえず、CDC-ACMでMacの動作も確認できたので、これをベースに作り込んでいく。

αブロガーと開発者

 量産基板はモバイルデバイスやガジェットで有名なブログを書かれている人と以前からの知り合いのデベロッパに渡した。ただ、Macは相変わらず、CDCACMのドライバがタコなので評価に時間がかかってしまいそうだ。今は弾数を増やすことに専念する。

原因が特定できた!

 手元にあって、動作しなかったパイオニアのAVアンプとソニーのテレビ(かなり古い)リモコンも再現できた。動作しなかった原因としては、一種の丸め誤差である。これについて、語る前に今回のリモコンの基本原理を説明する。
 今回はマイコンのタイマ機能をフル活用している。リモコン自身の変調周波数は38KHzだが、これもタイマを使っている。一番重要な赤外線波形の取り込み(Capture)と再生(Play)にはCCP=CaptureCompareを用いている。波形取り込みに解説する際に例えられる話として多くはサンプリングを挙げる。一定周波数でサンプリングして、その時にサンプリングした点がH/Lのどちらかと言うものである。この状態の蓄積で波形を形作る分けである。
 今回のシステムは、CCPなのでこれとは少し違う。ストップウオッチを使うのに例えられる。マイコンに内蔵されているカウンターはCPUとは関係なくカウントアップしている。これをフリーランニングカウンタと言う。外部からの信号が入力されると、その時のカウンタの値がラッチされる。赤外線のセンサからある間隔のパルスがストップウオッチのボタン操作と等価である。そのパルスが入力されるたびに、ラッチとストアを繰返す。これにより時間間隔が記録される。再生する時はこれと反対にストアされた時間間隔が到来するたびに出力ポートを上げ下げしてパルスを作り出す。
 マイコンは20MHzで動作している。この間隔は赤外線のパターンを測るのには細かすぎる。その為、マイコンにはプリスケーラと呼ばれる分周器を内蔵している。今回のシステムではこれで最大分周してもまだ細かすぎる。その為、postScalerと呼ばれる概念を導入した。これはストアされた値を更に分周するために使う。ストアされた値は2バイトだ。この間隔を表すのに2バイトは必要ない。パルス間隔の最大値と最小値のダイナミックレンジが1バイトで充分に収まる。極端に言えば、パルスの最小値が1になり、最大値が255に収まっていればシステムとしては成立する。
 今回の問題はこの postScaler で除算を行った際に丸めを考慮しなかったことにある。つまり、商は小数点以下は切り捨てにされる。常に低い値になってしまうわけだ。特に小さい値であれば1ビットが比率的に大きくなる。最小ビットが赤外線信号出力のLパターンにインパクトを与えるので、これが小さくなると正規の出力を得られなくなってしまう。そこで商に必ず’1’を加えることにした。これにより、常に多めに出てしまうが、誤差がマイナス方向に振れると動作しなくなる現状を考えると、このプラス方向に振ったほうが動作が安定する。つまり、今回の不具合はpostScalerで正規化した値に’1’を加えるだけで解決した。

 何事もプラスが良いようである。