Measure88プロジェクト

2009年7月14日 (火)

PIC12F509を用いたなんちゃって正弦波発振器基板化

Pic12f509_5Pic12f509_2PIC12F509を用いたなんちゃって正弦波発振器,ブレッドボードでの実験を終了して基板化をし,いよいよPIC16F88を用いた陸上タイム計測装置にドッキングすることになる.

最終的には「スタート時報音発生回路部」として本体基板上に実装することになるが,本体のエッチングパターンに織り込む前にまずはフレキシブル基板上に実装.3枚作る予定.

本体に織り込むときのことを想定して回路はなるべくコンパクトに,ジャンパは極小にと考えていたら,例によって結構トリッキーな配線になってしまった.

本来は図を書くことが望ましいが,これくらいの回路なら何とかなるだろうとラフスケッチ後半田付けをしながらこのパターンになってしまったので後のことを考えてせめて写真を撮っておく.左側は部品実装面,右側はパターン回路面だが,パターンの方は左右反転させてある.(コンピュータって便利!)反転前の写真は,ややこしいので最後に載せる.

左側の部品実装面の写真上で,一番左上に8ピンDIPのPIC12F509が実装される.そう,PIC12F509の下にジャンパがあり,PIC12F509を実装すると見えなくなってしまうのでこの段階で撮影.中央やや左のラインに2SA1015Yが4つ縦に並んで実装される.これで回路としては完成(のはず)だ.

これが,パターン回路面(反転前写真).半田付けをする際に見るのはこちらだ.

Pic12f509_7 

2009年7月 9日 (木)

PIC12F509を用いたなんちゃって正弦波発振器の完成

Vvvf

PIC12F509を使って正弦波もどき発振器を作成しようという試み.左のグラフの,正弦波に対して,赤色のパルスを連続発生っせて,そのエンペローブにより「ほぼ正弦波」を発生させようというものだ.きっかけは,PIC16F88を用いた陸上用タイム計測器を自作して5月の晴れた日に陸上競技のトラック内でテストした時の事.この陸上用タイム計測器には「ヨーイ,ドン」の合図として時報(ブッブッブッピーというやつ)を実装したのだが,アナログ発振回路で構成したために昼間の日差しとトラックからの放射熱が重なり温度が上がると発振周波数が異様に高くなり,競技者全員のやる気を吸い取るスタート音に成り下がってしまい悩んでいた.そこに\60のPIC12F509が「ぼくにもできそう」と立候補したというわけだ.

途中経過は一切省いて,完成した回路,ソフトを列挙.ブレッドボードでしか試していないし,オシロも無いので最終的な波形で確認したわけではないけれど,一応それらしき音が発生できたので完成としておこう.

(回路図p.4右下)  「090621Draft.ppt」をダウンロード
(計算書)             「pic509.xls」をダウンロード
(ソフトウエア本体) 「PIC12F509FakeOfSinWave.asm」をダウンロード
(ソフトウエア(ヘッダ))「ms509.inc」をダウンロード (変わっていない)

これでバックアップ良し.

音を聞く限り,確かに矩形派特有のがさつなブザー音という感じではない.きっとそこそこの波形になっているのだろう.一応RCのローパスフィルタを一段だけ入れたが,さりとてNHKの時報のようなきれいな正弦波というわけにはいかず,高調波成分が残っていそう.ま,用途を考えたら合格にしよう.少なくてもクールな体育館でも炎天下の競技場でも,今度はまじめにスタート音を発してくれるだろう.ちなみに単にパッシブなL.P.Fを2段積んでも音量が下がるだけで音質の改善は感じられなかった.

Nec_0363 ところで,動作確認はブレッドボードで実施した.これに先立って,ブレッドボード実験部屋を作ってみた.「部屋」とは言っても,100均のA4プラスティックBOXにブレッドボード実験に必要なものと,良く必要になる部品を収納して左の写真のように開いて使えるようにしたものだ.こういうくだらない道具作りから入り,なかなか本題に取り組まないのも昔からのくせだ.

