コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for 3月, 2006


hatena bookmark

「まわるメイドインワリオ」一台を三枚に下ろし、ジャイロセンサーの工作に手を出すことに。


真ん中の長方形の部品が載っている小さな別基板がジャイロセンサー。こいつのおかげでカセットがでかくなっているのだ。
よく考えたら振動用のモーターもなんかに使えそうですなん。


ちと今回は明確な元回路図無く行き当たりばったりで作業しているので美しくない。
写真だと隠れちゃって見えないけれども、ジャイロセンサーの裏には 3V のレギュレーターがあってセンサー用に電圧を落としている。
最初はセンサーの出力をオペアンプで増幅して読み取らないとと思っていたけれども、実際にやってみたらセンサーの出力範囲が 0〜2.6V だったので直に繋ぐことにした。PIC側の A/D が 10bit あるから 9bit 精度で読み取れるし、まあ良いか。
カタログの「基準電圧 1.3V」というのが、0〜1.3V 出力じゃなくて、静止時平均が 1.3V でした。

どっちかというと読み取った後のソフトが大変そうだ。
静止時といってもアナログデバイスなので揺らぎノイズがあるのだけれども、これが大体出力的に換算 1度前後の角速度でぶるぶる震えている。落ち着かせる方法がないので、ずりーっとドリフトしていったり。
移動の閾値をつけると、小さな動きに対応できないしで結構悩む。正面から横に向け、また正面に持ってきても閾値と積分ドリフトで元の数値になっていない。
まあ、わかってはいたことだけれどもね。

—–


hatena bookmark

その昔、Z80 とかの時代はコンピューターも偉い簡単な回路で組まれていてそれで TV に出力とかしていた。
んじゃあ、今の割と高速な PIC 単体で TV 出力できるんじゃないか、とか思って調べてみたら当然のようにヒット。
ルーツはトランジスタ技術の 1997/5 号に掲載された PIC を使ったワンチップブレイクアウト(ブロック崩し)らしい。えらい古い話だなあ。
その記事自体はPIC工作総集編の本に混ざっているけれども、ソースコードは今でも CQ出版のサイトからダウンロードすることができる。
WEB上でもあちこちで実際に作った体験記や回路図などが残されている。取り敢えずここあたりを参照して、リンクを飛び回るとよろし。
回路もえらい簡素で、ビデオ出力周りは抵抗数個とトランジスタだけで構成されていてびっくり。これなら作れそうだ。

どうせ作るなら(ソフトを自分で書く気) Pong が良いな。最近は Pong が見直されている不思議なご時世だし。
ということで調べてみたら海外の方でいくつか PIC-Pong の作例が見つかった。
そのうちの 1つが凄い。ビデオ出力に抵抗 2本しか使っていないのだ。


回路図で言うとこんな感じ。って書いてみせるのも気抜けするほど。

こちらのサイトにえらい詳しい説明があるのでそちらを参照してもらいたいあたり。
まず前提としてカラーは無理なのでモノクロだけを扱います。NTSC でカラーを扱おうとするとバースト信号の記述とそれとの位相差記録が必要で PIC では到底間に合いません。
で、モノクロをコンポジットで出力するには 0〜1.0V の電流をお約束に従って流し込んでやればよい。通常の信号無し状態が 0.3V で、0V に立ち下げると Sync 信号、0.3〜1.0V が輝度信号として扱われる。
つまり、黒と白だけの画面ならば 0V, 0.3V, 1.0V 三種類の電圧があれば作ることができる。これを PIC の I/O out から抵抗による電圧降下で作り出すってわけ。TV 側のコンポジットが内部抵抗 75Ωなので、それを含めて計算しているところがミソ。
ブレイクアウトも同等の回路で出来るはずだけれども、PIC-Pong は 5V 回路でブレイクアウトは 3V 回路なので注意。そのまま 5V にして TV 出力周りを持ってきても問題ないけど、パドルの値を読み取る CR 回路に影響がありそう。3V で抵抗の値を計算し直した方が早いか。

というわけで抵抗 2本を用意してそれだけで本当に TV 画面になにか画を出すことができるのかを実験。


