イメージ

数字の書いた高速回転する円盤を女子社員さんが弓矢で射る
それにより、公正な?0~9の数字を抽選する、
宝くじの抽選会場で見かけるようなイメージ
それをPICマイコンでシミュレートする、おもちゃを作ってみる事に・・・
名前を「南波君」としました。
当局のKK時代のクラスメイトの名前ではありません。
何のために製作したのかって? 野暮な事は聞かないで下さい・・・ (^_^;)

構想

①円盤が回転し始めたら安定した回転を行う
 つまり、抽選カウンタ動作時は1つの抽選数字の存在時間を公平にする
②矢を発射する行為は人間が行う
 つまり、抽選カウンタとプッシュスイッチの動作は別次元にする
③回転する数字の並びは各種用意する (^^♪
④一連の動作を簡単かつスムーズに繰り返し行えるようにする
⑤現在抽選値のみならず、直近の過去値もある程度表示する


ハードウエアについて

当初は7セグLEDにするつもりだったのですが、
プログラムのバージョンアップに対応するため、
16桁2行の液晶表示器にします。
携帯性も欲しかったので、電池駆動にするつもりでしたが、
それは実機バージョンで行う事に。
まずはACアダプタ駆動の基板状態での試作製作としています。
回路は簡単で、20ピンのPIC16F1828を使用します。
PORTCを使い、SC1602LCD表示器と接続
PORTBを使い、4ビットロータリーDIPスイッチ
PORTAでプッシュスイッチ、
と、至ってシンプルです。
LCDはパラレル接続で、4bitモードで通信します。
回転円盤および抽選についての考察

(1)回転速度について考察
  宝くじ公式ネットでの抽選実演をみると、回転円盤をモーターで回しています。
  見ただけでは詳細は不明ですが、秒速3~6回転と言った所でしょうか?
  10回転/秒は超えて無いと思われます。
  言い換えれば、抽選矢から見て、1つの数文字エリアは16ms~33ms程度の滞在時間(注1)と思われます。
  また、抽選矢の刺さる位置も移動(注2)している様で、そのメカニズムは全く不明です。(投げるのは人では無い)

(2)円盤上の数文字配列

 1)1の位の円盤

   0→1→2→3→4→5→6→7→8→9→元に戻る

 2)10の位の円盤

   0→3→6→9→2→5→8→1→4→7→元に戻る

 3)100の位の円盤

   9→8→7→6→5→4→3→2→1→0→元に戻る

 4)1000の位の円盤

   0→7→4→1→8→5→2→9→6→3→元に戻る

(3)PICでの抽選についての考察
  単純に考えて、1つの抽選用カウンタを回せば良い事になりますが・・・

 1)0~9までの抽選カウンタを高速回転させる
   これは実際に実験してみました。
   その結果、意外と抽選数字が偏るのです。
   つまり、抽選数字が結構高頻度でゾロ目が発生するのです。
   それも、7,7,7とか2~3連続同じ数字が選択される事がちょくちょくあります。
   たまに4連続ぞろ目も発生します。
   また、近い数字が発生し易いようです。
   つまり、6、7、5、8・・・とかです。
   バラけるときはバラけるのですが・・・

 2)TMR0によるインタバルタイマで抽選カウンタを低速回転させる
   (注1)を勘案し、実時間に近く、低速ながらも平等時間なカウントアップを行う事を想定しました
   これも実験してみました。
   その結果、(1)のような3~4連続ぞろ目はほぼ出なくなりました。
   しかし、2つのぞろ目は出ますが頻度はかなり低くなりました。
   近い数字の発生はありますが、すぐバラけます。
   こちらの方法の方が実際の抽選機の挙動に近いようです。

ソフトウエアについて

(1)抽選プログラム
   今の所、極めてシンプルな構成で、割り込み処理エリアに存在します。
   0~9までのローカルカウンタをTMR0による間欠割り込みで等時間および低速で回転させます。
   矢の代わりのプッシュSWを人間が押したときに、外部割り込みを掛け、ローカルカウント値を取得
   そのカウント値に対応する、該当桁抽選値をデータ配列から取得します。
   抽選は各桁それぞれ単独で行います。

(2)LCD表示
   1行目はメッセージエリアとしました。
   何気ない所なのですが、意外とここが悩むポイントでした・・・
   2行目は抽選数値表示エリアとしました。
   抽選値は、最右側に表示され、抽選の度に1文字づつ左へスクロールしていきます。
   最左側の文字はスクロール時に破棄されます。
   単純な動作なのですが、左スクロールの方が見易いです。
   表示文字バッファは面倒なので用意せず、LCD側のVRAMを読み書きしながら、スクロールさせています。
   VRAMも少なく、表示スピードも要求しないので、こんなもんでも大丈夫そうです。

