2008/12/25

ewfyの節約生活

ewfyみたいなツールというのは、あくまでも裏方なので、CPUに余計な負荷をかけないのはもちろん、メモリとかも含めて、あらゆるリソースの消費を抑えることが求められます。これ自体がシステムに負担をかけてEWFの限界を下げることになっては本末転倒だからです。

ewfyはewfmgr.exeを子プロセスとして実行するので、どうしてもそのためのオーバーヘッドが生じますが、それ以外の部分で節約することはできます。たとえばewfmgr.exeからの出力はファイルを使わずパイプで受けます。その方が効率的だし、同じパイプを使い回したりもできます。それに、もしも監視のたびに一時ファイルをEWF有効なドライブ上に作ったりすると、そのために貴重なEWF用のメモリを消費していくことになってしまいます。
画面表示もリソースを消費する大きな要因なので、基本的にタスクトレイアイコン以外の表示は行わず、表示の更新も最小限にします。(バルーン出すときとかは別ですが。) ここでももちろん、大きなオブジェクトは可能な限り使い回しです。
また当然、監視と更新の頻度に比例してリソースの消費は増えるので、頻度をどの程度に設定するかは重要です。ewfyではこの頻度が可変になっていて、状況に応じてewfy自身が適宜調整します。(ちなみに、APIを直接呼んでいるにもかかわらずEwfPlusの方が重いのは、監視頻度が常に毎秒1回、というのが大きな理由だと思います。これは多すぎ。)

そんなewfyですが、もう追加するべき機能もなさそうだし、不具合も特に出てないようなので、このへんで一応完成ということにしたいと思います。
あとは、もしも要望があれば英語版を作るかも。
Would you like the English version of ewfy? Please leave a comment if you did.

2008/12/10

ewfy 0.4.0.1

ほとんど変わってないですが、新バージョンです。
ewfy 0.4.0.1
普通に使う上ではぜんぜん役に立たないと思いますが、ewfyが管理の対象とするドライブを限定する機能を付けました。これは簡単に設定が変更できると危険なので、あえてメニューには入れないで、iniファイルを直接編集して設定するようにしてあります。(デフォルトのiniファイルにも入っていません。)
たとえばCドライブだけを対象ににする場合は、ewfy.iniにこれを追加します。
target=C
デフォルトでは、従来どおり、EWFが使用可能な全てのドライブが対象です。
もちろん一部のドライブだけを管理したのでは自動コミットの意味があんまりないのですが、なにか問題があるときの切り分けとかには使えるかもしれません。
これも含めて、マニュアルにiniファイルの説明を追加しておきました。

2008/11/22

ewfy 0.3.0.1

ewfy更新しました。
ewfy 0.3.0.1

前のバージョンでは「コミットしないで終了」ができなかった、というかそれをやらない前提で作ったのですが、やっぱり何かヤバいことになったときの緊急脱出用とかのために、あった方が便利な気もしてきました。いちおう、ewfyだけで一通りEWF関連の操作ができるようにしておきたいし。

そこで、「状態の変更」に「コミットなし」を追加しました。この状態だとシャットダウン時のコミットも自動コミットも行われません。新しく状態を増やしたのに関連して若干メニューの表現を見直したりしましたが、大きな違いはありません。

それと、いくら機能を絞ってあるとはいえ説明が簡単なReadmeだけでは不親切すぎるので、ちゃんとしたマニュアル も作ってみました。

2008/11/13

ewfy 0.2.0.1

EWFは際限なくメモリを消費するので注意が必要ですが、ある程度のところで自動的にコミットしてくれる EwfPlus を入れておけば、とりあえず安心です。
EwfPlusは非常に有益なツールなのですが、ewfapi.dllが別途必要、というのがちょっと残念なところ。(Shared Computer Toolkit を使った場合、ewfapi.dllはインストールされないのです。)

