生活

Arduinoのピンボールマシンを構築する方法:15ステップ(写真付き)

目次:

Anonim

あなたが私のことを気に入っているなら、あなたはピンボールが大好きですが、買うお金やフルサイズのゲームに合うスペースを持っていません。それでは、なぜあなた自身のものを作りませんか?

ここでは、Arduinoを搭載した独自のカスタムピンボールゲームを作成する方法について説明します。ゲームにはライト、サウンド、バンパー、ドロップターゲット、スリングショットを含む本物のピンボールパーツがあり、さらにランプを持っています。

このプロジェクトには非常に多くの種類の材料が必要なので、各ステップを完了するために必要な新しい材料については、後続の各セクションを参照してください。まず最初に、レーザーカッターやCNCルーター、そして基本的な電子機器やハードウェアのツールキットにアクセスできればとても便利です。

作者注:この説明書はごく最近発行されたものであり、すべての設計ファイルおよびソフトウェアファイルが完全に整理されているわけではありません。私たちのファイルを使用することを計画している場合は、すべてが最新の状態になっていることを確認できるようにコメントを残してください。

用品:

ステップ1:デザイン

上の写真は、プレイフィールドとそれを支えるアセンブリのSolidworks設計です。プレイフィールドは純粋にカスタムですが、ショットライン(バックループショットのカーブなど)はスムーズなプレーを確実にするために本物のピンボールマシンに基づいて設計されました。ここでの1つの難点は、その複雑さのために、実際のピンボール部品(バンパーやドロップターゲットなど)はモデル化されていませんでしたが、すべてがプレイフィールドの下に収まるように注意する必要があるということです。上より下の下。

ファイルはリポジトリに含まれているので、あなたのデザインに合わせて自由にデザインを調整してください。

デザインのいくつかのハイライト:

プレイフィールドは42インチx 20.25インチで、1980年代のBallyスタイルのゲームのサイズとまったく同じです。それは標準であり、ピンボール部品アセンブリがこの厚さのために設計されているので変更されるべきではない1/2インチ合板でできています。ここでの壁は、1/4インチの層の上にある1/2インチの層で構成されています。最初のプロトタイプでは、1/2インチの壁しか含まれていませんでしたが、これは短すぎるため、特にしっかりしたショットではピンボールが空中に飛び出す可能性がありました。第二に、このデザインはボールがプレイフィールドにわずかに落ちることを可能にしますが、戻って落ちないようにするわずかに上げられたシューターライン(上の写真)を可能にします。

傾斜路は明確なアクリルおよび3d印刷されたサポートと設計されている。それはプレイフィールドを横切るので、それはプレーヤーに左フリッパーから連続してランプを複数回押す機会を与える。そのため、プレーヤーのテーブルの視界を遮らないように、透明アクリルが使用されています。

最後に、競技場は4つのコーナーで短い壁によって支えられ、競技場を標準的な6.5度の傾斜に保ちます。後壁には取り外し可能な底部の「棚」があり、電子機器の取り付けに使用されます。これはフルサイズのプレイフィールドを持つゲームになりますが、一般的なゲームよりもはるかにコンパクトで、一人の人間が手で持ち運ぶことができます。ただし、プレイフィールドは標準サイズなので、プレイフィールドを標準のピンボールキャビネットに入れたい場合は、これらのサポートを削除することができます。そうするためには、この設計には含まれていないボールリターンアセンブリの追加を検討する必要があります。

ステップ2:木を切る

プレイフィールドのレイヤーをカットするために、我々はレーザーカッターを使いました。しかし、1/2インチの合板をカットするのに十分強力なレーザーカッターは見つけるのが難しく、高品質の合板を必要とし、注意しなければ発火する危険性があります。典型的なプレイフィールドは、CNCルーターを使用してカットされます - コーナーのいくつかはそれほど鮮明ではないかもしれませんが、それでもまともな結果を達成する必要があります。簡単にするために、以下のステップはあなたが私たちがしたのと同じレーザーカッターにアクセスできると仮定します。ドリルとジグソーパズルだけを使ってきちんとした結果を得た人たちもいますが、この道を進むならあなたは非常に注意深くそして忍耐強くなければなりません。

プレイフィールドを作成する最初のステップは、デザインをレーザーカッターに送ることができる.DXFファイルに変換することです。たとえば、プレイフィールドの.DXFファイルは以下のようになります。このプロジェクトで使用されているファイルは私たちのリポジトリに含まれています。

レーザーカッターを使用して、プレイフィールド、1/4インチの中間層(duron、安価な木材のような試作材料を使用しましたが、1/4インチの合板も使用できます)、1/2 "の上層、および1/2"の形状を切り取りました。サポートしています。

必要な材料:

  • 競技場および基盤のための½」合板
  • 中間壁層用の¼インチ合板またはデュロン
  • ½”、¾”、および1”木ネジ
  • CNCルーターまたはレーザーカッターへのアクセス

