工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino制御のピンボールマシン

コンポーネントと消耗品

>
Arduino Mega 2560
× 1
Adafruit2ピンLCDディスプレイ
× 1
24V電源
× 1
Adafruitフォースセンサー
× 1
ポップバンパーアセンブリ
× 1
ポップバンパースイッチ
× 1
ターゲットスイッチ
× 1
Rollover Switch
× 1
フリッパーアセンブリ
× 1
LEDランプ
× 1

このプロジェクトについて

Arduino制御のピンボールマシン

Arduinoで制御されるピンボールマシンを構築するには、木工、機械、電子、プログラミングのスキルを組み合わせる必要がありました。作成には約6か月のパートタイムの労力がかかり、これまでに作成した中で最も複雑なものでした。これは主に、ピンボールマシンの作り方について多くの情報を見つけることができなかったためです。

このドキュメントでは、このマシンがどのように構築されたかについて説明します。自分で作成する場合は、私よりも簡単に作成できるように、十分な参照を提供するように努めます。同時に、私はすべてをテストする必要性を十分に強調することはできません。実際の機械に取り付ける前に、スペアピースの合板を使用してすべてのコンポーネントのプロトタイプを作成しました。これにより、長期的には多くの悲しみを救うことができます。

<図>

写真からわかるように、このマシンは木製のキャビネットを備えており、市販のピンボールマシンの交換部品を使用しています。マシンは、単一のArduino Mega2560ボードによって制御されます。マシンの動作を確認したい場合は、このリンクにアクセスするか、こちらをご覧ください:

ケース

ケースは、ホームストアで購入したオーク材の合板で作られています。このドキュメントのすべての寸法はインチ単位です。フロントパネルとバックパネルは20Hx23Wです。サイドパネルは20Hx47Lです。ピースは留め継ぎされたエッジでカットされ、ビスケットジョイナーと木製の接着剤を使用して接続されました。ポケットネジと接着剤も機能します。マシンは多くの悪用を受けるため、強力である必要があります。それを一緒に結合する前に、私はまた、下から1インチ上に3/4インチのダドを切りました。棚を接着しないでください。膨張と収縮を可能にするために浮く必要があります。棚は主電源と蓋の下に取り付けられた装飾的なLEDライトの電源を保持するために使用されました。プレー面は22w×42Lです。キャビネットよりもかなり短いことに注意してください。これにより、フリッパーボタンとLEDライトにワイヤーを通すために約3インチ前になります。また、ボールプランジャーメカニズムのためのスペースを提供します。演奏面は、ケースの上部から約4インチ下の側面にねじ込まれたいくつかの小さな木製のブロックに単に載っています。マシンの内臓にたどり着くには、ふたを開けて、競技場を取り外し、裏返します。

<図>

ケースとプレー面はすべて直角に作られています。ゲームのピッチは、この側面図に示されているように、脚によって提供されます。ピンボールマシンは、最小1度から最大7度までの角度を持つことができます。角度が大きいほど、ゲームは速くなります。必要な角度がわからなかったので、脚を調整できるように設計しました。脚自体は木製で、ほとんどのホームストアで購入できます。次に、オーガービットを使用して各脚の端に12インチの深さの穴を開けました。下端では、3/8インチのTナットを挿入するために2成分エポキシを使用していました。ネジ山やドリルで開けた穴を塞ぐ場所に接着剤が付着しないように注意してください。次に、12インチの3/8インチのねじ棒を脚に挿入し、ナットを棒にねじ込みました。次に、最後にレベリングフットを取り付けました。以下のリンクで入手したレベリングフットとティーナット。

http://www.mscdirect.com/product/details/40610032

http://www.mscdirect.com/product/details/67300962

テーブル脚取り付けプレートを下部シェルフにねじ込み、脚をねじ込みます。機械の高さを調整するには、ナットを緩めてから、ねじ付きロッドをねじ込みまたはねじ込みます。次に、ナットを締め直して、テーブルがしっかりと固定されていることを確認します。

写真では、電気コードとUSBケーブルに気付くでしょう。電気コードは、マシンの背面に取り付けた電源タップから供給されます。すべてがそこに接続されるので、1つのスイッチですべてがオンまたはオフになります。 USBケーブルがそこにあるので、競技場を外さなくてもArduinoボードを再プログラムできます。

