Membangun mesin pinball yang dikendalikan Arduino memerlukan kombinasi keterampilan kayu, mekanik, elektronik dan pemrograman. Ini memakan waktu sekitar enam bulan dengan usaha part-time untuk dibuat dan merupakan hal yang paling rumit yang pernah saya bangun. Ini terutama karena saya tidak dapat menemukan banyak informasi tentang cara membangun mesin pinball.
Dokumen ini akan memberikan deskripsi tentang bagaimana mesin ini dibangun. Saya akan mencoba memberikan cukup referensi sehingga jika Anda memutuskan untuk membuat sendiri, Anda harus memiliki waktu yang lebih mudah daripada yang saya miliki. Pada saat yang sama, saya tidak dapat menekan cukup kebutuhan untuk menguji segalanya. Saya menggunakan potongan kayu tambalan cadangan untuk membuat prototipe setiap komponen sebelum memasang di mesin sebenarnya. Ini akan menghemat banyak kesulitan bagi Anda di masa depan.
Seperti yang Anda lihat dari gambar, mesin memiliki kabinet kayu dan menggunakan bagian pengganti mesin pinball yang tersedia secara komersial. Mesin dikendalikan oleh satu papan Arduino Mega 2560. Jika Anda ingin melihat mesin dalam aksi, pergi ke tautan ini, atau tonton di sini:
Kotak Mesin
Kotak terbuat dari kayu tambalan dengan kulit oak yang dibeli di toko perbaikan rumah. Semua dimensi dalam dokumen ini dalam inci. Panel depan dan belakang 20H x 23W. Panel sisi 20H x 47L. Bagian-bagian dipotong dengan tepi bersilang dan dihubungkan menggunakan biscuit joiner dan lem kayu. Pocket screws dan lem juga akan bekerja. Mesin akan menerima banyak penyalahgunaan jadi perlu kuat. Sebelum menyatukannya, saya juga memotong ¾” dado 1 inci dari bawah. Jangan lem rak. Ini perlu melayang untuk mengizinkan ekspansi dan kontraksi. Rak digunakan untuk menempatkan sumber daya utama dan sumber daya untuk lampu hias LED yang dipasang di bawah tutup. Permukaan permainan 22w x 42L. Perlu dicatat bahwa ini jauh lebih pendek dari kotak. Ini memberi saya sekitar 3 inci di depan untuk melewatkan kabel ke tombol flipper dan ke lampu LED. Ini juga memberi ruang untuk mekanisme plunger bola. Permukaan permainan cukup beristirahat pada beberapa blok kayu kecil yang disambungkan ke sisi sekitar 4 inci di bawah atas kotak. Untuk mencapai dalaman mesin, saya cukup membuka tutup, menghapus lapangan permainan dan membalikkan.
Kotak dan permukaan permainan semuanya dibangun di sudut siku. Kemiringan permainan disediakan oleh kaki seperti yang ditunjukkan dalam pandangan sisi ini. Mesin pinball dapat memiliki sudut dari 1 hingga 7 derajat. Semakin tinggi sudut semakin cepat permainan. Karena saya tidak yakin sudut apa yang akan saya butuhkan, saya merancang kaki agar dapat disesuaikan. Kaki itu sendiri terbuat dari kayu dan tersedia di sebagian besar toko perbaikan rumah. Kemudian saya membuat lubang 12 inci dalam di ujung setiap kaki menggunakan bor spiral. Di ujung bawah saya menggunakan epoxy dua komponen untuk memasukkan tee nut 3/8 inci. Hati-hati jangan sampai lem menempel pada busur atau memblokir lubang yang Anda buat. Kemudian saya memasukkan batang berpasang 12 inci 3/8 inci ke kaki dan saya memasang nut pada batang. Kemudian saya memasang kaki pengaturan di ujung. Kaki pengaturan dan tee nut saya dapatkan di tautan di bawah.
Piringan pemasangan kaki meja cukup disambungkan ke rak bawah dan kaki disambungkan. Untuk menyesuaikan tinggi mesin, cukup longgar nut dan lalu putar batang berpasang masuk atau keluar. Kemudian rapatkan nut lagi untuk memastikan meja tetap aman.
Dalam gambar, Anda akan memperhatikan kabel listrik dan kabel USB. Kabel listrik berasal dari strop daya yang saya pasang di bagian belakang mesin. Semua diplug ke sana, sehingga satu saklar menghidupkan atau mematikan semuanya. Kabel USB ada di sana, sehingga saya dapat memrogram ulang papan Arduino tanpa harus menghapus lapangan permainan.
Tutup
Bingkai tutup terbuat dari oak dan memiliki dimensi luar yang sama dengan kotak. Atas dan sisi lebar 1,5 inci, sementara bawah lebar 5 inci. Lebar tambahan pada bawah digunakan untuk menyembunyikan celah antara lapangan permainan dan kotak. Dado dijalankan di tepi dalam bagian bingkai untuk memegang penutup Plexiglas. Saya menggunakan Plexiglas bukan kaca karena lebih ringan, lebih aman dan lebih mudah dipotong. Tutup dipasang menggunakan pocket screws. Saya melakukan ini agar dapat membuka pasangnya jika Plexiglas perlu diganti. Saya juga memasang pita lampu LED berwarna di bawah tutup untuk tujuan dekoratif. Akhirnya, saya memasang tutup ke kotak menggunakan piano hinge yang saya simpan ke dalam baik tutup maupun kotak.
Arduino
Arduino Mega 2560 dasarnya melakukan empat hal. Ini menentukan kapan saklar diaktifkan, ini menyalakan atau mematikan lampu sesuai, ini melacak skor, dan ini menampilkan skor dan nomor bola pada layar LCD kecil. Sebagian besar kabel cukup sederhana. Misalnya, target disambungkan ke salah satu input digital Arduino dan ke ground. Input dikonfigurasikan menggunakan pernyataan seperti yang ditunjukkan di bawah.
pinMode(Pin_Number,INPUT_PULLUP)
Ketika kode mendeteksi input telah berubah dari tinggi ke rendah, tahu bahwa target telah dipukul dan kemudian menyalakan pin lampu pinball yang sesuai.
Komplikasi satu satunya ini berasal dari Pop Bumpers. Saklar rollover dan target yang digunakan dalam permainan ini semua mendapatkan daya dari Arduino. Pop Bumpers mendapatkan daya mereka dari sumber daya terpisah 25 volt karena mereka membutuhkan lebih banyak daya daripada yang Arduino dapat sediakan. Pop Bumpers memiliki saklar yang mengaktifkan mereka, tetapi saya tidak dapat membacanya secara langsung karena tegangan tinggi. Akibatnya, saya pertama mengirim output dari saklar Pop Bumper ke pembagi tegangan. Contoh pembagi tegangan dapat ditemukan di tautan di bawah.
Pembagi Tegangan
Setelah melalui pembagi tegangan, tegangan dikurangi menjadi 5 volt dan Arduino dapat mengatasinya. Saya menemukan bahwa saya mendapatkan pembacaan palsu lebih sedikit dengan ini jika saya menggunakan input Analog, karena pembagi tegangan tampaknya selalu bocor arus sedikit. Dengan input Analog, saya dapat memeriksa apakah ambang telah terlampaui sehingga dapat dengan mudah memisahkan sinyal dari kebisingan.
Selama permainan, jika semua jenis perangkat tertentu (target, pop bumpers, atau rollovers) telah diaktifkan, saya memprogram Arduino untuk memflash semua lampu untuk perangkat tersebut dan kemudian meningkatkan skor untuk mereka.
Saya juga menggunakan sensor gaya kecil untuk memberi tahu kapan bola telah hilang. Ini memungkinkan saya untuk melacak jumlah bola yang dimainkan dan menentukan kapan permainan berakhir. Ketika permainan berakhir, semua lampu berkedip berurutan.
Akhirnya, saya menggunakan Arduino untuk menampilkan skor dan nomor bola.
Diagram kabel yang dilampirkan menunjukkan cara salah satu dari setiap komponen utama disambungkan. Diagram akan terlalu membingungkan jika semuanya ditampilkan.
Sumber Daya
Untuk memberi daya pada komponen pinball, saya menggunakan sumber daya 24 volt. Unit ini memiliki cukup daya untuk flipper dan sidekicks. Ini sedikit lemah untuk pop bumpers. Anda mungkin ingin menggunakan sumber daya yang lebih kuat untuk ini. Jika Anda melakukannya, Anda harus membuat pembagi tegangan Anda sendiri, karena saya hanya dapat menemukan yang memiliki maksimal 25 volt. Informasi tentang cara membuat pembagi tegangan dapat ditemukan di sini.
Daripada menyambungkan semuanya langsung ke sumber daya, saya menjalankan kabel darinya ke sepasang bus bar yang saya pasang di bawah lapangan permainan. Ini membuatnya jauh lebih mudah untuk menyambungkan komponen yang berbeda. Anda dapat melihat salah satu bus bar dalam gambar kedua di bagian Slingshot. Mereka tersedia di toko perbaikan rumah di bagian listrik.
Ball Shooter atau Plunger
Ball shooter atau plunger dibeli di tautan berikut
Sebuah lubang perlu dibuat melalui depan kotak agar plunger dapat melewati. Kemudian diambil ke dalam kotak. Perlu perhatian besar untuk memastikan plunger teratur dengan lapangan permainan. Letakkan garis lurus pada lapangan permainan dan tandai titik di mana memantul ke dalam kotak. Kemudian naik cukup sehingga tengah plunger sama tinggi dengan setengah tinggi bola pinball. (Bola pinball berukuran 1 dan 1/16 inci dan tersedia di Pinball.)
Lapangan Permainan
Lapangan permainan terbuat dari kayu tambalan birch ¼ inci. Untuk membuat permainan lebih dekoratif, saya membeli gambar dari tautan Nasa di bawah.
https://hubblesite.org/gallery/printshop/ps35/
Saya pertama kali memakai lem kontak pada kayu tambalan lalu melaminasi poster di atasnya. Kemudian saya membalikkan dan memotong ke ukuran.
Saat Anda membeli sebagian besar komponen pinball, cenderung datang tanpa petunjuk yang berguna. Cara menyambungkan flipper ditunjukkan dalam gambar di bawah. Ini berasal dari tautan ini.
Selain mekanisme flipper, Anda akan membutuhkan bat flipper, saklar flipper dan tombol.
Slingshots
Rangkaian slingshot lengkap dapat ditemukan di sini. Anda juga akan membutuhkan pin dan karet karet. Anda dapat menemukan mereka di lokasi yang sama. Juga ditunjukkan adalah gambar slingshot saat dipasang di bawah. Saya ingin menyarankan bahwa kawat 16 gauge digunakan untuk semua komponen yang disambungkan ke sumber daya 24 volt dan kawat 22 gauge digunakan untuk koneksi ke papan Arduino.
Gambar pertama juga menunjukkan beberapa rel logis di samping bat flipper. Saya tidak dapat menemukan tempat untuk membeli rel, jadi saya membuatnya. Saya menggunakan kawat logis chrome yang saya temukan di toko perbaikan rumah. Digunakan untuk menandai rum saat telah diherbida. Saya memotong dan membungkuk kawat. Kemudian saya membuat lubang di lapangan permainan dan mencantumkan rel di tempat.
Pop Bumpers
Rangkaian pop bumpers dapat dibeli di sini. Anda juga akan membutuhkan saklar dan cap. Pop bumpers dipasang dengan membuat tiga lubang, dua untuk tiang logis dukungan dan satu untuk poros yang mengaktifkan saklar. Ketika bola menggulung ke cakram putih yang terlihat pada pandangan atas, itu mendorong poros ke bawah. Ini mengaktifkan saklar daun, yang kemudian mengaktifkan solenoid. Solenoid kemudian menarik cincan logis ke bawah yang mengirim bola ke arah berlawanan.
Penyambungan semua ini pada dasarnya sama dan disebutkan dalam bagian Arduino.
Ringkasan
Setelah Anda memulai, Anda pasti akan menemukan lonceng dan peluit lain yang ingin Anda tambahkan, tetapi ini harus memulai Anda.
Kode
Arduino Pinball Machine Code
Arduino Pinball Machine CodeArduino
Allows the Arduino to control the game play of a home made pinball machine
const int TxPin = 17; long Score = 0; long OldScore = 0; long Target = 1; long Pop = 1; long Roll = 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 Pressure = 1024; #include <SoftwareSerial.h>; SoftwareSerial mySerial = SoftwareSerial(255, TxPin); void setup() { /* Words without an s are the value achieved by interacting with a device. * Works with an s keep track of which individual ones were interacted with. * The latter is needed to determine when all have been hit and the value needs upgrading * and the lights need turning off. */ pinMode(TxPin, OUTPUT); digitalWrite(TxPin, HIGH); mySerial.begin(9600); mySerial.write(12); // Clear mySerial.write(17); // Turn backlight on //target inputs 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); //rollover inputs pinMode(10,INPUT_PULLUP); pinMode(11,INPUT_PULLUP); pinMode(12,INPUT_PULLUP); //lower ball shot switch pinMode(15,INPUT_PULLUP); //upper ball shot switch pinMode(16,INPUT_PULLUP); //lcd output pinMode(17,OUTPUT); //target lights, respective pinMode(32,OUTPUT); pinMode(33,OUTPUT); pinMode(34,OUTPUT); pinMode(35,OUTPUT); pinMode(36,OUTPUT); pinMode(37,OUTPUT); pinMode(38,OUTPUT); pinMode(39,OUTPUT); //rollover lights, respective pinMode(40,OUTPUT); pinMode(41,OUTPUT); pinMode(42,OUTPUT); //pop bumper lights pinMode(50,OUTPUT); pinMode(51,OUTPUT); pinMode(52,OUTPUT); pinMode(53,OUTPUT); } void loop() { // put your main code here, to run repeatedly: //If a pull-down resistor is used, the input pin will be LOW when the switch is open and HIGH when the switch is closed. //check if a target was hit //****** Targets ***** for (int i=0; i<8; i++){ if (digitalRead(i+2) == LOW){ //Target activated Targets[i]=1; Score = Score + Target; //turn on Target light digitalWrite(i+32,HIGH); //delay so as not get multiple points for one hit delay(Milli); break; } } Sum = 0; for (int i=0; i<8; i++){ Sum = Sum + Targets[i]; } if (Sum == 8){ //all Targets lit, so flash and then turn off. 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); //Multiply target value by 10 Target = Target * 5; //goto Skip; } // *********** Rollovers ********* for (int i=0; i<3; i++){ if (digitalRead(i+10) == LOW){ //rollover activated Rolls[i]=1; Score = Score + Roll; //turn on rollover light digitalWrite(i+40,HIGH); //delay so as not get multiple points for one hit delay(Milli); break; } } Sum = 0; for (int i=0; i<3; i++){ Sum = Sum + Rolls[i]; } if (Sum == 3){ //all rollovers lit, so flash and then turn off. 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); //Multiply score by 2 Score = Score * 2; Roll = Roll * 10; //goto Skip; } //********** Pop Bumpers ********** for (int i=0; i<4; i++){ if (analogRead(i) > 500){ //pop activated Pops[i]=1; Score = Score + Pop; //turn on pop bumper light digitalWrite(i+50,HIGH); //delay so as not get multiple points for one hit //mySerial.print(analogRead(i)); //mySerial.print(" "); delay(Milli); break; } } Sum = 0; for (int i=0; i<4; i++){ Sum = Sum + Pops[i]; } if (Sum == 4){ //all pop bumpers lit, so flash and then turn off. 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); //Multiply target value by 10 Pop = Pop * 2; //goto Skip; } Skip: //Determine ball number if (digitalRead(15) == LOW){ //ball hit lower alley switch //if not already done so, increase Ball if (Shot == 0){ //Set Lost = 0 since not on pressure pad Lost = 0; Pressure = analogRead(7) + 20; //set OldScore so as to reprint ball value on LCD OldScore =-1; Ball = Ball + 1; if (Ball == 6){ Ball = 1; Score = 0; Target = 1; Roll = 1; Pop = 1; } Shot = 1; } } if (digitalRead(16) == LOW){ //ball hit lower alley switch //if not already done so, increase Ball if (Shot == 0){ //Set Lost = 0 since not on pressure pad Lost = 0; Pressure = analogRead(7) + 15; //set OldScore so as to reprint ball value on LCD OldScore =-1; Ball = Ball + 1; if (Ball == 6){ Ball = 1; Score = 0; Target = 1; Roll = 1; Pop = 1; } Shot = 1; } } if (analogRead(7) > Pressure){ //ball on pressure pad Shot = 0; if (Lost == 0){ //mySerial.print(analogRead(7)); //Score = Score + 100; Lost = 1; if (Ball == 5){ //Game Over //flash rollovers and then turn off. 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; } // flash pop bumpers and then turn off 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; } //Flash Targets and then turn off. 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); // Clear delay(5); // Required delay mySerial.print(Score); // First line mySerial.write(13); // Form feed mySerial.print("Game Over!!!"); // Second line } } } //print to LCD if (Score != OldScore){ mySerial.write(12); // Clear delay(5); // Required delay //mySerial.print(analogRead(7)); mySerial.print(Score); // First line mySerial.write(13); // Form feed mySerial.print("Ball = "); // Second line mySerial.print(Ball); OldScore = Score; } }