ステップ3:プレイフィールドを組み立てる

それぞれの場所で合板に¼インチデュロン層からピースを締め付けることから始めます。ハンドドリルを使用する場合は、最初に3/32インチのビットを使用してパイロット穴を開け、次に平頭の3/4インチの木ねじを使用して1/4インチのレイヤーをプレイフィールドに取り付けます。 1/4インチ部分は小さくて細いので、反対方向に穴を開けるとベース層から離れて曲がるため、ネジは最初に1/4インチ層を通り、次に1/2インチベースに入ります。ネジの頭が1/4インチの層とぴったり重なるようにし、それ以上厚さを増やさないようにすることも重要です。

最後の注意点:これらのネジは、プレイフィールドが組み立てられるとプレイヤーにはほとんど見えなくなるため、ほとんどどこにでも配置できます。ただし例外があります。シューターレーンにネジを入れないでください。 (私たちは最初にこの間違いをしました)。

次に、側壁を取り付けて、一番長い木のネジを使ってボードの上からそれらに穴を開けます。これもネジの頭が上と平らになるようにします。それが終わったら、デュロンの上に½”の層片を固定して、今度は1”のネジを使って下からねじ込む以外は前と同じようにそれらをねじ込んでください。底から曲げて底からねじ込むと、ねじがプレーヤーから見えなくなります。

最後に、ブロックが簡単にねじれないように2本のネジを使用して底面からねじ込むことで、シューターブロック(上の写真、シューター付き)を取り付けます。シューターブロックには、反対側のナットを締めることで取り付けることができる、シューターに合う "U"字型のスロットがあります。シューティングロッドとボールの間の摩擦を減らすために、潤滑剤を使用しなければならない場合もあります。

この時点でデザインの調整が必要になる場合があります。たとえば、私たちのデザインでは、ドロップターゲットのカットが狭すぎるため、dremelを使用して拡大する必要がありました。私たちのファイルを参考用として使用する場合は、更新されたファイルを提供できる可能性がある作者に連絡してください。 2つの木の部分が出会うところで、どんな荒れた地域でも砂をかけるのも良い考えです。

ほとんどの場合、これで木工作業は終了です。コンポーネントの配置に移ることができます。

