パチスロ(実機)データ収集プログラムの改良

記事内に広告を含みます

まとめ記事のご案内 [2024.11.20]

こちらの記事に前編と後編の記事内容をまとめましたので、こちらをおすすめします。

前回の投稿記事で、パチスロの実機に接続したArduinoからPCへ実機データを送信するプログラムを作りました。

前回作ったArduinoのプログラムはIN信号が来れば現在の入力枚数を、OUT信号が来れば現在の出力枚数を文字列として送信するといったものでした。

しかし、データカウンターアプリにデータを送信するなら、入出力枚数やボーナス回数といった情報を一括送信した方が良さそうです

他にも色々変更を加えて、このプログラムをブラッシュアップしたいと思います。

変更点

現在ゲーム数と累計ゲーム数のカウント機能実装

パチスロ実機のデータ送信基板のIN信号からは、以下のようなパルスが入力されます。

3枚掛けの機種だと1回のレバーオンで3枚減るので、Lowへの立下りが3回発生します。

レバーオン時には必ずこのような波形になるので、最初のLowだけをカウントして残り2回を無視すればゲーム数を数えることができそうです

IN信号の入力波形

以下がIN信号の割込み発生時のアクティビティ図です。

基本は何もしないのですが、IN信号がLowになると割り込みが発生します。

このときに、前回の処理からTIN時間経過していれば入力枚数を更新し前回の処理からTGAME時間経過していればゲーム数を更新します

入力枚数とゲーム数をカウントする処理のアクティビティ図
Pachislot_DataCollector.ino解説

割り込み発生時のコールバック関数

Interrupt.cppで割り込みが発生したときにPachislot_DataCollector.ino側で処理を行いたいため、コールバック関数のポインタ配列を宣言します

setup()

Intr_Init()の引数にコールバック関数のポインタ配列を渡します。

Interrupt.cpp解説

allow_interrupt()

前回の割り込み発生時間からINTR_WAIT[ms]経過していたらtrue(未経過ならfalse)にする。

in_intr_occur()

前回のIN信号割り込み処理からINTR_WAIT[ms]経過していたらm_Func[1](つまりupdate_in())を呼び出す。

また、前回のIN信号割り込み処理からGAME_WAIT[ms]経過していたらm_Func[0](つまりupdate_game())を呼び出す。

ボーナス中フラグの追加

パチンコホールにあるデータカウンターは、ボーナス(ビッグおよびレギュラー)が始まると、ゲーム数は加算が止まりボーナス回数が増えます。

これを実現するために、内部に『ボーナス中』という状態を設け、ボーナス中になったらゲーム数のカウントを止めてボーナス回数を増やします。

一方、通常状態に戻ったらゲーム数をリセットして累計ゲーム数のカウントを再開します。

なお、『通常』⇒『ボーナス中』の状態遷移はBBおよびRB信号の立ち下がり(High⇒Low)、『ボーナス中』⇒『通常』の状態遷移はと立ち上がり(Low⇒High)で行います。

立ち下がり時の処理
  • 現在ゲーム数と累計ゲーム数のカウントを止める
  • ビッグ、レギュラーのボーナス回数を+1する
立ち上がり時の処理
  • 現在のゲーム数を0にリセットする
  • 累計ゲーム数のカウントを再開する

シリアル通信ボーレートの変更

PCへはボーレート9600bit/sのシリアル通信でデータを送信していましたが、正常に通信ができる範囲でもう少し速くしたいと思います。

今回は115200bit/sまでボーレートを上げます。

送信データのJSON化

今回のプログラムは、入出力枚数はもちろんのこと、ボーナス回数、ゲーム数、ボーナス中フラグなどをまとめて送信します。

そのため、送信するデータはJSON形式で作成します。

データ内容は以下のようになります。

JSONキーの意味
キー意味使い方
game現在のゲーム数データカウンター上に表示する
totalgame累計ゲーム数データカウンター上に表示する
in入力枚数データカウンター上に表示する
out出力枚数データカウンター上に表示する
diff差枚数スランプグラフとして表示する
rbレギュラーボーナス回数データカウンター上に表示する
bbビッグボーナス回数データカウンター上に表示する
duringrbレギュラーボーナス中フラグゲーム数加算の停止やゲーム数のゼロリセットを行う
duringbbビッグボーナス中フラグゲーム数加算の停止やゲーム数のゼロリセットを行う

ビッグボーナス中のRB信号無効化

ビッグボーナス中はBB信号がLowになるのですが、このときRB信号も同じようにLowになります。

そして、何枚かメダルが払い出されると、RB信号が一瞬Highになってしまいます

データ送信基板の仕様なのかわかりませんが、これではRB回数がカウントされてしまいます(下記動画参照)。

なお、上から3つ目のLEDがRB信号です。

なので、ビッグボーナス中はRB信号の入力を受け付けないように改良したいと思います

割り込み発生時の処理と割り込み制御の分離

各モジュールの責務を明確化します。

モジュールの責務
モジュール名概要責務
Pachislot_DataCollector.inoArduinoのスケッチで最初に実行されるモジュール(ファイル)モジュール間のデータ授受や呼び出しを制御する基幹コントローラー
Interrupt.cpp割り込み関係モジュール(ファイル)割り込みの発生方法などの設定を行うモジュール
Port.cppポート関係モジュール(ファイル)ポートの設定を行うモジュール
Serial_Com.cppシリアル通信モジュール(ファイル)シリアル通信の設定や送受信データを変換するモジュール
DataManager.cppデータ管理モジュール(ファイル)内部で持つデータを管理するモジュール

特に着目すべきは、割り込み発生時の処理をInterrupt.cppではなくPachislot_DataCollector.inoで行うという点です。

Interrupt.cppはあくまで割り込みを発生させる役割であって、その後の処理はPachislot_DataCollector.inoで請け負います。

そのため、Interrupt.cppで割り込みが発生したらPachislot_DataCollector.inoの関数を呼んでもらうよう『コールバック関数のポインタ配列』を渡します。

これにより、Interrupt.cppで割り込みが発生すると、コールバックによりPachislot_DataCollector.inoの関数が呼び出され、そこで割り込み発生後の処理を行うことができます(下図参照)。

Pachislot_DataCollector.inoへのコールバック

ソースコード

今回作成したプログラムは以下のGitHubからフルでダウンロードできます。

動作確認

それでは、プログラムの動作確認を行います。