ewfapi.dllのAPIを調べてみたら、機能的にはewfmgr.exeとほとんど同じでした。つまり、ewfmgr.exeでも同様のことはできるはず。
というか、実際に必要な機能はこれだけです。
  • EWFのメモリ使用量を調べる
  • コミットを実行する
どちらもewfmgr.exeでできますね。
最初は、ewfapi.dllを使えば「EWF有効のまま、ときどきコミットする」というのができるのかと思ったのですが、そういうわけじゃないようです。どうやっても、いったんコミットしたら再起動するまでEWF有効にはできません。

そういうわけで、作ってみたのがこれ。
ewfy 0.2.0.1
単にewfapi.dllが不要なだけじゃなくて、
EwfPlusにはなかった機能も入れてあります。
詳しくは ewfyのダウンロードページ で。

2008/10/18

EWFが入ってて、メモリ少なめ。これ。

Eee PC 901 を買いました。黒いやつ。

初心者向けかと思いきや、実はけっこうマニア向け。
使いこなすのは簡単じゃないけど、うまく使えばものすごい性能を発揮する。
いろんな意味でPIC的なモノを感じます。

とりあえず、EWFは入れるべきでしょう。
なんか時々、数秒間フリーズしたように止まることがあったので、
やっぱりメモリ増やさないとダメかもね、ぐらいに思っていたら、
実はメモリ不足じゃなくてSSDの書き込み待ちが原因でした。
メモリ増やすよりEWFです。(EWF込みでもメモリは1GBで十分かも。)

たしかにPICの内蔵EEPROMでもシリアルEEPROMでも、
読むのは速いけど書き込みはかなり待たされますね。
細かいことは良く分からないけど、
どちらも「フラッシュメモリ」なんだから似たようなもんか。
(間違ってるかもしれないけど、こう考えれば納得できる。)

EWFだと、いちいちSSDへの書き込みをせずに、後でまとめて一気に書き込む。
たしかにシリアルEEPROMの場合でも、1バイトずつ書くよりも、
バッファにためてまとめて書いたほうが効率が良いですね。
まあ、それとはちょっと意味合いが違うような気もするけど、
とにかくSSDの使い方としてはこれで正解だと思いますよ。

2008/09/27

玄関の鍵かけた?

先日、ついうっかり鍵をかけるのを忘れて出かけてしまう、
というアホな失敗をしでかしてしまいました。
幸い被害はなかったものの、こんなことではいけません。
ということで、こんなものを作りました。





玄関ドアの鍵の状態をフルカラーLEDで表示します。
鍵をかけずに出かけようとするとアラームが鳴ります。
自動的に鍵をかけたりはしません。(できないし。)
あくまでも注意するだけ。



これが本体。
上にアラームを止めるためのスイッチがあります。
中に家族がいれば鍵をかける必要がないので、
そういう時はこのボタンを押しておきます。
ドアの開閉を検出する方法で試行錯誤しましたが、
結局原始的な方法になりました。



製作途中の基板です。
この後何度も修正してジャンパだらけに。
ICソケットにはPIC12F683が入ります。

いろいろ考えて色とかアラームを細かく制御してますが、
実際に使ってみたら、意図した程の効果はなかったような気も。
ただドアにこんなものがくっついてたら嫌でも注意がそっちに行くので、
結果的に鍵をかけ忘れることはなくなりましたが。。

2008/08/31

超小型ユニバーサル基板

秋月にこんなユニバーサル基板が出てますよ。
この思い切ったサイズ。カッコよすぎです。
この基板に6ピンのPICとチップ部品で回路組んでみたいなぁ。

(2008/09/16)
8x8の方は手違いで穴のピッチが0.1mmほど狭かったそうです。

(2009/08/08)
リンク切れを修正。
だが穴のピッチはまだ修正されてない模様。

2008/08/01

6セグ

シンプルで合理的な形を追求したら、
数字を表現するには6個のセグメントで十分なのでした。