必要な材料:

  • 3/4 "皿頭木ネジ
  • シューターアセンブリ
  • 長い(〜1.5 ")木ネジ
  • 3/32 "ビット付きハンドドリル
  • 潤滑油
  • 1 "皿頭ネジ
  • ファイルやdremel、そしてサンドペーパー

ステップ4:コンポーネントを追加する

設計段階のこの時点までに、すべてのコンポーネントが実際にプレイフィールドの下に収まるようにするために必要な向きについての一般的な概念を理解しておく必要があります。 (私達の設計を使用している場合は、上の私達の表の下側の写真を参照してください)。

まず、1/2インチの木ねじをアセンブリの取り付け穴に通して、ドロップターゲット、スタンドアップターゲット、およびスリングショットアセンブリを取り付けます。ポップバンパーでも同じことをしますが、最初にキャップを外すか、アセンブリが穴に収まらないようにしてください。

次に、フリッパーアセンブリを取り付けます。それらが正しい方向に回転することを確認してください。ソレノイドは、発射されると、ピンをコイルに押し込みます。そしてこれは、フリッパーがプレイフィールドに向かって回転するようにシャフトを回転させるはずです。フリッパーアセンブリを取り付けたら、フリッパーコウモリを反対側から取り付けます。アセンブリのロックナットにレンチを使用して所定の位置に固定し、アセンブリに付属しているはずのバネを使用して、フリッパーが発射されていないときに確実に元に戻すようにします。

同様に、すべてのロールオーバースイッチを1/2 "ネジを使用して取り付け、上部から簡単に押し込み、所定の位置にはね返すことができるようにします。6-32ボルトを使用して、ゲートスイッチも左上に取り付けます。このゲートスイッチは一方向の開口部としても機能し、右側からの射撃と射手からの射撃をバンパーに落とすことができます。場所を変えて、遊びをより多様にします。

ライトを取り付けるには、まずプラスチック製のインサートを穴に入れます。これらのインサートは約1/4インチの厚さです。 CNCルーターを使用する場合、これらを取り付けるための適切な方法は、挿入穴よりわずかに大きい1/4インチの層を切ることです。私達の設計では、レーザーカッターは部分的な層を切ることができないので私達は挿入物を支えるブラケットを3D印刷しました。エポキシを使用してインサートを所定の位置に固定し(先にエッジを粗くします)、サンドペーパーを使用してインサートがプレイフィールドと同じ高さになるようにします。

次に、LEDを所定の位置に挿入してねじって、ブラケットをブラケットに挿入します。次に、これらのLEDが各インサートの真下にくるようにブラケットを所定の位置にねじ込みます。下にリンクされているライトブラケットはかなり細いです、そして実際には1/2 "ネジがテーブルの上を突き通すことができるほど十分に薄いです。これが起こらないように2つのワッシャーを使ってください。

プレイフィールドポストは6-32ボルトを使って取り付けます。取り付けたら、ゴム製キットのゴムを周囲に巻き付けてパッシブバンパーを作ります。デザインが完全に合板である場合よりも、これらはテーブルにはるかに多くの「命」を与えます。同じボルトを使用して、フリッパーの真上にレーンガイドを取り付けます。また、ゲーム終了スイッチを所定の位置に接着します。

ほとんどのゲームには、ここにあるような専用のボールリターンアセンブリがあります。ただし、これはこの設計には含まれていませんでしたが、主にコストのためです。もちろん、トレードオフは、プレーヤーがボールを排出した時点でそのボールをシューターレーンに戻す責任があるということです。しかし、私たちはシューターを持っています。

フリッパーボタンとスタートボタンは、それらを穴の中に入れて、手のひらで固定することによって取り付けられます。フリッパーボタンのリーフスイッチは6-32ボルトでボタンの内側にボルトで固定されており、ボタンを押すとスイッチ回路が閉じます。

この時点で、あなたのプレイフィールドは(上から)ほぼ完成したピンボールテーブルのようになるでしょう!足りないのはランプだけです。どれだけの配線やはんだ付けを行うべきかについて個人的に怖がっている間、それがどれほど素晴らしいかについてあなたの友人の間で自由に感じてください。

必要な資料(大部分はPinballLife.comから購入したもので、以下の用語を検索するだけで見つけることができます)。

  • 1 3バンクドロップターゲットアセンブリ
  • 3倍ポップバンパーアセンブリ
  • 1左フリッパーアセンブリ
  • 1右フリッパーアセンブリ
  • フリッパーコウモリ2個
  • 2つの足ひれボタン
  • フリッパーボタン2個
  • 1スタートボタン
  • ラバーリング1セット
  • 〜30のプレイフィールドスターポスト(1 1/16インチ使用)
  • 2車線ガイド
  • 2フリッパーボタンリーフスイッチ
  • 2つのパチンコアセンブリ
  • 1スタンドアップターゲット
  • 10個のロールオーバースイッチ
  • 8 LED#44バヨネット式ライト
  • バヨネット式ライトブラケット8個(ロングマウントブラケット付きミニチュアバヨネットベース2リードソケット)
  • 5 1-1 / 2 "x 13/16"青い矢印インサート
  • 3 1 "x 3/4"クリアブレットインサート
  • 6〜32本のボルト(2.5インチ、およびそれより小さいサイズもある)、ナット、およびワッシャー
  • 〜2 "ワイドゲートスイッチ(ここのもののように、これは見つけるのが難しいかもしれません、我々はebayで購入された古い壊れたピンボールランプから私たちを廃棄しました)

ステップ5:ランプを築く

ランプを作るには、ベースピースに¼”アクリル、側壁に1/8”アクリルを使用してください。透明なアクリルは、プレイヤーにとってプレイフィールドの視野を妨げない一方で、きれいできれいな外観を与えます。着色アクリルを使用することも見栄えの良いオプションかもしれませんが、それは木のような完全に不透明な材料を使用することはお勧めできません。

傾斜路のためのサポートはメーカーボットを使用して3D印刷され、同じ6-32ボルトを使用してプレイフィールドとプラスチックにボルトで固定されています。

ここでのアクリル片はアクリルセメントを使って接着されています。アクリルセメントは本質的にプラスチックを溶かして溶かす溶剤です。少量を使用するようにしてください。そうすることで、ほとんど目に見えないような非常に強い結合ができます。

ランプの入り口には、上の写真のようなランプフラップがあります。これは、ピンボールがプラスチックの厚さの「1/4」だけ「飛び上がる」必要があるのではなく、プレイフィールドからランプのプラスチックまで非常にスムーズに移行する薄い金属片です。あなたはピンボール専門店またはEbay(我々がした)からこれらのうちの1つを安く買うことができるか、単に板金からあなた自身の1つを作ることができます。市販のゲームでは、ボルトが突き出てボールの邪魔にならないように、これらはリベット止めされています。それを実行するための適切な機器がないため、同じ効果を得るために、必ず皿ネジを使用し、プラスチックと金属の穴を適切に面取りしてください。

ランプの正面右隅にある3Dサポートには、狭いゲートスイッチが付いています。このスイッチは、成功したランプショットがヒットしたときに記録するものです。

必要な材料:

  • 1/4 "クリアアクリル(12 x 24"シート)
  • 1/2 "透明アクリル(12 x 24"シート)
  • アクリルセメント
  • 3Dプリンターとレーザーカッターへのアクセス
  • ランプフラップ
  • ランプフラップ用のフラットヘッド6-32ボルト
  • チャンバードリルビットまたはハンドツール
  • ナローゲートスイッチ

