2014年11月28日金曜日

L64x0 ステッピングモータドライバ

L6470とL6480で遊んでいます



大きいほうがL6480 小さいほうがL6470で制御しています
このドライバは絶対位置をレジスタに書き込むと加速・定速・減速を自動で制御してくれます
停止・加速・定速・減速のモーター電圧はそれぞれ設定できます
例えば、12Vのモーターを24Vの電源で駆動する といったことも可能です

ただ、L6480の方の電圧設定はちょっと微妙です
L6480は外部にFETを持っているため、モーター電圧を知る術がありません
1Ωのコイルに3Vをかけても9Wも消費されていません
この辺りの校正はレジスタの設定でできそうですが、とりあえず電圧の設定を変えて対応しています


L6470とL6480は型番が似ており、レジスタ設定も似ていますが、完全に同じではありません
この図はそれぞれのレジスタ名と、ビット長を書きだしたものです
1ビット違う 位ならまだいい方で、名前もデータ長も同じだから同じレジスタだよな?と思ったら方やアンペア、方やボルト みたいな設定になっていたりします
またL6480のレジスタ一覧では15hは10bitですが、レジスタの説明では12bitになっています


L6470は比較的使いやすいステッピングモータドライバですが、L6480の方はもうしばらく様子を見たほうがいいかもしれません
L6480のデータシートは4回ほど更新されていますが、一体いつになれば修正されるのか…

2014年11月25日火曜日

Webカメラを買った

BUFFALOのBSW32KM03というWebカメラを買ってみました
現在1800円ほどです
安かろう悪かろうな製品かとおもいきや、予想を完全に裏切ってきます

1)FHD対応
2)FHDで20fps出る
3)分解すればすごく小さい
4)UVC対応なのでOpenCvで遊べる

つまり「1920x1080@20fpsを使った画像処理」ができます
ただ、帯域は十分にあると思うんですが、解像度を下げればfpsが上がるということでは無いようです
640x480なら30fps以上出ますが、1280x800だと20fpsとなり、FHDと変わりません

それと、十分にマシンスペックのあるPCならFHD20pで画像処理もできると思いますが、RasPiとかと組み合わせるとどうなるのかはまだ試してないのでわからないです
画像認識で導体追跡とかやってみたいので、RasPiでもある程度のパフォーマンスが出ると嬉しいのですが




とりあえず、このWebカメラは「買い」だと思います

2014年11月14日金曜日

IC-R6リモート


こんな感じになりました
COMポートの選択はテンキーで行うように変更されています
それとスケルチロードはdisconnectの横にある緑の丸がフラグになっています
緑でロード 灰色でロードせず ですが、OFFではSメーターと同じなので、悪いUIの見本みたいな感じになっています

それとdisconnect(COMポートの開放)はまだC#のボタンです

全体的に最適化して、下側を使ったリスト選択を自由に作れるようになったら、メニュー操作も突っ込もうと思います

それと地味な追加機能として、スケルチオープンのフラグを作りました
S00の左にある丸を触るとOpen/Closeが変化します


とりあえず右下の選択画面は1ページに5項目を表示でき、項目数が5よりも多い場合は1で前ページ、7で次ページ という感じにスクロールできます
現在は数字を選択するとすぐに確定ですが、7セグは文字色を自由に設定できるので、数字で選択し、Eで確定 という感じの実装もアリかなと思っています

とりあえず、全体的に複雑なコードなので、もうちょっと最適化を進めてからになります
最初はこのコードで問題ないだろ と思っても 機能追加していくとどんどん不便になっていきます
いままでまじめにプログラミングやってなかったツケを払ってる感じです
次に似たようなものを作るときはもっと上手く作れる と信じて書き直しではなく、修正で頑張っていますが、こんなUIもう二度と作らないと思います。。。

IC-R6リモート

こんな感じになりました


操作の雰囲気は動画で



イメージとしてはF/A-18(インテークが丸い方)の操作パネルですが、まぁ雰囲気だけです

使い勝手は悪いですがw 雰囲気は最高です

まだ正常に転送できなかった場合の動作に不安が残りますが、とりあえず最低限使うことはできるようになりました
あとは細々と作りこんでいく感じになりますが、コードが必要以上に複雑なので、結構大変です

IC-R6をリモートで

(コマンドの叩き方を調べて見てる人がいたら、前回のエントリを参照してください)

IC-R6の周波数とモードを表示するソフトを作ってみました
とりあえず周波数と、下にSメーターがありますが、基本入感したらメーター振り切るのであんまり意味無いです せいぜいイヤホン外してる時に入感してることを知る程度
それと現在の時刻も表示しています

今は表示だけですが、モード・周波数の変更と、スケルチオープンを操作できれば結構使えるようになりそうです

今回はマウスホイールなどで文字を操作したくて、となるとかなり厳密にマウスの位置と文字の位置を比較する必要があります
ということで自分でフォントを作ってみました
本来は固定幅フォントをキャプチャしてビットマップフォント化とかをするべきなんですが、今回は16segLEDっぽい表示にしてみました
謀らずもレトロな感じです

