posted by
rerofumi
2006/3/29 水曜日 22:19:15
作るだけ作って記録していなかったので纏めてレポート。
物体の傾きをセンスし、それを PC で読み取るということをやりたかったので加速度センサーを用いる。というかこっちの方が発端で、加速度センサー(やその他諸々のセンサー)の値を PC に読み込むためにはどうしたら良いかと考え、その結果 PIC に手を出したというのが正しい。
加速度センサーは名の通り加速度を感知するもので、振動の感知などにも用いられる。が、通常静止状態であっても物体には常に 1G の重力加速度がかかっており、黙っていてもどっちか方向に重力の 1G が数値として表れる。つまり、静止状態において加速度ベクトルが現れる方向が重力的に真下であると判断でき、結果センサーの地面に対する傾きがセンスできる。
傾きを知るだけだったら二軸の加速度センサーでも良いしそっちの方が安いのだけれども、二軸だと水平の時上向きに水平なのか下向きに水平なのかが得られないので(あたりまえか)三軸が欲しいのですよ。
で、手頃なところで買ってきたのが「浅草ギ研」の三軸加速度センサー。
ちょいとお高めだけれども、アンプ内蔵で 5V 電源繋いで即基準電圧 5V の出力が得られるといった便利アイテム。アナログ回路無しで PIC に直結して A/D で読めるのです。

こんな感じで実験基板の上で A/D 読み取り実験。赤い基板が加速度センサー。
PIC デバイスの A/D コンバーターを普通に使うだけ。

上手いこといったので、PIC12F683 を使ってコンパクトに纏めてみる。
緑色の基板はストロベリーリナックスから買った USB-RS232C変換モジュール。今回は USB から電源を取り、センサーの状態を TTLレベルの RS232C として PC に送り出す。
なので回路はシンプル。

PIC 部分。

配線も簡素。
なので今回は回路図も省略。
soft_serial.asm
PIC 上のプログラムソース(PIC12F683)
A/D 部分は 10bit で得られる値を 8回計測して足し込み、疑似 13bit としている。それを 3bit 左へシフトし、16bit を計測値として扱っている。それを X Y Z で 3つ。
PIC12F683 には USART などないので、タイミングを数えながら I/O ピンを自力で ON/OFF してシリアル通信を行う。スタートビット、ストップビットを含め 10回ぱたぱたしてやると 1byte のデータが送れる。
タイミングは PIC12F683 の内蔵OSC 8MHz に合わせてあるので注意。
シリアル通信は割り込みを用いておこなうのがスマートなんだろうけど、タイミング的に問題もないので「計測→転送→計測→転送→…」とモノシリックなフローでごまかしている。
転送プロトコルは “XhhYhhZhh”(hhは16ビットバイナリ) といった感じ。PCから見ると定期的に 9byte が送られてくるので XYZ といった文字をヘッダーとして適当に扱う。
センサーの変化値が 5V 供給時 2.5V を 0G として 700mV/G で変動するらしい。だから 16bit で 8000h あたりで 0G、5400h あたりで 1G とかになる。実計測から 1G の絶対値を取るしかないのだけれども、 単純に傾き角度だけが知りたい場合は 3値のベクトルがあれば良くスカラー値はあまり関係ないので困らない。
—–
posted by
rerofumi
2006/3/17 金曜日 23:24:58
PC側のコントロールプロトコルは基本 LED レベルメーターと同じなので、前回の CPU 占有率アプリを使って動作実験ができる。
テストモードにしてから、スライドバーをコントロールするとそれに合わせてモーターがぐりぐり動くのが確認できるのですよ。
ちなみに CPU 占有率をそのまま送ると、やっぱりそれに合わせてモーターがぶいぶい動くのでアナログ的メーターみたくみえるような気もする。
ステッピングモーターの駆動を作成したのにはそれなりに意図があるわけだ。
ステッピングモーターというと、パルスコントロールにより「回転速度」をコントロールすることができるというメリットと「回転角」をコントロールして指定位置に動かすというメリットがある。
このうち「指定した角度に動かす」というのが今回の目的。
例えばステッピングモーターで作った回転台にフィギュアを置いて回したりするわけだ。カメラを回転台に置いたらパノラマ撮影ができたりする。
そこで PC 側のソフトとしては「ステッピングモーターをコントロールしながら、カメラで写真を撮る」というアプリを用意したいわけなのです。

ビデオカメラからの静止画キャプチャをするために DirectShow を使ったので結構苦労したけれども、個人的な目標はなんとか達成。
アプリの実行形式とソースコードはこちら。
stepping_capture_060317.zip
PIC デバイスが無くても連続撮影アプリとしても使えるかも。
—–
posted by
rerofumi
22:49:04
今回も実験ボードとサブボードをわけて回路設計。
回路図はこんな感じ。