ステップ6:エレクトロニクスブロックとピンレイアウトを計画する

(作者の更新:長時間使用すると、48Vでこの構成のいくつかのトランジスタを飛ばすことができます。これらの電子機器では35V以下を使用するか、ここにリストされているようなよりプロフェッショナルな制御ボードリソースを使用することをお勧めします。 .com / wiki / index.php /コンストラクション)

この機械は3つの電圧レベルを持っています:ソレノイド力のための48V、LEDのための6.3V、そして論理と音のための5V。これらの電圧レベルを供給するために、我々は48VのためにCNC電源を使用しました、そして、6.3Vと5Vを供給するために市販のDCアダプター。 (Arduinoはその電源電圧をその5V出力ピンに下方調整するので、6.3Vを使うことも可能かもしれませんが、私達はそれらの電源を分離したままにしました)。 48Vは高電圧であり、それ自体では致命的ではありませんが、部品に損傷を与えたり、回路に問題があるとコンポーネントを急速に過熱させる可能性があります。いずれかのトランジスタがショートしても発火しないように、48 Vの主電源の入力と出力の両方に5Aのスローブローヒューズを使用してください。

Arduinoシールドには、ソレノイドドライバーボード、ライト/サウンドドライバーボード、および入力ボードの3つのサブボードそれぞれの入出力要件に適合するように設計されたメスのMolexコネクターでワイヤーを取り付けました。

私たちのデザインでは、次のようなピン割り当てがありました。もちろんこれはかなり柔軟です。ピン0はオープ​​ンのままにしました。 (Instructablesは0から始まるnumberesリストをさせません。)

  1. 開いた
  2. 開いた
  3. 割り込み/入力アクティブ端子
  4. エンコード入力端子
  5. エンコード入力端子
  6. エンコード入力端子
  7. エンコード入力端子
  8. エンコード入力端子
  9. 右バンパー出力
  10. ミドルバンパー出力
  11. 左バンパー出力
  12. ドロップターゲット出力
  13. フリッパーマスタースイッチ出力
  14. マスターライトスイッチ出力
  15. 光出力ピン
  16. 光出力ピン
  17. 光出力ピン
  18. 音声出力ピン
  19. 開いた

私たちのデザインでは実装されていませんが、SCLピンとSDAピンはディスプレイに使用でき、残りのピンは機能の追加(ボールリターン)やより多くの照明の組み合わせなどの追加の制御に使用できます。

必要な材料:

  • 48V CNC電源(このようなもの)
  • 市販の6.3Vおよび5V電源(このようなもの)
  • 5Aスローブローヒューズとヒューズホルダー、および接続用の熱収縮チューブ
  • モレックスコネクタ
  • Arduinoプロトタイプシールドボード
  • たくさんの22AWGワイヤ、​​はんだ、そして忍耐力

ステップ7:ドライバーボードを作る

ドライバーボードは、Arduino、フリッパーボタン、およびスリングショットスイッチからの入力をコイルの点火に変える役割を果たします。信号は5Vレベル、ソレノイドは48Vであるため、信号を中継するには多大なパワーMOSFETが必要です。この設計に使用されているトランジスタは、Mouserの100V定格MOSFETです。

上に描かれている3つの概略図があります。そしてそれは足ひれ、スリングショット、そしてバンパー/ドロップターゲットを含みます。それぞれがわずかに異なる要件を持っています、しかしそれらのすべてにおいて、トランジスタが5V信号を与えられるとき、ソレノイドのための電流経路が開いて、強力なキックをするために5〜8アンペアがコイルを通して押されます。これは現在たくさんあります。実際には、トランジスタが非常に短いパルスよりも長い間オンに保たれると、この大きな電流が部品を焼き尽くします。ソフトウェアまたは他の方法を使用してこの回路をテストする際には、約1秒を超えてソレノイドに絶対に電力を供給しないでください。

上記の回路における問題の主な原因は、誘導性キックです。ソレノイドは強力なインダクタです。ご存知のとおり、インダクタの電流は瞬時には変化しません。そのため、トランジスタがオフになっても、5〜8アンペアがソレノイドに流れている瞬間がまだあり、そのためにはどこかに電流が必要です。グランドへの経路が与えられていないと、この電流によってトランジスタのドレインの電圧が最大数百Vになり、トランジスタが破壊されます。さらに、トランジスタが破壊されると、3つの端子すべてが短絡されます。このため、アンペアの連続電流が流れ、適切なヒューズが取り付けられていないとソレノイドが破壊される可能性があります。 (私たちは発見したときに8つのトランジスタを破壊し、この問題に対処しようと試みましたが、手動で電源を切断するのが常に速いので幸いなことにソレノイドはありませんでした)。