なんか出た。ふにょふにょに歪んでいるけど出たことは確かだ!
クロック数とタイミングをパズルのように積み重ねていかないとならないのでかなり面倒。簡易ペンオシロがなかったらここまでたどり着けなかったかも。
PIC12F683 を内部クロック 8MHz で動かしているんだけれども、そのクロックの不安定さが画面に出ているんだろうか。

取り敢えず最初の一歩。先は長い。
—–


hatena bookmark

三軸加速度センサーで傾きが得られるようになってほくほくなのですが、実はこれだけだと不十分なのです。加速度センサーは傾きを感知することはできるけれども、ヨー方向の回転は知ることができません。
ヨーの回転を得るためには「ジャイロセンサー」が必要なのだけれども、ジャイロセンサーはお高いのですよ……。なので諦めて加速度センサーだけでも、と。

加速度センサー繋がりでゲームボーイカラーの「コロコロカービィー」を入手する。中古で 300円。
おお、こりゃ面白い。ころころころ。
コロコロカービィのカートリッジの中に入っているのは二軸加速度センサーの ADXL202 だそうだ
今コロコロカービィを買うと安価にて二軸加速度センサーを入手できる手段となりうるか?まあ、秋月で新品買っても 800円くらいですけど。

そのサイトで見つけた別記時で「まわるメイドインワリオ(以下まワリオ)」ではジャイロセンサーが使われているとのこと。
なに?まワリオは加速度センサーじゃなかったのか。てっきりゲーム機を垂直に持って遊ぶゲームだと思っていたのに、どう持っても良かったのか。くそ、だまされた(誰も謀ってません)。
まワリオは面白いゲームなので中古でも 3500円とかなかなか価格が下がっていない状況。でも、箱説明書無しなら 2500円くらいで手に入る。ジャイロセンサーとしては安価じゃないか。