SC1602低レベル制御アッセンブラ サブルーチン(2017年11月版)
  下記の3つしかありません・・・

  SEND4C
   Wregにコマンドバイトを入れて呼び出します
   LCDコマンドを4bitモードで送信します

  SEND4D
   LCDデータバイトを4bitモードで送信します。
   WregにLCDデータを入れて呼び出します

  RECV4D
   Wregに指定のVRAMアドレスのデータを4bitモードで読み込みます
   事前にLCD側VRAMアドレスを指定しておく必要があります

SC1602基本制御アッセンブラ サブルーチン(2017年11月版)

  補足事項
   ここで言う、VRAMアドレスとはマニュアルで言うDDRAMアドレスの事なのですが指定数値が違います。
   VRAMアドレスはDDRAM+命令ビットで、ここでの事実上のアドレス指定数値です。
   1行目と2行目はVRAMアドレスが連続していません。
   LCD1行目左からVRAMアドレスは
    80H 81H、~、8EH 8FH
   LCD2行目からは
    C0H C1H、~、CEH CFH
   以上をVRAMアドレスとして指定します

  PUTW
   Wregの文字コードをLCDに1つ表示させます
   事前にDSP_ADR(8bit変数)にLCD側VRAMアドレスを入れておきます

  GETW
   WregにLCDのVRAMデータ(文字コード)を1バイト読み込みます
   事前にDSP_ADR(8bit変数)に読み込むLCD側VRAMアドレスを入れておきます

  PUTL1
   指定の文字列を1行目に表示します
   表示開始位置は指定できず、最左側から表示し始めます。
   文字列の先頭アドレスは、MSAD0、MSAD1の16bitで指定します。
   文字列データはプログラムメモリのどこに配置しても大丈夫です。
   ただし、リセットベクタ、インタラプトベクタはだめです。
   文字列のエンドコードは00Hです。
   最大16文字表示できます。

  PUTL2
   指定の文字列を2行目に表示します
   表示開始位置は指定できず、最左側から表示し始めます。
   文字列の先頭アドレスは、MSAD0、MSAD1の16bitで指定します。
   文字列データはプログラムメモリのどこに配置しても大丈夫です。
   ただし、リセットベクタ、インタラプトベクタはだめです。
   文字列のエンドコードは00Hです。
   最大16文字表示できます。

  PUTL
   指定の文字列を指定の位置からLCDに表示します
   表示開始位置(VRAMアドレス、DSP_ADR)を指定します。
   文字列の先頭アドレスは、MSAD0、MSAD1の16bitで指定し、エンドコードは00Hです。
   最大32文字表示できますが2行に跨ります。

  L1BSL
   Wregの文字データを1行目最右側に表示する。
   既存の表示データは1文字左スクロールされる。
   最左側の表示データは破棄される

  L2BSL
   Wregの文字データを2行目最右側に表示する。
   既存の表示データは1文字左スクロールされる。
   最左側の表示データは破棄される

  L21BSL
   Wregの文字データを2行目最右側に表示する。
   既存の表示データは1文字左スクロールされる。
   2行目最左側の表示データは1行目最右側にスクロールされ、そのまま1行目指定位置までスクロールされる。
   1行目指定最左側の表示データは破棄される
   1行目最左側の位置は「BSLSP」にそのVRAMアドレスを指定できます。

  BLINK_ON
   Wregで指定したVRAMアドレスの文字をブリンクさせます
   カーソルは表示しません。
   また、複数の文字のブリンクはできません。(ハードウエアの仕様)

  BLINK_OFF
   ブリンクを解除します。
   呼び出すだけでOKで、引値はありません。

  CLRLCD
   画面全クリア

  CLRCLD1
   1行目クリア

  CLRLCD2
   2行目クリア

  INIT4_LCD
   4bitモードでイニシャライズを行います
   2行表示、5×8ドットを指定します
   呼び出すだけでOKです。
本機の使用方法 (2017年12月版用に変更しました)

MODE0  待機状態
        このままでは何もしません、ローターリースイッチを回して目的の動作モードに移動します

MODE1  NUMBERS3の擬似抽選
        ボタンを押すとまず100の位の抽選結果の数字1文字がLCD2行目最右側に表示されます
        再度押すと10の位の抽選結果の数字1文字がLCD2行目最右側に表示されます
        100の位の抽選数字は左にスクロールします。
        次に1の位と計3回スイッチを押して3桁分の数値が抽選されます。
        さらにボタンを押すと、再度3桁分の連続抽選が始まります。