インダクティブキックを防止する方法は2つあります。まず、各ピンボールアセンブリに、トランジスタのドレインから電源までを指すダイオードを1つ取り付ける必要があります。理論的には、これが起こるとダイオードがオンになり、インダクタからすべての残りのエネルギーを排出するため、これはトランジスタのドレインが電源電圧を超えることを防ぐはずです。残念ながら、実際にはこれらのダイオードだけでは誘導キックを抑制するのに十分なほど速くターンオンすることはできません。

この問題を解決するために、RCの「スナバ」回路を追加しました。この回路は、抵抗と直列のコンデンサを備えています。コンデンサがインダクタから十分な電流を吸収するので、ダイオードはターンオンしてその機能を実行する時間があります。 RCスナバ回路の詳細については、こちらをチェックしてください。

バンパー/ドロップターゲットソレノイドドライバ回路はかなりシンプルで、トランジスタ、ソレノイド、スナバ、そしてArduinoからの入力を受け取るための接続だけを持っています。このボード以降のボードでは、ダイオード(回路図には示されていません)が高電圧側を向くようにソレノイドを配線してください。

フリッパー駆動回路は3つの理由でもう少し複雑です。まず、ボタンを押したときとフリッパーの動作をすばやく反応させるには、Arduinoが処理する個別の入力と出力としてではなく、回路内で直接その応答を作成することをお勧めします。 Arduinoによる遅延はわずかですが、経験豊富なプレイヤーはすぐに言うことができますし、コントロールの欠如に不満を感じます。

第二に、足ひれは2つの異なるコイル(低出力と高出力コイル)の足ひれが高いときに起動するストロークの終わりスイッチを特徴とします。このスイッチは強力なストロークを出すためにハイパワーコイルを最初に発射させるが、フリッパーを「上に」保持するのに十分なパワーを与えるローパワーコイル(〜130オーム対4オーム)に切り替えるという重要な機能を果たします。ボタンが配置されている限り、ソレノイドを焼損するほど多くの電流を流さないでください。下の図では、EOSスイッチは通常閉じていますが、私たちのアセンブリには通常開いているスイッチがあり、それを通常閉じている信号に変換するために別のトランジスタが必要でした。

3つ目は、ボタンでフリッパーを直接制御したいのですが、ボールがプレー中かどうかに応じてフリッパーを有効または無効にすることができるArduinoからの「マスター」スイッチ信号も含めました。これにより、回路内に第3のトランジスタが使用されることになる。

同様に、パチンコボードには独自の問題があります。 1つのトランジスタだけを使用しますが、高速応答のためにArduinoに追加の出力ピンを必要としないように、フリッパーのように入力スイッチ(直列に配線したもの)で直接制御する必要があります。残念なことに、トランジスタのゲートがスイッチに直接接続されている場合、スイッチは非常に長い間閉じたままではないため、応答が速すぎてほとんど目立たないキックを超えることはできません。より強力なキックをするために(すなわち、スリングショットソレノイドを「フォロースルー」させる)、トランジスタのゲートにダイオードと大きな抵抗を追加しました。これは素早い応答を可能にしますが電圧減衰の大きな時定数を作り出します。スリングショット・スイッチが再び開かれた後でさえも、ゲートが顕著なキックをするのに十分なだけ長い間5Vに(およびトランジスタがオンに)留まるように、そのノードで。別の面倒なことは、入力ボードが(後で見るように)必要とするので、この入力をArduinoに送ることです。 低い スリングショットは入力が高く押されると動作します。この問題を解決するために、どちらかの入力がハイになるたびに閉じる3番目のトランジスタを追加したため、プレイフィールドの他の入力スイッチと同様に扱うことができます。

ドライバボード(実際には2つのボード)は、2つのフリッパドライバ、2つのスリングショットドライバ、および残りのソレノイド用の4つのシングルスイッチドライバで構成されています。直接はんだ付けするのではなく、0.1インチのモレックスコネクタを使用してこのボードをソレノイド、電源、およびスイッチに接続したため、修理や調整がより簡単になりました。

設計にははんだ付け可能なブレッドボードを使用しましたが、これらの機能を使用して実際のPCBを設計すると、はるかにクリーンな結果が得られ、これらの機械に必然的に生じる配線の混乱を軽減できます。

材料:

  • 12個の100V定格パワートランジスタ
  • 10〜50μFのコンデンサ(できれば無極性)
  • 300、5k、および500k、そして3Mの抵抗
  • スリングショットスイッチ用の1個の小型トランジスタ
  • いくつかの1N4004ダイオード
  • プロトタイプのはんだ付け可能なブレッドボード(または、さらに良いことには、あなた自身のPCBをデザインする)

ステップ8:センサー入力ボードを作る

