コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for 3月, 2006

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


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


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

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

—–

その昔、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 で動かしているんだけれども、そのクロックの不安定さが画面に出ているんだろうか。

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

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

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

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


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

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

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

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

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


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

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


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


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

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

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


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


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

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

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

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

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


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

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

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

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


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

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

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

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


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

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

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

ハードウェアができたので次はそれをコントロールする PC 側アプリケーションである。
ポイントは二つ。
1) シリアルポートにアクセスする部分
2) Windows 上での CPU 稼働率を集計する部分


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


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


光っている所がわかるショットをもう一枚。

普通に作業していてもあんまりあがらないので、わざと負荷をかけて遊んでみたりしちゃいます。やっぱ 15 を超えて赤く光るとなにか「おおおっ」とくるものがあるんだよね。

今回は CPU 稼働率だけを集計、表示させているけれども、PDH API を使っているので他のインフォメーションも集計可能なはず。
ハードディスクランプ代わりとか、ネットワーク転送量のモニターなんかにも良さそう。
当然ながらシリアルポートなので Linux からもコントロールしやすいというのもポイント。サーバーの監視に。

単なる遊びだけれども、機構、電気、組み込みソフト、PCアプリ、そしてユーザーへ提供するサービスと全てが詰まっているミニファクトリーなんだよね、コレ。楽しい楽しい。
—–

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

次の記事へ続く。
—–



ストロベリー・リナックスに発注しておいた「USBシリアル変換モジュール」が届いた。
先日の USBシリアル変換ケーブルでは PICプログラマーの動作が異様に遅くなるといった問題の時に、見つけて注文したもの。
これに使われている CP2101 なら大丈夫かなあと思って。

結局駄目だったんですけどね、ははっ orz
どうも使用ライターである SPW-10 PRO が sensitive な様で。ICSP が出来なかった事も含めて。

しかしま、こいつは TTL 出力なんで PIC に直接繋げるといううまみがあり、それ目的で買っているので良いのです。
RS-232C レベルコンバーターが要らなくて線を 2本直接 PIC に繋ぐだけで、USB 接続のアイテムになるというのはおいしいと思うのです。シリアル接続ですけれども。
チップが MLP なのでとてもじゃないが個人では入手しても加工できないデバイスをこのように販売してくれるのはありがたい。ストロベリー・リナックスさんだけあって、Linux で使えることが保証されているあたりもポイントだね。

最終目的(のひとつ)は PIC で様々な USB 接続アイテムを作る事だったりする。そのために PIC18F4550 を買い込んでいたりするので、こいつは通過点もしくは楽したいときの手抜きアイテムなのです。


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

このブログを始めるにあたり、回路図を描く必要があるよなあと思い回路図エディタを探したのです。
で、見つかったのが水魚堂の回路図エディタ「BSch3V」。フリーウェアですが、たたき上げられているので実用性ばっちりなのです。
おまけにマルチプラットホーム版(MacOSX, Linux)もあるし。
私が知らなかっただけで超有名なアプリですけど。

私は回路図を書くのは初めてなのですが、それでもそれっぽくなっているのはこのソフトのおかげ。
—–

最後に RS-232C コンバートチップとその周辺を検証して実験ボードの完成。


写真だとわからないけど、PC とシリアル接続して、ターミナル内でキーを押すとその文字が一文字ずつ LCD に表示されていく。
シリアルポートに小亀が付いているのはうっかりオスコネクタを買って、それを付けてしまったため。リバースケーブルで PC と接続する機器になってしまった。(それはそれで正しい気もする)

RS-232C の検証で躓いてかなり苦労してしまった。
なんで?なんで?とずーっと悩んでいたが、結局 TRISC でのポート設定で RC7(RX) が out 設定になっていたため。clrf で処理していたのでそうなっていた模様。RX のポートだけ in になるように TRISC を設定してやったら無事解決。
うむむ、他のコードを参考にしてたら特に設定していなかったので、RC enable の際上書きされるもんだと思っていたよ。
わかってみれば簡単だけれども、調べているときは本当に悩むんだよなあこういうのって。
あと、突然データが不安定になってうんうんうなっていたら、リードが一本外れていたというのもあった。不安定なときは結線を調べろという先人の言葉は重たいのです。

ハード的には一通り完成だけれども、シリアル周りのコードをちゃんと書いていなくてテスト止まりなのでそのへんを整備する必要があるかな。



今回の実験ボードの回路図。
リセットのあたりが怪しいのです。
—–



てなわけで、PIC16F876A の実験ボードに一通りリードを張り終える。
真ん中のコネクタに PORT-A と PORT-C が出ていて、ケーブルで他基板にひっぱりそこにセンサーなり LED なりを繋いで楽しもうという魂胆。
PORT-B は LCD表示ユニットに使っている。1ポート余っていたのでテストスイッチ入力としてみる。