実験ボードとしての回路は省略。
使っているのは PORTA の 4つの I/O だけなので PIC としては軽量なのだけれども、モーターコントロール部でアナログ回路があるのでちょいと面倒だった。
というかアナログ回路苦手。

4つ並んだダーリントントランジスタが壮観。
I/O チェック用に LED を追加してあるので、モーター駆動時に光がくるくるちかちか回るのが楽しい。
PIC のプログラムはこちら。
steppingmoter.asm
RS-232C から入ってきた値を目標値に設定して、現在の値が目標値より小さいと -1 大きいと +1 して現在値がずるずる動く仕組み。あとは現在値の下 2bit をステッピングモーターコントロールステップとして設定するだけ。
といっても、前回のレベルメーターでそういう設計になっていたのでそれの使い回しでほとんど変わっていない。というか、LED コントロール部分が無いだけレベルメーターよりも短くなっているのだけれども。
ハードと PIC プログラムは事もなく完了。
—–
posted by
rerofumi
22:32:00

電子工作はユニバーサルでふにふにと作成することがメインなのだけれども、部品を付けるために穴を開けたり切り取ったりといった作業が必要になることがある。
今回も、電源のプラグコネクタを付けたいのだけれどもこいつは幅が広い(2穴分)の足を持っているので穴を広げないとならない。

最近ちょっとフィギュア作りのほうも嗜んでいるので、こいつをがりがり使ってこなす。
おお、らくちんだ。
ついでにルーターの回転ノコビットを使って溝を掘り、ぺきっと折り基板を分ける。
—–
posted by
rerofumi
22:21:28
ステッピングモーターは回路によるコントロールで、回転速度や回転角度や方向を自在に操ることができるモーターなのです。
動作原理等については先人の詳しい説明が沢山あふれているのでググれ。
取り敢えず回して遊んでみてから回路を作ろうかと思ったので、ステッピングモーターと一緒に秋月の PIC ステッピングモータードライブキットを買ってきてみてある。
このキットは PIC16C56 でステッピングモーターを回転させるといった内容。CR発振でパルスを作り、1パルス毎にモーターのステップを進める感じになっていた。
って、結局作らずじまいで終わっちゃったのよね。てへっ。
色々と無駄な事を沢山している気がする。
せっかくだから赤い扉そのパーツを使って回路を作成。
ダーリントントランジスタを使っているけれども、原理的には普通の 2SC1815 をダーリントン接続しても OK。
—–
posted by
rerofumi
22:07:16

12V を食らわしてお亡くなりになった PIC の代わりを買ってくる。
860円也。
さて早速プログラムを書き込むかとPICプログラマにセット。
画面に表示される「プログラムエラー」 orz
ハズレ?ハズレ品?
SPWriter のデバイスリストで PIC16F876A のところで ProgOnlyCycle の数値を 1 から 2 へ変更
ProgOnlyCycle=2
とすることで安定して書き込める様になる。よかったよかった。
そういえば前のデバイスでもたまに書き込み失敗していたような気がする。
—–
posted by
rerofumi
2006/3/15 水曜日 2:23:55
今度の工作はステッピングモーター。
PC側のソフト次第ではかなり楽しく使えるのです。

こんな感じで滞りなく完了。
モーターの方で電圧が必要なので、サブボードに 12V のアダプタを接続する感じ。ついでなのでレギュレーターもサブボードに載せてしまい、今回実験ボードの電源供給もサブボード側から行う構造。
PC 上でのソフトでかなり苦労したけどなんとか全部揃った。
さて、いよいよ本格動作ですよ。ぷすっ。
…
……
………
うわあああああああぁぁぁ、PIC実験ボードに 12V を繋いでしまったあああああぁぁ……… _| ̄|○
PIC16F876A, ADM3102AN, LCD と石が全て逝ってしまわれる。
12V、恐ろしい子っ!
他はともかく PIC16F876A は予備が無いんだよう。
ちくしょう、こんなことで実験を止めてなるものか。
40ピンとピンの数は全く違うけれども、アーキテクチャは大体同じな PIC16F877A が手元にはある。プログラムをこいつに焼き込んで、後はピンさえ何とかすれば……。

かくして超絶パッチが誕生。
LCD が無いから動いてくんないので、LCD表示周りをコードからコメントアウトして焼き込む。
よっしゃ動いた。
しかし、流石にこのレベルのパッチだとシリアル通信がおかしくなりまくりなのは仕方がないところか。(なんか他の要因がありそうな気もするけど)
一応動かしたけれどもなんか不完全な気分。
PIC16F876A をもう1個買ってくるか……。
(40ピンPIC用実験ボードを作った方が早いような気もするけど)
—–
posted by
rerofumi
2006/3/13 月曜日 6:50:22
ハードウェアができたので次はそれをコントロールする PC 側アプリケーションである。
ポイントは二つ。
1) シリアルポートにアクセスする部分
2) Windows 上での CPU 稼働率を集計する部分