2008/07/29

ビー玉LEDをバージョンアップ

LEDの光をビー玉で拡散させるのはそこそこうまくいったのですが、
どうも後ろ側に漏れる光が多くてもったいない。
そこで、半分に切ったピンポン玉を後ろにつけてみました。


なんか妙にレトロかわいい感じなのでもう1個つくってみました。
普通の2本足のLEDだと、もっと電球っぽい形になります。

2008/07/21

ビー玉でLEDの光を拡散


光拡散キャップ以外の方法でLEDの光をうまく拡散できないかと、
100円ショップでいろんなネタを仕入れて実験してみました。
その中で良かったものをひとつ紹介したいと思います。




表面がすりガラス状態になっているビー玉。
よく100円ショップで見かけますね。
1個あたり10円ぐらいなので、
値段的には光拡散キャップと良い勝負です。




これを、このフルカラーLEDに取り付けてみます。
といっても、ただ上に乗せて、
ホットボンドでくっつけて隙間を埋めるだけ。
ガラスの玉なのでけっこう重いのかと思ったら、
ホットボンドだけでも十分に固定できるみたいです。




というわけで、でかいフルカラーLEDが完成。
このまま基板に挿して使えますね。
今回は角型のLEDを使ったので安定感がありますが、
普通の2本足LEDの場合は支えが必要になるかも。




点灯した様子。
写真だと分かりにくいですが、
すりガラスがそれなりに光を拡散しています。
それでいて、正面から見ると非常に明るい。

正面からだと明るすぎてうまく写らないので、
ちょっと斜めから撮っています。




色のバランスを見るために、
PICで自動的に色を変えるようにしてみました。
(そのへんは写真じゃ分からないわけですが。)

ビー玉全体が光って、なかなかきれいな色が出ます。
このLEDは裸で使うよりも、
こうした方がぜんぜん良いと思います。

2008/07/09

PICの罠: コンパレータ

コンパレータ内蔵のPICの場合、
デフォルトでコンパレータが有効になっています。
コンパレータの入力につながっているピンを入力に使う場合、
ANSELでデジタルに設定しただけではだめで、
さらにCMCON0でコンパレータをオフにする必要があります。
(そうしないと、常に'0'になってしまう。)
出力に使う場合は特に問題ないので気づきにくいですが、
それだけに厄介な罠といえるでしょう。

(2009/08/08)
↑全部ではないです。要注意なのはPIC12F683。

2008/06/15

むりやり2色LED

赤と緑のLED。

くっつけてエポキシでモールド。
見た目は悪いけど、これで2色LEDに...

なるわけないか!

表面を削ってみたらどうかな?




微妙。。

2008/06/02

PICの小技: ローカル変数

たとえばマクロ内の処理でWをいったん退避したい場合、
その退避先のアドレスをうまく決めておかないと、
マクロの中から別のマクロを呼び出したときに、
同じ場所に上書きしてしまうかもしれません。
こういう場合は、マクロ内でローカルなメモリ、
つまりローカル変数を使いたいところです。

結局マクロというのは呼ばれるたびに展開されるわけなので、
その都度メモリを適切に割り振ってやれば良いのですが、
これは、意外と単純な仕組みで実現できます。
; ローカル変数用に使う領域の定義
constant _VAR_first = 0x74
constant _VAR_last = 0x7b
variable _VAR_pointer = _VAR_first
variable vptr = 0

; N1バイトのメモリを確保する。
; vptrが、確保したメモリの先頭を指す。
valloc macro N1
vptr = _VAR_pointer
_VAR_pointer += N1
if _VAR_pointer > _VAR_last+1
error "valloc ran out of space"
endif
endm

; N1バイトのメモリを解放する。
; vallocと対で使う必要がある。
vfree macro N1
_VAR_pointer -= N1
vptr = 0
if _VAR_pointer < _VAR_first
error "vfree mismatch"
endif
endm