【収納物】
・ブレッドボード
・各種配線(市販のもの,自作の配線数々)
・電源(機種変更して不要になった
  携帯充電器を改造した電源(+5V)
・ピンセット,ドライバ
・ミニテスタ,ロジックプローブ
・部品(PIC,OP-AMP,Tr,アンプ(LM386),抵抗各種,コンデンサ各種)

休みを使った実験が終わり,日常モードに戻るときはふたを閉じ,壁に貼り付けて収納する.奥行き3cmの壁収納システム.電子部品はこまごまと散らかるので,このサイズの収納でも結構整理になる.化粧ベニヤと角材で超薄のタナを作り壁に張り付け,そのタナに9つのA4プラスティックケースをマジックテープで貼り付け固定している.片付け,取り出しも簡単.材料費\2,000.

Nec_0364Nec_0365

続きを読む "PIC12F509を用いたなんちゃって正弦波発振器の完成" »

2009年6月21日 (日)

PIC12F509を用いたなんちゃって正弦波発振器の構想

まず結論から.

Photo こんな回路を作れば,できそうな感じになってきた.PIC12F509の動作は,正弦波に程近い(とはいっても高々8倍の周波数だが)VVVFの指令パルスを出す.これを受けて実際のVVの部分の実現をどうするか,だ.当初より変更してトランジスタはPNPタイプのものにしたが比較的簡単な回路でできそう.抵抗値は現物あわせで決めた.計算すりゃいいんだけれどね.計算してもどうせ確認するし,実際には手持ちの抵抗で実現できる値を選ぶんだろうから,ということであとはPICが正確なパルス指令を出してやれば良い.

本当はPICから出た指令パルスの波形をオシロでとりたいのだが,家にそんなものは無い.LEDを点灯して貧乏なデバッグを実施する.なんとなく,できてそう.試しに,PICの指令パスル出力をそのまま圧電スピーカにつないでみた.圧電スピーカは直流分が入っていてもいいし,電力もいらないので簡単に確認ができる.

完全ではないが,それらしき周期でパルスを発生している.GP3はプの音,440Hzの低音側っぽい音だ.また,GP5はピの音,880Hzを意図した発振をするはず.この2つのI/Oを順番にOnさせると,オクターブになるはず.....うーん.微妙に音痴.ちょっと高い音が低めだ

これは,例の発振周波数×8倍の周波数で時間待ちをしているところの,定数違いだろう.やっぱり計算はビール抜きのときにやらなきゃね.

ただし,おおまかにはあっているので,つまらないところで命令数を数え間違えているなどの原因だろうから,今のところは気にしない.いざとなったら高々2音のオクターブ関係なんだから,ホビーの王道現合という手だってある.

ところで,PIC12F509でもやってしまった.もう片付いた話だが,新しいPICの種類を使う度に,再三こうした目に遭うので今後の戒めの意味で書き記そう.

GP2のコントロールが効かないのだ.今回,TRISの設定値は0x28,GP0,GP1,GP2,GP4が出力だ.GP0,1,4は正確にソフトウエア通りにON/OFFしているようだが,GP2だけうんともすんともいわない.LEDをつけても,ロジックプローブを当てても,まったく無反応.まるで入力に設定されているようなのだ.

ここでマニュアルを読む.GP2がアサインされているのは,T0CKI,TMR0の外部クロック入力と兼用のピンだ.うーん,こいつとあたっているのか.

確かにマニュアルには,OPTIONビットの中にTMR0のクロックソースを指定するビットがある.TMR0の外部クロックを有効にすると,このピンは入力に設定される.(TRISをオーバーライトする,とある)しかも,パワーリセット時のデフォルト値は,外部入力なのだ.

ヤラレタ.

だけどPICの気持ちがわかれば,直すのも簡単.OPTION命令でTMR0のクロックソースをIntに切り替えて,無事GP3は出力として使えるようになりました.

「PIC12F509FakeOfSinWave.asm」をダウンロード

2009年6月20日 (土)

PIC12F509ちっさいけれど,ピリリ

PIC16F88+SC1602S*Bを使った陸上タイム計測器の時報(スタート音)に使う正弦波発信器モドキをPIC12F509で作ってみよか,と思いつき,考えてみた.Excelで試算した内容を冷静にも一度見てみた.
プリスケーラを2とか1に設定すれば,TMR0を使って何とか1KHz前後までは何とか発生できる見込み.でもPIC12F509って,割り込みが無いんだよな.すると,ソフトウエアでTMR0の計数値を見張り,例えばFF→00になった瞬間をSTATUS-Zフラグで検出すれば出来るのだけれど,これにはbtfs?命令とGOTOディレクティブでループを構成しなければならない.でも待てよ?プリスケーラが1ということは,TMR0のカウントクロックとCPUの動作するインストラクションクロックが全く同一ってコトだな.そうすると,TMR0のオーバフローを検出するループが仮に3マシンサイクル(btfs?(=1サイクル)+goto(2サイクル))になってしまうので,タイミングが0~3サイクルは狂ってしまうことになる.うーん,残念だけれどTMR0は使わないほうが良いね.このクラスのPICで組まれる一般的な方法として,nopやLoopで時間待ちをしたほうが良さそうだ. nopやloopで時間待ちをする場合,ソフトウエアの正確なコードが決まらないとどんな時間待ちをどのような定数でやれば良いかも決まらない.卵鶏状態でなにも決まらない.
そこで,コードを書き始めることにする.

Vvvf何ちゃって正弦波発信器は,PIC12F509のGPIOをVVVF(Variable Voltage & Variable Frequency))っぽく制御すれば制限波っぽい波形を生成できるんじゃないか,という幼稚な発想で始めた遊びだ.発生させたい正弦波の8倍の周波数で,VVVF的パルスを生成する為の指令(1ビット)を出力する.これをトランジスタで受け,オープンコレクタ出力にして指令に対応した電圧が生成されるように負荷抵抗をセットしてやれば良い.オープンコレクタにするのは,複数の指令パルスを受けた電圧をワイヤードORで結線することでして連続波形にする為だ.(ほんとうはOPアンプの加算回路で合成するべきなのかもしれないが,遊びだから面倒くさいことはなるべくやりたくないのだ.後は交流カップリングとアッテネータを介してで386(1WオーディオアンプIC)へ送れば良いんじゃないか.

さてと,ソフトを作るには...MPLAB のIDEの環境を整えて,っと.MicroChipのサンプルソースを変更してソフトを書けば良いね.サンプルソフトを見てみた.すると,

ORG     0x3FF             ; processor reset vector

; Internal RC calibration value is placed at location 0x3FF by Microchip
; as a movlw k, where the k is a literal value.

ORG     0x000             ; coding begins here
movwf   OSCCAL            ; update register with factory cal value

とある.え?リセット割り込みベクタが03ffH??? しかも何のソースコードも書いていないし.その後すぐにorg000Hがあるし.

データシートを斜め読みしてみると,12F509はPricisionな内蔵RC発振器を有しており,かつそのキャリブレーション値が工場出荷時に書かれているというのだ.上記のサンプルソースと併せて解釈すると,キャリブレーション値はプログラムメモリの03ffHにmovlw kの形式で保持されているという.(kがキャリブレーション値)なおかつ,03ffHはリセットベクタだというから,電源リセット時にはここからCPUは動作を始める.PIC12F509の場合,03ffHのこの命令の次にPC(プログラムカウンタ)が向かうところはオ-バーフローして000Hだ.ここにはmovwf OSCCAL命令があり,Wレジスタに保持された,工場で書き込まれた内蔵RCオシレータのキャリブレーション値がキャリブレーションレジスタに目出たく書かれ,とてもリーズナブルな仕組みで4MHz(誤差1%)のPricisionなCPU動作クロックが供給されるということになる.こんな仕組みが60円のCPUに入っているなんて,にくいねぇ.4MHzの発振器から供給されたクロックは,4分周されてTMR0のカウントアップ用クロックソースとして供給される.だからこの場合,カウントクロックは1MHzだ.また,CPUのマシンサイクルは4クロックで供給されるので,1マシンサイクルは1MHzとなる.かくして,ユーザはTMR0で1μSecで刻むなり,1命令で1μSecを消費するなりということで,単純だが精度の良く計算のしやすいクロックを用いてアプリケーションを作成することができる.

さて,PIC12F509は8pinのIC.内蔵クロックで駆動するとなると,電源+,Gndに2pinを消費するが,残りの6品は全てI/Oとして使える.但し,GPIO3だけは入力としてしか使えないそうだ.ちょっと不満.何でbit3なんだ.MCLR*との関係なんだろうけれど...ま,こういう割り切りがPICの魅力でもあるんだけれどね.
かくして,趣味で.
Bit0(出力)角度 -1π/16~3π/16, 5π/16~7π/16の時の出力指令
Bit1(出力)角度 3π/16~5π/16, 15π/16~17π/16の時の出力指令
Bit2(出力)角度 7π/16~9π/16,13π/16~15π/16の時の出力指令
Bit3(入力)低音:ブッ(440Hz)の発振指令
Bit4(出力)角度 11π/16~13π/16の時の出力指令
Bit5(入力)高音:ピー(880Hz)の発振指令
というピンアサインとした.
入力のビットパターンが変わらない限りは,所定のサイクルで上記Bit0,1,2,4をサイクリックにON/OFFさせれば良い.
一つのパルスを発生させるソフトはおおよそ次のようになるだろう
ModeL_1_8_PI  ; 1/8PI Out PitPatern=0x04
     movf GPIO,W      ←1Clock
     andlw CommandMaskBitPattern  ←1Clock
     xorwf mode,W      ←1Clock
     btfsc STATUS,Z     ←1Clock
     goto setMode

  ;;; Wait xxx Instruction Clock
     movlw LowToneWaitFactor    <<<- ここまで
     call wait_8_Plus_4_by_n_Clocks     LowToneWaitFactor×4+8 ->>>
     nop         ←(補正)1Clock
     nop         ←(補正)1Clock

  ;;; Out Signal to GPIO
      movlw 0x04      ←1Clock
     movwf GPIO      ←1Clock
     goto ModeL_3_8_PI    ←2Clock

ここで,共通の時間待ちサブルーチンを以下とした
wait_8_Plus_4_by_n_Clocks
wait_8P4n000  movwf wait_8P4nCounter0
wait_8P4n001  decf wait_8P4nCounter0,F
     btfsc STATUS,Z
     return
     goto wait_8P4n001

この条件で消費クロックを数え,excelから時間待ちFactorと調整用のNOPを入れて正しく440Hz,または880Hzの正弦波っぽくなるように調整した.

「pic509.xls」をダウンロード

コンパイルは通ったぞ.とりあえず.

「PIC12F509FakeOfSinWave.asm」をダウンロード
「P12C509.INC」をダウンロード
「ms509.inc」をダウンロード

大きな勘違いは無いと思うけれど.ビールの見ながらExcelシートと作ったし.計算間違ってなければいいなあ.取り合えず,今度の休みにでも動作確認してみよう.

それにしても,60円のPIC12F509もやるもんだ.がんばっているなぁ.

2009年6月12日 (金)

恐るべし,陸上競技場

完成した!,と思った自作光電管式陸上競技タイム計測器をとある陸上競技場へ持ち込んで最終確認...のつもりが,5月の晴天下の陸上競技場は只者ではなかった.

 体育館内でのテスト,自宅前の市道上でのトライアルにはほぼ満足できる性能,使い勝手だった.本当に実際の計測環境での最終確認のつもりで,まずはPM1:30.陸上競技場のトラック内部の中央部に陣取って練習の邪魔にならぬよう意気揚々とくみ上げた....が,レーザ光の光軸がずれているにも関わらず,光電管スイッチがONしてしまう.ははぁ,5月の晴天下,周囲にさえぎるモノの無い陸上競技場だから,照り返しが外乱光になっているのだな,と思い,レーザ発光側,センサ側ともその場にあるもので覆ってみたが,変わらず.近距離でなら,ON,OFFを認識してくれるが,発光側と受光側を30cmも離すともうONしっぱなし.
 壊れたのかな,と思い,ベンチ内の日陰で再びトライアルしてみると,今まで通りほぼ完全に振舞ってくれる.再び日なたへ出すと,もうダメ.そうすると,温度そのものの影響じゃないな.
 それを確かめるべく,夕方5:30に再びトライアル.昼間に比べると立っている時の上半身近辺の気温はかなり涼しくなっている.しかしこれでも現象はそう変わらない.ここで思い当たるのは熱を蓄えた陸上競技場の地面から上がってくる温度.赤外線カメラで見てみたら,かなり真っ赤になっていることなんだろうな.例によって測定器なんて全く持っていないから,想像の域を超えないけれど.
後日,フォトトランジスタPTS610,PTS615の特性を見てみると,なんと感度のピークは800nmではないか.赤色レーザ光の波長は650nm.細かい数値は覚えていないが,赤外線って確か800nmくらいの波長だったように思う.むしろ,赤外線の方を強く拾うんだね.きっと.
 というわけで,ここは電子回路上で対策するしかないことになる.今はフォトトランジスタの入光・遮光時の電圧変化に対して,単純に74HC14のスレッショルドにあわせてバイアスをかけているだけ.従って外乱信号が74HC14のスレッショルドよりも高い位置に来てしまえば,常時ONになってしまい,光電管センサとしては使い物にならないのだと考えるとつじつまが合う.
 やっぱ,フツウにコンパレータで取ろう.その前段でOff時の外乱光をキャンセルできるレベルシフトを行えるようにすれば良いかな.LM324あたりの単電源OPアンプでなんとかできたら良いな.だめならこの方式での自作はあきらめかな.

実はもう一つ我慢なら無いことがあった.
非常に気に入っていた,スタートの時報音だったが,完全なアナログ発信回路を用いた為,どうも温度変化に弱い.高温になればなるほど,高い音にシフトするばかりか,ブッブッブッピーのプの音(440Hz=Aを想定)とピーの音(880Hz=オクターブ上のAを想定)のオクターブ関係がずれて,スタートダッシュのモチベーションを根こそぎ取り去るようなマヌケな音になる.
Drums担当だとは言え,若かりし頃はアマチュアミュージシャンの端くれだったプライドが我慢の限界を超えた.
Vvvf ようし.ここもデジタル化するぞ!どうせいつかはやろうと思っていたんだ.とはいえ,PICだけで可聴音域の完全な正弦波を発生させることは難しい.考えたのは,VVVF方式.正弦波っぽく電圧可変,周波数可変のパルスを生成するのだ.
本当は正弦波を発生したいが,デジタル制御で赤の信号を作り,なんとなく正弦波っぽく聞こえる発振器を作る.何ちゃって正弦波だ.デジタル制御によるパルス列だから,周波数は温度に拠らず,また,オクターブの関係に至っては正確無比にKeepできるというものだ.
これをPIC12F509あたりでできたらオモシロイ.D/Aの機能が無いので周辺ICの力は借りることにはなるが,8ピン・割り込み無し・\60円のPICであえてチャレンジしてみる.PIC12F509にもTMR0は実装されている.こいつを使って.やるとすると,どうなるか...

「pic509.xls」をダウンロード

今回は440Hz.12F509内臓の4MHzクロックでPICをドライブすると,TMR0の計数クロックは1MHzとなる.前出のグラフのように,発生させたい正弦波周波数の8倍でスイッチON/OFFをするための動作タイミングを1MHzの計数クロックでTMR0を使った場合の設定を算出してみると...
 440Hz  プリスケーラ=2,TMR0のカウント値=142
 880Hz  プリスケーラ=1,TMR0のカウント値=142
と,この場合でゆけばプリスケーラ値を1,2と切り替えれば良いことになる.4MHzでPIC12F509を動作させた時のインストラクションクロックは1MHzなので,TMR0のカウントクロックと同じだ.だから,厳しいほうの880Hzで見ても,142インストラクションに1回の割合でパルス発生をしてやれば良いことになる.パルス発生とはいっても,PIC12F509から見ればGPIOを切り替えるだけだ.うーんこれなら,割り込み無くても何とかなるんじゃないかな~.あるとおもいます.
と,言うわけで,Mesure88プロジェクトは最後の(最後にしたい)山場を迎える.

2009年3月23日 (月)

久々,ソフトウエアのアップデート

PIC16F88を応用した自作光電管の陸上競技用タイム測定器,今週今まで気になっていた箇所のソフト修正を一気に修正した.

第一に,LED点灯条件の見直し.スタート前の,「プップップップップッピー」の時報に合わせてLEDを移動させる.LED4つを使って時報に合わせ,一つ筒LEDの点灯が移動する表示に直した.
第二に,スタート前の光電管スイッチの状況を確認し,光電管スイッチの光軸ずれがある場合には,スタートを取りやめてエラー表示することとした.
また,設定モードで釦を長押しするとキーリピート(高速インクリメントやデクリメント)とする仕様を実現するためにTMR2を使ったが,測定中にTMR2を生かすと本来の,32.767KHzで駆動されるTMR1の割り込み応答遅れにより精度が落ちるので,測定スタート時にTMR2の割り込みを殺し,設定モードに入ったときに,TMR2を生かすこととした.このソフト修正後,一晩経過させて例の100均で購入した月差実績15秒の時計と比較して,確かに誤差が縮まって測定の精度を上げられることを確認した.
更に,入力SWの二度読みを廃止した.この機能は,設定モードにおける押し釦のチャタリングをキャンセルするために設けていたものだが,これも1/1000秒制度の測定の邪魔になる.確かに設定モードの時の押し釦のチャタリングを拾ってしまうようだが,所詮,設定モードだからね.がまんしよう.(設定モード時だけ入力の2度読みをする手はある)

一応,バックアップ目的でアップデート.

あとは,RS-232Cへのアップロードだ.ついでにやってしまえるくらいのボリュームだったが,10進ASCII変換などが面倒くさいので,後回し.来週の楽しみにしておこう.

「measure88090321.inc」をダウンロード

「mesure88090321.asm」をダウンロード

「ms88.inc」をダウンロード  (これは変わっていない)

続きを読む "久々,ソフトウエアのアップデート" »

苦手な板金加工&光電管スイッチの固定法

Nec_0331_2この”年度末”という時期,会社勤めの人間にはなにやら落ち着かない時期だ.加えて,杉花粉がもたらす毒霧がモチベーション低下を加速する.全く進まない.ただでさえ苦手な板金加工なのに,外に出て毒霧を吸入して正常に作業できるのは2Hが限界.しかも天候や時間は選ばなければならない.前回は,苦手な上に設計図も書かないでいきなり板金との勝負に出たために,LEDの取付穴を一つ少なく配置してしまったり,気が付いたら液晶が当初と左右反対に取り付けることになってしまったり(表裏を間違えて加工穴を開けてしまったことによる)と散々だった.今回はちゃんとか構図も書いて,一応2式製作.電子回路は既に手作りプリント基板が動いているのであとはスイッチ,ランプ,コネクタの取り付けと最終チェックで完了だ.

ところで,先日の実機トライアルでわかったこと.光電管の固定方法と軸あわせである.きちんとした三脚を取り付けるなどの手を講じなければ.そんなことをぼやっと考えていると,秋葉原でこんなものに出会い,即購入した.Nec_0340Nec_0341左のように,自立式折りたたみ三脚なのだが,クランプ付いていて,フェンスやポールなどに取り付けて使うこともできる.これで,500円強だし,なかなか良さげ. これで光電管を安定して取り付けられるセットを作ろう.

2009年2月21日 (土)

PIC16F88)陸上タイム計測器(時報付き) 量産してみようか

結構つかいものになりそうなので,自分達のクラブ以外に試しに使ってもらえそうなクラブに渡して使ってもらい,あくだしをしよう.

ハードウエアの仕様はこれでいったんFix.製作ネックになるのは,やはり本体のプリント基板だ.これも過去の記事にあるように露光器を自作し,極力手作りで実施してきたが,実は結構失敗もしている.失敗を繰り返してわかったことは,以下の3つのポイント.
 ①露光時間は,8分30秒がBest
 ②エッチングの際の,温度管理
 ③エッチング液の量
 ④エッチング時間(引き上げのタイミング)

露光~感光までは,①の露光時間を守れば,ほぼ失敗は無い.エッチングは,例によってジップロック(小)に基板とエッチング液を入れて湯煎する.この時,袋が破れそうだからと言って袋を2重にすると,温度管理は困難になってしまうので,ジップロックは必ず新品を大事に使うようにすれば,周囲湯温度を43度に維持すれば,エッチング液温は40~42度に保てる.

