【Arduino】パチスロ実機データの収集機の開発(記事まとめ)

記事内に広告を含みます

以前投稿した以下の記事のまとめ記事を作成しました。

完成品がこちら

完成したパチスロ実機データの収集機がこちらです。

このような、実機のゲームデータを保持しつつ、データが更新される度にPCへデータを送信する機器を開発します。

金欠ぱとろん
金欠ぱとろん

そんなに難しい仕組みじゃないのできっと理解できますよ

データ収集機の仕組み

データ収集機の仕組みを説明します。

構成図

一般的なデータカウンターの構成
データ収集機の構成

一般的なデータカウンターは、専用のハーネスを介して実機の中にある『データ出力用の基板』と接続されています。

一方、本記事ではPCとデータ収集機(Arduino)とを繋ぎ、データ収集機からデータ出力用基板に接続することにします。

使用実機・ユニットは以下の通りです。

実機パチスロ 新世紀エヴァンゲリオン 〜まごころを、君に〜
ArduinoArduino Nano Every
PCWindows11 64bit
ソフトウェア開発環境Visual Studio Code

データ出力用基板とデータ収集機の接続

データ出力用基板の内部回路は単純な電磁リレー回路になっていて、例えばメダルが1枚入力されるとINとGNDを繋ぐ電磁リレーが1度「カチッ」とON状態になり、すぐにOFF状態に戻ります

ON状態の継続は、だいたい50msくらいです。

データ出力用基板とデータ収集機の接続(INのみ抜粋)
接続した状態

このデータ出力用基板とデータ収集機の接続にプルアップ回路を追加します。

これで、電磁リレーがONするとArduinoへの入力は0Vに、電磁リレーがOFFするとArduinoへの入力は5Vになります。これによって、電磁リレーのON/OFF状態をArduinoへ伝えることができます。

データ出力用基板のピン配置

ちなみに、こちらがデータ出力用基板のピン配置です。

名前は勝手に付けたものなのでご了承ください。

INメダルの入力
OUTメダルの払い出し
RBレギュラーボーナス発生フラグ
BBビッグボーナス発生フラグ
GNDグラウンド(=0V)

これに対するArduino側とのピン対応は下表のようにしています。

データ出力用基板ピンNo.データ収集機ピンNo.
IN1D624
OUT2D523
RB3D422
BB4D321

データ収集機への入力信号の解析

データ収集機には、電磁リレーのON/OFFによって矩形波が入力されます。例えば、3枚掛けの機種であればレバーオンとともにINのリレーが「カチッ、カチッ、カチッ」と3回ONします。

INからの入力信号の場合は、1回の立ち下がりエッジが『1枚減った』ことを意味しており、これがOUTからの入力信号ならば『1枚増えた』ことを、RBやBBからの入力信号ならば『ボーナス中である』ことを意味します。

また、INの入力信号については、最初の立ち下がりだけをカウントするとゲーム数をカウントすることができます

さらに、ボーナスフラグのBBとRBについては、ボーナス図柄を揃えたら立ち下がり↓、ボーナスが終了したら戻ります↑

注意点 ビッグボーナス中のRBのスイッチ動作

本機は、ビッグボーナス中にBB(上から3番目)がONになるとともに、RB(上から4番目)もONになります。

そして、一定枚数が払い出されるとRBが一瞬OFFに戻ります(動画参照)。

どうやらデータ出力用基板の仕様のようなのですが、「ビッグボーナス中はRBの入力信号を無視する」などの対策が必要になりそうです。

注意点 チャタリング対策

IN、OUT、RB、BBのチャタリング無視時間

データ出力用基板に載っている電磁リレーは機械式接点ですので、当然チャタリングが発生します。

例えば、レバーオン時のD6(IN)の波形は図のように半周期50 msの矩形波になっています。

見た目には普通に見えますが、拡大するとかなりチャタリングしていることがわかります。チャタリングが続く時間は350 us(=0.35 ms)くらいなのですが、立ち下がり↓の時だけでなく戻り↑の時にもチャタリングは発生しますので、こちらも無視する必要があります。

そのため、立ち下がり↓が発生したら、次の立ち下がり↓が発生する直前まで無視したいところです。

したがって、チャタリングを無視する時間は80 msとします。

ゲーム数のチャタリング無視時間

レバーオン時のINの入力信号の最初の立ち下がり↓の後、次のレバーオンまで割り込みを無視できれば、ゲーム数をカウントすることができます。

INの入力信号3回立ち下がり↓が落ち着くのが、約250 ms経過後なので2倍程度のマージンを持たせて500 msとします。

管理データ

データ名意味算出方法
game現在のゲーム数レバーオン時のINの3つの立ち下がり↓パルスのうち、最初だけカウント
totalgame累計ゲーム数gameと同様
in入力枚数レバーオン時に発生するINの立ち下がり↓をカウント
out出力枚数レバーオン時に発生するOUTの立ち下がり↓をカウント
diff差枚数出力枚数ー入力枚数
rbレギュラーボーナス回数RBの立ち下がり↓でレギュラーボーナス回数をカウント
bbビッグボーナス回数BBの立ち下がり↓でビッグボーナス回数をカウント
duringrbレギュラーボーナス中フラグRBの立ち下がり↓でtrueにし、立ち上がり↑でfalse
duringbbビッグボーナス中フラグBBの立ち下がり↓でtrueにし、立ち上がり↑でfalse

PCへのデータ転送

通信ボーレート

データ収集機ーPC間の通信ボーレートは『115200 bit/s』とします。

データ形式

転送するデータは、JSON形式のデータにして転送します。

なお、ArduinoからのJSON形式のデータ転送についてはこちらをご参照ください。

データ転送タイミング

PCには最新の情報を表示してほしいので、データ収集機からPCへのデータ転送のタイミングは、『内部データが更新されたとき』とします。

データ収集機への入力信号の変化を外部割込みに設定しておき、いざ割り込みが発生した際に割り込み処理で内部データを更新した後、PCへデータを転送します

ソースコード

データ収集機のプログラムを作成したので、プログラムの解説をしていきます。なお、Visual Studio CodeでのArduino開発環境の構築の仕方については、こちらの記事をご参照ください。

ソースコードの全体構成

ファイル名概要詳細
Pachislot_DataCollector.inoArduinoスケッチデータ収集機(Arduino)のメインとなるスケッチファイルです。
他のモジュールを操作するコントローラとしての役割を担っています。
Interrupt.cpp割込み関連モジュールデータ収集機(Arduino)への入力信号(INやOUTなど)を検知して割込み処理を発生させる役割を担っています。
ただし、割込み後の処理はコントローラに任せます。
Port.cppポート関連モジュールデータ収集機(Arduino)への入力信号のポート設定を行います。
Serial_Com.cppシリアル通信関連モジュールPCとのシリアル通信のボーレート設定やJSON形式データのエンコード処理を行います。
DataManager.cppデータ管理関連モジュールデータ収集機(Arduino)内で保持しておくデータを一括管理します。
注意点

Arduinoのメインファイルは「.ino」という拡張子のファイルになっています。それ以外にC言語のソースファイルを追加したい場合は「.cpp」ファイルにする必要があります。「.c」だとうまくコンパイルが通らないのでご注意ください。

ソースコード

Pachislot_DataCollector.ino

Interrupt.cpp

Port.cpp

Serial_Comm.cpp

DataManager.cpp

ソースコードはこちらに置いています。

ショート動画でも紹介しています

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です