マクロの最初に valloc 、最後に vfree を記述して、
そのマクロの中で使うローカル変数の量を指定します。
valloc 直後に vptr の値をローカルなマクロ変数に入れたら、
あとはマクロの引数などと同じように使うことができます。
example macro
valloc 3 ; 3個のローカル変数を確保
local T1 = #v(vptr)
local T2 = #v(vptr+1)
local T3 = #v(vptr+2)
;
movwf T1 ; <-みたいにして使える
;
vfree 3 ; メモリ解放
endm

実行時に動的にメモリを確保しているわけじゃなくて、
あくまでもマクロ展開時に割り当てているので、
実行時の動作は普通にアドレスを直接記述したのと同じです。

ただローカル変数といってもマクロ内でローカルなだけなので、
サブルーチンや割り込みのことまで考えると、
・マクロの中からサブルーチンを呼び出さない
・割り込みの時はローカル変数領域全体を退避する
・あるいは割り込み処理ではローカル変数を使わない
とかの対策が必要になります。

2008/05/24

PICの小技: ブロックif

PICのアセンブラで条件分岐の処理を書くのって大変ですね。
条件を何重にも「否定」で考えないといけないし、
いちいちユニークなラベルを作るのもめんどくさいし、
elseがあったり多重になってくると、もうワケ分かりません。
Cみたいに if ... { ... } って書けると便利なんだけどなぁ...

実は、MPASMのマクロだけで、それっぽいことができるんです。
; マクロで使う変数の初期化
variable _BLK_count = 0
variable _BLK_depth = 0

; ifの素。条件スキップ命令と組み合わせて使う
if_n_ macro
_BLK_count++
_BLK_depth++
_BLK_stack#v(_BLK_depth) = _BLK_count
goto _BLK_label#v(_BLK_count)
endm

; elseブロック。あってもなくても良い
_else_ macro
goto _BLK_label#v(_BLK_stack#v(_BLK_depth)+1000)
_BLK_label#v(_BLK_stack#v(_BLK_depth)):
_BLK_stack#v(_BLK_depth) = _BLK_stack#v(_BLK_depth)+1000
endm

; ブロックの終わり
_endif macro
_BLK_label#v(_BLK_stack#v(_BLK_depth)):
_BLK_stack#v(_BLK_depth) = 0
_BLK_depth--
endm

このままでも使えますが、もっと分かりやすくするために、
分岐条件とif_n_を組み合わせたマクロを作っておくと便利です。
「スキップする条件」=「ifブロックを実行する条件」になるので、
例えば、Zフラグを条件とする場合は、こうなります。
if_z_   macro
btfss STATUS,Z
if_n_
endm

これで、こんな書き方ができるようになります。
        movf    MODE,W
xorlw 0x01
if_z_
movf N2,W
addwf N1,F
_else_
movf N1,W
if_z_
movlw 1
_endif
subwf N2,F
_endif

・インデントはお好みで。
・_else_はあってもなくてもかまいません。
・もちろん何重にもネストできます。

2008/05/17

PICの小技: Wを破壊せずにレジスタ間コピー

最近ずっとPICのアセンブラで遊んでいます。
PICで良いプログラムを書くのは、
まるでパズルを解くようなモノですね。
で、それをうまくやるマクロを書くのが、
また面白い。

たとえば、こんなのとか。
xorwf SRC,W
movwf DST
xorwf SRC,W
xorwf DST,F
これでSRCからDSTへのコピーができます。
このとき、Wを経由して処理しているにもかかわらず、
結局Wの内容は変化しない、というのがミソ。
したがって、Wの値を保持しておく必要がある場合でも使えます。
必要な命令数は、普通にWを退避してコピーするのと同じですが、
この方法だと退避先の心配をしなくて良いので便利です。

コピー元がリテラルの場合も同様。
xorlw DATA
movwf DST
xorlw DATA
xorwf DST,F
リテラルを2回使いますが、マクロ化すれば特に問題ないでしょう。
というか、マクロ化しないと読みにくくてしょうがないですね。