3個入手(w
まあ、ゲームの方も楽しみたいし無理に三軸必要でもないので最初は 1つだけ利用してあとは取っておく方向で。
ちなむと、三軸で 1つのモジュールになっている加速度センサーは売られていないらしい。

このセラミックジャイロセンサーのデータをみると 3V 駆動で出力基準電圧が 1.3V とかある。まあ 3V はツェナーダイオードでないいとかするとして、出力が 1.3V というのが心許ないなあ。
オペアンプで増幅することにしたが、結局アナログ回路が必要な事になってしまう。デジタルだけで済むからと PIC の電子工作を始めたのに、やっぱり色々と必要になるもんだ。
—–


hatena bookmark

作るだけ作って記録していなかったので纏めてレポート。
物体の傾きをセンスし、それを 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値のベクトルがあれば良くスカラー値はあまり関係ないので困らない。
—–


hatena bookmark

PC側のコントロールプロトコルは基本 LED レベルメーターと同じなので、前回の CPU 占有率アプリを使って動作実験ができる。
テストモードにしてから、スライドバーをコントロールするとそれに合わせてモーターがぐりぐり動くのが確認できるのですよ。
ちなみに CPU 占有率をそのまま送ると、やっぱりそれに合わせてモーターがぶいぶい動くのでアナログ的メーターみたくみえるような気もする。

ステッピングモーターの駆動を作成したのにはそれなりに意図があるわけだ。
ステッピングモーターというと、パルスコントロールにより「回転速度」をコントロールすることができるというメリットと「回転角」をコントロールして指定位置に動かすというメリットがある。
このうち「指定した角度に動かす」というのが今回の目的。
例えばステッピングモーターで作った回転台にフィギュアを置いて回したりするわけだ。カメラを回転台に置いたらパノラマ撮影ができたりする。
そこで PC 側のソフトとしては「ステッピングモーターをコントロールしながら、カメラで写真を撮る」というアプリを用意したいわけなのです。


ビデオカメラからの静止画キャプチャをするために DirectShow を使ったので結構苦労したけれども、個人的な目標はなんとか達成。
アプリの実行形式とソースコードはこちら。
stepping_capture_060317.zip
PIC デバイスが無くても連続撮影アプリとしても使えるかも。
—–


hatena bookmark

今回も実験ボードとサブボードをわけて回路設計。
回路図はこんな感じ。


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


4つ並んだダーリントントランジスタが壮観。
I/O チェック用に LED を追加してあるので、モーター駆動時に光がくるくるちかちか回るのが楽しい。

PIC のプログラムはこちら。
steppingmoter.asm
RS-232C から入ってきた値を目標値に設定して、現在の値が目標値より小さいと -1 大きいと +1 して現在値がずるずる動く仕組み。あとは現在値の下 2bit をステッピングモーターコントロールステップとして設定するだけ。
といっても、前回のレベルメーターでそういう設計になっていたのでそれの使い回しでほとんど変わっていない。というか、LED コントロール部分が無いだけレベルメーターよりも短くなっているのだけれども。

ハードと PIC プログラムは事もなく完了。
—–


hatena bookmark


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


最近ちょっとフィギュア作りのほうも嗜んでいるので、こいつをがりがり使ってこなす。
おお、らくちんだ。

ついでにルーターの回転ノコビットを使って溝を掘り、ぺきっと折り基板を分ける。
—–


hatena bookmark

ステッピングモーターは回路によるコントロールで、回転速度や回転角度や方向を自在に操ることができるモーターなのです。
動作原理等については先人の詳しい説明が沢山あふれているのでググれ。

取り敢えず回して遊んでみてから回路を作ろうかと思ったので、ステッピングモーターと一緒に秋月の PIC ステッピングモータードライブキットを買ってきてみてある。
このキットは PIC16C56 でステッピングモーターを回転させるといった内容。CR発振でパルスを作り、1パルス毎にモーターのステップを進める感じになっていた。

って、結局作らずじまいで終わっちゃったのよね。てへっ。
色々と無駄な事を沢山している気がする。
せっかくだから赤い扉そのパーツを使って回路を作成。
ダーリントントランジスタを使っているけれども、原理的には普通の 2SC1815 をダーリントン接続しても OK。
—–


hatena bookmark


12V を食らわしてお亡くなりになった PIC の代わりを買ってくる。
860円也。

さて早速プログラムを書き込むかとPICプログラマにセット。
画面に表示される「プログラムエラー」 orz
ハズレ?ハズレ品?

SPWriter のデバイスリストで PIC16F876A のところで ProgOnlyCycle の数値を 1 から 2 へ変更
ProgOnlyCycle=2
とすることで安定して書き込める様になる。よかったよかった。
そういえば前のデバイスでもたまに書き込み失敗していたような気がする。
—–


hatena bookmark

今度の工作はステッピングモーター。
PC側のソフト次第ではかなり楽しく使えるのです。


こんな感じで滞りなく完了。
モーターの方で電圧が必要なので、サブボードに 12V のアダプタを接続する感じ。ついでなのでレギュレーターもサブボードに載せてしまい、今回実験ボードの電源供給もサブボード側から行う構造。

PC 上でのソフトでかなり苦労したけどなんとか全部揃った。
さて、いよいよ本格動作ですよ。ぷすっ。

……
………
うわあああああああぁぁぁ、PIC実験ボードに 12V を繋いでしまったあああああぁぁ……… _| ̄|○
PIC16F876A, ADM3102AN, LCD と石が全て逝ってしまわれる。
12V、恐ろしい子っ!
他はともかく PIC16F876A は予備が無いんだよう。

ちくしょう、こんなことで実験を止めてなるものか。
40ピンとピンの数は全く違うけれども、アーキテクチャは大体同じな PIC16F877A が手元にはある。プログラムをこいつに焼き込んで、後はピンさえ何とかすれば……。


かくして超絶パッチが誕生。

LCD が無いから動いてくんないので、LCD表示周りをコードからコメントアウトして焼き込む。
よっしゃ動いた。

しかし、流石にこのレベルのパッチだとシリアル通信がおかしくなりまくりなのは仕方がないところか。(なんか他の要因がありそうな気もするけど)
一応動かしたけれどもなんか不完全な気分。
PIC16F876A をもう1個買ってくるか……。
(40ピンPIC用実験ボードを作った方が早いような気もするけど)
—–