Arduinoを使用しているだけなので、デジタルピンは20本に制限されています。しかし、ピンボールマシンには、ライト、サウンド、駆動ソレノイドに必要な出力はもちろんのこと、数十のユニークなスイッチ入力があります。この問題を軽減するために、2つの入力が同時にトリガーされることはないと仮定しました(それによって、1つのボールのみを使用するように制限されます)。この仮定により、有効なスイッチ入力が受信されるたびに割り込みをトリガする6番ピンを持つ5ビットバイナリレジスタに変換することで、スイッチ入力を「エンコード」することができます。これを達成するために、我々は上の写真で示されるレイアウトでこのエンコーダを使って24対5エンコーダを作るために8対3エンコーダのカスケードを使いました。

これは、フリッパー、バンパー、そして1つか2つのターゲットを持つという当初の計画から、マシンの複雑さを大幅に増やすことができたため、プロジェクトの最も重要な開発の1つでした。

もう1つのプロトタイプボードを使用して、24個のオスのMolexコネクタをそれぞれ配置しました。プレイフィールドの各スイッチには、このボードに差し込む長いワイヤの端にメスコネクタがあります。ドロップターゲットは、いくつかの方法で処理できるユニークなケースです。各ドロップターゲットスイッチを直列に配線することで、入力がすべてオフになったときに入力が閉じられ、Arduinoがソレノイドに信号を送信してドロップターゲットを元に戻すことができます。

材料:

  • 4つの3ステート出力優先順位8:3エンコーダ

ステップ9:ライト/サウンド/スコアペリフェラルボードを作る

エンコーダと同様の方法でピンを節約するために、ライトを制御するために3:8デコーダを使用しました。これにより、一度に複数の光を照らすことができないという制限がありましたが、それは他の要素のためにピンを解放するための許容できるトレードオフでした。私達はまたすべてのライトを一度に制御できる4番目の「マスター」ライト出力を含めました。これにより、たとえば、ゲームの最初の電源投入時にすべてのライトを数回点滅させることができます(スタートボタンを押したときに実際に何かが起こっていることを強く示しています。ボールトラフまたはカラフルなディスプレイ)。

上記の回路図は、ドライバに似たトランジスタ回路を特徴としていますが、動作中の電圧が低い(ライトでは6.3V)ため、トランジスタのサイズが小さくて済み、保護回路もそれほど必要ありません。トランジスタにはダイオードのORゲートを使用して、マスタースイッチ信号と個々の光信号を分離しました。これにより、光1つにつき2つではなく1つのトランジスタしか使用できず、Arduinoとエンコーダチップが電流のソースまたはシンクに「戦う」ことを防ぎます。

私達がそれぞれのプレイフィールドライト(挿入物の下にあるもの)のために低電流LEDを使用している間、スタートボタンと3つのポップバンパーはそれぞれそれぞれ約250mAを引き出す白熱電球が付属していました。トランジスタは530mAの連続電流で定格が定められているので、これを超えないように、1つのトランジスタを通過する白熱灯は2つだけです。

このボードには、基本的なサウンドを再生できるようにするパッシブ5Vピエゾブザーも取り付けました。

カスタムの光と音のシーケンスは、関数light_sequence + sound_sequenceを使って、またはPinball言語インターフェースを通してプログラムすることができます。

  • 10個の照明用トランジスタ(これらを使用)
  • 5Vピエゾブザー

ステップ10:ステップ11:ゲームのルールをデザインする

ピンボールゲームのルールを定義するための2つのオプションがあります。カスタマイズ可能なピンボール文書、またはハードコードのゲームルールを使用してゲームと対話できます。ハードコードされたゲームルールは、連続ショットや時限ボーナスなど、より柔軟性があります。ピンボールドキュメント/パーサーシステムを使用すると、より柔軟でシンプルなルールが可能になります。私達は構成可能なゲームのためのインターフェースから始めて、そしてあなたがあなたがあなた自身のピンボールゲームのために望む構成を選ぶことができるようにいくつかのハードコードされたゲームのルールを詳述します。

このプロジェクトで参照されているファイルについては、こちらのgithubリポジトリを参照してください。

パート1。ゲームのルールをデザインする

ピンボールゲーム用のデフォルトのステートマシンが図に示されています。

これはデフォルトのスターターコードで提供されています。今、あなたは2つの選択肢を持っています - マシンのためのあなた自身のコードを書くか、ピンボールゲームのために指定されたフォーマットを使うかのどちらかです。

ステップ11:オプション1。あなた自身のPinball.txtファイルを書きなさい