2008/05/06

1.5VでLED

今度は100Vじゃなくて1.5Vです。
とりあえず簡単そうなのを作ってみました。




HT7733Aで3.3Vに昇圧して白LEDを点灯させます。
簡単にするために部品をいくつか省略しました。
電圧が低めなので、LEDの電流制限抵抗もなしです。







小さく作って電池ケースにくっつけました。
固定と絶縁をかねてエポキシで固めたら、
なんだか微妙にグロい感じの仕上がりに。
思ってたのとちがうぞ。。







裏側に小さなスイッチが付いています。
押したらONですが、ずっと押してなくても、
普通の向きで置いたら自重でONになります。

2008/04/29

コンデンサの容量を変えてみる

また AC100VでLED ネタです。


いろんな容量のコンデンサが手に入ったので、
コンデンサの容量を変えて電流値を測ってみた。
(交流なので実効値です。電源周波数は50Hz。)
C[uF] 電流[mA]
0.33  8.7
0.47  11.8
0.68  17.9
1.00  24.9
コンデンサのインピーダンスから単純に計算すると、
電流値 = 電源電圧 × 2 × π × 電源周波数 × コンデンサの容量
ですが、実際にはその80~85%ぐらいになるようです。
ちなみに、LEDでの電圧降下はコンデンサの電圧降下に比べて十分小さいので、
LEDを変えても電流値はほとんど変わりません。
複数のLEDを(直列に)入れたりしても大丈夫です。



↑今回使ったコンデンサたち。耐圧250Vだと結構でかい。
左から、0.33uF, 0.47uF, 0.68uF, 1.0uF, 2.2uF。
(2.2uFは、50mA以上流れそうなので除外しました。)

2008/04/19

AC100Vから5Vを作れなかった原因

100VでLEDを点灯させる実験はうまくいったものの、
ついでに思いついた5Vの電源として使おうという試みは見事に失敗。
その原因は、非常に初歩的なものでした。



初歩的なミスその1:
負荷が200Ωのときに5V出なかったのは、単に負荷抵抗が小さすぎるからです。
単純に計算して、負荷が200Ωだと、5V出すには25mA必要です。
78L05はできる限りの電流を流そうとしていたはずですが、
なにぶん入力からは12mAしか来ないので、必要な量に全然足りません。
だから5Vなんて出るわけがないのです。
この時点ですでに初歩的なミスその1を犯していたのでした。

初歩的なミスその2:
電流が少ないからといって甘く見ていました。
なにしろ相手はAC100V。
トランスで電圧を落としてるわけじゃないので、
整流してコンデンサにためたらどんどん電圧が上がっていきます。
当たり前ですね。。
出力端子をオープンにした78L05ではあんまり電流が流れないので、
470uFはどんどん充電され、やがて35Vもの電圧に達しました。
もちろんこのとき、78L05ががんばって電力を熱に変えていたので、
これ以上に電圧が上がらなかったわけです。
最近のコンデンサは爆発しないようにできてるそうですが、
それでも危険な状態になっていたことは確かです。

このように、予想通り、レギュレータの使い方が間違いまくってました。。
なんでもかんでも78L05を使えば良いというものじゃない、
ということがよく分かったのでした。

2008/04/13

AC100VでLED

AC100VでLEDを点灯させる実験をしてみました。
トランスを使わずコンデンサで電圧を落とす方法です。
定数は手持ちの部品の中で適当に決めました。

いくら簡単な回路とはいえ、AC100Vを扱うのは正直ビビります。
というのも子供の頃にイタズラして本当にビビッと感電したから、
というのは置いといて、とにかくやってみたら、あっさり点灯してくれました。