苦労したのが,③と④だ.いろいろな文献をを読むと,今回使っているサンハヤトの片面感光ポジ基板10K程度だったら,塩化第二鉄200CCで2枚くらいエッチングできる,と読める文献が多かったので,200cc程度で実施していた.すると,温度を適温に保っても,なかなか細部のエッチングが進まない.常識的なエッチング時間,15分~20分程度実施してもまだパターン間に銅箔が残る.こちらもそう暇でないので,やけになってほったらかし,パターン間の銅箔が完全に消えた段階で引き上げると,細いパターンは既にエッチング液の中に溶け込んでいて消えている,という状態だ.

当初は温度管理だと思ったので,少し温度を高めにエッチングしてみたが,これでもうまくいかなかった.ふとエッチングの進行速度から見て,温度と言うよりもエッチング液を増やすほうが効くかな,と思い,250cc程度に増やしてみたら,エッチング時間も18分程度と適正になり,パターンもパターン間も健全になった.

090215_1_2090215_2 

ところで,エッチング液を多めに使えばうまくいくことはわかったが,数を作ろうとすると今度はコストが気になるところ.サンハヤトのエッチング液は,1,000ccで2,410円だった.一枚の基板に250cc使うとすると,380の感光ポジ基板一枚あたり500円のエッチング液が必要になることになる.納得いかない.30年位前は,近所の薬屋さんで購入した.塩化第二鉄溶液は,”普通薬”なので,手軽に購入できたのだ.今近所にこうした薬屋さんは無いが,WEB販売という強い味方がいる.早速検索し,注文することに.今回は,画材通販の"画材販売.jp"から入手した.ここから,”腐食液”で検索すると,500ml入りで350円とある.4本頼んで郵送してもらっても2000以下なので,大変お得.廃液の処理剤は,別途入手する必要はあるが.

090215_9 こちらは次の難関,穴あけの模様.パターン面から日曜大工用のミニ電動ドリルドライバ+100均で売っているホビー用0.8mmドリル刃により穴を空けると,部品面には左の写真のごとく,バリが多数出る.

そこで,今度はこれまたダイソーさんで購入したホビールータに,1.0mmのドリル刃を取り付けて部品面から面取りをしてやる.穴もくっきり開き,これで部品挿入もやりやすくなる.(見栄えはあまりよろしくないが)

090215_10

090215_11これが完成した様子.

体育館デビュー

Nec_0300量産試作機はこんな感じに仕上がった. 表示灯も,結局は5mmの高輝度LEDを用いることにした.

アルミのケースに入れたのにLEDを裸でとりつけるのも何なので,LEDカバーを購入した.秋葉原の千石さんの2階で,10セット700円パックのもの.レンズ付きなので,ちょっとしたランプに見える.

ただ,惜しむらくは自らの勘違いにより,盤面に7個しか穴を開けなかったことだ.LEDは8個あるのに...仕方が無いので,右側面に1個セットしてある...押し釦も同じ千石さんの2階にあった,おそらくゲーム機に使われるようなカラフルなプラスティック筐体のもの.1っこ\240えんくらいだったかな.設定用の押し釦は目立つ必要は無いので,省スペースの8mmタイプの白を選択した.基板はスピーカの下辺りにセットされている.カラフル押し釦の奥行きが結構深く,基板の高い部分(電解コンデンサや放熱器等と干渉してしまうので.やっぱりポッキーの空き箱じゃ入らなかったな.

Trial88_090211_2いざ,体育館へ.電源は,手元にあった12Vのバッテリーにした.実用のスタイルも,屋外を考えるとバッテリーは有効手段だ.秋葉原の秋月さんで購入した,メンテナンスフリータイプのもの.容量は4.5AH.既に,フル充電すると,このシステムを1日以上動かせることは事前に確認してある.時報音などはあまり出力していないので,頻繁にStartStopを繰り返したら,動作可能時間多少短くなるのかもしれないが,実用上これくらいのバッテリーで十分だろう.

設置は次の写真の様に.写真右側の光電管スイッチセットがStart位置で,競技者は体育館を一周した後に左側のGoal位置光電管スイッチを切って計測を完了する.じつはこれ,陸上競技用のタイム計測器と言って来たが,主たる計測対象は,実は一輪車である.だから,光電管の位置を低くしている.(おおよそ地上高100mm)

今回のトライアルの主たる目的は,100mm程度に設置したこの光電管システムが,一輪車の全力疾走時にもその通過を確実に検出できるかどうかだ.

Trial88_090211_1まず,光電管の軸を合わせる.事前に家の前の道路で実施したときに比べると,難しい.体育館なので,子供たちが周りで騒ぐと床が揺れてしまうのである.何とか光軸をセットし,計測開始.子供たちは怖がっている.得体の知れない機械が入ってきて,「レーザ光だから直接光を見ちゃだめ,注意して,」などと言われるものだから,近寄ろうともしない.

しかし,最初の勇気ある選手がチャレンジしてくれた.

5カウントの時報は結構受けた."24秒556",拍手,お母さん方からの歓声.二人目"19.xxx秒","おぉー,記録更新"歓声が徐々に大きくなってきて,次々に挑戦者が続く.

だが,ゴール時に勢いあまって落車すると,床が振動して光軸がずれてしまう.やはりここは問題だ.サランラップの芯を遮光筒に使った手作り光電管,安くて結構満足していたが軽すぎて使いにくい.おまけに屋外での計測の場合は風も問題になる.まずこれを安定させないと,実用にならないな.

一方,結構受けたのが時報とフライング検出.フライングを検出すると,”ぴぴぴぴぴぴっ”とダメ出しを食う.2回も連続すると,周囲からは笑いの声が.選手もリズムを取りながら,慎重なスタートを試みる.これは結構練習になるなぁ.

そのうち,スタート釦を押して計測結果を読み上げる役目も子供たちがやり始めた.はじめは”得体の知れない機械”だったが,やっと”練習相手”として認めてくれた.

一人が,「走って計ってもいい?」と言い出した.光電管の位置が低いので,子供とは言え光軸を飛び越えてしまうので,「スタートラインとゴールラインの光軸位置に貼ったガムテープを必ず踏めば,計れるよ」と教えたら,次々に何メートルなのかもわからない体育館をただただ走り回りタイムを計測して盛り上がりはじめた.本機も,もう遊び道具だ.

2009年2月 8日 (日)

箱入り!

箱入りである.長年,バラックで活躍してきた基板もついに,箱に納まる.

Nec_0300 当初はポッキーの箱を考えていた.紙の箱でも,エポキシ樹脂(接着剤)等で補強すれば,機能的にも十分だ.また,ガッキーが嫌いなわけではない.むしろ家族中でファンでもある.CPU基板やソフトはそこそこ考えて作ったという自負はあるが,であるから,いやだからこそ,見た目はチープにしたい.そんなひねくれ根性が幼いころからの自分流になっている.しかし,妻から,安心して簡単に使いたいという強い希望があり.あっさりポリシーを変えてアルミのBOXを買うことにした.かくしてこのアルミのBOXが,本システムの中で一番高い部品となる.液晶SC1602S*Bはあっさりと最高額部品席を譲ってくれた.でも,1,500円はしないけれど.

この穴あけに手間取る.ステップドリル,ニブラ等の新兵器をいろいろと駆使したが,けっきょく,小径ドリルでプロファイルにそったこあなを開けて,ヤスリやリーマで仕上げる,という,30数年年前からの方法で仕上げた.

確かに部品代はいろいろと安く上げたけれど,工数を入れたらはたしていくらなんだ?会社でのレシオだったら,数十万円の基板になっていることだろう.

LED周りの回路図(抵抗値)をFixし,実際に組み立ててやり図ら買った箇所などを振り返り,パターン図も修正した.

「measure88V2.pcb」をダウンロード

「16F88IOMEASURE.pdf」をダウンロード

とまれ,見栄えもこれで完了!

2009年2月 3日 (火)

なんとか立ち上がった.プリント基板,完成間近

Nec_0289基板完成!

こんな感じ.左下の大きいのは,放熱器を取り付けた7805(5V三端子レギュレータ)

これも,リピートものの実態配線図を兼ねる意味で写真を保存しとこう.

Nec_0290

Nec_0291

Nec_0292

こちらは,3分割した拡大写真.

さて,テスターで電源周りの配線が間違いの無いことを確認し,スイッチON.どうだっ.

液晶はまず動いた.LEDは???なんか挙動がおかしい.ああ,そうだ.この基板変更を機に,時報のI/Oポートの割付を変えたのだった.それでは,ソフト修正.

すると,事件発覚.まず,光電管スイッチからの入力が入らない.光電管のインターフェース基板は先週動作していることは確認しているので,今回作成したCPU基板上の入り口,すなわちフォトカプラから調べてみる.なーんだ.1番ピンを12Vで吊る回路になっているのに,パターンを忘れているじゃないか.これは,取り急ぎ,ジャンパーで対応.後日パターンも直そう.これでスイッチはOK.

次に時報音.これが何ともおかしい.音程がまったく安定しない.パターン間違えたかな.とりあえず,メインループの中に,PBが押されたら音を出力するようにデバッグ用ソフトを入れてみる.釦を押す.ぷっぷっぷっぷっぷっぴーと心地よくオクターブの正弦波がスタートを知らせるはずが,形容しがたいほど無様な音に.しかも,時間と共に変化する.

時間とともに変化するのなら,熱(温度)は大いに関連しそうだ.ということで,PICに触れてみると,PICそのものは涼しい顔だが,5Vの放熱器はかすかに暖かい.こんなもの,PICにはいらないよなとおもいながらも,安定稼動のために,一度は付けてみようという気持ちで付けてみた放熱器.しかし,原因はもらい熱だった.9V系からの.9V系とはアナログの回路.発振回路,その後の386ベースのパワーアンプを賄う電源のことだ.ここは触れないくらいに熱い.これはおかしい.個性などではなく,明らかに何らかの原因がある熱さ.なんだろう....しばらく考えた.しかし,三端子レギュレータが根を上げるほどまでは行かない....一番考えられるのは,パワーの最終段.ここに以上電流が流れているのでは?老眼による半田ブリッジか...あ゜あ゜あ゜ぁ゜,スピーカへの出力で直流成分をカットする100μFのコンデンサがないぢゃないかぁ.386の出力段から直流成分がインピーダンス8Ω(ということは,直流抵抗は数オーム以下)のコイルをす通りぢゃないか.良く三端子レギュレータ大丈夫だったな.

コンデンサを付けてみた.温度は下がり,時間とともに温質が激しく変わることは無くなった.だが,まだ音がおかしい.これは,結果からいうと,先のデバッグソフトが悪さをしていた.これを取り除いてOK.デバッグソフトの顛末はばかばかしいので記録にも載せないが,一つだけ,このコードがメインループに入っている時の信じられないような現象は記しておく.

ぷっぷっぷっぷっぷっぴーと心地よくオクターブの正弦波がスタートを知らせるはずが,ぷっぷっぷっぷっぷっぶぶぅぅぅぅぅ,と,じらすだけじらした跡にスタートにダメ出しをするような,とてもたちの悪いパロディースタートになってしまった.これで競技をやると,たいていの競技者は二度とモチベーションが保てなくなるような.こんなソフト,作ってないよ誰も.しかも,仮に作ろうとしても結構大変じゃあないか.家族にも受けた.

わかってみればあたりまえのことだが,なぜこんな狙ったようなパロディーさながらのバグり方をしたのか,天は,楽しめるバグを与えてくれたのだとさえ思う.後に,再現したくなったときのために,メインループに挿入したコードを残しておきたいと思う.これがどうしてそんなパロディースタート音になるかは,その時また身を持って発見したほうが楽しみだ.(再発見できるかどうか)
    bcf        mdo_00 , 0
    btfsc     mdi_00 , PB_Green
    bsf        mdo_00 , 0
    bcf        mdo_00 , 1
    btfsc     mdi_00 , PB_Yellow
    bsf        mdo_00 , 1

絶対に直せると確信の持てるバグ.PICは絶対に裏切らない.そう信じれるから,こんな冗談みたいな現象のバグに遭遇すると,本当に楽しい.

「16F88IOMEASURE.pdf」をダウンロード  (回路図修正)

パターン図の修正は,ほかにもあるから,後日バックアップする.

2009年1月25日 (日)

PIC16F88)陸上タイム計測器(時報付き)製作1