MODE2  NUMBERS4の擬似抽選
        ボタンを押すとまず1000の位の抽選結果の数字1文字がLCD2行目最右側に表示されます
        再度押すと100の位の抽選結果の数字1文字がLCD2行目最右側に表示されます
        1000の位の抽選数字は左にスクロールします。
        次に10の位、そして1の位と計4回スイッチを押して4桁分の数値が抽選されます。
        さらにボタンを押すと、再度4桁分の連続抽選が始まります。

MODE3  LOTO5(MiniLOTO)の擬似抽選
        ボタンを押すと1~31の2桁の数値を発生します。
        5回スイッチを押す事で、5つの数値を発生し、それで1抽選が終了です。
        1抽選の5数値の内、一度選択された数値はパスされ、同数字の重複発生はしません。

MODE4  LOTO6の擬似抽選
        ボタンを押すと1~43の2桁の数値を発生します。
        6回スイッチを押す事で、6つの数値を発生し、それで1抽選が終了です。
        1抽選の6数値の内、一度選択された数値はパスされ、同数字の重複発生はしません。

MODE5  LOTO7の擬似抽選
        ボタンを押すと1~37の2桁の数値を発生します。
        7回スイッチを押す事で、7つの数値を発生し、それで1抽選が終了です。
        1抽選の7数値の内、一度選択された数値はパスされ、同数字の重複発生はしません。

MODE6  NUMBERS 1の位の擬似抽選
        ボタンを押すと抽選結果の数字1文字がLCD2行目最右側に表示されます
        再度押すと再抽選され、以前の抽選数字は左にスクロールします。
        発生数値の波の研究用

MODE7  NUMBERS 10の位の擬似抽選
        ボタンを押すと抽選結果の数字1文字がLCD2行目最右側に表示されます
        再度押すと再抽選され、以前の抽選数字は左にスクロールします。
        発生数値の波の研究用

MODE8  NUMBERS 100の位の擬似抽選
        ボタンを押すと抽選結果の数字1文字がLCD2行目最右側に表示されます
        再度押すと再抽選され、以前の抽選数字は左にスクロールします。
        発生数値の波の研究用

MODE9  NUMBERS 1000の位の擬似抽選
        ボタンを押すと抽選結果の数字1文字がLCD2行目最右側に表示されます
        再度押すと再抽選され、以前の抽選数字は左にスクロールします。
        発生数値の波の研究用

MODE10~15 現在は何も設定されていません
感想

この手のシミュレータはPC版がネットに存在しますが、ソースファイルは公開されていません。
結局は、そのシミュレータに対して、自分が納得できる事が肝心だと思います。
もちろん本機はソースファイル公開してますので、使用者がとりあえず納得できるよう変更して使うべきです。

さて・・・使用してみた感触ですが、操作性は適当だった割にまあまあの操作感です。
今回使用したタクトスイッチは安価なせいか、チャタリングが派手で、行と帰りの往復で発生します。
長いウエイトで何とか隠していますが、超ゆっくりなプッシュ操作ではチャタリングによる誤動作が発生します。
当然予想はしていましたが、実機製作では、この部分は信頼性のあるプッシュスイッチにすべきと思いました。
肝心の抽選表示ですが、応用方法やその結果については、しばらく使用してのご報告とします。
今後、過去結果と比較して、どこまで波が近づけるか、遊び半分で研究してみたいと思います。

追加機能のロト抽選ですが、結果を出して考察する事がそう簡単にできません・・・
「おまけ」或いは「マイ・クイックピック」程度と考えて下さい。
PIC16F1828プログラム
アッセンブラで記述

 南波君 Ver1

 NUMBERS_SIM01B.asm

 NUMBERS_SIM01B.hex

PIC16F1828プログラム
アッセンブラで記述

 南波君 Ver2.0

 NUMBERS_SIM02.asm

 NUMBERS_SIM02.hex
2017年12月追記

LOTO擬似抽選機能を付加しました。
その他バグ修正、小変更等行いました。
モードSWの配列も変更しました
結局、「My QuickPick」と言った感じになってしまいました・・・
現在の所、ハードウエアの変更はありません。
改変プログラム本体はBANK0に収まりきれなくなった・・・
それ故、効率化もしましたので、バージョンを上げました。
戻る  実験・製作の記録TOPへ戻る