とりあえずもうちょっと機能を作りこんで、その後はマイコンに移植かな
といっても、C#をCにするので全く互換性がありませんが

マイコンから操作できればテンキーみたいなインターフェースを作れるので、便利になると思います
ま、基本メモリに入れちゃえばいいので完全にネタになっちゃいますが

2014年11月12日水曜日

IC-R6のコマンド

/*
 バイナリビューアはしばらくお休みします
 ネタ切れしてます
*/

IC-R6を買ったので、早速コマンドを叩いてみました


FE FE 7E 00 03 FDを送ると、FE FE 00 7E 03 00 00 60 32 01 FDが帰ってきました
コマンド03は表示周波数を返すコマンドです
03コマンドのリターンはBCD(二進化十進表現)で下位桁からです
そのまま表示すると下位の桁が左に表示されるため
順番を入れ替えると01 32 60 00 00となります
数字としてみると0132600000で、MHzにすると132.6MHzです
IC-R6で北海道東セクタの管制を聞いているので、ちゃんと表示している周波数が帰っています

ボーレートは1200で上手く行ったので、気を良くして9600にしたら帰ってこなくなりました
結構ゆっくり送る必要があります


また、最初はC#ではなく、X-CTUのアセンブリパケットで送っていました
が、ボーレートを変えようが何しようが戻ってきません
もしかしたらX-CTUは1バイトごとに適当なdelayが入っていて、IC-R6でタイムアウトしているのかもしれません
IC-R6に限らず、X-CTUでコマンド叩いて上手く動かない場合は別の方法でコマンドを叩いてみるといいかもしれません
気が向いたらロジアナでタイミングを確認しようかと思っていますが…


とりあえずコマンドは正常に機能しているようなので、まずはC#でGUIで動くプログラムを作ってみようと思います
その後でてきとーなマイコンでスタンドアロンで動く表示・変更用の機材を作ってみようと思います


IC-R6を買った時に一緒に買ったオプションや、運用環境についてはまた改めて別のエントリに書きたいと思います

2014年11月7日金曜日

バイナリビューアを作る(4日目)

細々と修正を重ねているのですが、自分でもどこを変えたか思い出せません。。

とりあえず表示するエンディアンの選択と、表示する変数型の選択は実装しました

あと、ファイルサイズの表示等は昨日のバージョンにはなかったはず…
とりあえずByte,KiB,MiBで表示できるようにしてあります
1024Byteを超えるとKiBで 1024KiBを超えるとMiBで という感じで自動的に表示しています

それとアドレスのオフセットを実装しました
とりあえず今はオフセット後のアドレスをステータスバーに10進で表示しているだけです
オフセットを設定するにはカーソルを移動してF2キーを押すとカーソルの位置を0とします
(F2は検索機能とかがついてるのが普通ですね 多分変更します)

あと、ステータスバーの最後の(0.006)は1フレームを描く時間を示しています
あまりに大量のデータを表示するともっさりしてくるため、目安として表示しているだけですが
といっても、FHD画面1枚に最大で表示しても20fpsくらいは出ます
FHD2枚に最大で表示すると10fpsくらいになるので、スクロールとかの追従性は悪くなります


とりあえずはこれくらいでしょうか
あとは細かいところを作りこめば僕が欲しい機能は粗方実装が終わります
多分ここからが長いんですが。。。
間に合わせで作った部分とかは、ちゃんと作る方法を調べながらになるので 結構面倒な気がします

2014年11月6日木曜日

バイナリビューアを作る(3日目)

だいぶ横長になりました

現状の機能として
・ファイルの読み込み(800MB程度までは確認済み/1.6GBのファイルではメモリ不足エラー)
・任意の場所・任意の長さの選択
・選択した場所のコピー(16進2桁+スペース区切りの連続)
・0x00を強調して表示
・フォントの選択(インストール済みの等幅フォントのみ)
・カーソル位置・選択したデータ数の表示
・選択した箇所から各種変数型で値を表示
という感じです

読み込めるファイルサイズは800MBあたりまでは確認しました
ただこれ以上だとちょうどいい感じのファイルが無くて、確認していません
1GBを超えたあたりでメモリ不足エラーが発生すると思いますが、RAMは32GBで一部RAMDISKにしているとはいえ20GB以上あるので、もうちょっと大量に確保できても良さそうな気がします
C#側で大量にメモリ確保しすぎないように制限かかってるのかも?

ファイルの読み込みは800MBで7秒くらいでした
秒100MB位を読んでるので、HDDのシーケンシャルリード(120MB/sec)に近い速度です
これ以上の高速化はおそらく無理でしょう


変数型ですが、8bit 16bit 32bit 64bit float doubleの6種類を、前者4種類は符号有り・無し含め、リトルエンディアンとビッグエンディアンで表示しています
doubleは精度が約15桁で、それに指数を含めても20桁程度なのですが、64bitを3桁カンマ区切りで表示するとそれ以上の文字数になってしまい、変数表示エリアがかなり広大になります

