コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for 3月, 2006


hatena bookmark

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


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


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


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

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

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

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


hatena bookmark

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

次の記事へ続く。
—–


hatena bookmark



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

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

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

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


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


hatena bookmark

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

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


hatena bookmark

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


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

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

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



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


hatena bookmark



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


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


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

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

—–


hatena bookmark

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ピンデバイスの設定ときに出力されることがわかったので設定を弄ってみたりするけどもなんかいまいち。



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


こんな感じで。

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

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


hatena bookmark

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

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

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


hatena bookmark



ソフトウェアもハードウェアもある程度の規模になると、ちゃんと動作しているか、動作していなかったらどこがおかしいのかを調べることになる。いわゆるデバッグ。
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 になっている模様。

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


hatena bookmark

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

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

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

—–