2014年 02月 06日

mil

電子部品の足の間隔とかは 0.1inch == 100mil で作られている。ユニバーサル基板のピッチが 0.1inch == 100mil。mil は1000分の1 inch

2014年 02月 01日

12V, 5V, 3.3V 電源

Raspberry Pi を中心にやってみようとしているところ | avr | raspberrypi | ham - 氾濫原 について、まず電源をつくった。

手元にサンハヤトのICB-90という基板がたくさんあるので、これに実装した。

とりあえずこれで Raspberry Pi を動かしてみたけど、スイッチング部分はちょっとあたたかいぐらいだった。

Eagle で配置を検討したら Print を Mirror とUpside down にチェックをいれて行うと裏面から見た感じがつくれるので配線が楽だった。あとなんか単位 (inch, mm) を切り替えながらやっていたらグリッドからずれることがあって困ったけど、これは Cmd を押しながら移動を行うことでグリッドにフィットするようだった。

2014年 01月 28日

Mac で強制的に FAT32 でフォーマットする

ディスクユーティリティを使って FAT でフォーマッットをすると、フォーマットしようとしているディスクが2G未満だと自動的に FAT16 になってしまうようだ。

世の中にはFAT32だけをサポートするという変わったシステムもあるので、そのような環境において 2GB 未満のメディアを使おうとすると、これは困る。しかし以下のように diskutil コマンドからならば普通にフォーマットをかけられる。

$ diskutil list
# /dev/disk2 とか、フォーマットしたいディスクをよくよく確認する
$ diskutil partitionDisk /dev/{{disk}} 1 MBRFormat "MS-DOS FAT32" SD 100%

オシロスコープを買った

OWON デジタルオシロスコープSDS7102 超薄型 1Gsサンプリング100MHzFFT機能付カラーポータブルフルセット【国内正規品】 - OWON

OWON

5.0 / 5.0

OWON SDS7102 というのを買った。OWON は中国の測定器メーカーで、かなり安いオシロスコープを出しているけど、ググったりしてみると割と評判が良く、英語圏でも使ってみたりハックしたりしている記事がヒットする。

オシロスコープの選定基準は主に

  • 帯域
  • サンプリングレート
  • チャンネル数

があるけど、買ったモデルは、帯域 100MHz、サンプリングレート1G samples/sec、2ch のもので、中堅クラスぐらいのもの。帯域が100MHz でも、矩形波にすると25MHz程度までしか観測できないので、マイコンプログラミング程度でもこれぐらいのスペックが必要になり、なかなか厳しいものがある。デジタル回路を見る場合2chは必要…

これ以上のスペックものは正直高すぎて手が出ない。購入価格は正規代理店経由のもので 52000円ぐらい。円安になりつつあって一時期より値段があがっていたけど、消費税もあがると買うことにした。

所感

今までオシロスコープを所持したことがないので、他のオシロスコープとの比較はできない。

届いてあけた感想としては「画面がでかい!」「奥行がない!」という感じだった。ちょうどいい大きさ。

使いこなせるかな、思っていたけど、予想よりは全然操作が簡単で、すぐトリガをかけて単発現象を観測したりはできるようになった。

見えないものが見えるようになるというのはすごくテンションがあがる。可能性が一気に広がったように感じる。

よくないところ

現時点では完全に使いこなせているとは言えないので、あまり思いつかないけど、

  • USB host 側として、FAT32 しかファイルシステムをサポートしてない
  • USB slave 側として、Mac につなげるとなぜか Mac がフリーズする
  • 電源ケーブルが硬く、ソケットが左向きについているので、結構邪魔
  • 電源ケーブルの接続がなんか心もとない

というのがあった。LAN ポートもついていて、こっちの連携はすぐにうまくいった。

SDS7102 のスクリーンショットを LAN からとる

普通にルーターと接続してアドレスとかを設定すると、設定したポートで listen するようになってるのでコマンドを送るだけ。

なので自分で Ruby で実装を書いてみた。bmp を得られるけど、png で欲しいので ImageMagick で変換までしている。

プロトコルフォーマットはググると出てくる。ただ、bin なフォーマットは仕様書とだいぶ違っていて、結構めんどうくさい。

というのがあって、解析したコードがあったりする。けど、とりあえず必要ないし、そこまで実装してない。

2014年 01月 23日

FT-450D の CAT の挙動

AI の挙動不審

AI (Auto Information) でデータが自動でくるようになるけど、その状態でこちらから読み出しコマンドを出したり、書き込みコマンドを出したりすると、それらのコマンドがうまく読みとってくれなかったり、あるいは出力が混ざったりする。

解決方法でいまいち良いのがない

考えた解決案

  • AI はするが、コマンドは何度か送りつける
  • 一旦 AI を止めて、コマンドを送りつけて AI を再開する
  • AI を一切やめて必要な情報だけをポーリングする
AI はするが、コマンドは何度か送りつける
  • 3回程度送りつけても結局失敗することがある

コマンドが成功していることが確認できるまで送り続ける方法もあるが、コマンドごとに確認方法が違うのでコーディングが大変