基板製作記.まあまあ順調だが,老眼がきつい.Measure88v1_board000 思いつくのが遅くて一部のICやソケットMeasure88v1_board001Measure88v1_board002をつけてしまった後だが.この写真はジャンパー線の実態配線図としてリピート製作時の為にのこしておこう.

基板の半田付けは,背の低い部品から,熱に強い部品から取り付けてゆくのがセオリーである.が,自作基板の場合は部品実装面にシルク印刷を行うのが難しいので沢山ある穴のどこに部品を取り付けて良いのか迷うことがある.穴あけだって手でやるから設計図どおりにまっすぐぴしっとはいかず,集中力が途切れた時に開けた穴がずれている場合など,設計図とは一見同じようには見えずに勘違いをする場合もある.だから,ICやICソケットから取り付けることにしている.そうすると,ICを頼りに,自信を持って正しい位置に部品実装するのが容易になるから.最近のICはそう熱に弱いものでもないし.ものによるけど.半田付けをひどくミスって長時間こねくり回すようなことさえ避ければ,その程度で壊れる部品などほとんど無い.

Measure88v1_sensor00こちらはセンサー側の基板.もともとこれしきの回路だったらユニバーサル基板でいいやと思っていたが,メイン基板をサンハヤトの10Kという最小サイズのポジ感光基板上にレイアウトしたら余りスペースが出たのでそこにレイアウトしてみた.っだからこんなへんてこりんなカタチをしている.写真右下部の3P,2Pコネクタの向きも異なっている.2Pはこの向きに実装しないとコンデンサと干渉するし,コンデンサをずらすスペースは無い.3Pは今までのテスト基板で使っていたケーブルアサインを変更しない前提でパターンを組むとこの向きにしか実装できない.美しくないけれど,実害は全く無いので忘れることにする.
レイアウト上10Kの基板の幅目一杯を使っているので,感光の時にフィルムがずれるとパターンが切れる.写真の上部に基板の裏側にリード線が見えているがそれは切れたパターン部分を手配線している箇所だ.カタチはへんてこりんで端っこのパターンの一部が切れているとしても,やはり専用のプリント基板の方が作業はぐっと楽だし早い.もちろん,一発完動.

実装してみてわかった.余分な穴を消し忘れている.パターン図を修正.
「measure88V1.pcb」をダウンロード

この写真は,リピート製作時の部品配置図になる.(ホビーなので,シルク印刷ができないからねー.Epsonさん/Canonさんとサンハヤトさんが提携して電子基板に部品配置図を印刷できるインクジェットプリンタ出ないかな.CD-Rはプリンタブルになっているんだから)

2009年1月18日 (日)

PIC16F88で構成する陸上タイム計測器(時報付き!)製作

昨年後半から空き時間をつかって陸上タイム計測器の基板を作っている.主役はPIC16F88だ.かつての実験基板を改造し,光電感センサスイッチを自作し,基本ソフトがほぼ完了した.

今年は専用基板でこれを仕上げてゆくことにした.間に合えば,今年の夏の大会のタイム集計に使ってみたい.

ここ2週間くらいで,専用基板の製作に取り掛かっている.

まずは,パターン.これは,以前から使っているPCBE(パターン設計用フリーソフト:Vectorからダウンロードしたっけか?)を使用する.

「measure88V1.pcb」をダウンロード

データもこうしてBlogにあげておけばすばらしいバックアップになる.しかも,時系列で各バージョンも残るし,変更履歴も残せるし.安心安心.

Nec_0242

プリント基板づくりも,もちろんいかげんなもの.なるべく専用の道具は使わないで,台所用ビニール袋や割り箸など,基本は過程にあるもので,なければ作って,というのが基本だ.過去のこの日記を見ながら,カンコツを思い出しながら作ってみたが,なにぶん真冬で洗面所が寒いので,一杯やりながら適当にエッチング温度を見ていたのがいけないのか,はっきりいって失敗した.

どうも,自作した露光機のセット不良による焼付けムラ,エッチング時間のミスなのだろう,細いパターンは途切れてしまいそうなところがあるのに,別な部分は太いパターン間の細い溝は銅が溶け切れずに導通が残っている.まあ,何とか修理して使えそうなので,このまま行く.

Nec_0246 今週の改善はこれ.穴あけ冶具だ.右の写真のように,これまでは基板を左手でしっかり持ってハンディのミニチュア電気ドリルで一つ一つ空けてきた.しかし,20個も穴をあけると,若かりしころドラムで鍛えた握力もすっかり落ちてしまった左手が悲鳴をあげだす.こんなことでつらい思いをしては趣味でも何でもないので,余り木を使って冶具(単なるズレ止め付きの置き台)を作った.斜め35度くらいに傾けてあるので,ほとんど押さえが不要になる.なんでもっと早く作らなかったかな.

Nec_0247Nec_0248

2009年1月 4日 (日)

PIC16F88による陸上用計測器,2009年基点

今年も昨年に引き続き,まずはPIC16F88による陸上競技用タイム計測器にチャレンジする.ハード,ソフトの製作と動作確認は済んだので,2009年は実際に使ってみて改善を進めて実用機を目指す.

年も変わるので,気分も新たに進めるために,これまでの仕様,回路図,ソフトを整理してみた.ここを今年の基点にする.

システム図,回路図,ハーネス図  「16F88IOMEASURE.pdf」をダウンロード

状態遷移図「statusdiagram.pdf」をダウンロード

ソフト: ヘッダーファイル 「ms88.inc」をダウンロード   「measure88.inc」をダウンロード

ソースファイル 「mesure88081231.asm」をダウンロード

昨年末にUPしてから,時刻設定,レコード番号設定,START光電管スイッチの使用用途オプションの設定ソフトを追加した.時刻,レコード番号は数値を設定する.特に,レコード番号は0000-9999を循環する数値という仕様としたので,4つしかない押し釦スイッチでこれを設定するのは面倒になってしまうので,各PBを以下のように割付け,キーリピート,ターボインクリメント/デクリメントができるようにした.

緑PB立ち上がり: +1
黄PB立ち上がり: -1
緑PBキーリピート:0.5秒以上押し続けると,高速でインクリメント(キーリピート)
黄PBキーリピート:0.5秒以上押し続けると,高速でデクリメント(キーリピート)
緑PBを押した状態で白PBの立ち上がり: ターボインクリメント(+50)
黄PBを押した状態で白PBの立ち上がり: ターボデクリメント(-50)
白PBを単独で押すと,設定終了し,次の設定項目画面に遷移する.
赤PBを押すと,中断してアイドルモードに戻る(設定モードを抜ける.

時,分,秒の設定時にも同様の操作仕様となる.ただし,時設定の場合のターボインクリメント,ターボデクリメントは各々+4,-4とした.同様に分,秒設定の場合のターボインクリメント,ターボデクリメントは各々+10,-10とした.

START光電管スイッチの使用用途オプションとは,START光電管を下記2つのモードのどちらで使用するかを特定するオプションスイッチである.電源投入時は,①のマニュアルスタートモードにデフォルト設定される.

①マニュアルスタートモード
 アイドルモードから,グリーンPBを押すと,Readyの時報音が鳴り始め,6秒後にSTARTとなる.この時START光電管は,フライング検出スイッチとして使用される.

②オートスタートモード
 アイドル状態で,START光電管スイッチが切られると同時にタイム計測を開始する.

それと,昨年末に動作試験をした時と同じストップウオッチ時計を使って机上での最終動作確認をしてみたところ,少々解せない結果になったのでソフト変更をしている.
昨年末は,ストップウオッチ時計をストップウオッチ計測モードで動作させ,今回PIC16F88で自作した計数モードを長時間動作させて比較を試みた.その時は,10時間で数秒程度,PIC16F88での計測値が遅かったのである.そこで,タイマー1のプリセット値を0x8000から0x8001に調整した.これで,遅れは3秒/10時間になっり,まあいいか,という値になったはずである.今回は,同じストップウオッチ時計を時計モードで動作させて,長時間の比較をしてみた.すると10時間後には,今度は逆に,PICの方が10秒程度も進んでしまうではないか.しかし,ストップウオッチ時計の時計は,そこそこの精度であるので疑うべきは,ストップウオッチ時計のストップウオッチ機能の精度,ということになる.と,同時に,PIC16F88のタイマー計測の方も,個体ごとにもう少しこまかくチューニングした方がいいということだ.そこで,PIC16F88のマニュアルに出ていたリアルタイムタイマーのサンプルソフトに逆らって,TMR1のプリセット値を定数定義できるようにした.

それでも,32.368KHzを32868(0x8000)程度で分周して実現するリアルタイム時刻計数をPIC16F88で実現するシステムという構成上,10時間で3秒程度は仕方なさそう.しかし,これは「数十秒~数分の陸上競技タイムを対象に1/100秒で正確に測る」という目標実現に対しては,十分な精度であると再確認できたので,良しとする.

2008年12月21日 (日)

【祝:基本機能完成!】PIC16F88+SC1602+手作り光電管スイッチで陸上競技のタイム計測器

ここまでできた.といっても,こういうものは言葉でできばえを確認しようとしてもなかなか記録にできないので,携帯ビデオで撮ってみた.

「MOL005.3GP」をダウンロード

自作光電管スイッチ,正弦波発振器による時報の単体動作は一応確認しているので,ここでは,それらをタウトスイッチとLEDで代用してソフトウエアの確認をしている.

緑ボタン: カウントダウン開始
赤ボタン:中断
黄色ボタン: 警告ボタン,
青ボタン:ゴールの光電管スイッチ
橙ボタン:スタートの光電管スイッチ(フライング検出用)
白ボタン:設定補助

緑ボタンを押すと,時報が始まる.今は,5秒をカウントしてから,スタートするように設定している.スタートボタンを押してから実際の計測までの間をrunUp(助走の意)モードとして定義している.RunUpモードでカウントダウンをしている最中にもしもスタート側の光電管スイッチをさえぎってしまえば,いわゆるフライング,また,同様にゴール側のスイッチがOnしてしまったら,センサ異常としてスタートを中断する.

スタート後はひたすら計数を続けるだけだ.今は橙スイッチを割り当てているが,ここにゴール光電管を接続することで,ゴールの光電管を切るまでの時間が記録される.または赤ボタンを押すと,中断する.赤ボタンで停止されたタイムは人手によるものなので,記録にはAbortフラグが立っていて,液晶にも表示される.(タイムの前に'A'の文字が付く)

また,実際の陸上競技のタイム計測では,時計による計測と同時に,人間の目でコースアウトや進路妨害等の審判員による目視情報が加えられる.これらはを完全にリアルタイムでコンピュータに取り込むことはあまり現実味がない.せめて,コンピュータ上の記録には,なんらかの識別があり,詳細は審判員が記録紙等に記録してあとから付き合わせるというのが現実だろう.そこで,黄色ボタンを押すことで,計測値にフラグを残せるようにした.黄色ボタンは計測中には何度でも押す度にトグルできるので液晶表示(タイムの前の'R'文字)を確認しながら操作できる.間違って押してしまっても,計測終了までは,修正が利く.

SC1602に表示されるのは画面左上は,時刻,右上はレコード番号,下段はタイム及びフラグ情報だ.必用最低限の表示ということを考えると,PIC16F88とは非常にいいコンビ.

ソフトを開発してゆく過程でだいぶ変えてしまったが,ステータスイベントマトリクスに従ってソフトを書いてゆく.

「statusdiagram.pdf」をダウンロード

現在,メインモードにある

1)アイドルモード
2)RunUPモード
3)計測中モード
4)設定モード(時刻やパラメータなど)

のモードのうち,本日1から3を一気に実装できてしまった.アセンブラソースで数百ステップだろうか.やはり,ステータスマトリクスで整理が進んでいると,実装の効率は一気に上がる.ほとんどバグらしいバグも無く,着々と進んできた.