取り敢えずちゃっちゃと作ってしまいましょ。
遊びなんで常駐とかタスクトレイアイコン化とかしないで普通に起動しておくアプリとして。
実行ファイルとソースコード。
windows_monitor_060313.zip
一通り完成。動作させてみよう。

インテリアとしても合格の存在感。

光っている所がわかるショットをもう一枚。
普通に作業していてもあんまりあがらないので、わざと負荷をかけて遊んでみたりしちゃいます。やっぱ 15 を超えて赤く光るとなにか「おおおっ」とくるものがあるんだよね。
今回は CPU 稼働率だけを集計、表示させているけれども、PDH API を使っているので他のインフォメーションも集計可能なはず。
ハードディスクランプ代わりとか、ネットワーク転送量のモニターなんかにも良さそう。
当然ながらシリアルポートなので Linux からもコントロールしやすいというのもポイント。サーバーの監視に。
単なる遊びだけれども、機構、電気、組み込みソフト、PCアプリ、そしてユーザーへ提供するサービスと全てが詰まっているミニファクトリーなんだよね、コレ。楽しい楽しい。
—–
posted by
rerofumi
6:33:00
PICデバイスと PC を RS-232C で接続できるようになったので、PC からコントロールしてなにかさせてみたくなる。
取り敢えず LED を光らせたいなーと思ったけれども、マトリクス LED によるメッセージボードとかはメジャーなんで今ひとつ興味が湧かない。常にぴろぴろ動いているのが良いよねということで、「外付け CPU 稼働率メーター」を作ることにした。
最初は基板に LED を並べてそれでやろうとしたけれども、ふととある物が頭に浮かんだのでそれを入手してみる。

これだ。
この手のおもちゃも中に 1チップマイクロコントローラーが入っていて、そいつが I/O を通じて LED を光らせたり、ボタンを監視したりしている。PIC デバイスの工作と非常に近いものとなっている。
こいつの売りは番組と同じ音楽が流れるところなんだけれども、PIC で音を出すのは困難だし、オリジナルのマイクロコントローラーと共存させるのも面倒なのでばっさりと切り捨て。
今回は LED だけを使うということで割り切る。

LED 部分の回路はこんな感じになっていた。
抵抗が既に配置してあるところがおいしい。実は元の基板上にはトランジスタもあったのでそれを利用したかったのだけれども、かえって面倒になるのであきらめ。

それをドライブするような回路はこんなで良いだろう。あっさり風味。
前の記事で作った PIC 実験基板を使うので、I/O ポート以外の回路は省略してある。
LED は 5×4 のマトリクスになっていて、同時に 5つまで光らせることができる。この 5つを光らせる組み合わせを RC0〜RC4 の 5つで制御する。カソードをここに繋ぐので I/O 的に ‘0’ で点灯、’1′ で消灯となる。
4つのセグメントのうちどのブロックを光らせるかの指示は RA0〜RA3 の 4つで指示する。最大 5つの LED が点灯するので、電流確保のためトランジスタで増幅させる。
後は、プログラム制御でセグメントを切り替えながら表示をコントロールしていく。この切り替えを高速に行うことで 20個全部が点灯しているようにみえるのだ。
これは元のおもちゃも、そうして表示していたのだ。

ハードウェアと PIC のプログラムが完成。
PIC のプログラムは目標値と現在の値を分けておいて、目標に向かってじわじわと変化していくようにする。こうするとぽんっと表示が飛んでしまわずに、にゅるにゅると上がり下がりをするメーターになり見ていて楽しい。
PIC 側のソースコード。
levelmeter.asm
次の記事へ続く。
—–
posted by
rerofumi
2006/3/10 金曜日 4:53:40

ストロベリー・リナックスに発注しておいた「USBシリアル変換モジュール」が届いた。
先日の USBシリアル変換ケーブルでは PICプログラマーの動作が異様に遅くなるといった問題の時に、見つけて注文したもの。
これに使われている CP2101 なら大丈夫かなあと思って。
結局駄目だったんですけどね、ははっ orz
どうも使用ライターである SPW-10 PRO が sensitive な様で。ICSP が出来なかった事も含めて。
しかしま、こいつは TTL 出力なんで PIC に直接繋げるといううまみがあり、それ目的で買っているので良いのです。
RS-232C レベルコンバーターが要らなくて線を 2本直接 PIC に繋ぐだけで、USB 接続のアイテムになるというのはおいしいと思うのです。シリアル接続ですけれども。
チップが MLP なのでとてもじゃないが個人では入手しても加工できないデバイスをこのように販売してくれるのはありがたい。ストロベリー・リナックスさんだけあって、Linux で使えることが保証されているあたりもポイントだね。
最終目的(のひとつ)は PIC で様々な USB 接続アイテムを作る事だったりする。そのために PIC18F4550 を買い込んでいたりするので、こいつは通過点もしくは楽したいときの手抜きアイテムなのです。

メモリースティックDUO とのサイズ比較。
—–