一旦 AI を止めて、コマンドを送りつけて AI を再開する
  • まず、AI を止めるためのコマンドが認識されないことがある
  • AI を止めてもすぐに止まるわけではないっぽい
AI を一切やめて必要な情報だけをポーリングする

確実に動くけど

  • 情報が反映されるのが非常に遅くなる

例えば読み出しコマンドを発行すると、250ms ぐらいでようやくレスポンスがあるので (何やってんだ?) 、4個値を読み出すだけで1秒かかってしまう。

AI はそのまま

AI はそのままにするのがやはりよさそう。コマンドを送って確実に操作するよりも情報を早く受けとるほうが重要だと思う。

とはいえ、コマンドを送ったのに反映されないのもイラつくので、かなり執拗に送信確認をする必要がある。

  • 書きこみするコマンドを3回送りつける
  • 読みだしする

として、返答があるのを250msぐらい待って、セットできていなかったらリトライする。

2014年 01月 22日

絶縁型 RS-232 ⇔ TTL レベル変換

RS-232 TTL 変換をフォトカプラでやる。

グラウンドを分離したいと、ノイズ相互の流入を防ぎたいのでRS-232変換を専用ドライバーICではなく、フォトカプラで行うようにした。無線機側とグラウンドを共通にするとインターフェアがでやすいらしい。

面倒な点は、RS-232 側の両電源を別に用意しなくてはならないところだけど、ググってみるとRTSにきてる電圧と RX の電圧をうまいこと利用している例があったので、それに従うことにした。一応RTS CTSをショートさせて電圧を計ってできそうなことを確かめた。

回路

これのコピーです

RS-232 が正負電圧で論理表現をするのでそこが面倒なところ、正電圧はRTSできてるのでいいけど、負電源をとれるピンはないので、TXのアイドル (負電圧がかかってる) を使ってる。47uFの電解コンデンサは電源を安定させるためについてる。

TX のアイドル時にコンデンサに電荷をためといて、RX が正じゃないときはダイオードを通じて RX のレベルを負に保つようになっている。コンデンサの前に 680Ω の抵抗がついているのは正のときにおかしくならないようにかな……

あとは電圧をクリップするダイオードがついていたり、フォトカプラのスペックにあわせるための抵抗がついてたり。

RS-232とTTLは論理が逆だけど、フォトカプラがオープンコレクタなので自動で反転して丁度いい。

手元で試した限りだと、ボーレート 19200 でもうまくうごいた。

挙動を確認する

その後オシロスコープを買ったので再度挙動を確認してみた。

これは Linux → Rig 方向のもの。この方向の負電圧は 47uF に蓄えられているものが使われる (と思う) ので、連続して送信を行うと、だんだん電圧レベルがさがってしまう。最後のほうは 3V 未満になってしまっているので、RS-232 レベル的には動かない。

200uF にすると、だいぶマシになる。適切なのを選択する必要がありそう。

ハマったところ

ハマったのは、USB シリアル変換ケーブルと、無線機のRX TXの配線が逆な点だった。これは普通にドライバーIC使ったときもハマったので比較的すぐ抜けれたけど、毎回ハマる…

あとはTTLレベルのRXをRS232ドライバICに面倒くさがって繋がったままやってたら動かなかったのもハマった (電源が入ったままだったので GND に落ちていたっぽい)。変なことしないほうがよい

あと、もっと簡略化した回路(TXとRXを繋ぐ部分、負電源部分を削除したもの)もググるとでてくるけど、それだと今回はレベルが安定しなくて、エコーする現象が起きてだめだった。

フォトカプラは FOD817B300 というのを使った。応答速度の関係でものによっては動かないとかあるみたいだけど手元にあったのでうまく動いた。

参考文献

2014年 01月 21日

Angular JS で View を伴う Service 的なことをしたいとき、あるいは Directive に Controller をつけたいとき。

クソコード を書いたはいいが、釈然としなかった。 "View independent business logic: Services" とドキュメントに書いてある通りなので、やはり他のやりかたのほうがよい。のでよくよく読んだところ、やはり View にかかわる部分は Directive に集約されるようだ…… しかし使いかたが非常に難しい。

iimsApp.directives.directive('dialog', function ($q) {
    return {
        restrict: 'E',
        transclude : true,
        scope : {
            Dialog : '=name'
        },
        controller : function ($scope) {

            $scope.Dialog = {
                open : function (title) {
                    $scope.deferred = $q.defer();
                    $scope.title = title;
                    $scope.show  = true;
                    return $scope.deferred.promise;
                }
            };

            $scope.close = function () {
                $scope.show = false;
            };

            $scope.ok = function () {
                $scope.close();
                $scope.deferred.resolve();
            };

            $scope.cancel = function () {
                $scope.close();
                $scope.deferred.reject();
            };
        },
        templateUrl : '/static/js/app/dialog.html'
    };
});

こんな感じで dialog という directive を定義して、

<div ng-controller="FooCtrl">
    <dialog name="FooBarDialog">
        {{ message }}
    </dialog>
</div>