あとは,4の設定モードを実装すれば,ソフトは完成となる.ここはちょっと面倒くさそうだが,年内完成をめざすぞぅ!

「mesure88081221.asm」をダウンロード

「measure88.inc」をダウンロード

「ms88.inc」をダウンロード .(これは変わっていない)

2008年12月20日 (土)

ステータスダイアグラムとステータスマトリクスダイアグラム

当面の,目標とすべきPIC16F88と手作り光電管スイッチ,SC1602格安液晶パネルを登場人物とする,陸上競技用タイム計測器のための仕上げのアプリケーション設計に先立ち,ステータスダイアグラムとステータスマトリクスダイアグラムを書いてみた.

一見めんどくさそうだが,こうすると,雑然とした頭がそこそこでも整理される.

「statusdiagram.pdf」をダウンロード

メインループにおけるモードは,4つ.

①アイドルモード(idole)
②RunUpモード(RunUP)
③計測モード(Measuring)
④設定(Setting)

これら4つのモードを変数として,主に押しボタンやスイッチを外部イベントとしてステータスマトリクスを組んでみた.

さらに,各モードにおいてもサブステータス&イベントを定義し,ネスティングする仕組みとした.ただし,計測モード,実は陸上競技タイム計測における主題ともいうべき本チャンのモードなのであるが,ここは計測を精度良く実施するのが旨で,外乱はあまり無いので,メインループで発生するイベントをそのまま受け継ぎ,かつ,計測モードも一つであるので,ネスティングをさせることなく,メインループのステータスイベント図に直接振る舞いを記述した.

できあがったものを見ると結構厳つく見えるが,実装はそうとうシンプルになると思う.

これぞPICの活きる道.

2008年12月 3日 (水)

PIC16F88に,ステータスイベントマトリクス駆動ソフトを実装

いよいよメインループを作成して,これまでの要素を組立,陸上計測器に仕上げる.
この手の単体機のメインルーチンは大方条件判断を基にしたシーケンシャル処理になる.
だから,設計に当たっては状態遷移図で表し,実装設計はステータス&イベントマトリクスに従ってイベントドリブンで組むのが楽.
 PICだからってこうした実装が不得手とは限らない.PIC16F88には100H単位のバウンダリを跨がぬ範囲で255方向へPC相対ジャンプができる.良く”テーブル引き”に使われる,
addwf PCL,F
命令だ.本ソフトでもctoaで使っている.これを使って,ステータスイベント方式のメインループ処理テンプレートを作ってみよう.
指針として,以下を考える.
  ・様々な実装への自由度を考え,ステータスイベントマトリクスマシーンは0800H以降に置く.メインループの中で毎回PCLATHを書き換えることにはなるが,他のソフトが混在すると,他のソフトの改造の影響で100Hの協会をずれるようなアドレスズレが起こることはなるべく避けたいから.800H-FFFHまでの広大なPIC16F88のメモリの半分をメインループの中身の記述に使ったって,文句は無いだろう.
・テンプレートの実装においては,メインルーチンからのコーリングシーケンスとリターンのルールを決め打ちにしてgoto文でこれを行う.ソフトを構造化するというと,関数実装にするのが一般的だがなにしろPICのスタックは8レベルしかないのだ.コーリング&リターンシーケンスを統一すればgoto文でも事足りるのなら,スタックは使わないほうが良い.あとは,ラベルの命名規則と構造を守るだけ.

まずは,メインループへの追加.コーリングシーケンスは,StatusEventDriver変数にステータス&イベントコードを入れて,PCLATHをドライバーソフトの記述アドレスに合わせてセットし,goto文で飛ばす.ReturnPointOfSEDラベルは,ステータスイベントコードにあわせたアクションが終了した時にメインルーチンへ戻ってくる箇所を表している.当然戻ってくると言っても,goto文で「往った」のだから,goto文で還って来る.還って来るgoto文の直前には,PCLATHをメインループの記述されている所に合わせてやる必要がある.
     movf StopDisplay,W
     movwf statusEvent
     movlw StatusEventDriver/0x100
     movwf PCLATH
     goto StatusEventDriver
ReturnPointOfSED

次に,StatusEventDriverの記述だ.メインルーチンからここに飛んでくる.ここでは,StatusEventに合わせて相対ジャンプするためのジャンプポイントへ飛ばす.ジャンプポイントとは,例の,Wレジスタの値に応じたPC相対ジャンプを行う(addwf PCL,W命令が書かれている)箇所だ.ただ,その前に,ジャンプテーブルにあわせたPCLATHにしてやる必要がある.ここでは,A00H番地から書かれているジャンプテーブルエリアに飛ぶことを前提としている.(ジャンプテーブルの名前は,ここではSED0A00Hとした)このジャンプテーブルは,くどい様だが物理アドレスの100Hごとの境界を跨ぐことは許されない.
なお,続くLabelは,statusEvent変数に応じてジャンプした先にあるアクションルーチンからの戻り先である.一度ExitOfSEDに戻って,更にPCLATHをメインループの記述がある0x000-0x7ff用にゼロにしてやった後に,メインループの戻り先にgoto命令で返してやる.

     org  0x0800
StatusEventDriver movlw SED0A00H/0x100
     movwf PCLATH
     movf statusEvent,W
     goto SED0A00H

ExitOfSED   clrf PCLATH
     goto ReturnPointOfSED

続くエリアは,statusEvent変数により相対ジャンプされた先の,アクションルーチンの記述だ.800Hのページに記述しているが,今回は,0A00H以降をジャンプテーブルにしているため,09ffHまでしか記述できない.もしも,ジャンプテーブルの数がそう沢山は要らず,むしろ,ジャンプ先のアクションソフトが複雑でメモリを沢山要すようだったら,ジャンプテーブルを例えば0E00Hに移すなどしてやれば良いことになる.

act0a00_00   movlw 0x30
     movwf mdo_01
     goto ExitOfSED
act0a00_01   movlw 0x31
     movwf mdo_01
     goto ExitOfSED
act0a00_02   movlw 0x32
     movwf mdo_01
     goto ExitOfSED
act0a00_03   movlw 0x33
     movwf mdo_01
     goto ExitOfSED

act0a00_04
|
act0a00_FC
act0a00_FD
act0a00_FE   movwf mdo_01
     goto ExitOfSED

ここからが,ジャンプテーブルそのものの記述だ.初めにorg擬似命令でジャンプテーブルの先頭アドレスを定義する.ここでは,0A00Hとした.普通は,0A00Hにジャンプソフト(addwf PCL,F)を書くが,ここではあえて,その0A00Hページの最終アドレス0AFFHにこのジャンプ命令を書いた.こうすると,Wレジスタに格納されているstatusEvent変数の値とジャンプ先変数名のサフィックス,及びそのジャンプ文が書かれている絶対アドレスが揃って気持ちがイイ.例えば,Wレジスタの値がゼロの場合,今相対ジャンプ命令(addwf PCL,F)の飛び先は,(0AFFH+1)+0でA00Hとなるの(PCLへの足し算だから,キャリーはPCHに反映されない)ので0A00Hとなり,そこに書いてあるラベル名は,act0a00_00という,サフィックス部が00となっているラベルである.これは単なる趣味だ.PICとココロを合わせるための.
     org  0x0A00
     goto act0a00_00
     goto act0a00_01
     goto act0a00_02
     goto act0a00_03
     goto act0a00_04
        |
     goto act0a00_FC
     goto act0a00_FD
     goto act0a00_FE
     org  0x0aff
SED0A00H   addwf PCL,F

もちろん,statusEvent(Wレジスタ)の値に0ffHが入ることは許されない.と,いうより,0ffHだったら,自分自身へ永久ジャンプしてしまうので,無限ループ状態になってしまう.そういう使い方が無いとも限らないが....

また,テーブルは必ずオフセット0から始まって0ffh個無ければならないことはない.そのシステムにより必要とされるステータスとイベントの数文あればいいのだ.ステータスが3種類,イベントが4種類で12個でも良いし,ステータスが3ビット,イベントが4ビットの128個でも良い.
もちろん,0100Hのアドレス境界を跨がない制限内で余ったメモリエリアを別のステータスイベントジャンプテーブルとして定義をして,ステータスイベントドライブソフトをネスティングするような構成も実現できる.

ソース作りは秀丸のコピペとマクロと置換で作ったので手間はかからないけど,テーブルの数が多いと,ソースリストがやたらに長くなるのだけが,ちょっと困るかな.だけど,アセンブル&リンク,焼きこみの時間は殆ど変わらない.だけどそこが正直者で愛らしい.

「mesure88081202.asm」をダウンロード
「ms88.inc」をダウンロード (こちらは変わっていない) 

本当にすごいな,PICは.

2008年11月30日 (日)

PIC16F88と液晶SC1602で構成する時計(経過時刻計算&検出)

もう少しだけ,重要なサブルーチンを作成する.サブルーチンというよりも,計測装置の心臓部ともいうべき,計測をどのように実施するかである.既に1/1000単位でそこそこの精度を持つ時計機能もストップウオッチの機能もほぼできたのであるが,これらの機能を使って陸上タイム計測装置に仕立てることを考えると,LAPはいくつまで考慮すれば良いんだろう,タイマーのようなものも欲しくなるかもな,時報だって正確に出さないといけないのだから,タイマー機も結構重要だ...その度に割り込みルーチンを含んだ改造やTMR1の初期化などやってしまったら,複雑なソフトになってしまう.

ここは,面倒くさいけれど今回もいつものの私流で行こう.時刻計測を”時間差”で行う方式だ.システムとしては,正確に秒を刻む”時計”が一つだけ用意する.STARTイベントが入ったら,この時の時刻を記憶する.GOALイベントが入った瞬間にその時の時刻を記憶し,この時刻からSTART時刻を引いた値がタイム(STARTからの経過時間)だ.計測中に現在時刻を読み出し,START時刻を引いてやれば,途中の経過秒表示もできる.更に,この経過時間を常時算出して何かの基準時間と比較してやる毎にタイマーアラーム機能も簡単に実装できる.複数の時間を計りたいとか,複数のアラーム機能とも組み合わせてゆきたい等,個別のタイマや時間計数の要求が出ても,それに対応した変数を設け,割り込み外のループで頻繁に引き算が起こるだけで,事実上タイマ機能に数の制限は無くなる.一見複雑に見えるこの,”時間差計算方式”で実装してやるほうが融通が利く.それ程PICは十分速い.

と,いうわけで,”時間差計算”ファンクションで準備するのは以下とした.

【主役たち(変数)】
☆現在時刻(nowSec.nowSubSec)
 [nowSecH] [nowSecL].[nowSubSecH] [nowSubSecL]
☆開始時刻(startSec.startSubSec)
 [startSecH] [startSecL].[startSubSecH ] [startSubSecL]
☆経過時間(passwdTimeSec.passedTimeSubSec)
 [passedTimeSecH] [passedTimeSecL].[passedTimeSubSecH] [passedTimeSubSecL]
☆比較参照時間(referenceTimeSec,referenceTimeSubSec)
 [referenceTimeSecH] [referenceTimeSecL].[referenceTimeSubSecH] [referenceTimeSubSecL]

【サブルーチン】
[readWatch]  システムのリアルタイムクロック変数から現在時刻(nowSec.nowSubSec)を更新する.メインループの中から毎回呼び出す.

[setStartTime] 現在の時刻を読みスタート時刻(startSec.startSubSec)に格納する.

[calcPassedTime]現在時刻を読み,スタート時刻からの経過時間を算出し,passedTimeSec.passedTimeSubSecに格納する.

[isTimePassed]スタート時刻からの経過時間(passedTimeSec.passedTimeSubSec)が,参照時間(referenceTimeSec.refereceTimeSubSec)を超えたかどうかを判断する.
以下のように使う.

    movlw .500/0x100
    movwf referenceTimeSubSecH
    movlw .500&0xff
    movwf referenceTimeSubSecL
    movlw .00
    movwf referenceTimeSecH
    movlw .00
    movwf referenceTimeSecL
    call isTimePassed
    btfsc STATUS,C
    bsf  mdo_01,6
    bsf  mdo_01,7

