2015年11月27日金曜日

C#でatanhとか

地形とか扱ってるとATANHとか出てくる。が、C#のMathにはatanhとかは入ってない。ということで自前で用意する必要がある。MSDNにいろいろ書いてあるのでそれを使う。

Derived Math Functions (Visual Basic)

C#で使うとこんな感じ

double Atanh(double x)
{
    return (Math.Log((1 + x) / (1 - x)) / 2);
}

他の関数も同様に使用可能。

2015年11月18日水曜日

STM32F1 タイマの同期

STM32F1では、それ以外のマイコンと同じように複数のタイマを使用することができる。そして複数のタイマを同期して使用することができる。この同期とは、例えばTIM2のPWM立ち上がりエッジでTIM3を開始する、といったことが可能になる。

今回はTIM3のエッジでTIM2を開始するための方法。

まずはTIM3とTIM2を適切な設定で初期化する。今回はTIM3のOC2を使用するので、それらの設定も必要。

次にTIM3をマスタとしてトリガを出力できるようにする。
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);

そしてTIM2をスレーブとして設定する。
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR2);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);

TIM_TRGOSource_OC2RefはOC2をトリガ出力として使用するための設定。TIM_TS_ITR2はITR(内部トリガ)2をソースとして使用する。TIM_SlaveMode_Triggerはタイマをスレーブモードとするための設定。

それと今回はTIM2を TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single) でワンパルスモードに設定した。これはTIM3のトリガでTIM2を1回だけ動作させるため。

あとはTIM_Cmdで開始すればマスタが出力したトリガでスレーブが動作する。マスタのトリガやスレーブの設定はRM0008を参照すれば良い。ただしStdPeriphLibはヘッダファイルを読んでも何が何だかわからないのが難点。RM0008で欲しい機能を探して、StdLibのソースを読んで、それっぽい関数を探す、という作業が必要。


それから、OnePulseModeでPWMを出力したい場合、大抵は望んだ動作をしないはず。ワンパルスモードでは「PWMを1回出力して、ポートを非アクティブ化した状態で終了する」ということを望んでいると思うが、そうはならない。というのは、OPMでは「タイマ更新イベントでタイマを停止する」という動作になっているから。タイマ更新イベントでは「ポートをアクティブ化する」と、「タイマを停止する」が同時に行われる。
本当はもっとスマートな処理方法があるはずなんだけど、まだ見つけられていない。OCをPWM1で初期化した場合、カウンタがしきい値を超えたら停止する みたいな動作がほしいんだけど。

ストロボスコープ

ストロボスコープを作っている。ストロボスコープとは高輝度の明かりを一定間隔で照射するためのモノで、常に運動している物体を止めて撮影するのに使用される。ストロボの発光間隔は既知となるから、物体が映った時の位置がわかれば、距離と時間から速度を求めることができる。


まだ途中までしか作りこんでいないのでインターバルでの発光しかできないが、動作確認程度はできるようになってきた。


スロープ上で球体を転がした時の写真。左から転がり始め、右に進むに従って速度が上がっていることがわかる。

もう少し手直しが必要だが、外部トリガに対応するとフォトインタラプタとかを使うことにより物体が通過した瞬間に撮影することができるようになる。これができればミルククラウンとかを簡単に撮影できるようになる。

それとこの基板はNchFETをドライブしているだけだから、出力はLow,HiZの2値となる。これは単純なレリーズ端子がついてるカメラをドライブすることができるので、インターバル撮影のタイマとしても使用できる。バルブモードにしておけばパルス幅でシャッター速度を変更できるから、うまく制御ソフトを作ればいろいろと面白い表現ができるかも。

録画のソート

パナのレコーダは録画の並べ替えができないみたい。
DMR-BRW1000のFAQは出てこなかったけど、基本的に変わらないはず。

Media Centerの場合は番組名(放送時のタイトル)と録画日付のソートのみ対応だけど、録画データ自体はWinのエクスプローラで表示できるので、ファイル名を変更すれば自然順ソートで表示することができた。

DMR-BRW1000はLAN経由でWebブラウザから録画一覧を見ることができるので、HTMLを解析すればリストを取り出せられそうだけど、有線LANで繋いでる割にかなり遅い。
せっかく無線LANや有線LANを搭載して、CPUも高性能な奴積んでるんだからTCP/IPとかで接続できたら楽しいのに。

IoTってメーカーお仕着せの「おれのかんがえたさいきょうの(ry」とかではなく、「こういうデータがあるから使ってみて!」のほうが楽しいと思うんだけど。

2015年11月14日土曜日

自動録画

パナのDIGAはdimoraというWebサイト経由で録画の設定をすることが可能です。

自動録画予約は10組を登録でき、1組あたり10個のキーワードと5個の除外キーワードを設定できます。Media Centerのキーワード録画と比較して 1)キーワード数が少ない 2)キーワードが反映されるまでに時間が掛かる という問題があります。「番組表を見て気になったキーワードを片っ端から追加する」といった使い方はできません。


自動録画予約はサーバー上で番組表から検索を行い、放送日が近づいたらレコーダへ転送する という動作をしているような気がします。そのためレコーダの処理能力とは関係なくキーワードを登録可能なはずですが、実際にはそのような実装にはなっていません。また自宅にはモバイルルータしか無く、外出中はオフラインになる という場合には自動録画はされないため、長期間家を開けるときは何らかの対策が必要となります。

キーワードのAND,OR,NOTは「必須 キーワード:」の右にある疑問符をクリックすることにより優先度等の設定を見ることができます(AND AND OR ANDのような設定は書いてませんが)。


