| ホーム | 私の電子工作作品集 |
[ 初公開日:2020年6月1日 ] |
私は以前から健康のために毎日ではないですが、週に3、4日ぐらいのペースで日に2時間ほどの散歩というかウォーキングをしています。 我が家の近所地域を歩くことがほとんどですが、
それでも飽きることがないように、東西南北いろいろな方向のコースをいくつも自分なりに設定をしていて、毎回ローテーションで回しながらなるべく異なったコースになるように務めています。 また、同じコースを歩くことになっても、前回右回りだったから今回は逆の左回りにしようとか、そんな変化を加えながら自分なりにウォーキングを楽しんではいるのですが、以前からずっと気になっていることがありました。 それは同じコースを歩いていて、例えば出発から帰着までに要した時間はもちろんのこと、A地点からB地点までに要した時間とかが、前回と今回とではどのぐらい異なっているか。 しかも、この地点間の所要時間が1か所だけではなく複数あって、それらを簡単に把握できないものか。など。 数年も以前からそのような時間計測ができるものを作ってみたい、と思っていました。 そんな構想を抱きながら今日に至っていたのですが、最近(といっても半年ほど以前)になって、"秋月電子通商" の商品カタログにある "I2C接続小型キャラクタLCDモジュール [AQM0802A-RN-GBW] " の消費電流が 1 mA という低消費であることを知って、一気に製作意欲が湧いてきました。 製作物はウォーキングに携行できるものでなければなりません。 アマチュアが作るものですからある程度のサイズになることは仕方がありませんが、装置としてできる限り小型でそして低消費電流のものが望まれます。 上述のように週に3、4回、日に2時間ほどの、結構長丁場のウォーキングの友ができるように、電源には単4電池3本を使用としました。 そんな構想で製作をしたストップウオッチは、長時間の使用に耐えられるように、低消費電流のLCDモジュールの採用だけでなく、スイッチ操作が一定時間なかったときにはスリープモードに移行して、 積極的に省電力化を図るようにしています。 また、私の拘りで予め設定(任意であり必須ではない)をしておけば、携行中に現在時刻の表示も可能なようにしました。 メイン機能のストップウオッチとしての時間計測には、歩きながらでも簡単なスイッチ操作で、 (内蔵メモリ量の関係で)最大 58 個 (PIC16F628A の場合) / 68 個 (PIC16F648A の場合) までの、スプリットタイムとラップタイムの測定を記憶・表示が可能です。 |
*注. RA4 の出力はオープンドレインのため、外部抵抗でプルアップしないと、High が出力されない。 RA5 は入力専用で、出力ポートには使えない。 RB1 〜 RB5 は内部プルアップ機能を ON にして使用。 また、SLEEP 中には RB4, RB5 にポート変化割り込み機能を使用。 |
| 回路図 (StopWatchII.CE3) | ページトップ |
|
| ページトップ |
( * 実際にはもっと多くの数を登録することも可能であるが、逆に選択が面倒にもなるため最大5つに制限をした。)
[ 00:00:00 ] ..... 1行目にスプリットタイムのカウントが開始される。 [ xx:xx:xx ] ..... 2行目に刻々と現在時刻が刻まれながら表示される。 [ ** xx ** ] ..... 1行目の xx に記憶番号が表示される。 [ xx:xx:xx ] ..... 2行目にラップタイムが表示される。 [ xx:xx:xx ] [ Mem Over ] ..... 2行目にメモリオーバーエラーメッセージが表示される。 [ xx:xx:xx ] ..... 1行目のスプリットタイムはカウントが停止される。 [ xx:xx:xx ] ..... 2行目の現在時刻は更新されながら表示し続ける。
[ ** xx ** ] ..... 1行目には記憶番号 xx が表示される。 [ ] ..... 2行目には何も表示はされない。 [ xx:xx:xx ] ..... 1行目にはスプリットタイムが表示される。 [ xx:xx:xx ] ..... 2行目にはラップタイムが表示される。 [ Mem Disp ] [ xx:xx:xx ] ..... 2行目には刻々と更新をしながら現在時刻が表示される。
|
| ページトップ |
・ 使用した割り込み機能の種類について ページトップで述べたように本機の使用目的が私のウォーキングの友とすることであり、本機の作製に当たって、携帯性の確保と如何にして電池を長持ちさせるかに重きを置いています。 家を出てから帰宅するまでの 間中ずっと現在時刻を始め、スプリットタイム* やラップタイム* の表示をさせておく必要もないので、スイッチ操作が一定時間なかったときには積極的にスリープモードに移行して 省電力化を図るようにしているのは上述した通りです。 ( * については 以下 を参照のこと ) 本機のLCDモジュールでの表示内容については、前項の "機能と使用法" で述べたように、PICがスリープ中にはLCDモジュールの電源も OFF になるようにしているので、LCDには何も表示がされません。 しかし、表示を再開したいときには、ENABLE、または START スイッチのどちらかを操作することで、いつでもすぐに目覚めさせることが可能です。 10 年ほど以前に作製をして、既に私の他のページで紹介をしている "145. 長時間ストップウオッチ/タイマー" とは、使用目的や設計思想がまったく異なるために、本機ではその前作のように 1/100 秒までの詳細な測定はできません。 これは測定精度よりも省電力化を優先させたためで、最小単位が1秒のために、本機では最大1秒の誤差を伴います。 あくまでもウォーキングの友とすることが使用目的であって、 陸上競技のようなタイム測定には不向きであることを初めに断っておきます。 積極的にスリープモードに移行をさせてはいますが、本機はストップウオッチという時計です。 ずっとスリープをしたままでは時を刻むことができません。 したがって、スリープ中にも1秒毎に割り込みをかけて一瞬だけ目覚めさせ、 時を刻んだ後に再びスリープをさせる、ということを繰り返しているのです。 この割り込み周期をもっと長くすればそれだけ省電力化にはつながりますが、計測の最小の単位を1秒にしたかったので、 本機では1秒毎に割り込みをかけています。 このように1秒毎に割り込みをかけるために、本機では タイマー1割り込み を使用していますが、スリープモード中だけでなく目覚めているときにも、常にタイマー1割り込みで時を刻んでいるのです。 また、スイッチ操作が一定時間なかったときにスリープモードに移行させるための、この一定時間のカウントの監視にも同割り込みを使用しています。 そして、スリープ中のPICをスイッチの操作によって再び目覚めさせるためには、 RB ポート変化割り込み を使用しています。 また、本機では様々な状態の変化をユーザに知らせるために、各種のビープ音を発生して注意の喚起に使用をしていますが、そのビープ音の発生には タイマー0割り込み を使用しました。 ・ ビープ音の発生方法について 私のこれまでの他のプログラムでは、ビープ音の発生には通常タイマー1割り込みを使用することが多いのですが、本機ではタイマー1割り込みは上で述べたように、既に時を刻む目的のために使用をしているので、 同目的にはタイマー0割り込みを使用しました。 このビープ音を発生させるのに、タイマー1割り込みの場合には TMR1H、TMR1L の両レジスタで構成される、16 ビットカウンタがオーバーフローしたときに発生するタイムアウト割り込みを利用しますが、 これに対してタイマー0割り込みでは TMR0 レジスタだけの、8 ビットカウンタがオーバーフローしたときに発生するタイムアウト割り込みを利用しています。 前者ではビープ音の発生プログラムはかなり簡単でしたが、 後者でのプログラムは少しばかり面倒な作りになりました。 例えば "ピポッ" というブザー音を発生させるために必要となるプログラムを示すと、次のようなコード群となります。 ;========================================================================== ; 変数、定数の定義とレジスタ割付 ;========================================================================== radix dec : _BZ equ 0 ;アラーム音 出力 : ; f t = 1 / f f_do2 equ 956 ;ド(1046.52 Hz) 0.0009 55 5479111723 f_soh equ 1276 ;ソ (784.00 Hz) 0.0012 75 5102040816 f_mih equ 1517 ;ミ (659.26 Hz) 0.0015 16 8522282559 f_doh equ 1911 ;ド (523.26 Hz) 0.0019 11 0958223445 f_so equ 2551 ;ソ (392.00 Hz) 0.0025 51 0204081633 f_mi equ 3034 ;ミ (329.63 Hz) 0.0030 33 7044565118 f_do equ 3822 ;ド (261.63 Hz) 0.0038 22 1916446891 ; | | ; (100μS 桁) (1μS 桁) po_tim equ 100 ;音長(ms) pi_tim equ 100 ;音長 : cblock h'20' : const_high ;音階用分周定数 high の保存 const_low ;音階用分周定数 low の保存 t0_work ;音階用分周変数ワーク wt1cnt ;ウェイト用ループカウンタ wt2cnt ;ウェイト用ループカウンタ : endc ;========================================================================== ; マクロ命令定義 ;========================================================================== : ; Sound_M マクロ(タイマー0割り込み使用) Sound_M macro @scale,@time movlw @scale / 100 ;出力音階 movwf const_high movwf t0_work ;ワーク movlw @scale % 100 / 2 movwf const_low movlw @time ;出力時間(ms) ;; call buzzer_control ;ブザー音出力コントロール goto buzzer_control ;スタックの消費を抑えるため変更 endm ;========================================================================== ; アラーム(ブザー)音出力ルーチン ;========================================================================== : ; "ピッ" ブザー音出力 (100 mS) buzzer_pi Sound_M f_soh, pi_tim movlw f_soh / 100 ;出力音階 ; movwf const_high ; movwf t0_work ;ワーク ; movlw f_soh % 100 / 2 ; マクロ展開 movwf const_low ; movlw pi_tim ;出力時間(ms) ; ;; call buzzer_control ;ブザー音出力コントロール ; goto buzzer_control ;スタックの消費を抑えるため変更 ; ;; return ; "ポッ" ブザー音出力 (100 mS) buzzer_po Sound_M f_do2, po_tim movlw f_do2 / 100 ;出力音階 ; movwf const_high ; movwf t0_work ;ワーク ; movlw f_do2 % 100 / 2 ; マクロ展開 movwf const_low ; movlw po_tim ;出力時間(ms) ; ;; call buzzer_control ;ブザー音出力コントロール ; goto buzzer_control ;スタックの消費を抑えるため変更 ; ;; return : ; "ピポッ" ブザー音出力と LED(緑)点滅 (Total 260 mS) buzzer_pipo call buzzer_pi ;"ピッ" ブザー音出力 bsf PORTA,_ledG ;LED(緑) 点灯 call wait_30ms bcf PORTA,_ledG ;LED(緑) 消灯 call buzzer_po ;"ポッ" ブザー音出力 bsf PORTA,_ledG ;LED(緑) 点灯 call wait_30ms bcf PORTA,_ledG ;LED(緑) 消灯 return : ; ブザー音出力コントロール buzzer_control movwf wt2cnt ;退避 movlw 256 - 200 ;4 / 8MHz * 200 = 100 μS movwf TMR0 movf wt2cnt,W ;復帰 bsf INTCON,T0IE ;bit5(T0IE)=1: タイマー0割り込み許可 call wait_xxms ;入力 W: 音長(ループカウンタ) bcf INTCON,T0IE ;bit5(T0IE)=0: タイマー0割り込み禁止 return ;========================================================================== ; ウェイト・ルーチン (8 MHz) ;========================================================================== : ; xx m 秒( 1m 秒 x W )ウェイトルーチン wait_xxms movwf wt2cnt ;1 w1m01 movlw 221 ;1 movwf wt1cnt ;1 w1m02 goto $ + 1 ;2 goto $ + 1 ;2 goto $ + 1 ;2 decfsz wt1cnt,F ;1,2 goto w1m02 ;2,0 (2+2+2+1+2)*220+(2+2+2+2+0)=1988 nop ;1 goto $ + 1 ;2 goto $ + 1 ;2 decfsz wt2cnt,F ;1,2 goto w1m01 ;2,0 (1+1+1988+1+2+2+1+2)*(W-1)+(1+1+1988+1+2+2+2+0)=1998*W-1 return ;2 1+(1998*W-1)+2=1998*W+2 ;Total (1998*W+2)/8MHz*4 = (999*W + 1) μS : ;========================================================================== ; 割り込み処理 ;========================================================================== interrupt : : ; タイマー0割り込み処理( 100μ秒毎に割り込み: ブザー音出力時のみ ) int_tmr0 bcf INTCON,T0IF ;タイマー0割り込みフラグをクリア decfsz t0_work,F ;t0_work - 1 = 0 か? goto int02 ;No movf const_low,W ;音階用分周定数 low movwf t0_work ;(4/8MHz) * (1+1+2) * (const_low) = 2μS * (const_low) int01 nop ;1 decfsz t0_work,F ;1,2 t0_work - 1 = 0 か? goto int01 ;2,0 No movlw 1 << _BZ ;対象ビットをセット xorwf PORTB,F ;出力をビット反転 movf const_high,W ;音階用分周定数 high movwf t0_work int02 movlw 256 - 200 ;4 / 8MHz * 200 = 100 μS movwf TMR0 goto int_end : :以上に示したプログラムで、音階を作り出すための定数定義の部分を再掲してみると、次のようになります。 ; f t = 1 / f f_do2 equ 956 ;ド(1046.52 Hz) 0.0009 55 5479111723 ;buzzer_po で使用する音階定数 f_soh equ 1276 ;ソ (784.00 Hz) 0.0012 75 5102040816 ;buzzer_pi で使用する音階定数 f_mih equ 1517 ;ミ (659.26 Hz) 0.0015 16 8522282559 f_doh equ 1911 ;ド (523.26 Hz) 0.0019 11 0958223445 f_so equ 2551 ;ソ (392.00 Hz) 0.0025 51 0204081633 f_mi equ 3034 ;ミ (329.63 Hz) 0.0030 33 7044565118 f_do equ 3822 ;ド (261.63 Hz) 0.0038 22 1916446891 ; | | ; (100μS 桁) (1μS 桁)この内、"ピッ" と "ポッ" で使用する音階定数を再掲でコメントの追加をしましたが、例えば "ピッ" の場合の音階定数は 1276 ですが、どのようにして求めたかというと、この音階は高い方の ソ (784.00 Hz) で その周期を求めると T = 1 / f = 0.0012 75 5102040816 ≒ 0.0012 76 秒(小数点以下 7 桁目を四捨五入)、すなわち、0.0012 76 秒 = 1276 μ秒となります。 本機では、システムクロックに 8 MHz のセラロックを使用しているため、基準クロックは ( 1 / 8MHz ) * 4 = 0.5μS となります。 したがって、この基準クロックを TMR0 で 200 カウントして 4 / 8MHz * 200 = 100 μS 周期で タイマー0割り込みを起こさせています。 また、上で示した "ピッ" サブルーチン( buzzer_pi )を同様に再掲してみると、 ; "ピッ" ブザー音出力 (100 mS) buzzer_pi Sound_M f_soh, pi_tim movlw f_soh / 100 ;出力音階 ; movwf const_high ; movwf t0_work ;ワーク ; movlw f_soh % 100 / 2 ; マクロ展開 movwf const_low ; movlw pi_tim ;出力時間(ms) ; ;; call buzzer_control ;ブザー音出力コントロール ; goto buzzer_control ;スタックの消費を抑えるため変更 ; ;; returnこのマクロを使用したサブルーチンでは何をしているかというと、まず、音階定数 (1276) の上2桁を取り出して const_high = 1276 / 100 = 12、次に、音階定数 (1276) の下2桁を取り出したものを 1 / 2 して const_low = 1276 % 100 / 2 = 76 / 2 = 38 と、2つの値を作り出してそれぞれのレジスタに格納をしています。 そして、これらの2つの値が上に示した 100 μS 周期の、タイマー0割り込み処理ルーチン内で使用されます。 まず const_high = 12 で、タイマー0割り込み処理ルーチンが 12 回繰り返され( 100 μS * 12 = 1200 μS )、 次には、その 12 回目に const_low = 38 で、タイマー0割り込み処理ルーチン内の次に示すループを、38 回繰り返します( 2 μS * 38 = 76 μS )。 ;(4/8MHz) * (1+1+2) * (const_low) = 2μS * (const_low) int01 nop ;1 decfsz t0_work,F ;1,2 t0_work - 1 = 0 か? goto int01 ;2,0 Noこのように 1200 μS + 76 μS = 1276 μS が経過すると、最終的には次のようにブザー音出力ポートのビットを反転させます。 movlw 1 << _BZ ;対象ビットをセット xorwf PORTB,F ;出力をビット反転ただし、この場合には指定周波数よりも1オクターブ下の半周期分を作成していることになります。 したがって、以上説明をした過程(ビット反転まで)を2度繰り返すことによって 1周期分を作成することになりますが、あくまでも指定周波数よりも1オクターブ下の音階であるので注意が必要です。 なお、"ピポッ" ブザー音出力時には LED(緑) も点滅をさせて、ユーザへの注意喚起をより強調させています。 ・ 時間データの取り扱いと記憶の方法について 本機で取り扱う時間データには、現在時刻、スプリットタイム、ラップタイムの3種類がありますが、それぞれ "時"、"分"、"秒" で構成されており、プログラムの内部では3バイトの BCD データ(BCD とは、Binary Coded Decimal の略で 2進化 10進数 の意味)とし、各バイトは次図に示すように4ビットずつに分けて、2桁の2進数として取り扱っています。 したがって、本機の電源スイッチを ON にした直後に時刻の設定をする仕様(設定が簡単に行えるようにプリセット値を、PICに内蔵のメモリ(EEPROM)へ書き込みや読み出しの機能もあり)になっていますが、 必須ではないため不要な場合には省略をしても構いません。 ただし、その場合には、ストップウオッチの動作中にも無意味な時刻表示がされ続けることになります。 次に、スプリットタイムとラップタイムについてですが、次図のような関係にあります。 スプリット(SPLIT)タイム とはスタートしてからゴールまでの途中経過時間のことを言い、また、ラップ(LAP)タイム とは スタートからゴールまでの区間経過時間のことを言います。 そして、ユーザのスイッチ操作によるスタートの合図を起点として、スプリットタイムの "時"、"分"、"秒" を [ 00:00:00 ] にしてカウントが始まります。 このように本来、現在時刻とは非同期でカウントが開始されるのですが、 上述 したように本機の割り込み周期が1秒で同じ割り込みを使用しているために、更新のタイミングは現在時刻と同期をしてしまいます。
次図は PIC16F628A と PIC16F648A のデータメモリの構成を図に表したものですが、着色した部分が汎用レジスタ(GPR)でユーザが自由に使用できる RAM メモリです。 ただし、各バンクの最下位 16 バイト分については、実際には バンク0に存在するだけで他のバンクには物理的に存在しませんが、バンク切り替えを行わなくても他のバンク指定のままで、バンク0の 16 バイト分にアクセスすることが可能となっています。 両PICではバンク2のメモリ量が異なっているのが分かりますが、本機ではどちらでも使用することができます。 ただ、PIC16F628A では RAM メモリが少ない分だけスプリットタイムの記憶量も少なくなります。 具体的には、1スプリットタイム当たり3バイト必要なのでバンク2での記憶量は、PIC16F628A では 48 / 3 = 16、PIC16F648A では 80 / 3 = 26 となります。 (ただし、これらの両PICの仲間に PIC16F627A というものもあり、データメモリの構成は PIC16F628A と同じですが、プログラムメモリが 1 K ワードしか存在しないため、本機で使用することはできません。) また、スプリットタイムの記憶用として使用するバンクの順は、まず初めにバンク1としました。 そして 80 / 3 = 26 個と満タンになると、次にバンク2に移ります。 そして PIC16F628A では 48 / 3 = 16 個、PIC16F648A では 80 / 3 = 26 個とそこも満タンになると、次にはバンク0に移ります。 上述のようにバンク0では 80 + 16 = 96 バイトから、一般的な変数の総数を差し引いた残りの(GPR)を使用します。 まだプログラムの開発途中の現在ですが 50 バイトの残り(GPR)がありますので、50 / 3 = 16 個まで記憶することが可能です。 したがって、全体を通してもう一度まとめてみると、PIC16F628A の場合には 26 + 16 + 16 = 58 個、PIC16F648A の場合には 26 + 26 + 16 = 68 個まで記憶することができます。 そして、もしも、 これらの最大個数になっているときに、なおも記憶をさせようとしたときには、[ Mem Over ] とLCDにエラーメッセージを表示して、かつ、"ブッブッブッブッ" ブザー音とともに LED(赤) が数秒間点滅を繰り返します。 さて、時間データを3バイトの BCD データとして取り扱っていることと、ラップタイムを求めるための時間計算についてを先に触れたところですが、この時間計算に引き算をするということが、 私にとってそれほど容易なことではありませんでした。 私はこれまでに時間関連におけるいろいろなプログラムを作成してきて、3バイトの BCD データを単純にインクリメント(+1する)したり、 デクリメント(−1する)したりするだけのプログラムに関しては、比較的容易に実現をさせることができていました。 しかし、今回のようにラップタイムを求めるために、3バイトの BCD データ同士の引き算をするということに関しては、まったく初めての経験でその実現にはずいぶんと頭を悩ませました。 何とかそのサブルーチン( lap_time_calc )を作り上げたのですが、現在はかなり冗長なコードになっています。 もう少し頭を捻ればより簡潔な方法になるかもしれないですが、とりあえず現行のままとします。 BCD データを文字化する場合には超簡単ですが、このような時間計算をさせる場合には、本機のプログラムを通じてかなり面倒であることを、改めて認識をしました。 このような時間計算をさせる場合には、BCD データではなく バイナリデータを扱ったほうが単純に引き算ができて面倒さがないと思います。 反面、本機のプログラム内でも使用をしていますが、バイナリデータを文字化する場合には、サブルーチン( bin8_dec2chr )のように 若干面倒さを伴います。
|
| ページトップ |
下の ケース加工図 で示したケース内にぴったりと収めるためには、プリント基板の切断等の加工が必要です。
使用したプリント基板は、"秋月電子" の "片面ガラス・ユニバーサル基板 Bタイプ(95×72mm)めっき仕上げ(通販コード P-00518)" で、下図に示すように
まず、横の ----- 線の位置で切断をします。 次に、縦の ----- 線2ヶ所の位置で切断をします。 最後に、ケース取り付け用のΦ3.2 の穴を4個と木片固定用のΦ2 程度の穴を2個開けます。 |
| プリント基板部品配置図 (StopWatchIIPC0.CE3) | ページトップ |
プリント基板に各パーツ類を取り付けるに当たって、いくつかの注意をすることがあります。 その1つ目は、PIC用のソケット周りのハンダ付けをするときに、
使用するソケットの形状にもよりますが、ソケット内に配されている 0.1μF のコンデンサを、ソケットよりも先に取り付けておかないと、後からでは取り付けが少しばかり困難になります。 2つ目は、右側に5個並んでいるタクトスイッチの内、下から2番目の DOWN スイッチについても同様で、スイッチよりも先に青線で示したジャンパーの配線をしておかないと、 スイッチの取り付けの後からでは配線が難しくなります。 LCDモジュールの取り付けについては 下で詳述 しているので、そちらを参照してください。 また、左下に位置している 100μF のコンデンサは、通常のものよりも背が低いタイプのものが必要で、通常タイプでは背が高くて本機で使用しているケース内には収まりません。 本機で使用している2個のLEDについては通常のものを使用していますが、できれば VF が小さくて高輝度なものを使用することが望ましいと思います。 私の場合には、緑(3 mm)の高輝度LEDが手持ちになかったので赤緑とも通常のものを使用してしまいましたが、消費電流を抑えるために通常よりも大きな制限抵抗を使用していることもあって、 やはり光具合には多少の不満が残ります。 次に、右上に位置している2個のタクトスイッチについては、他の3個に比べてキートップ長が長いものを採用し、本機のケースの蓋を閉めた状態でも頭がケース外に飛び出すような構造にしています。 私が使用したものは、"ラーメン・タイマー II(2号機)" や "ラーメン・タイマー III" で使用したものと同じもので、 キートップ長が 9.5mm のものを使用しています。 そして、プリント基板をケースへ取り付けるときの考え方などを、"ラーメン・タイマー II(2号機)" の "ケースへのプリント基板の取り付け" で詳述していますので参考にしてください。 |
| プリント基板パターン図 (部品面) (StopWatchIIPC.CE3) | ページトップ |
| プリント基板パターン図 (ハンダ面) (StopWatchIIPC1.CE3) | ページトップ |
本機で使用したLCDモジュールは、"Xiamen Zettler Electronics" 社の "AQM0802A-RN-GBW" ですが、本機に採用した理由として、I2C接続で必要とするPICの I/Oポート数が2本だけで済み、
また、小型で消費電流も 1 mA と少なく携帯用にはぴったりなことと、"秋月電子通商" で購入をしたのですがすごく安価である、ということなどが挙げられます。 半面、このモジュールの、基板との接続用の足ピンのピッチが 1.5 mm のため、通常の 2.54 mm ユニバーサル基板には、そのままでは搭載することができません。 そのために、ピッチ変換基板なるものも販売されていますが、 その価格設定が私にはどうしても納得が行きません。 LCDモジュールに必要な外付けのCR類が付属されているとはいうものの、本体のLCDモジュールよりも高いということに、どうしても納得が行かないのです。 (下図は AQM0802A の外観図で、"秋月電子通商" のホームページに収録の PDF データシートから抜粋したもの) そこで、ピッチ変換基板を購入することはやめて、何とか 2.54 mm ユニバーサル基板に取り付ける方法を考えてみました。 "AQM0802A-RN-GBW" の足ピンは、上図に示すように 1.5 mm ピッチですが 9 本が横一列に並んでいます。 また、次の図は既に上で示した、プリント基板の 部品配置図 と パターン図 (部品面) の、LCDモジュールの取り付け部分を切り取ったものです。 右側の図中のやや中央下部分に、千鳥足状に 1 〜 9 の番号が付けられている基板の穴の場所に、上図に示す横一列に並んでいる 1.5 mm ピッチの 9 本の足ピンを、予め千鳥足状に曲げておいて差し込もうというものです。 そのために、まず 2, 3, 5, 7, 8 のピン先を元位置よりも 2.54 mm 上にずらすように曲げて、横一列だったものを横二列にします。 次に、横二列になったそれぞれのピン先の横幅の間隔を右図になるように広げます。 これらの曲げ加工は足ピンを折ってしまわないように慎重に行います。 といってもそんなに簡単には折れるようなことはありませんが。 このようにして足ピンの曲げ加工を行ったLCDモジュールを基板に搭載する前に、もう 2、3 先に行っておく作業があります。 左側の図中で、2つの縦長の緑色長方形のものはLCDモジュールを乗せるための台座となる木片で、 他に適当な素材のものが見つからなかったので、私は手持ちにあった □ 5 x 5 mm の木材を 18 mm 長ほどにカットをして使用しました。 また、台座としての高さ(厚さ)も出来れば 4 mm 程のものが良いのではないかと思われるため、少々やすりで削ってみましたがこの作業が意外と難しくほどほどで止めてしまいました。 そして、このように加工をした木片を基板に固定をするために、プリント基板の裏側から M2 x 6 程の木ねじで取り付けました。 このとき木片側に予め Φ1.5 程の穴をドリルで開けておくと、木ねじの通りもよく木片が割れにくくなります。 このようにして私は木ねじを使用しましたが、接着剤で固定をさせても良いのではないかと思います。 次に、この取り付けた2つの台座同士の間にできた空間には、LCDモジュールの取り付けよりも先に上図に示した位置に、3個のコンデンサと2個の抵抗を取り付けておかなくてはなりません。 3個のコンデンサ類は恐らく台座の高さよりも背が高くなるため、LCDモジュールの裏側とぶつからないように、少し斜めに寝かせなければならないと思います。(下の写真を参照) このように下準備をした上でLCDモジュールを取り付けるのですが、その前に最後になりますが、LCDモジュールとの密着度をよくするために、2つの台座の上面には両面テープを貼り付けておくと良いと思います。 そしていよいよ、足ピンの曲げ加工が済んでいるLCDモジュールを取り付けるのですが、先の細いピンセットなどで誘導をしながら、各ピンが確実に所定の穴位置に入るように差し込んで行きます。 このようにして所定の穴位置に差し込んだ 9 本の足ピンの内、4, 5, 6 についてはまったく問題はないと思いますが、通常のプリント基板の厚さは 1.6 mm ありますので、特に 2 と 8 については問題ありで、 恐らく足ピンが基板裏のハンダ面まで達しないと思います。これは、台座の高さが 5 mm と少々高いことと、元々 7 mm 程の長さしかない足ピンを、最も端位置にある所定の穴まで曲げ広げるには少々の無理があるものと思います (場合によっては、他のピン 1, 3, 7, 9 についても同状態になるかもしれません)。 このままではハンダ付けができません。 そこで、このような場合には裏技を使います。 まず、不要となったACコードなどを用意してその被覆を剥き、複数の細線で構成された芯線を取り出します。 そして、その細線 10 数本を束ねたものをハンダ面側から 該当ピンの穴に差し込んで、その状態でハンダ付けをします。 このときの注意として、決して芋ハンダにならないように十分に熱を加え、ハンダが細線を通して穴の中に流れ込んでその細線と足ピンがハンダで結合するようにします。 また、差し込んだ細線がバラけて他のピンと接触することが決してないように注意が必要です。 以上述べてきたように、LCDモジュールの足ピンの曲げ加工を行ったり、プリント基板への取り付けを行ったりするときに、気を配っていても指先がLCDモジュールの各部分にしばしば触れてしまうことがあります。 そして、LCDモジュールの表面の下1/3を占める黒い部分に触れてしまった場合には、指先に付着している油脂とか埃とかがその黒い部分(ブラックシリコン)に移ってしまい、 地が黒いだけにその汚れが極端に目立ってすごくがっかりします。 しかし、心配はいりません。 簡単にこれらの汚れを取り除く方法があります。 どこの家庭にもあると思いますがセロテープを用意してください。 そして、取り扱いやすいように数センチにカットしたもので、 ブラックシリコンの表面上を数回ペタペタを繰り返していると、それらの汚れが次にはセロテープに移って、汚れていたLCDモジュールは元のように復活をします。
上の写真は、このようにして取り付けた後のLCDモジュールの足ピンの様子を撮ったものです。 なお、これらの写真の他にも、LCDモジュールを取り付ける以前のプリント基板の様子写真や、 足ピンの曲げ加工を行った直後の足ピンのアップ写真なども数枚あったのですが、残念ながら、今となってはお見せすることができなくなってしまいました。 その理由については 後書き を参照願います。 ( 2020/9/23 追記 ) 最近になって、"187. FMステレオラジオ" を製作しているのですが、本機と同様にLCDモジュール "AQM0802A-RN-GBW" を使用しています。 そこで、ユニバーサル基板に取り付けてしまう前に、 写真を撮っておきましたので、次に掲載をしておきます。 足ピンの曲げ加工を行うときの、要領をつかむための参考にしてください。 上でLCDモジュールを乗せるための台座となる木片について述べていますが、今回はその高さ(厚さ)を何とか 4 mm 程に削って使用をした結果、上で述べているような裏技を使わなくても、 長短の差はありますが全ピンとも基板裏のハンダ面まで達して、通常のハンダ付けをすることができました。 また、LCDモジュールの黒い部分(ブラックシリコン)が汚れてしまう件についてですが、予め黒い部分の表面にセロテープを貼って保護をしておき、一連の取り付け作業が終了してから剥がすようにすれば、 何ら問題は起こらないと思います。 ( 2020/10/7 追記 ) 昨日、"187. FMステレオラジオ" を公開しました。 中国製の超安価なFMラジオモジュール、デジタルアンプモジュールを使用した "FMステレオラジオ" で、FMラジオモジュールは LCD とともに、 PIC から I 2 C 接続で制御をしています。 興味のある方は是非ご覧になってください。 |
| ページトップ |
| ケース加工図 (StopWatchIICS.CE3) | ページトップ |
(主要部品: IC, トランジスタ等) | (データシート) | ||
PICマイコン | .................... | PIC16F628A / PIC16F648A | |
三端子レギュレータ | .................... | S-812C33AY-B-G | |
トランジスタ | .................... | 2SA1015 | |
LCDモジュール | .................... | AQM0802A-RN-GBW | |
圧電ブザー | .................... | PKM17EWH4000 |
| 部品表
| Excel ファイル (StopWatchII_parts.xls)
| ページトップ |
突然ですが、皆さん、パソコンなどの重要なデータのバックアップを取っていますか? 災難というものはいつわが身に降りかかってくるか分からないもので、今回の件でつくづくそう思わされました。 また、昔から、備えあれば ・・・・・ といわれているように、まさにその通りだと反省をしております。 実は、私が日ごろ愛用しているPCが、2月末頃のある日に、突然 Windows 10 が立ち上がらなくなってしまいました。 当初は事態を安易に考えていたのですが、また、話が長くなるのでここでは詳細に述べることは避けますが、 原因はどうやらハードディスクがクラッシュしたようで、後日、ハードディスクを他の正常なPCに SATA-USB3.0 変換ケーブルで接続をしてみたのですが、ハードディスクにアクセスすることができない様子で、 ディスク内のフォルダやファイルの存在をエクスプローラで確認することがまったくできない状態です。 ここで、事の深刻さを改めて知らされたようでがっくりと力が抜けてしまいました。 システムはもちろんのこと、最も重要な各種のデータ類を救い出すことがまったく不可能となって、すべてがオシャカになりショックで落ち込んでしまって、 しばらくは立ち直れないほどでした。 データ類のバックアップは、不定期ではありますが一応、外付けのハードディスクに取ってはいたのですが、その最終のものが昨年の11月末頃で、その間、約3か月分の更新されたデータについては、 完全に蒸発をしてしまいました。 また、バックアップについてはすべてのデータ類ではなく、私にとって最も重要な趣味の開発環境で使用するためのデータ類(約 30G bytes 分)だけで、その他のものについてはバックアップを取っておらず対象外でした。 このバックアップの対象外としていたデータ類の中にも、重要なファイル類がたくさん含まれていたのですが、ただ、ため息が出るばかりで何ともなりません。 蒸発をしてしまった3か月分の更新データの中には、本作品 "ストップウオッチ II" の開発のために必要な各種のデータファイルなどがたくさんありました。 回路図を始めとしてプリント基板パターン図、ケース加工図などの各種図面類は 既にほとんどが完成しており、他にはまだ開発途中ではありますが、本機のプログラムやこのページである HTML ファイルも含まれています。 また、一部ですが、ホームページ用の写真もありました。 しかし、それらのすべてが一瞬の内に消えてなくなってしまったのです。 唯一残ったものは、既に完成をしていた本機のハードウエアだけでした(ハードディスクとは関係がないので当たり前か)。 このように、本機の開発もかなり進んでいたころのことで、一瞬にしてそれらのすべてを失ってしまったため、 それからひと月以上もの間、何もする気が起こりませんでした。 気を取り直して本格的に再開を始めたのは4月に入って何日も経ってからのことでした。 まず初めに行ったのは回路図の再現からでした。 本機は比較的簡単な回路ですがそれでも頭の中に入っているわけではないので、 完成をしている現物のプリント基板のパターンを見ながら回路図を起こして行きました。 そして、プリント基板パターン図などの再現も行いました。 開発途中ではありましたが既に1か月以上ものブランクがあったために、プログラムの作成では以前にはどんな考えのもとでどこまで進んでいたのか、まったく記憶にはなく思い出すことができません。 プログラムリストが一瞬で消えてしまい文字通りまた一からの再出発でした。 私の場合には、プログラムというものは毎日毎日の積み重ねで、その日の一瞬一瞬でどんどんと内容の更新がされて変わって行きます。 ですから、どのようなことをさせるか概略では大まかに似ていても、それを HEX レベルにしたときにはまったく異なった別のものとなります。 もしも、作成が途中で打ち切られることなく以前のまま進めていたとしたら、 どのようなプログラムができ上がっていたか、やむなくの再出発で別ものを完成させた現在でもすごく興味があります。 また、昨年の11月末以降に私が公開をした作品として、他のページで紹介をしている "110. 音声(お喋り)時計 2題" がありますが、この作品に関してもバックアップがまったく取られてないので、 外付けのハードディスクの中には何もなくPC上だけに存在していたわけですから、それが消えてしまった時点ですべてがなくなってしまいました。 その中にはホームページ上に表示がされている各種の図面や写真などの元となった、 数多くの重要な元ファイルが含まれています。 たとえば回路図を例にしてみると、元ファイルは "回路図エディタ BSch3V" で作成をした ".CE3" ファイルのことで、その後 ".BMP" ファイルを経て私の場合には彩色を施して最終的に ".GIF" ファイルに変換をした後、 ホームページ上で表示をさせています。 したがって、今後回路図を変更したいとかの要求が起こっても元ファイルが存在しないと、その変更をすることがかなり困難になります。 また、写真ファイルでは、まずデジカメで撮った ".JPG" ファイルが元ファイルになり、サイズが極端に大きな元ファイルをサイズ変換ソフトで適度なサイズに縮小した後、 必要な部分だけをトリミングして、場合によっては明るさやコントラストなどを調節して、ホームページ用の写真ファイルに仕上げています。 この作品では、PC内の元ファイルなどを含んだすべてが失われてしまったのですが、それでも僅かに救いとなったのは、ホームページ上で公開のために既にWEBサーバ上にアップロードをしてあったので、 それらを新しいPC上にダウンロードをして、とりあえず元ファイルなどを含まないデータだけの復元をすることができたことでした。 このように昨年の11月末以降でバックアップが取ってなかったために大きな影響を受けてしまった作品には、前者のまだ開発途中であった本作品 "ストップウオッチ II" と、後者の既に公開済みの "110. 音声(お喋り)時計 2題" の 2作品があったのですが、前者については開発の二十手間、という実に大きな犠牲を払わされました。 |
| ページトップ |
長時間ストップウオッチ/タイマー | ..... | http://xyama.sakura.ne.jp/hp/StopWatchTimer.html |
初心者にもわかるPICマイコン活用法&電子工作の基本 | ..... | http://t4053x.jp/index.htm |
ダウンロード < X.PICマイコン アセンブラ入門 > | ..... | http://t4053x.jp/download.htm |