変数は選択した場所で作れる変数ではなく、選択した部分の一番若いアドレスから1,2,4,8バイトを変数として表示しています
なので16バイト分選択したからといって128bit変数として扱うわけではありません


昨日のバージョンでは、文字列を画面に書き込むたびに書いたサイズを積算していました
が、それでは等幅フォントを使用していても少しずつズレが発生していました

今日のバージョンではフォントをロードした段階で、1文字の大きさを計測して変数に保存しておき、文字を書いたらその大きさを積算していく という感じにしています


既知の重大な問題としては、ウインドウを最小化するとPictureBoxのSizeが0x0になり、Bitmap変数のコンストラクタでエラーが発生してしまいます
とりあえずの解決策としては下位関数に画像を要求する前に解像度を調べて、解像度が1バイト表示できる最低サイズよりも小さい場合は処理を中断する という感じにしようかな と思っていますが、あんまりスマートな方法じゃないのでなぁ


とりあえず、変数の表示ができれば色々と便利ですが、更に便利にすべくアドレスのオフセット表示を実装したいと思っています
この機能があるとファイルコンテナ内のアドレスとかを考えるときに脳内オフセットしなくていいので、非常に楽です
しかしオフセットをさせるには数字の入力UIを作る必要があり、結構面倒です
とりあえずはカーソル位置を0として扱う というボタン?キー操作?を実装すればいいかな と考えています

後はマーカー機能とジャンプ機能とか

まぁ今のUIだって使いやすいわけじゃないし、欲を言えばきりがないので 程々に色々追加しようと思います


/*
しかし、C#は結構昔から使ってましたが 真面目に使ったことはありませんでした
それでも3日 必要な関数を探しつつ、少しずつ作業してここまで形になるんだなぁ
*/

2014年11月5日水曜日

バイナリビューアを作る(2日目)

マウスクリックでカーソルを移動 クリックしたまま動かして範囲選択 を実装した
それと文字列を表示する関数を変更した

今までの関数では1文字書く毎に数ピクセルずれているような雰囲気があった
ということで新しい関数を作ったのだが、画像の通り、こっちのほうが酷い

一番簡単に解決するにはビットマップフォントを作ればいい
これなら大きさが固定なので並べるだけ

ただ、自分しか使わないとはいえ最低限文字サイズの変更くらいは実装しておきたい
まだ今日は1日の4分の1が残ってるので、文字表示関数を作りこもうと思う

2014年11月4日火曜日

バイナリビューアを作る(1)

暇つぶしとか気分転換を兼ねてバイナリビューワを作り始めました

1日目の作業はこんな感じ

フォームの上下サイズを変更すると表示量が増えます
フォームの左右サイズを変更すると1行に表示できる量が増えます
また0x00を強調して表示する機能を実装しました

既知の不具合としては、スクロールバーの動作がおかしいです
しかしこれはC#側の問題な気もします
しばらくは最低限必要な機能を実装することが重要で、それが終わってから動作確認をすることになると思います
また横幅を変更するとスクロールできる行数も変化しますが、その部分もまだ実装していません

まだ実装していない機能としては、クリックしてカーソルを移動 でしょうか
バイナリエディタではないのでカーソルは必須ではないですが、マーカーとして便利です

他に実装したい機能として、カーソルの位置の表示+オフセットを設定したアドレスの表示
8,16,32,64bitの変数として扱った場合の値の表示
あたりを作りたいと思っています

右側に表示される文字はとりあえずASCIIだけの予定です
文字コードを扱うのは面倒なので


プログラムの作りとしては、上にメニューバー 真ん中にピクチャボックス 右側にスクロールバー という感じです
表示はBitmap Graphicsでリアルタイムに作っています
最終的には必要なときに画像を生成するようにするかもしれませんが、今のところはTimerで一定間隔ごとに作っています
必要なときに生成 の利点はCPUリソースを無駄に浪費しないという点ですが、欠点として「何かイベントがあると必ず呼び出す必要がある」という点があります
チェックボックスを作って、画像生成処理でチェックボックスを参照しているのに、なぜか正常に動作しない と思ったらチェックボックス変化割り込みで画像を更新していない みたいなことが発生する可能性があるわけです


データの読み込みは、一旦全て配列に読み込んでから必要な部分を表示します
なのでデータサイズが数百MBとか数GBになるようなファイルは扱わないほうがいいと思います


現状はこんな感じです
個人的に使いたいだけなので、あまり多機能性は求めませんが、自分が欲しい機能は載せていく予定です
いずれはバイナリエディタ機能も欲しいなぁと思いつつ、メモリ配列の途中にデータを追加って結構面倒なので
ただ表示は中のメモリを表示しているだけなので、置換(上書き)は簡単に実装できる気がします
この辺りはあんまり重要性が高くないのでしばらく放置になると思いますが


とりあえず、表示だけでもまともに動くようになるまでは作り続ける予定です