ふた

蓋のフレームはオーク材でできており、キャビネットと同じ寸法です。上部と側面の幅は1.5インチで、下部の幅は5インチです。底部の余分な幅は、競技場とキャビネットの間のギャップを隠すために使用されます。プレキシグラスのカバーを保持するために、フレームピースの内側の端にダドが走っていました。ガラスの代わりにプレキシグラスを使用しました。これは、軽量で安全で、切断が簡単だからです。ふたはポケットネジを使用して組み立てられました。これは、プレキシグラスを交換する必要が生じた場合に備えて分解できるようにするためです。また、装飾目的で、ふたの下にカラフルなLEDライトのストリップを取り付けました。最後に、蓋とケースの両方に引っ込めたピアノのヒンジを使用して、蓋をケースに取り付けました。

<図>

Arduino

Arduino Mega2560は基本的に4つのことを行います。スイッチがいつアクティブになるかを決定し、それに応じてライトをオンまたはオフにし、スコアを追跡し、小さなLCDにスコアとボール番号を表示します。ほとんどの配線は非常に簡単です。たとえば、ターゲットはArduinoのデジタル入力の1つと地面に接続されています。入力は、以下に示すステートメントを使用して構成されます。

pinMode(Pin_Number、INPUT_PULLUP)

コードが入力が高から低に変化したことを検出すると、ターゲットが攻撃されたことを認識し、適切なLEDピンボールライトをオンにします。

これの唯一の複雑さはポップバンパーからです。このゲームで使用されるロールオーバースイッチとターゲットはすべて、Arduinoから電力を取得します。ポップバンパーは、Arduinoが供給できるよりも多くのジュースを必要とするため、別の25ボルトの電源から供給されます。ポップバンパーにはスイッチがありますが、高電圧のため直接読み取ることができません。したがって、最初にPopBumperスイッチからの出力を分圧器に送信します。分圧器の例は、以下のリンクにあります。

分圧器

分圧器を通過すると、電圧は5ボルトに低下し、Arduinoはそれを処理できます。分圧器は常にいくらかの電流をリークしているように見えるので、アナログ入力を使用した場合、これらで誤った読み取り値が少なくなることがわかりました。アナログ入力を使用すると、しきい値を超えていることを確認できるため、信号をノイズから簡単に分離できます。

プレイ中に、特定のタイプのデバイス(ターゲット、ポップバンパー、またはロールオーバー)がすべてアクティブ化されている場合、それらのデバイスのすべてのライトを点滅させるようにArduinoをプログラムしてから、スコアを上げました。

また、小さな力センサーを使用して、ボールが失われたことを知らせました。これにより、プレーしたボールの数を追跡し、ゲームがいつ終了したかを判断できます。ゲームが終了すると、すべてのライトが順番に点滅します。

最後に、Arduinoを使用してスコアとボール番号を表示しました。

添付の配線図は、主要コンポーネントのそれぞれがどのように配線されたかを示しています。それらがすべて表示されていると、図は混乱しすぎます。

電源

ピンボールコンポーネントに電力を供給するために、私は24ボルトの電源を使用しました。このユニットはフリッパーとサイドキックに十分なパワーを持っていました。ポップバンパーには少し弱いです。これらには、より強力な電源を使用することをお勧めします。もしそうなら、私は最大25ボルトのものしか見つけられなかったので、あなたはあなた自身の分圧器を作らなければならないでしょう。分圧器の作り方については、こちらをご覧ください。

すべてを電源に直接接続するのではなく、競技場の下側に取り付けるのではなく、電源から1対のバスバーに配線しました。これにより、さまざまなコンポーネントの接続が非常に簡単になりました。スリングショットセクションの2番目の写真にバスバーの1つがあります。電気部門のホームストアで入手できます。

ボールシューターまたはプランジャー

ボールシューターまたはプランジャーは、次のリンクで購入しました

http://www.marcospecialties.com/pinball-parts/B-12445