参照時間referenceTimeに00.500秒を入れ,isTimePassedをコールし,スタート時刻から0.5秒経過していれば(Carryがゼロならば)デジタル出力6をONにする.デジタル出力7は常にONする.ソフトが走ると,はじめに出力7のLEDが点灯し,その後0.5秒後に出力6のLEDが点灯する.

うまくいったぞ.ちょっと心配なのは,桁上がり処理だ.全ての時刻・時間変数は2バイトの秒と2バイトの1/1000秒が割り当てられているので,表現できるのは,0.000~65535.999秒までだ.例えば,スタート時刻が65535.000秒だったとすると,1秒後に現在時刻は0.000秒に戻ってしまうから.しかし,すべて同じルールで桁あふれして循環する変数なので,経過時間計算でボローを無視しやることでて正しい時刻差(=時間)になるはずである.0.000~65535.999までの経過時間は正しく算出できるので,そのあとのreferenceTimeとの比較には影響を及ぼさないはずだ.

ともあれ,確認は必要だ.

Before65536

液晶画面が小さいので,小数点を省き,各変数を表示し,ところどころ表示を止めて見て検証しよう.でも,65536秒って,20時間弱になるので,長丁場だ.

左上は,現在時刻(nowSecを10進数5桁+nowSubSec10進数3桁)を続けて表示している)写真左の64443.228秒ということだから,17時間54分3秒228という意味だ.同様の表記で下段左はstar時刻,下段右の8文字は経過時間を示す.この場合は,
  現在:64443.228
  START:00016.052
 経過:64427.176
ということで確かに現在時刻からSTART時刻を引いたものが経過時間になっている.

Justafter65536

これは,現在時刻変数が桁あふれした瞬間の様子.

現在:    00003.326
START: 00016.052
経過:    65523.274

現在時刻は3.326であるが,実際には65536秒+3.326秒が経過している.3.326+65536-16.052=65523.274となり,この状態でも正しく経過時間が算出されていることがわかる.

Next65536 更に,現在時刻が進み,Start時刻から65536.000を超えてしまった場合,当然経過時間のレジスタも桁あふれしてゼロに戻る.要は,STARTボタンを押した瞬間にもどるだけだ.当然,表示してある数字の計算結果はあっている様に見える.

ちなみに,経過時間が65535.999から0.000に戻る時の瞬間は,前述のLEDも一度初期状態に戻り(LED6が消える)0.5秒後にLED6が再び点灯することも目視ながら確認できた.

一番ややこしい部分が終わって,あーさっぱりした.


「mesure88081129.asm」をダウンロード
「ms88.inc」をダウンロード  (こちらは変わっていない)

2008年11月27日 (木)

PIC16F88と液晶SC1602で構成する時計(時刻表示)

本番に入る前に,簡単な時計を作ってみた.光電管スイッチを使ってスタート,エンドの正確なイベントを取り,リアルタイム時刻計測と組み合わせて陸上タイム計測装置を作る.PICったって立派なコンピュータなんだから,計測したからには正確にデータ化したい.つまり,記録(ログ)である.記録の一意性を何で保証するか,ということなのだが,手っ取り早く使うのは時刻だろう.3次元の空間の特定は計測装置そのもので行い,4次元目の時刻を特定すれば,その計測器でその時刻に記録されたデータはおおよそこの世ではユニークな記録であると特定できる.

大それた言い方だが,CP/MからMS-DOSになり,それまでUnixのものだったタイムスタンプがパーソナルコンピュータの世界に入ってきた時,目に見える大きな違いの一つがこのタイムスタンプだった.当初はこのタイムスタンプって,面白いけれど,正直それが特段大それたものには思わなかった.が,しかしその後このタイムスタンプによる恩恵に浴すことを実感するのに時間はかからなかった.例えば,ファイルの新旧をタイムスタンプで正確かつ自動に判断して知的財産を最新に保つこと.統合環境に慣れてしまっている昨今の開発者の方々には実感がわかないとは思うが,複数ファイルに分散して書いたソフトを安全かつ効率良くマネジメントをするのに,MAKEコマンド等を使うことなども画期的だった.このMAKEコマンドはまさにファイルのタイムスタンプを頼りにそうした機能を実現している.統合環境が当たり前になってMAKEというコマンドファイルを開発者が自ら操ることは無くなったが,統合環境の中でだってバックグラウンドでは,相変わらずこの”時刻”はファイルの新旧,一意性を確信する最も信頼の置ける,かつ効率の良い強力な手段として用いられている.だが,そのことを実感で知る人は少ない.だからどうだというわけではないのだが,MAKEコマンドを手で操ることで,「時刻」の大切な意味や有効性を体で感じることができた自分たち世代のエンジニアは幸せだなあと思うことがある.高い効率とアウトプットを求められ,こうした「真実」に触れる時間がなかなか取れない昨今の技術者やホビイストには,少々同情する面もある.

リアルタイムで秒,1/1000秒を刻むところまで行っているので,時計を作るのは造作も無い.割り込みで秒を刻んでいるので,秒,分,時を積算すれば良いだけだ.PIC16F88のデータシートにもサンプルは載っている.ここでも,単純に秒を刻み,分,時へ積算を繰り返しているだけである.しかしMesure88ではアプリケーションに広く使えることを想定し,少しでも割り込みの負担を減らすことを考えた.下記の赤字部分が割り込みソフトで追加した箇所だ.

IntTMR1    bsf  TMR1H,7
     bsf  TMR1L,0
     incf secCntL,F
     btfsc STATUS,Z
     incf secCntH,F
     bcf  PIR1,TMR1IF
     decfsz watchSec,F
     goto INT100
     movlw .60
     movwf watchSec
     decfsz watchMinute,F
     goto INT100
     movlw .60
     movwf watchMinute
     decfsz watchHour,F
     goto INT100
     movlw .24
     movwf watchHour
     goto INT100

ここでは,1秒の割り込みごとに秒カウンタを減算している.初期値は60であるので,減算して結果が0になったら60秒すなわち1分が経過したことになる.そこで秒カウンタを60秒にプリセットしなおし,分カウンタを減算する.分カウンタも60が初期値で,60回減産が繰り返されてゼロになったら,時カウンタを減算し,分カウンタは初期値60にプリセットしなおす,こうして時カウンタも減算する.時カウンタの初期値は24である.こうして秒単位に時刻は刻まれているが,割り込み外ルーチンで液晶表示するときには,各変数を補正して時刻に直して表示する.

複雑なようだが,こうすると,割り込みルーチンの中ではdecfsz命令だけでカウント&桁上がり判断ができるので,割り込みルーチンの負担が最小になる.その分,割り込み外ルーチンの負担は毎回増えるが,そこはPICの気持ちになってみればわかること.割り込み外のパワーはあまりに余っているのだ.PICがふさわしいアプリケーションの中で,PICでは間に合わないなんて,めったに聞いたことが無い.本ソフトのメインループの最後には,押しボタン処理のチャタリング防止ソフト(二度読み)ソフトを有効にするために10msecのnopによる時間待ちソフトを挿入しているのだ.PICから見れば本来全く無付加価値な,永遠にも近い時間だ.実際のアプリケーションにはこうした"待ち時間"が多く必要になる事が多い.こういう時間待ちの際に,時刻表示のような,比較的消費時間が読める処理を入れることはPICにとってもありがたいことだ.

一方,PICとて割り込みリソースは非常に貴重だ,ということでこんな構成にしてみた.

ちなみに,表示ソフトのサブルーチンはこんな感じ.

displayCurrentTime clrf A16H
     movf watchHour,W
     sublw .24
     movwf A16L
     call setVramcharIn2_DecimalNoSign
     call puts
     movlw ':'
     call putc
     movf watchMinute,W
     sublw .60
     movwf A16L
     call setVramcharIn3_DecimalNoSign
     call puts
     movlw ':'
     call putc
     movf watchSec,W
     sublw .60
     movwf A16L
     call setVramcharIn2_DecimalNoSign
     call puts
     return

Nec_0186時は24-現在のカウンタ値(watchHour)
分は60-現在のカウンタ値(watchMinute)
秒も60-現在のカウンタ値(watchSec)
をおのおの10進数2桁に変換し,間に適宜文字’:’(コロン)1文字表示しながら液晶に表示するだけ.もちろん時刻計測の精度そのものにも何ら影響は無い.

「mesure88081123.asm」をダウンロード
「ms88.inc」をダウンロード (こちらは変わっていない)

2008年11月16日 (日)

光電管スイッチを使った陸上競技のタイム計測器設計の準備

光電管スイッチで陸上競技用のタイム計測木を作ってみようというもの,基本的な道具立てがそろい,リアルタイム用時間計測の確認実験も済んだ.

ただ,秒以下の表示がまだできていない.アプリケーションにかかる前に,そこはちょっと難しそうだから先にに考えておこう.

このプロジェクトでは,PIC16F88に32.768KHzの発信器を取り付け,このクロックでTMR1をドライブすることで正確な時間を刻むことにした.
Nec_0182TMR1はプリセット値から入力されるクロックに応じてカウントアップするタイプの16Bitカウンタを基本構造に持っている.その16ビットカウンタが加算を加えてオーバフローした時にTMR1割り込みがかかる.プリセット値は,0x8000だから,そこから0x8000(32,768)回目のカウントでカウンタはFFFFhから0000hに周回し,オーバーフローし割り込みが発生する.この計数は32.767KHzの周期で行われるので,割り込みは正確に1秒後に発生する.

TMR1割り込みルーチンでは,16ビットの内部カウンタ[secCntH]{secCntL]をインクリメントするだけの処理にしている.単純な秒カウンタだ.割り込み外の一般ルーチンから見ると,[secCntH][secCntL]は自動的にインクリメントしているように見えるので,これを例えば液晶に繰り返し表示させてやれば,時計の秒表示のように見えることになる.次に,秒以下の時間計測だ.プリセット値が8000Hであるので,[TMR1H][TMR1L]からプリセット値8000Hを引いてあげればいいのだ.実際には,[TMR1H][TMR1L]を読んだら,最上位ビットをクリアすればいいだけである.但し,このMSBをクリアした[TMR1H][TMR1L]の値は,1/32,768秒毎に行われていることを忘れてはならない.しかし,陸上競技のタイムもそうだが一般の世界では秒以下は10進数小数点で表すのがしきたりである.つまり,計数の単位を1/100または1/1000に変換してやらなければならない.ここでは,せっかくPICでやるんだから,ということで1/1000の表示にチャレンジしたい.机上でやるなら簡単な単位変換だ.1/32,768単位の計数値を1000倍して,その後に32,768で割ってやれば良い.それを小数点以下3桁の10進数で表示してやれば,”1分23秒456”を例えば1'23"456の「456]の様に表示できる.

ここで,PIC16F88が悩みこんでしまった.「掛け算や割り算は得意じゃないんだ...」

確かに.でも,あらゆる掛け算や割り算をほかの命令並みにすばやくやれ,って事でもないし,ハードやファームで正確に計数した結果を人間の目にとまらない程度の速さで変換するためのものだったら,そんなに悩むことも無い.

1000という数字は,3E8Hだ.これは,二進数で書くと,001111101000Bだ.1の数にして6個.ということは,おおまかに言えば6回程度の足し算とシフトをやってやれば良いんでしょ.さらに,32,768は0x8000,2^15だから,二進数でいうと,15ビット右シフトすればいいだけ.

...シフト命令も無いんだ.あるのは,rlf,rrf(キャリーを含めたローテイト命令)も無いんだ.(PIC16F88)

必ずrlf,rrf命令の前には必ずキャリーをクリアしてやれば,いいんでしょう?君は十分に早いからね.全く問題なし.