流石に全ポート張るとぐちゃぐちゃになるなあ。


ポートチェックの様子。
写真じゃわからないけれども、光が左右に行ったり来たりしているいわゆるナイトライダーフラッシャー。PIC 工作を行う者は必ず作るアイテムだよね(w
確かに簡単に作れるので楽しいやら拍子抜けするやら。

RS-232C 周りはリード張り終わっているのだけれども、まだチェックしていないのでドライバーを刺していない。次はそのあたりのチェックから。
RS-232C が出来ると完成。
そうなると PC から LED をコントロールしまくれたり、データを PC でロギングしたりとうっは夢がひろがりんぐ。
それをできるだけたやすく行えるようにという実験ボードなのだわさ。

—–

PIC デバイスのプログラム開発を始めると必然として、ライターとターゲットの間をいったりきたりになる。ちょいと焼いてはターゲットに刺して確認、失敗なので外してライターに戻しコード修正してまた書き込み。
その手間はともかくとして、ターゲットの IC ソケットからの抜き差しするときにデバイスのピンを傷つけてしまう。何度も繰り返すうちに曲がったりしちゃうのよね。
まあ、昔は業務で 36ピンを毎日抜き差ししていたもんだけれども。

PIC用語で「ICSP(In Circuit Serial Programming)」とゆーのがある。ターゲットにデバイスを刺したまま、直接プログラミングしようというものだ。
ICD2 などは ICSP で書き込む事になっている。



PIC デバイスの工作にも慣れてきたので、実験専用のボードを作成することにする。いつまでもブレッドボードというわけにもいかないので。


制作途中のスナップショット。
PICデバイスの駆動と LCD表示ユニットを繋いで表示ができるようになったところまで。他のリードはまだ繋いでいない。

今回の実験ボードで使うデバイスは PIC16F876A、28ピンで 3ポート持っている多機能デバイス。汎用実験にちょうど良い感じで。
流石に 28ピンともなってくると ICソケットの抜き差しが心配になってくる。
そこで ICSP できないもんかとぐるぐる考えるわけだ。
SPW-10 PRO には外付け(フラットピンユニットとか)で焼き込みができるように 6ピンの端子が付いているのだけれども調べてみるとちょいと使いづらい。VPP と VDD が出力されないので色々調べると、8〜14ピンデバイスの設定ときに出力されることがわかったので設定を弄ってみたりするけどもなんかいまいち。



そこで簡易ジャンパーを作成してみる。


こんな感じで。

でも結局失敗。
読み書きは成功するんけれども、データが全然違う。
うーん、ライター側が対応でないと駄目なのかしらん。
回路の方はまだ何も作ってないので直結に近いんだけどなあ。

ひとまず諦めて、デバイスを抜き差しする形に戻る。
また、気が向いたら調べてみよう。
—–

ちゃんと動作しているかどうかをハードウェア的にチェックするにも調べる手段があると便利。
LED の点滅やデジタルマルチメーター(テスター)だとパルスやトリガーが計測できないのよね。
でかといって、オシロスコープやロジックアナライザーはお高いし、買ったとしても置き場所に困ること請け合い。まあ、最近は PC に接続して PC のディスプレイ上に表示するタイプが流行になりつつあるけれども。

で、WEB でうろうろして見つけたのが超簡易ペン型オシロスコープ 「osziFOX」
日本だと秋月でしか扱っていないっぽい。7800円で購入。
ちっこい LCD に何となくの波形が現れる。波形は鈍っているし、サンプル期間も短い(サンプルとサンプルの間が異様に空く)けれども、こんなのでもあると便利。
シリアル転送で PC 上に波形表示も一応できる。

ちょっとしたチェックに。
—–



ソフトウェアもハードウェアもある程度の規模になると、ちゃんと動作しているか、動作していなかったらどこがおかしいのかを調べることになる。いわゆるデバッグ。
PICデバイス工作は半分がソフトウェアによるものなので、ソフトウェアのデバッグも重要な要素になってくる。とはいえ、ICE はお高いし、廉価なデバッグ環境の MPLAB ICD2 は在庫無しの 1ヶ月待ちだったり。
てなわけで当面はライターで焼いてはチェックの繰り返しになる模様。

そんな状態でどうやってデバッグをしていくのかというと、そこは基本の「printfデバッグ」である。
ポートの 1つを使ってそこに LED を繋ぐ。これだけでもよい。適当なところでポートを ON にするコードを埋め込んでおき実行、LED が点けば少なくともそこは通っていることになるわけだ。

しかし、それだけではこの先心許ないのでマイコン工作では超メジャーな「LCD表示ユニット」を接続し、そのドライバを書くことにする。
少なくともこれが稼働していれば、様々な情報を表示し確認することができる様になるのです。

LCD表示ユニットは秋月で 700円。デファクトスタンダードアーキテクチャになっているので、ピンや駆動手順は M1632 互換。つまり、みんなが使っているのと同じということやね。
回路やソースコードは「PIC LCD」で検索かますと山ほどヒットするので特に説明も無し。ソースコードも他の見よう見まねに近くなっているし。

lcdmain.asm

各種解説記事をみていると必ずタイミングチャートが載っていて一見小面倒くさそうだけれども、肝心なのは ‘E’ のトリガーだけだったり。
E 以外全部のデータポートを設定して「設定完了、オラ読み込め」という指示のために E を上げ下げする。
read の際は「オラデータをよこせ」と E を立ち上げてからポート読み込み、読み込み終わったら E を下げるといった風情。

駆動するには 8bit モードと 4bit モードがあってそれぞれ 11本/7本の I/O を必要とする。今回は 4bit を選択することにする。
デバイスは 14ピンの PIC16F684 を選択。I/Oポートは 12本(PORTA 6bit、PORTC 6bit)なのでできるでしょ。(このへんで無駄に苦労を背負い込んでいる気がする)

後はデータシートと首っ引きでプログラム作成。
ここでドはまりしたのが I/O ポートの設定。PIC16F684 は起動時初期値で A/D コンバーターを持つ 8ポートが「全てアナログ」に設定されている。なので起動時にそれを無効に設定してやらないとならない。
んが、もう一つあって、2ch のアナログコンパレーターもあるのだが、こいつも「標準でON」になっている。このコンパレーターの方を見落としていて、ずーっとうんうんうなっていた次第。どうりで、ポートを設定してもすぐに立ち下がると思ったよ。
ちなみに上位のデバイスだと起動時にコンパレーターは OFF になっている模様。

苦労はしたけれども、無事表示が出来るようになってめでたしめでたし。
—–

メモ。
SolitonWave社の SPWriter Ver1.00-06 だとサポートデバイスに PIC12F509 が無いのです。書き込みは PIC12C509 の設定を使うことで出来るのですが、これだとフラッシュの消去が出来ない。
色々試してもうまくいかず困ったのでデバイス定義を適当にでっち上げて使うことにした。
下記の設定を SPWriter の Device.ini に追加することで何とか消して書ける様になりました。

まあ、あんまマイナーなデバイスを進んで使うなということですね。

[PIC12F509]
Default=PIC12C509
FlashType=1
CmdSet=0×03E
;Timing Data
BulkEraseCycle=6 ;バルクイレース時間(ms)
ChipEraseCycle=3 ;チップイレース時間(ms):サポートしていない場合は0
ProgOnlyCycle=3 ;プログラム時間
EraseProgCycle=6 ;イレース込みのプログラム時間

—–



ちと PIC アーキテクチャのコーディングに慣れるため LED を光らせるプログラムを書いてみる。

ただ点滅させるだけだとつまらないので、フェードイン/フェードアウトでぼやーと明るくなったり暗くなったりする LED 点灯プログラムを作成。
明度を付けるには PWM 方式の時間分割スイッチングを行う。
よするに高速で LED を ON/OFF するのだけれども ON の時間が長いと明るく、OFF の時間が長いと暗くみえるってわけ。


これで明るめ。


これで暗め。


その中間。

256分割を 1周期として、明るさ n を 0〜255 で指定。n の時間だけ LED を ON にし、時間がきたら (255-n) の時間を OFF にするといった感じでコーディング。

ソースコードは PICkit1 と PIC12F509 による物。
softled_2.zip

509 なんて機能ミニマムなチップを使っているからソフト制御だけれども、ミドルレンジ以上の PIC デバイスだと PWM 機能を最初から持ってて、こういったことが容易にできるようになっている。
—–

結局 PCI カード型の RS-232C 拡張ボードを買ってきてマシンに刺す事にした。
そして、シリアルライターを起動。どきどき。
!!!
早い、早いよ!
これまで10分以上かかっていたものが 10秒で終わるよ(っておい
これが普通の速度だったんですね……。
PICkit1 の USB が特別早いわけでないこともわかった。

しかし RS-232C ポートなんて、いらない子だと思っていたけれども、いざ必要な場面になってみるといろいろ面倒なものだねえ。
色々と投資してきた額を考えると、Microchip社のダイレクト通販から ICD2 を買った方が安かった。送料関税で $16 くらいかかるけれども。
といっても、これまでの経験をしたからそう考えられるようになったわけだし、PICプログラマー(ライター)も確かに自作できるほど簡単な仕組みなのだなと理解できるようになってきたとゆーことなのだが。

うーん、いまからでも ICD2 を発注するか?いやいや、そこまでは……。
—–