最初はブレッドボードにAC100Vをかけるのもちょっと心配だったのですが、
別に、部品が発熱するとか変な音がするとかいうこともなくて、
テスタで測ってみて、やっとそれなりの電圧だと分かるだけです。
でも金属部分に手で触ってみたいとは絶対に思いません。。。

せっかくなので他の回路も試してみました。
ダイオードブリッジで整流して1個のLEDを点灯させます。

パルスの数が2倍になるので当然明るくなりますが、
2倍明るいのかどうかはよく分かりません。
回路に流れる電流はさっきの回路と変わらず、約12mA程度。
トータルではLEDで消費する電力は変わってないので、
たぶん明るさもほぼ同じなんでしょう。
ちなみにVfの違うLEDに変えても、電流値はあんまり変わらないようです。

調子に乗って、こんなことも考えてみました。
トランスを使わずにDC5Vが取れるのでは、と。

出力に適当な負荷(200Ω)をつないで電圧を測ってみたら、2.5V。
ぜんぜんだめです。78L05の入力側で3.5Vぐらいしかないし。
そこで、(なんかヤバそうな気がするけど)出力をオープンにしてみたら...
きましたよ。
78L05が非常に熱いです。
入力側が35V(!)とかになってます。
結局、まともに5Vを取ることはできませんでした。

そもそもコンデンサの容量が小さすぎるんじゃないかという気はしていますが、
あいにく手元には(耐圧250V以上で)0.47uより大きいのがありません。
もっと大きいので試してみたら違う結果になるのかもしれません。
ていうか、レギュレータICの使い方として、こんなんでいいんでしょうか?
2uFとツェナーダイオードを使って5Vを作る回路を参考にして、
再度挑戦してみることにします。

(2008/04/19) 失敗の原因が分かりました。

(2011/04/16) 関連記事もどうぞ。

2008/03/23

PICkit2

PICで遊ぶには、プログラムを書き込むためのライタが必要です。
昔は 秋月のライタ が定番と言われていましたが、
作りが古いし値段も高いので、今から買うなら、
もっと高性能で安い PICkit2 の方がおすすめです。
たぶんmicrochipDIRECT が送料込みでも一番安いと思います。
PICkit2にはICソケットがありませんが、
ブレッドボードとかに挿して使えば良いので大丈夫です。

PICkit2と完成品の基板がセットになったStarterKitもあります。
これだと一切ハードをいじらずにプログラミングの実験ができるので、
とりあえず最初はこっちの方が良いかも。

2008/02/11

PICとは?


PICという、小規模な組み込み用のマイコンがあります。
値段は非常に安くて、1個100円とかです。高いのでも500円とかそういうレベル。
必要なハードウェアがほとんど全部チップ内に入っているので、基本的に電源つないだだけで動いてしまいます。
全部中に入れてしまえばバスを外に出す必要もないので、ピンの数はすごく少なくて、電源以外は基本的に全部I/Oです。
こんなちっこいのに一応コンピュータなんですよ。しかも値段が100円。
もちろん普通のPCとかと比べると笑っちゃうほどロースペックなのですが、1バイトとか1クロックとか気にしながらアセンブラいじるのも、それはそれで楽しいかも。。。

2008/01/25

GoogleChartでオセロ

GoogleChartでゲームができそうなので作ってみました。
Google Chart Othello

ご覧の通り、ただのオセロです。
ゲームの本体はJavaScriptで、表示するたびに画像のsrcを書き換えています。
詳しくはソースを見てください。

表示にGoogleChartを使うメリットのひとつは、本当にJavaScriptオンリーでできる、ということです。
つまり、画像ファイルとかを用意する必要がない。

もっとも、オセロぐらいならテキストだけでも何とかなりそうですが。
というか逆に、GoogleChartでオセロ以外のゲームができるのか、というと...
んー...

(2009/05/31)
Google Sites への移行に伴いリンク先を修正しました。
Google Sites ではJavaScriptが使えないので、ガジェット化して貼り付けています。

アーカイブ