ピンボールテキストの文書には、3つのセクションがあります。1つはパート、もう1つは「ステート」、もう1つは「アクション」です。ここでは、各コンポーネントに特定のアクションを定義できます。ほとんどのコンポーネントでは、おそらく1ステートのステートマシンに固執したいでしょう。たとえば、バンパーを叩くたびに、プレーヤーはさらに100ポイントを獲得し、ランプを点灯し、100ポイントを獲得すると、状態図は対応するコードとともに図1のようになります。コンポーネントに複数状態のステートマシンを持たせたい場合、たとえばバンパーに当たったときにライトを点灯させ、次にそれが再度当たったときにオフにしたい場合、状態図/対応する状態は図2のようになります。図3に示すように、私たちの特定のマシンが構造を提供しており、それに対してルールを定義できます。それらの名前、内部コード化されたマクロ(あなたが心配する必要はないが、ソースコードを調べることにした場合に役立つかもしれません)、そして割り込みコードは図3に与えられています。

ピンボールゲームを書くためのヒント
ゲームコンポーネントはハードウェアによって定義される特定の割り込み(「pos」フィールドで示される)に結び付けられているので、「States」フィールドの外側で「parts」セクションを変更しすぎることはお勧めしません。スタートボタンやゲームスイッチなど、得点に影響を与えないコンポーネント用に状態0とアクション0を予約します。私たちのコードは図5のように見えます。

ステップ12:光と音のシーケンスを定義する

ボード上の8つのライトは、前述のように、3:8デコーダ+ 1つのマスタースイッチを使用して制御されます。特定のライトは、部品コードのバイナリエンコードバージョンに対応するピンに書き込むことで点灯できます。 light_sequenceヘルパー関数は、ユーザーが点灯させたいライトを指定するためのインターフェースをユーザーに提供します。マクロはstate_machine_headers.h文書で定義されています。あなたのプログラミングの便宜のために再び表が用意されています。サウンドに関しては、Arduinoトーンライブラリを使用して、さまざまなゲームイベント用の短いサウンドシーケンスをプログラムしました。私たちはあなたが選ぶことができる4つのあらかじめ作られた音を持っています(executeSound(<あなたが望む音の数>)を使って)。これらの音は、長くて元気なシーケンス、短い元気なシーケンス、短い悲しいシーケンス、そして長い悲しいシーケンスに対応しています。あなたがあなた自身のサウンドをプログラムしたいならば、あなたはそうする方法をここで見ることができます(pitch.hはリポジトリに含まれています):http://www.arduino.cc/en/Reference/Tone

ステップ13:ArduinoにPinball.txtファイルをロードする

FSMの作成が終わったら、ここでArduinoにゲームをロードする方法を説明します(Macを使用していると仮定します)。すべてのファイルはgithubリポジトリにあります。

  1. arduinoシリアルのzipファイルを解凍します。
  2. arduino-serialファイルに移動して、ゲームの設定ファイルをここに保存します。 “ Pinball.txt”はあなたが使用できるサンプルテンプレートを提供します。
  3. Arduinoを開きます。ピンボールゲームのスケッチをアップロードする。
  4. 端末を開き、以下のコマンドを入力します。
    • 作る
    • ./arduino-serial -b 9600 -p pinball.txt
  5. これで、Arduinoの内部メモリにデータを読み込んで保存することになります。不正な行があると、Arduinoはエラーメッセージを表示し、ファイルを再送信することを選択できます。
  6. 端末を使用してコードをアップロードしたら、 Arduinoが「完了」メッセージを印刷したら、Arduinoシリアルを開いて進行中のゲームからメッセージを読むことができます。

ソフトウェアゲームに関する一般的な問題/最適化

  1. ハードコーディングされたゲームと設定可能なゲーム - ハードコードされたゲームの割り込みが、カスタマイズ可能なゲームの割り込みよりもはるかに正確に応答したことに気づきました。これは、カスタマイズ可能なゲームが条件付きステートメントを必要とする多くの汎用目的の機能を持っていたためかもしれません。これはループの読み込み速度を落とし、それがいくつかの割り込みを見逃し、ゲーム全体の動作速度に影響を与えました。この問題を解決するために、我々は回路で許容可能な応答時間を達成するために設定ファイルゲームのカスタマイズ可能性のいくつかを減らしました。私たちはもともとArduinoのRAM容量とそれがどれだけのゲームルールを保存できるかについて懸念を抱いていましたが、これは当初予想されていたよりも問題は少なく、ループのスピードが大きな制限要因でした。
  2. 割り込みのデバウンス - ピンボールゲームの素早いアクションのために、ピンボールが1つのゲームコンポーネントにしか当たらないために割り込みピンが複数の割り込みを受け取っていたいくつかのケースがありました。さらに、これらの割り込みはエンコーダがすべての入力を正しく読み取る時間が来る前に受信されたので、割り込みは不正確なコンポーネントにリンクされているでしょう。この問題を解決するために、最初の割り込みが受信されてから1ms後に応答する外部デバウンスライブラリを使用し、ゲームが入力コードを読み取る前にエンコーダピンがHighに達するまでの時間を与えました。
  3. ディスプレイ - シリアルディスプレイでは詳細なメッセージをプリントアウトすることができますが、テンポの速いゲームをプレイするときにプレイヤーが出力メッセージを読むのは困難です。また、プレーヤーがコンピュータを接続した状態でゲームをプレイしなければならないのも面倒です。将来的には、LEDマトリックスや7セグメントディスプレイなど、ユーザーが見やすいディスプレイにスコアやその他のゲーム情報を表示できるデジタルディスプレイの実装を目指しています。