実際には,ソースコードに埋め込んだコメントの様に3E8Hの掛け算の後で32,768で割るという処理を如何に簡単に実装できるか,を考えた.

   ([subSecH][subSecL] / 32768(=2^15) * 1000(=0x3E8)
  = ((subSecH*0x100+subSecL) * (0x300+0xE8) / (2^15)
  =(((subSecH*0x300)*0x100 + (subSecH*0xE8)*0x100+(SubSecL*0x300)+(SubSecL*0xE8)) / (2^15)
  =(((subSecH*03)*0x10000 + ((subSecH*0xE8)+(SubSecL*3))*0x100 + (subSecL*0xE8) ) ) >> 15
  =(((subSecH*03)*0x10000 + ((subSecH*0xE8)+(SubSecL*3))*0x100 + (subSecL*0xE8) ) ) >> 15

老眼と物忘れに加え,集中力の衰えを感じながら,あれこれ関係の無いこともしながら結構な時間をかけてしまったが,これも一発で動いたよ.

Nec_0183

「mesure88081116.asm」をダウンロード

「ms88.inc」をダウンロード (このファイルは変わっていない)

ちなみに,デバッグ用に押しボタンを取り付けた.左上の写真のように.赤いボタンを押すと,計数値をゼロに戻す.黄色のPBを一度押すと,表示を一時停止する.もう一度黄色いPBを押すと,表示を動かす.そう,ストップウオッチでいうと,赤色いボタンはSTARTボタンに近く,黄色いぼたんはLAP表示そのものだ.

だからということで,ストップウオッチのSTARTボタンと赤いボタンを同時に押して計数を開始し,ストップウオッチのLAPボタンと黄色PB(LAP表示機能)を同時におして比較したのが右上の写真.液晶上の行には102.88秒とある.ストップウオッチは1'42"96だから,筆者の右手と左手の運動神経を総合すると,まあ,こんなもんじゃないかな.と.

今週は時間かかったけど,まぁ満足.

2008年11月15日 (土)

電子基板改造の友

Debugcablez 久しぶりに基板の改造ってやつをやったときのこと.簡単に言うと,パターンを切ったり,新たな配線をしたりするわけなのだが,新たな配線をするときには少々コツがいる.ユニバーサル基板を使って基板を手組みする時等には,リード線やスズめっき線を半田付けする為のランド(パターン)があるわけだが,改造の場合は適当なランドが無い場合の方がむしろ多い.だから,ICピンや抵抗等のリード線が半田付けされているランドに盛り込まれている半田の山を暖め,ここにリード線を突き刺して配線することが多くある.被服付の単線スズめっき線(単線)を使ってこの作業を行うが多いが,これがまた結構不器用な者にとっては難作業だ.折角半田付けをしても,イモ半田になりやすい.理由はおそらく単線のスズめっき線は20W程度のコテでは温まりにくく,半田がうまくのるまでの温度に達しづらいのだろう.しかしむやみに半田ごてのワッテージを上げたり,執拗に長時間熱をかけるのは他の部品やパターンをいためてしまう.だから,いよいよという時は,カッター等でスズめっき線の表面を磨き,銅線が見えるくらいにしてから半田付けしていた.でもこれが毎回となると結構めんどうくさい...そこで,写真にある,100均ストアで買ったホビー用のルータの出番だ.基板作りで穴あけにも使ってみたこのルータ,電池タイプは力が弱くていまいちだったが,今回の,このスズめっき線の表面磨きにはむしろこれがいいあんばいに磨き上げてくれる.ルータの先端を丸型のやすりに戻し,回転させた状態でルータの先端にスズめっき線の先端を対面から触れさせる.ルータに絡みつくように数回転接触を保ってやると,簡単確実に磨ける.これは便利.ダイソーさんありがとう.

 

2008年11月13日 (木)

A型ホビイストの性

Debugcable3 電子回路のトライ&エラーというか,試行錯誤といえば,ブレッドボードなる便利なものがある.いろいろな回路をあれこれ手軽に試してみたい時には便利だし,昨今こうしたものも全くホビーの価格で入手できる.ブレッドボード間の接続は扱いやすいジャンバー線(太目のスズめっき線のようなもの)を使う.でも,ブレッドボードに載らないような機器やデバイス,部品等はやはりワニ口クリップ,蓑虫クリップ,等でターミネートとされたジャンパー線が数多く要る.また,基板上のコネクタ端子,RS-232Cのようなコネクタ,電池スナップ等とブレッドボード上の回路を接続したい場合も様々な形のジャンパーがあると便利だ.そうやって良く使うパターンのジャンパ線を作って増やしてゆくうちにいつの間にか道具箱の中はぐちゃぐちゃになってしまう.

Debugcable0Debugcable1  A型のホビイスト(しつこいか)としてこの状況にはフラストレーションを感じざるを得ない.そこで,こんな整理箱を作ってみた.写真だと小さく見えるがこれでもほぼA3サイズ.MDF材と呼ばれる,ボール紙のような材質でベニヤ板の様に使える平板と,例によって100均で売っている平たい角材(厚さ2mm~3mm程度,幅18mm程度,長さ910mm程度)を使って側面と仕切りを構成してゆく.枠は木ねじ+ボンドで構成したけれど,この程度なら全部ホットメルトでべたべたに止めた方が楽に作れたな.側板や仕切り板に小さな穴を開けてスズめっき線を通し,そこにワニ口や蓑虫クリップで噛み付かせるDebugcable05Debugcable6 Debugcable4  長いケーブルは,半分の長さ近辺の所にもスズめっき線を張り,折り返してやる(左上の部分).終端がバナナクリップやストレートピン,電池スナップ等スズめっき線に噛み付けないものは,左下のスペースのように,一箇所にまとめる.ここにもスズめっき線をガードレールのように複数張っており,ポケット状態になっているのでずれることは無い.あとは見栄えの問題でふたを付け,100均で仕入れた蝶つがいとラッチ(カチッと閉まって蓋をキャッチする部品)を取付,出来上がり.

A型ホビイストの自己満足.モノ探しもこれで幾分解消する.大したもんじゃないけれど,これが結構気に入っている.材料費\500程度,構想&組立3H(結構かかったな).

しなみに,A型とは言っても,正確にはAO型である.

2008年11月11日 (火)

リアルタイムクロック順調だ!

次は,MAX88を計測器の為のハードウエアに改造する.

一番の改造ポイントは,正確な時刻が計れるように,リアルタイム計測ができるようにすることだ.もちろん,イベントの発生時刻を正確に記録して時間を計測するにはきちんとしたリアルタイムクロックを使う必要があるだろう.だけど,高々数十秒~数十分の時間を100msec程度の精度で測るというなら,PIC16F88にだって充分に可能だろう.PIC16F88のデータシート(マニュアル)にだって,TMR1を32.768KHzの外部クロックでドライブすれば,時刻計測が可能とある.しかも実際のアプリケーションでそのまま使えそうなアプリケーション事例が載っている.ハードウエアのケアとしてガードリングを推奨し,サブ秒を計測するための,リアルタイムカウンタ部分を割禁(割り込み禁止)無しで正確に読める方法等,ポイントは完全に押さえられている.これはもうPICホビイストに向けて,「それでもまだリアルタイムクロックICなんてあてにするんすか~?」といわんばかりの充実振りである.

実際,IOに繋がっているパターンをカットし,秋月さんから買っておいた32.768KHzの水晶発振器(確か¥100円くらいだと思う),セラミックコンデンサ33pfを2つ取り付け,マニュアルのアプリケーション事例に沿ってTMR1のイニシャル,割り込み,確認用の表示ソフトを作るだけ.休日のコーヒーを楽しみながら2Hで出来ちゃった.「わかって使ってくれれば,おれってできる子なんすよ」という声がPICから聞こえてきた.

Firstmeasure いい加減な確認ソフトだが,32.768KHzの水晶発振器をソースとして1秒間隔で正確に発生するTMR1の割り込みの中でインクリメントした16ビットの変数(secCnt0とsecCnt1)を液晶SC1602S*Bの上段に5桁の10進数で常時表示している.65536秒後は,0に戻ってしまうはずだ.参考の為に,これまで作ってきたTMR2の割り込みで作成している約10msec単位のカウンタも液晶SC1602S*Bの下段に10進数5桁で表示した.このTMR2のクロックソースは,PIC16F88に内蔵されているCPU動作用RC発振器の1/4分周クロックであるので,そう正確ではない.もう一つの比較対象として,手元にあったストップウオッチ(100均にて200円で購入)を置いて,ヨーイドンでスタートしてみる.結果は上の写真のような状況になった.これは開始後100秒後を狙ってシャッターを押した時のもの.ストップウオッチは1分40秒を示し,液晶上段のTMR1の計測結果はそれと同じ時間経過を示す100秒を示しているが,TMR2の10msecカウンタ値は101xx(xxは正確に読めない),つまり101.xx秒だと言っている.確かに,正確なカウントをしているようだ.ただ,10時間程度連続動作させていると,ストップウオッチとTMR1もさすがにずれてくるようだ.今回の目的にはこれで充分満足である.
だが,A型のホビイストとしてはやはりこの差は気になる.例によって測定器など無いし,PICの中の構造など知らないので勝手な推理である.TMR1の仕組み上,割り込みが発生してTMR1の処理に飛び,この先頭でプリセット値を書くことで次の計数が始まるのだろう.ということは,割り込みを生じてからプリセット値を書き込むまでに32.768KHzのクロックが来ててしまえば,当然誤差が生じる.今のソフトでは,TMR2割り込みやRS-232Cへの送受信割り込みが発生しているので,最悪はこれらの割り込みサービス時間だけTMR1割り込みがサスペンドされる可能性がある.さらに,そもそも割り込み発生からPICの反応時間,割り込みの入り口でコンテクストの退避等不可避なオーバヘッドも次の1秒割り込みに対しての誤差要因だ.10時間でおおよそ1秒狂っているように見える.10時間=36,000秒ということは,一回の割り込みあたり平均で1/36,000秒≒30μS弱の遅延というのはありえない話でもないような気がする.内蔵8MHzのマシンサイクルは0.5μSecなので,ジャンプ系を除く一般のインストラクションでゆけば,50ステップ弱ということになる.これが当たっていたとしたら,計数地で補正することもできるだろう,1/36,000秒というのは,32.768KHzの1クロックに極めて近いという偶然があるので,TMR1のプリセットカウンタ値を0x8000(=32,768)から0x8001(32,769)にしてやる.どうかな.これで.ズレ時間が逆に振れたら,TMR1の割り込みルーチンでNOPなど使って調整できるかもしれない.掟破りだけど.

Tomeasure88う一つの基板改造はI/O周りなので力づく.計測モノなので,入力センサはそう点数もいらないしということで,74HC138によるマトリクス入力を解消し,ダイレクト入力とした.ソフトウエアもマトリクス入力ドライバを削除し,直接IOを入力するように変更したが,チャタリング防止(2度読み)とアップエッジ(立上り)ダウンエッジ(立下り)検出は残した.アプリソフトが楽になると思うので.
出力はそのまま74HC595を残した.3点のPIC出力で基板としては16点のDOを持つというスタイルは変わらない.写真の,左側がオリジナルのMAX88基板,右側が改造後である.見た目はあまり変わらない.右の写真の本体右側にあるように,せっかく老眼を押して取り付けたフォトカプラも一度の入力検出に使われること無く,無事に予備品に回帰していった.

結果として,PICのI/Oピンの使途は以下となった.
 PORTA 0~5 入力 押しボタンスイッチや光電管スイッチの為の入力
    6~7 入力  使途未定.もしかしたら,出力に設定するかも
 PORTB  RS-232C,TMR1クロック,74HC595のRCH,SCH,DATAの為の出力

基板としての入出力Specは以下
RS-232C
ディジタル入力 :6点
ディジタル出力 :10点 (74HC595を介して接続)
使途未定  ;2点(RA6, RA7)
液晶表示(SC1602S*B) (74HC595を介して接続)

基本的なハードとIOドライバはこれでOK.いよいよアプリ設計だ.
時間計測部分の標準関数化ととメインルーチンの状態繊遷移維部分のフレームワーク位はきちんとモジュール化して作りたいなあ.

「mesure88-081111.asm」をダウンロード

「ms88.inc」をダウンロード

2008年10月20日 (月)

気になるのは光電管スイッチと正弦波発振器(2) とりあえずできたっぽい-2

Nec_0053左の写真のようにブレッドボード上で投光,受光回路だけを作成し,動作を確認しながら定数を決めてゆく.投光は,秋月通商のレーザ発光器LM101-Aの仕様にあわせ3.3Vを供給,受光回路はフォトトランジスタPT610を5Vで駆動,シュミットトリガ入力の74HC14で受けることとした.更に,光電権ON/OFF信号は屋外で長距離を伝送することを考慮し,この間のIO電源を12Vとすることを決めた.以上の”仕様”を元に,センサ部とインターフェース部を下記の様に定めて試作した.

Nec_0094

Nec_0093まずは,センサ側から.ここは,投光側(左)と受光側(右)のユニットに分かれる.一般的な用途であれば,この2つのユニットは,1m位離れて設置されるだろう.受光部の回路の方がデリケートなことは間違いないので,本体のI/Fとの接続回路は受光側にコンパクトに実装するのが良いだろう.ここで,投光器用の3.3Vも作り,投光側に送ってやる.回路図は以下の通りとした.Optswsenseor_4

ここで工夫したのは,光電管スイッチのON/OFFモニタ用のLEDの点灯方法.たぶん現場では,等工期と受光器を設置されて最初にやりたいのは,本体からきちんと電源が来ているかどうか. だろうが,上述のLEDをノーマルON(光が入ってこない=光軸があっていない)状態で点灯しておくように設定すれば,電源確認用のLEDは廃止しても影響は無い.どうしても,光がフォトトランジスタに入った時に動作確認LEDを点灯させたければ,LED点灯回路(330ΩとLED)の回路を74HC14の2番ピン位置に接続(2つあるインバータの真ん中)に移すとノーマルOFFになる.でも,この場合は,電源投入用のLEDがあった方が,現場での設置作業がらくだと思う.

Nec_0095次は,インターフェース基板.12Vで入ってくるデジタルI/O信号をフォトカプラで絶縁し,5VのOn/Off信号に直してPICに渡す役目の基板.今回の仕様では,このインターフェース基板からセンサ側に+12Vを送ることとした.下記写真の様に,2センサ分の回路をユニバーサル基板上に実装してみた. Optswif各々のセンサには,+12V,GND,センサON/OFF信号入力の3つを3Pのコネクタに出してある.動作源のLEDは5V側で点灯させている.LEDの色が違うのは,単なるご愛嬌.

Nec_0092_2

そして,こんな感じに仕上がった.次はいよいよ,PIC-CPU基板の改造と今回接続した周辺機器の改造だ!

2008年10月19日 (日)

気になるのは光電管スイッチと正弦波発振器(2) とりあえずできたっぽい

ここ2~3週間の休みは,光電管スイッチ作りに集中している.紆余曲折の後,とりあえず使えそうかな,というレベルのものができた.材料費は一対で\1,000円程度.これで使えればいろいろと使えそう.

最初に検討したのは光電管スイッチの光源とセンサ.赤外線を使えば安心だけれど,光軸調整一つ取ってもツールを持たないホビイストとしてはキツイ.やっぱ見える光で無いと.すると,身近なもので計測用に使うとなればレーザポインタだ.プレゼンテーションで使うやつ.受けはCds(硫(S)化カドミウム(Cd)を原材料とする,光により抵抗値が変わるシロモノ)も考えたが,ホビイストだって環境は気になるし,確か欧州では全面禁止ということになっているから,フォトトランジスタ等を考える.

仕事だったらここで使う光の波長とかセンサの特性から,最適なシステムを考えるんだろうけれど,自称いい加減なホビイストの立場からすると理屈は必要無い.レーザポインタは,通常目立つ光だから,強さも波長も,「これぞ可視光」というべき光のはず.その可視光の優等生が見えない可視光対応のフォトトランジスタなどあるはずがないだろう.と,いう強引な思い込みで,理屈抜きに部品を買う.Nec_0101 フォトトランジスタは数種類を買ったが,TPS610というものが大きさも手ごろなのでこれに仮決めした.レーザポインタは,当初手持ちで使っていたプレゼン用のものをばらして使ってみた.後に,秋月通商で「赤色レーザ発光モジュールLM-101-A(650nm)」という発光源がなんと\500で売っていたので,こちらに切り替えた.プレゼン用のレーザポインタ,2個もばらして損したが,まあいいや.

Nec_0092 とりあえずこれを組んで基礎実験に入る.光を正確にセンサに当てないとだめだし,光軸は調整できなければならない.こんな風に光源とセンサをユニット化した.長い方(左側)にはフォトトランジスタを組み込んだ受光部,右側の短い方がレーザ発光器を組み込んだ発光部である.なぜ,長さが異なるのか,というと,これは筒に使った材料に由来する.筒の材料として目をつけたのはサランラップである.4人家族の我が家では,サランラップは30cmのものが主流.しかし,光電管スイッチのつつの長さが30cmというのはちょっとやりすぎ感がある.半分の15cmというと,受光部側のフォトトランジスタが外乱光の影響を受けそうだ.送信部は本来筒など無くても良いくらいどうでも良いので,目分量で適当な比率で作成しよう.サランラップの筒の内側は100均で購入したポスターカラーでつや消し黒に仕上げ,カメラ用の三脚と組み合わせれば良い.

Nec_0045 Nec_0046

三脚も秋葉原のアキバオーのレジに置いてある小さいもの.今回の用途は,一輪車のスタート,ゴールを検出するものだから,高さはむしろ低いもので良い.この3脚,3本の足が自由に動くので,以外にもX,Y,Z,θx,θy,θz,の調整が自由にできそう.価格も1本210円.決まり.そして,サランラップの筒とうまくつなげるように,3脚に合うナットが必要.どう見てもミリネジではないことは明らかなので,現物を持ってホームセンターへ.1/4インチネジでした.

  これらを接着剤やホットメルトグルーを使ってそれらしい形にする.その後,レーザ発行器,フォトトランジスタを固定する.Nec_0047Nec_0044薄いベニヤ板やMDF板でサランラップの内側に入るくらいの円板を作成し,中心に穴を開け,レーザ発行器やフォトトランジスタを固定する.この時,リード線は予め眺めのケーブルを付けておくほうが良い.筒に固定してからリード線を細工するのは面倒なので.
尚,レーザ発光器は,熱の影響を受けるので,ホットメルトでの固定はお勧めしません.接着剤が良いと思います.円盤の,サランラップの筒への取り付けはホットメルトで位置を調整しながら固定するのがやりやすい.特に,LED発光部は発光器を円板にいい加減な角度で取り付けても,右写真の様にサランラップ筒に固定するときに筒の先端に薄い紙を取り付ければ,筒の中心から光が出るように光軸を合わせる事が容易にできる.

Nec_0051 こうして考えながら2対のユニットで実験開始.フォトトランジスタの入力から,遮光の検出をどうやってやろうか.コンパレータ,オペアンプ,ディスクリート,いろいろとあるのだが,バイナリ信号にすることが目的だと考えると,シュミットトリガ入力のTTLで作ることができれば一番楽.また,検出部とPICの基板の距離は相当離れるかもしれないので,機器間の長距離配線を全て5Vというわけにはいかない.屋外で使うことを考えるとポピュラーなバッテリー電圧12Vで入出力を行うと便利そうだ.以上を想定して検出は5V(TTL)回路で,デジタルI/O信号の送達は12Vで,また,CPU回路直前にI/F回路を置き,フォトカプラで縁を切ってふたたび5Vに戻す,ということにした.まずは,5VTTL回路での光検出回路を検討&検証してみた.ここでも,特別な計算や測定はやらず,あくまでもいいかげんな思い込みと勘を頼りに,何とか使えそうなポイントを探してゆくことにした.

Photo

偶然にも,うまくいってしまった.ただ,エミッタ抵抗は,10KΩ以下はちょいと厳しそう.外乱光には強くなるが,発振側のスポット光をフォトトランジスタに当ててもONしなくなることがあったから.ここは10KΩ~15KΩの可変式にしておこう.

こんな実験を繰り返しーの,実際に現地でケーブリング等の設置を実施すること等を考えて,最終仕様は以下に決めた.変えるかもしれないけれど.なんか,ブログのエディタがおかしいので,最終結果は次回へ.

2008年9月29日 (月)

気になるのは光電管スイッチと正弦波発振器(1)

PICでのリアルタイム計測については,世間でもいっぱい事例があるし,表示も押しボタンスイッチもRS-232C/RS-485も実績あるし.やっぱり問題は光電管スイッチと正弦波発振器.

まず,正弦波発信器から.一番PICに似合うのは,2段T型発信回路だろう.トランスやコイル等は要らないし,トランジスタ1個でも発信できる.しかも,波形はきれいな正弦波というから,調整は難しいといってもなんとかこれでチャレンジしたい.みたいなことをちらちら考えて秋葉原をうろついていたら,キャリブレーションさんから発売されている「サイン波発振器」というキットが格安で出ていた.袋に入っている部品からすると,これは2段T型の発振器じゃないかな.簡単そうだし,そうでなくてもいいや.回路定数を自分で計算する自信も時間も無いので,これを改造しよう.トランジスタが2SC1815だし部品もありふれたものばかりでやりやすそう.

キットを組み立てたら,トラブル発生.というより単なる配線ミスで,どうやらトランジスタをだめにしてしまったよう.そこで手持ちの2SC1815に交換して配線を正規にしても.....鳴らない.な~ぜ~,と思いながら何回確認しても,今度は配線あってるぞ.

ヨーク見てみると,キットに付いていたのは2SC1815GRで,手持ちにあったのは2SC1815Y.サフィックスはhfe(増幅率)を示すので,あーそうか,Yだと増幅率が足りないのか,と思い,2つの2SC1815Yをダーリントン接続をすることで無事発振した.確かに音からすると,きれいなサイン波のよう.

キットの仕様では,600Hz~900Hzとあり,これだと時報に必要なオクターブの正弦波を生成できないので,耳を頼りに早速定数変更.

更に,キットの説明書にあるとおり,HPF(ハイパスフィルタ)部の中点とグランドにスイッチを付ければモールス信号の練習機のように正弦波の生成をコントロールできるというので,ここをトランジスタスイッチに置き換え,PIC16F88のDO(デジタル出力)から制御できる仕様に変更した.Nec_0049

これでよし,部品を集めて作成すれば,かなりお安くできる.キットもじゅうぶんに安いのだけれど.(たしか\500円以下)

回路図(手書き)
(キットのオリジナル部分は,転載許可を得ていないので,キットのオリジナル回路(参考回路も含む)の定数は書きません.)

Photo_2

2008年9月27日 (土)

陸上用計測器,作れるかな

トータライザを作成するためのMax88基板の機能は確保でき,あとはソフトを書けばというところまでは着ているのだが,これを見ているうちにやはり何か実用的なものも作ってみたくなる.陸上競技なんかに使える計測装置なんかが面白いんじゃないかという気になってきた.子供の(陸上ではないが)競技の練習なんかに使えたら,面白そうだ.ちょっと考えてみる.

Cocolog_oekaki_2008_09_27_08_00

 骨格はできている.I/Oはキーマトリクスではなく,直に取り込んだほうが良さそうだ.光電管は高いな.作れないかな.Cdsとフォトトランジスタとどっちが良いんだろう.環境時代だからCdSはまずいのかな.試してみよう.

あとはリアルタイムに計測ができれば良し.
 リアルタイムに計測するには,外部クロック入力を持つTMR1を使うのが良いのだろう.ここに32.767KHzのクリスタルを接続すれば正確な時間計測ができそうだ.折角だから,フライング検出機能や自動スタート機能もいれたら良いかも.一方で,スタート音(時報)はこだわりたい.ホビーなんだから.PICで音を出すと言えば,I/OをON/OFFさせてパルス状の波形を出すのが定番だが,そでれはリアルタイム処理がやりにくいし,音もおもちゃっぽくてよろしくない.時報は正弦波だろうから,正弦波発信回路をON/OFFさせることで時報音を操ってやろう.変なところには凝りたい.

スタンドアロンで計測器として完結する.当然,RS-232CやRS-485を使ってPCにデータを取り込み可能な仕様にすることも考えなきゃね.頑張れば,SPIを使ってSDカードへ記録することもできるだろう.ソフトはたいへんそうだけど.PIC16F88のE2RAMにも簡単な計測なら,工夫すれば数十~100回程度の計測値は蓄えられる.

実用になるもの,できるかな.

いいかげんな構想メモTimemeasuringmachine1
Timemeasuringmachine2