この記事でわかること
・電子サイコロ回路の構成
・7セグメントLEDを用いたルーレット動作
・スイッチ入力のチャタリング防止プログラム
PICマイコンを用いた電子サイコロ回路と、その制御を行うプログラムについて解説します。
これは、7セグメントLEDを8の字ダンス状に点灯(ルーレット表示)させ、
スイッチでストップさせた時の値(1~6)をサイコロ状に配置したLEDによって、
サイコロ目の数で表示させるものです。
本記事で使用する新居浜高専PICマイコン学習キットについては下記記事で解説しています。
キットの回路図やプログラムはキットを販売している秋月電子のHPからダウンロードできます。
秋月電子 新居浜高専PICマイコン学習キットVer.3 ACアダプタ付
また、参考書も販売されています。
※本記事はPICマイコン学習方法の一例を紹介するものであり、
ここで紹介するキットやソフトの動作を保証するものではありません。
キット等の購入については自己責任でお願いします。
(不明点等の質問にはお答えできません)
<本ソフトの利用環境と設定について>
本記事におけるMPLABの開発環境は以下の通りです。
・MPLAB X IDE v.15
・XC8 v2.46
・Device Family Pack PIC16F1xxxx_DFP(1.24.387)
※ダウンロードしたプロジェクトファイル(NNCTkit_v3.X)は、
そのままビルドするとエラーになるため、以下の変更を実施しました。
・helpstr.h 9行目
変更前:const __section(“title”) unsigned char title[224]={
変更後:const __section(“help_title“) unsigned char help_title[224]={
セクション名がtitleだとエラーになるので、別の名前にします。
ここではhelp_titleにしましたが、何でも良いです。
この時、配列名はtitleのままでも問題ありませんが、
他のデータ同様、配列名をセクション名と同じにする場合は、
この配列を使用しているソースファイルの方も直します。
・monitor.c 2093行目
変更前:TX1REG = title[i];
変更後:TX1REG = help_title[i];
MPLABの使い方については下記で解説しています。
電子サイコロ回路
タクトスイッチ(SW1)がデジタル入力(RB0)に、
デジタル出力(RC0~RC7)は、7セグメントLED(D100,D101)の各セグメント及び、
サイコロ目LED(D3,D12~D17)に接続されています。
(以下、7セグメントLEDを7セグLEDと表記)
どのLEDを点灯させるかは、デジタル出力(RA3~RA5)がデコーダ(IC2)に入力され、
Y0~Y6のうちどれか1つだけL出力することで、
PNPトランジスタがONし、LEDに電源供給されることで指定されます。
この回路では、7セグLED(D100、D101)をルーレットとして使用し、
SW1を押すと、ルーレットがストップ(消灯)し、SW1を離すと、
ストップさせた時の値(1~6)をサイコロ目LED(D3、D12~D17)に表示します。
そして、SW1を再度押すとルーレットが再スタートします。
本回路におけるベース抵抗などの回路定数の設定については、下記記事で解説しています。
スイッチ入力は、10kΩでプルアップすることで、
スイッチOFFでHレベル、ONでLレベルが入力されます。
プルアップ抵抗の決め方については下記記事で解説しています。
PICマイコンの初期設定
プログラムでは、PICマイコンの初期設定として、
コンフィグレーション設定(※1)によるクロックの動作モード設定を行います。
※1:クロックなどの動作環境設定
プログラムコードの詳細は、ソースファイル(nnct_kit_v3.c)を参照下さい。
コンフィグレーション設定は以下の通りです。
#pragma config FEXTOSC = HS
外部発振器モード選択:HS(水晶振動子 4MHz以上)
#pragma config RSTOSC = EXT4X
発振器の動作モード:PLL(※2)の4逓倍回路を使用
※2:Phase Locked Loop(位相同期ループ):クロック周波数を増加させる回路
PIC16F18857ではPLLにより、外部からのクロック信号の周波数を4倍に増やすことができ、
本キットでは、8MHzの水晶振動子から32MHzのシステムクロック周波数Foscを生成してます。
コンフィグレーション設定については、下記記事で解説しています。
電子サイコロ プログラム
プログラムが動作すると、ルーレット表示が開始され、
7セグLED(D100、D101)は図の様に8の字ダンス状に点灯します。
ルーレットの回転速度は、待機関数L_wait( )で調整できます。
本記事では、待機関数の引数を10から16に変更することで、
ルーレットの回転速度を遅くしています。
これは、元のプログラムが、学習キットVer.2時の搭載マイコンである
PIC16F886(動作周波数20MHz)時に設計されたものであることから、
Ver.3のPIC16F18857(動作周波数32MHz)だと、
L_wait関数内のforループの処理速度が早くなり、待機時間が短くなるためです。
ルーレットの点灯順序は、24段階(1~24)ありますが、
これが6パターン(①~⑥)に割り振られており、
スイッチを押した時のパターンに従って、制御フラグiが1~6にセットされます。
制御フラグiが0以外になると、ルーレット制御のwhileループから抜けて、
LEDは全消灯し、スイッチを離すまで待機します。
スイッチを離すと、制御フラグiの値(1~6)に応じて、
サイコロ目LED(D3、D12~D17)を点灯(サイコロ目表示)させ、
スイッチを再び押すとルーレットが再スタートします。
電子サイコロの動作波形
ルーレット動作時にSW1を押して、サイコロ目が点灯した時の波形です。
SW1をON(RB0=L)にすると、7セグLEDが消灯(Y0、Y3=H)し、
その後、SW1をOFF(RB0=H)にすると、サイコロLEDが点灯(Y4=L)しています。
ルーレット動作波形を見ると、各7セグLEDの点灯(Lレベル)が6回行われています。
ここで、Y0(7セグ4桁目)の波形にある①~⑥は、
先程のLED点灯順序や、プログラムコードの①~⑥の部分に相当します。
各信号のL期間は約8msですが、これは長時間待機関数L_wait(16)による待機処理によるものです。
for文によるループ処理なので、正確な時間ではありませんが、
実測したところ、待機関数 wait(1)=1.96us となっており、
L_wait(1)=wait(255) ≒500us
L_wait(16)=16×500us=8ms
となります。
次に、スイッチ入力波形ですが、
ON(Lレベル)直後に短期間だけOFF(Hレベル)に戻るチャタリングが発生する場合があり、
これによってスイッチがOFFされたと誤検知してしまう恐れがあります。
この回路の場合、チャタリングの発生期間は数十us程度であることから、
ソフトでは、SWがON(Lレベル)検出後、長時間待機関数L_wait(16)で8ms待機することで、
チャタリングの発生が収まってから、SW入力を確認するようにしています。