ステップ14:オプション2:自分のゲームをハードコーディングするためのアドバイス

まず、state_machine_headers.hドキュメントを読んで、ステートマシンに関する情報を格納するグローバルデータ構造を理解します。 Arduinoコードにロードする前に、Arduino IDE内でこれらのデータ構造をゲームのルールに合わせて初期化する必要があります。以下のデータ構造が提供されています。

各部分に関する情報を保持するためのゲーム構造体の状態遷移に関する情報を保持するための状態実行されるべき動作に関する情報を保持するためのアクションこれらの構造体は、読み込みファイルによって読み込まれます。すべてのピンの入出力を定義してください。割り込みピンはINPUTピンとして定義する必要があります。

メインループ内で、各サイクルをチェックして、各ゲームコンポーネントに対して割り込みが発生したかどうかを確認します。 switchステートメント内で各ゲームコンポーネントを定義します。

ヘルパー関数executeStateは、パーツの現在の状態を更新し、コード化された情報に基づいてアクションを実行します。

ゲームコードのハードコード化された最初のバージョンは、ファイル“ simplepinballgame.ino”にあります。

ステップ15:すべてをつなぐ

Arduinoを私達のドライバーボードとインターフェイスさせるために、私達は他のボードのピンにもっと簡単にアクセスするためにプロトシールドを使いました。ワイヤがたくさんありますので、注意してください。あなたのArduinoコンセントをそれらに対応するピンに接続するために電子ピンとレイアウトで与えられたレイアウトに従ってください。モレックスのコネクタは、どのコネクタがどのコネクタに接続するかを判断するのに役立ちます。

これは私達がしたよくある問題のいずれかに出くわす場合のための短いトラブルシューティングFAQです:

入力エンコーダの性質は、Arduinoには6本の入力ピンがあることです。5本は一緒にどの入力がトリガーされるかを示し、6本のピンは単一の入力がトリガーされるとハイになります。書き込まれたコードは、この6番目のピンがローからハイに変化したときにのみ検出します。 Arduinoが何も入力を受け取らず、すべての、あるいは少なくともほとんどのスイッチが機能することを確認したら、いずれかのスイッチが閉じたままになっていないか確認してください。たとえば、すべてのドロップターゲットが停止していても起動していない場合は、スイッチが閉じているため、Arduinoは他の入力を受信できません。

シューターを固定しているナットが完全に締められていること、またはシューターブロックが緩んでいないことを確認します。または、シューターロッドに給油します。

スイッチが余りに広い車線に配置されていてボールがスイッチを回って回ることができる場合、これは機械的/設計上の問題となる可能性があります。それ以外の場合は、コード内のどこかで遅延が長すぎることが原因である可能性があります。たとえば、トーンライブラリとdelay()ステートメントを使用してトーンを演奏するのに忙しい場合、その間Arduinoは入力を拾うことができません。私たちが使用した1つの回避策は、ランプショット、スタンドアップターゲット、スタートボタン、そしてゲーム終了スイッチのサウンドのみを再生することでした。 。

確かに、私たちは特定のライトや特定のソレノイドに特定のヘッダを割り当てていません。つまり、最初にすべてを差し込むとき(または何らかの方法でラベルを付けない場合はその後)、出力ピン(または出力光のエンコード)が接続されます。任意の順序試行錯誤して、どのピンがどの出力に対応するかを解決し、それに応じてコードを調整します。ライトやバンパーにとって、これはそれほど悪いことではありません - しかし、間違いなくすべての入力にラベルを付けて、それを書き留めてください。これは、そのプロセスが最大24の値を持ち、調整に少し時間がかかるためです。

エンコーダは、5本のエンコーダピンが完全にその値を解決する前に、インジケータピンを時々ハイにパルスするという不幸な特性を持っています。私たちにとって、これは押されているスイッチの数が1つずつずれたときに起こっていたことを知っていました、しかしそれはあなたにとって異なって現れるかもしれません。スイッチが変更されたことに気付いてからそれがどのスイッチであったかを記録するまでの間にわずかな遅延を作り出すためにデバウンスライブラリを使用することによってこの問題を解決しました。ただし、注意が必要ですが、15〜20ミリ秒を超える遅延があると入力が完全に見逃される可能性があります。

すみません、しかし、私たちはまだこれのための良い解決策をまだ考え出していません。