というふうにすると、FooCtrl のスコープから FooBarDialog というプロパティで見えるようになる。つまり

        $scope.message = "Hello!";
        $scope.FooBarDialog.open('OKK!!!!!').then(function () {
            alert('ok');
        }, function () {
            alert('cancel');
        });

みたいなあ

難しポイント

  • restrict: 'E'
    • この directive は要素として使うよってこと
  • directive の scope の定義がむずかしい
    • プロパティ名には自分のスコープで見える名前、値には謎の書式で親スコープから見える名前が書いてある属性名を書く
  • controller に渡される $scope
    • 親スコープなどからは分離されているスコープが与えられる。directive が何度も出現することもあるからね!
  • transclude: true の意味。これは dialog 要素内に内包される変数が、外側のスコープをさすようにするもの。例では $scope.message を外側のスコープで代入している

こういう謎の構造体を返すのってわっかりにくいので気持ち悪いなあて思いました。全部メソッドになっているべきなのでは????

directive のプロパティの説明がどこにあるかわかりにくいけど、 http://docs.angularjs.org/api/ng.$compile#description_comprehensive-directive-api_directive-definition-object にある

2014年 01月 20日

Angular JS でビューを伴う Service ってどう書けばいいんですか

続きをかきました。

[tech] Angular JS で View を伴う Service 的なことをしたいとき、あるいは Directive に Controller をつけたいとき。 | Tue, Jan 21. 2014 - 氾濫原

よくわからなかったので以下のようにしましたが、まっとうな方法には思えないので正しいやりかたをおしえていただきたく申し上げます……

  • factory で空のオブジェクトをかえしとく
  • view に紐付けた controller で factory で作ったオブジェクトを初期化する
  • 作った Service を依存に加えて使う

一応、controller 間は直接依存しない (Service を mock にさしかえれば動く) のでユニットテストは書けると思うけど、よくわかりません……

myApp.factory('DialogService', function () { return { } });
myApp.controller('DialogControl', function ($scope, $q, DigalogService) {
	DialogService.open = function (title, message) {
		$scope.deferred = $q.defer();
		$scope.show = true;
		return $scope.deferred.promise;
	};

	$scope.close = function () {
		$scope.show = false;
		$scope.deferred = null;
	};

	$scope.ok = function () {
		$scope.deferred.resolve(true);
	};
});


// User
myApp.controller('FooController', function ($scope, DialogService) {
	DialogService.open('foo', 'bar').then(function () {
		...
	});
});

そもそも "View independent business logic: Services" と書いてあるので、定義からして Service はビューを持ってはいけないようです。

じゃあビューを伴う Service 的なものはどうやって書くんですか

2014年 01月 17日

Raspberry Pi / BeagleBoard Black / Intel Galileo / Arduino の違いのメモ

いろいろでてきてる。

Raspberry Pi

Type AType B があり、Type A はイーサネットポートと組込みUSBハブがなくメモリが少ない分少しだけ安い。

BeagleBoard Black

本体は Raspberry Pi と同じぐらいの価格だけど、

  • CPU がより高速
  • オンボードなフラッシュメモリがある (SDカードもつけれる)
  • 消費電力がより低い
  • GPIO が多い

という特徴がある。内蔵フラッシュメモリがあるので、(それにおさまるなら) SDカードがいらない分、Raspberry Pi よりコスト面でも有利。一方で欠点は

  • 入手性
    • Raspbery Pi はかなり安定して手に入る感じだけど、BeagleBoard Black はそうでもない感じ
  • 情報源
    • やはりちょっと少ない

Intel Galileo

価格的に上であげたものの1.2〜1.5倍ぐらいする。現時点ではまだ日本未発売。1月中旬らしいのでそろそろかな。2A のAC アダプタとケーブルが一部付属っぽいので、(それらが必要な人なら) そんなに割高とはいえないかもしれない。

Linux が動いてるけど、Arduino 互換を謳ってる。ピン互換があって Arduino 用にでまわっているシールドがつかえるのと、開発環境も Arduino のものが使える。

気になるのは

  • グラフィック出力がない (HDMI とか)
  • 消費電力 (詳しいスペックがわからないけど、2A のアダプタが付属ってことは結構あるのかな)

Arduino

Arduino は AVR というマイコンを使って動いているので、Linux は載っていない。本当にローレベルなことしかできないし、CPU クロックも20MHz程度。2000円〜3000円ぐらいで買えるみたいだけど、できることと、実装方法の苦楽の差を考えると Raspberry Pi や BeagleBoard Black のほうが圧倒的にコストパフォーマンスは高い。

個人の見解のまとめ

最初に手をとるなら Raspberry Pi がよさそう。もっと要求がでてきたら BeagleBoard Black がよさそう。Intel Galileo はなんともいえない。

さらに別の回路を複雑に繋げたり、役割分担をさせたくなったら、Arduino 的なものを導入してもよさそう。

しかし AVR 使うなら、普通にチップ買えば1個あたり50円〜300円程度 (チップによる) なので、個人的にはそのほうがいいと思う。ただ、Arduino はオールインワンな感じの開発環境がキモなので、それが欲しいなら Arduino はいいかもしれない。(自分で互換のブートローダーを書きこんでもいいけど)