プランジャーが通過するように、ケースの前面に穴を開ける必要があります。次に、ケースの内側にねじ込みます。プランジャーが競技場と適切に位置合わせされていることを確認するために、細心の注意を払う必要があります。競技場に直定規を置き、ケースの内側に当たるポイントをマークします。次に、プランジャーの中央の高さがピンボールの高さの半分になるように十分に持ち上げます。 (ピンボールのサイズは1インチと1/16インチで、ピンボールで入手できます。)

競技場

競技場は、¼インチの白樺に面した合板で作られています。ゲームをより装飾的にするために、下のNasaリンクから写真を購入しました。

http://hubblesite.org/gallery/printshop/ps35/

私は最初に合板に接触接着剤をスプレーし、次にポスターをその上にラミネートしました。次に、裏返してサイズに合わせてトリミングしました。

フリッパー

足ひれは以下のリンクで購入しました。

http://www.pinballlife.com/index.php?p=product&id=172

ほとんどのピンボールコンポーネントを購入するとき、それらは有用な指示がない傾向があります。下の写真に示すように、フリッパーを配線する方法。このリンクから来ました。

<図>

フリッパーメカニズムに加えて、フリッパーバット、フリッパースイッチ、ボタンが必要になります。

パチンコ

完全なスリングショットアセンブリはここにあります。ピンと輪ゴムも必要になります。あなたはそれらを同じ場所で見つけることができます。また、下に取り付けたときのパチンコの写真も示されています。 24ボルトの電源に接続されたすべてのコンポーネントに16ゲージのワイヤーが使用され、Arduinoボードへの接続に22ゲージのワイヤーが使用されたことを指摘しておく必要があります。

最初の写真は、フリッパーバットの横にあるいくつかの金属レールも示しています。レールを買う場所が見つからなかったので作ってみました。実店舗で見つけたクロム鋼線を使用しました。殺虫剤を散布した芝生に印を付けるために使用されました。ワイヤーを切って曲げました。次に、競技場に穴を開け、レールを所定の位置にエポキシ樹脂で接着しました。

<図> <図>


ポップバンパー

ポップバンパーアセンブリはこちらで購入できます。また、スイッチとキャップが必要になります。ポップバンパーは、金属製のサポートロッド用に2つ、スイッチをトリガーするシャフト用に1つ、合計3つの穴を開けることによって取り付けられます。上面図に見られる白い円盤にボールが転がると、シャフトが押し下げられます。これによりリーフスイッチがトリガーされ、ソレノイドがアクティブになります。次にソレノイドが金属リングを引き下げ、ボールを反対方向に送ります。

<図>

<図>

ターゲット、ロールオーバースイッチ、ライト

ターゲットは以下のリンクから入手できます。

http://www.marcospecialties.com/pinball-parts/A-14691-5

ロールオーバースイッチとマウントは以下にあります。

http://www.actionpinball.com/parts.php?item=A-12687

私が使っていたランプはもう作られていませんが、同等のものを以下に示します。

http://www.actionpinball.com/parts.php?item=LED4555

以下に示すランプマウントも必要になります。

http://www.actionpinball.com/parts.php?item=077-5030-00

これらすべての配線は基本的に同じであり、Arduinoのセクションで言及されています。

概要

始めると、追加したい他のベルやホイッスルが見つかることは間違いありませんが、これで始めることができます。

コード

  • Arduinoピンボールマシンコード