現在のところこの機能について大きな不満はありません。しかし上記の通り常にオンラインである必要がある、キーワード数が余り多くない、といった不満はあります。またキーワードには正規表現やワイルドカードが使用できればいいなとも思います。

2015年11月13日金曜日

PanasonicのDIGAを買った

先日、パナのHDDレコーダ、DIGA(DMR-BRW1000)を買いました。少し前の機種ですが、1)最新機種に欲しい機能がなかった 2)旧機種の在庫なので若干(5%程度)やすかった ということで。

旧機種ですが、おおまかな機能は大きく変化することはないと思うので、機能のレビューとか細々と書いていこうと思います。

今まで使っていたのはWin7のMedia Centerで、それと比較した感じになると思います。

C#でスクリーンキーボード

ナショジオのAH-64組み立て番組見てたらキーボードが面白そうだったのでC#で作ってみた(ソフトウェアキーボード)。


もちろん普通にスクリーンキーボードとして使用可能である(といっても、IME切り替えキーは無いので英語圏の入力のみだけど)。AH-64って2人乗りとはいえ、飛んでる間に左手で長文を入力するとも思えないし、ちょっとした情報の入力程度にしか使わないんだろうけど、入力しやすいとは思えないなぁ。

一応形だけは作ったけど、例えばZの横にあるスラッシュと、Enterの上にある除算記号は同一の文字が入力される。また±キーは本来であれば入力値の正負が反転されるはずなんだけど、Winではそれっぽいキーは無い気がするので今のところ何も割り当てられていない。CLRはKeys.Clearを割り当てている。ただnotepad.exeではClearは何も行わないみたい。

スクリーンキーボードは大きさ固定のユーザーコントロールとして作成している。そのため他のプロジェクトに貼り付けることも可能。各キーはButtonを継承したコントロールを使用している(円形表示や四角の枠を表示するため)。ボタン間の分割ラインはLabelのAutoSizeをFalseにしたうえで使用している。他にはボタンが押されたらそのボタンに応じてKeysをEventで渡せるようにしている。

スクリーンキーボードとして使用するには、1)スクリーンキーボードが押されてもアクティブにならない 2)キーを送信する という動作が必要になる。今回は .netで何かつくろう スクリーンキーボードの作成 を参考にした。キーを送信するにはkeybd_eventを使用しているが、C#にはSendKeyというクラスがある。もっとも、keybd_eventならKeysをbyteにキャストするだけで良いのでDLLを使ったほうが簡単だと思う。

Formを常に最前面に表示するにはTopMostをTrueにすればいいらしい。が、僕の環境ではこれだけではダメだった。「デザイナのプロパティでTopMostをTrueにする」かつ、「LoadイベントでTopMostにtrueを入れる」という操作が必要だった。どちらか片方ではダメで、LoadではなくFormのコンストラクタで代入してもダメだった。ということで今回はデザイナでTrueにしつつ、コンストラクタでLoadに匿名メソッドを追加することで設定した。

マウスで操作する上ではスクリーンキーボードは大して便利ではないし、ハードウェアキーボードがあるなら選択肢にもならないが、タッチパネルなPCなら、ちょっとした入力程度ならそこそこ便利。ウチにあるタッチパネルはHDMI/USB接続の液晶だけなので部屋でしか使えないし、それならハードウェアキーがあるから、とりあえずは不要かな。

2015年11月3日火曜日

日本のSF小説における軍隊の階級

Wikipediaの"日本のSF小説"カテゴリに含まれる小説に登場する軍隊の階級を調べてみた。

条件
1) 作品ページに書かれた登場人物のみを扱う
2) 階級は24種類
3) 作品はSFカテのみ

1) Wikipediaでは登場人物が増えると別ページに人物の一覧を書いている。そのため作品ページのみの参照では取りこぼしが発生する可能性が高い。その他に、単純に文字列一致でカウントしているため、「階級の説明」など、登場人物とは関係ない数をカウントしている可能性がある。

2) 階級は 大元帥,元帥,上級大将,大将,中将,少将,准将,代将,上級大佐,大佐,中佐,少佐,上級大尉,大尉,中尉,少尉,准尉,曹長,軍曹,伍長,兵長,上等兵,一等兵,二等兵 の24種類を使用した。この分類は軍隊の階級の一番上にある表から拾ってきた。また自衛隊は階級の名称が違うからカウントされていない。

3) コレが一番重要。例えば最近までアニメ放送されていた"ゲート"はSFカテではなくファンタジーカテに属しているため、この集計対象には含まれない。

作品総数は現時点で297作品がカテゴリに属していた。カテゴリに属しているページのURLをすべて取り出し、そのページのHTMLをダウンロード後、ID"content"内にあるテキストからそれぞれの階級を文字列一致でカウントした。

すべての作品に登場するそれぞれの階級の合計。一番多いのが大佐で106人、ついで大尉の82人。


作品別の階級ヒット数。"宇宙一の無責任男"は桁が違うので省略した。二番目に多いのは"魔法科高校の劣等生"で42件だった。297件の内212件はヒット数が0だった。


ただ数字を拾ってきただけなのであまり面白くない…かな。今回は重複のチェックとかが面倒なので1つのカテだけを使用した。他のカテも含めれば面白いかも?

今回はSF小説カテだったが、次はアニメ作品を調べてみたい。しかしWikipediaにはアニメ作品一覧ページと言うのは無いみたい。あかさたな別でページが分かれてるので、そこから拾ってくる必要があるかな。ちょっと面倒。


*まとめ
軍人がいっぱい出てくる(かも知れない)小説を読みたいなら魔法科高校を読めばいいと思うよ!

*最後に
現時点での階級がヒットする作品名とヒット数一覧をCSVで貼り付けておく