Arduinoピンボールマシンコード Arduino
Arduinoが自家製のピンボールマシンのゲームプレイを制御できるようにします
 const int TxPin =17;長いスコア=0; long OldScore =0;長いターゲット=1;ロングポップ=1;ロングロール=10; int Targets [8]; int Rolls [3]; int Pops [4]; int Milli =10; int Sum =0; int Flash =100; int Ball =0; int i =0; int Shot =0; int Lost =0; int圧力=1024; #include ; SoftwareSerial mySerial =SoftwareSerial(255、TxPin); void setup(){/ * sのない単語は、デバイスとの対話によって達成される値です。 * sを使用して動作し、個々のユーザーが対話したことを追跡します。 *後者は、すべてがヒットし、値をアップグレードする必要があり、*ライトをオフにする必要があるかどうかを判断するために必要です。 * / pinMode(TxPin、OUTPUT); digitalWrite(TxPin、HIGH); mySerial.begin(9600); mySerial.write(12); // mySerial.write(17);をクリアします//バックライトをオンにします//ターゲット入力pinMode(2、INPUT_PULLUP); pinMode(3、INPUT_PULLUP); pinMode(4、INPUT_PULLUP); pinMode(5、INPUT_PULLUP); pinMode(6、INPUT_PULLUP); pinMode(7、INPUT_PULLUP); pinMode(8、INPUT_PULLUP); pinMode(9、INPUT_PULLUP); //ロールオーバー入力pinMode(10、INPUT_PULLUP); pinMode(11、INPUT_PULLUP); pinMode(12、INPUT_PULLUP); //下部ボールショットスイッチpinMode(15、INPUT_PULLUP); //アッパーボールショットスイッチpinMode(16、INPUT_PULLUP); // lcd出力pinMode(17、OUTPUT); //ターゲットライト、それぞれのpinMode(32、OUTPUT); pinMode(33、OUTPUT); pinMode(34、OUTPUT); pinMode(35、OUTPUT); pinMode(36、OUTPUT); pinMode(37、OUTPUT); pinMode(38、OUTPUT); pinMode(39、OUTPUT); //ロールオーバーライト、それぞれのpinMode(40、OUTPUT); pinMode(41、OUTPUT); pinMode(42、OUTPUT); //ポップバンパーライトpinMode(50、OUTPUT); pinMode(51、OUTPUT); pinMode(52、OUTPUT); pinMode(53、OUTPUT);} void loop(){//メインコードをここに配置して、繰り返し実行します。//プルダウン抵抗を使用すると、スイッチが開いているときは入力ピンがLOWになり、スイッチが開いているときは入力ピンがHIGHになります。スイッチが閉じています。 //ターゲットがヒットしたかどうかを確認します// ******ターゲット***** for(int i =0; i <8; i ++){if(digitalRead(i + 2)==LOW){/ / Targetがアクティブ化されたTargets [i] =1;スコア=スコア+ターゲット; //ターゲットライトをオンにしますdigitalWrite(i + 32、HIGH); // 1回のヒットで複数のポイントを取得しないように遅延しますdelay(Milli);壊す; }} Sum =0; for(int i =0; i <8; i ++){Sum =Sum + Targets [i]; } if(Sum ==8){//すべてのターゲットが点灯しているので、点滅してからオフにします。 for(int j =0; j <3; j ++){for(int i =0; i <8; i ++){digitalWrite(i + 32、LOW); } delay(Flash); for(int i =0; i <8; i ++){digitalWrite(i + 32、HIGH); } delay(Flash); } for(int i =0; i <8; i ++){digitalWrite(i + 32、LOW); Targets [i] =0; } delay(Flash); //ターゲット値に10を掛けますTarget =Target * 5; // goto Skip; } // ***********ロールオーバー********* for(int i =0; i <3; i ++){if(digitalRead(i + 10)==LOW) {//ロールオーバーがアクティブ化されたRolls [i] =1;スコア=スコア+ロール; //ロールオーバーライトをオンにしますdigitalWrite(i + 40、HIGH); // 1回のヒットで複数のポイントを取得しないように遅延しますdelay(Milli);壊す; }} Sum =0; for(int i =0; i <3; i ++){Sum =Sum + Rolls [i]; } if(Sum ==3){//すべてのロールオーバーが点灯しているので、点滅してからオフにします。 for(int j =0; j <3; j ++){for(int i =0; i <3; i ++){digitalWrite(i + 40、LOW); } delay(Flash); for(int i =0; i <3; i ++){digitalWrite(i + 40、HIGH); } delay(Flash); } for(int i =0; i <3; i ++){digitalWrite(i + 40、LOW); Rolls [i] =0; } delay(Flash); //スコアに2を掛けるスコア=スコア* 2;ロール=ロール* 10; // goto Skip; } // **********ポップバンパー********** for(int i =0; i <4; i ++){if(analogRead(i)> 500){/ / popがアクティブ化されたPops [i] =1;スコア=スコア+ポップ; //ポップバンパーライトをオンにしますdigitalWrite(i + 50、HIGH); // 1回のヒットで複数のポイントを取得しないように遅延//mySerial.print(analogRead(i)); //mySerial.print( ""); delay(ミリ);壊す; }} Sum =0; for(int i =0; i <4; i ++){Sum =Sum + Pops [i]; } if(Sum ==4){//すべてのポップバンパーが点灯しているので、点滅してからオフにします。 for(int j =0; j <3; j ++){for(int i =0; i <4; i ++){digitalWrite(i + 50、LOW); } delay(Flash); for(int i =0; i <4; i ++){digitalWrite(i + 50、HIGH); } delay(Flash); } for(int i =0; i <4; i ++){digitalWrite(i + 50、LOW); Pops [i] =0; } delay(Flash); //ターゲット値に10を掛けますPop =Pop * 2; // goto Skip; }スキップ://ボール番号を決定if(digitalRead(15)==LOW){//ボールヒット下路地スイッチ//まだ行っていない場合は、ボールを増やすif(Shot ==0){// Set Lost =0圧力パッド上にないため、Lost =0;圧力=analogRead(7)+ 20; // LCDにボールの値を再印刷するようにOldScoreを設定しますOldScore =-1;ボール=ボール+1; if(Ball ==6){Ball =1;スコア=0;ターゲット=1;ロール=1;ポップ=1; }ショット=1; }} if(digitalRead(16)==LOW){//ボールが下の路地スイッチに当たる//まだ行っていない場合は、ボールを増やすif(Shot ==0){//圧力パッド上にないのでLost =0に設定Lost =0;圧力=analogRead(7)+ 15; // LCDにボールの値を再印刷するようにOldScoreを設定しますOldScore =-1;ボール=ボール+1; if(Ball ==6){Ball =1;スコア=0;ターゲット=1;ロール=1;ポップ=1; }ショット=1; }} if(analogRead(7)> Pressure){//圧力パッド上のボールショット=0; if(Lost ==0){// mySerial.print(analogRead(7)); //スコア=スコア+100;失われた=1; if(Ball ==5){//ゲームオーバー//フラッシュロールオーバーしてからオフにします。 for(int j =0; j <3; j ++){for(int i =0; i <3; i ++){digitalWrite(i + 40、LOW); } delay(Flash); for(int i =0; i <3; i ++){digitalWrite(i + 40、HIGH); } delay(Flash); } for(int i =0; i <3; i ++){digitalWrite(i + 40、LOW); Rolls [i] =0; } //ポップバンパーをフラッシュしてからオフにしますfor(int j =0; j <3; j ++){for(int i =0; i <4; i ++){digitalWrite(i + 50、LOW); } delay(Flash); for(int i =0; i <4; i ++){digitalWrite(i + 50、HIGH); } delay(Flash); } for(int i =0; i <4; i ++){digitalWrite(i + 50、LOW); Pops [i] =0; } //ターゲットをフラッシュしてからオフにします。 for(int j =0; j <3; j ++){for(int i =0; i <8; i ++){digitalWrite(i + 32、LOW); } delay(Flash); for(int i =0; i <8; i ++){digitalWrite(i + 32、HIGH); } delay(Flash); } for(int i =0; i <8; i ++){digitalWrite(i + 32、LOW); Targets [i] =0; } mySerial.write(12); // delay(5);をクリアします//必要な遅延mySerial.print(Score); //最初の行mySerial.write(13); //フォームフィードmySerial.print( "Game Over !!!"); // 2行目}}} // LCDに出力if(Score!=OldScore){mySerial.write(12); // delay(5);をクリアします//必要な遅延//mySerial.print(analogRead(7)); mySerial.print(Score); //最初の行mySerial.write(13); //フォームフィードmySerial.print( "Ball ="); // 2行目mySerial.print(Ball); OldScore =スコア; }} 

回路図


製造プロセス

  1. Raspberry Pi /ホログラムSMS制御AC電源スイッチ
  2. Bluetoothで制御されるRaspberryPi Robot
  3. ジェスチャー制御のインタラクティブテーブルライト
  4. ARDUINOを使用した超音波浮揚機
  5. RaspberryPiを介したAlexa制御LED
  6. ジョイスティック制御のRCカー
  7. Nunchuk制御ロボットアーム(Arduino付き)
  8. ワイヤレスライトスイッチマニピュレーター
  9. 音声制御ロボット
  10. Arduino Apple Watch
  11. Arduino制御ピアノロボット:PiBot