Kamis, 20 Juli 2017

BAB 3 GAME ARDUINO PINBALL

Bab3 IMPLEMENTASI
Pada tahap ini akan dibuat implementasi dari game Pinball Arduino

3.1         Mesin Pinball Arduino


Membangun mesin pinball Arduino yang terkontrol membutuhkan kombinasi keterampilan kerja kayu, mekanik, elektronik dan pemrograman.

Seperti yang dapat Anda lihat dari gambar, mesin memiliki lemari kayu dan menggunakan suku cadang mesin pinball yang tersedia secara komersial. Mesinnya dikontrol oleh satu dewan Arduino Mega 2560.
Gambar 3.1: Mesin Pinball

Kasusnya semua dimensi dalam dokumen ini berukuran beberapa inci. Panel depan dan belakang 20H x 23W. Panel sampingnya adalah 20H x 47L. Potongan-potongannya dipotong dengan tepi yang digergaji dan dihubungkan menggunakan penggabung biskuit dan lem kayu. Sekrup dan lem juga bisa bekerja. Mesin akan mengambil banyak penyalahgunaan sehingga perlu kuat. Sebelum digabung, potong ¾ "dado 1 inci dari atas. Jangan merekatkan rak. Perlu mengapung untuk memungkinkan ekspansi dan kontraksi. Rak itu digunakan untuk menahan catu daya utama dan catu daya untuk lampu LED dekoratif yang dipasang di bawah penutupnya. Permukaan bermain adalah 22w x 42L. Perhatikan bahwa itu secara signifikan lebih pendek dari kabinet. Ini memberi sekitar 3 inci di depan untuk melewati kabel sampai tombol sirip dan lampu LED. Ini juga memberi ruang bagi mekanisme plunger bola. Permukaan bermain hanya terletak pada beberapa balok kayu kecil yang disekrup ke sisi sekitar 4 inci di bawah bagian atas kasus ini. Untuk mendapatkan isi dari mesin, cukup membuka tutupnya, lepaskan bidang permainan dan balikkan.
Kasus dan permukaan bermain semua dibangun di sudut kanan. Pitch dari permainan ini disediakan oleh kaki seperti yang ditunjukkan oleh sisi ini. Mesin pinball bisa memiliki sudut dari sesedikit 1 sampai 7 derajat. Semakin tinggi angle semakin cepat game. Rancang kaki agar bisa disesuaikan. Kaki-kaki itu sendiri terbuat dari kayu. Kemudian mengebor lubang 12 inci jauh di ujung masing-masing kaki menggunakan sedikit auger. Di ujung bawah saya menggunakan dua komponen epoxy untuk memasukkan
kacang tester 3/8 inci. Hati-hati jangan sampai lem di benang atau di tempat yang akan menghalangi lubang yang Anda bor. Saya kemudian memasukkan batang benang inci 12/8 inci ke kaki dan saya memasukkan mur ke batangnya.
Pelat pemasangan meja kaki hanya disekrupkan ke rak paling bawah dan kaki-kaki disekrupkan. Untuk menyesuaikan tinggi mesin, cukup lepaskan mur dan kemudian gerobak batang berulir masuk atau keluar. Kemudian kencangkan mur untuk memastikan meja tetap aman.
Kabel listrik berasal dari soket ekstensi yang terpasang pada bagian belakang mesin. Semuanya terpasang di sana, sehingga satu sakelar menghidupkan atau mematikan semuanya. Kabel USB ada di sana, sehingga saya bisa memprogram ulang papan Arduino tanpa harus melepas lapangan permainan.
Arduino Mega 2560 pada dasarnya melakukan empat hal. Ini menentukan kapan saklar diaktifkan, ternyata lampu menyala atau mati sesuai, melacak skornya, dan ini akan menampilkan nilai dan nomor bola pada LCD kecil. Sebagian besar kabelnya cukup sederhana. Misalnya, target terhubung ke salah satu masukan digital Arduino dan ke tanah. Masukan dikonfigurasi dengan menggunakan pernyataan seperti ditunjukkan di bawah ini.
Ketika kode mendeteksi bahwa input telah berubah dari yang tinggi ke rendah, ia mengetahui bahwa target telah dipukul dan kemudian menyalakan lampu pinball LED yang sesuai.
3.2          Penjelasan Hardware

3.2.1       Peralatan
Berikut adalah peralatan yang digunakan untuk membuat game Pinball dengan menggunakan arduino.
1. Arduino Mega 2560 & Genuino Mega 1560

Gambar 3.2: Arduino Mega 2560

2. Adfruit 2-pin LCD Display

Gambar 3.3: Adfruit 2-pin LCD Display

Gambar 3.4: Adfruit 2-pin LCD Display

Gambar 3.5: Adfruit 2-pin LCD Display

Gambar 3.6: Adfruit 2-pin LCD Display

3. 24V Power Supply

Gambar 3.7: 24V Power Supply



4. Adafruit Force Sensor


Gambar 3.8: Adafruit Force Sensor

Gambar 3.9: Adafruit Force Sensor

5. Pop Bumper Assembly

Gambar 3.10: Pop Bumpers Assembly

6. Pop Bumper Switch

Gambar 3.11: Pop Bumper Switch

7. Target Switch

Gambar 3.12: Target Switch

8. Rollover Switch

Gambar 3.13: Rollover Switch

9. Flipper Assembly

Gambar 3.14: Flipper Assembly

10. LED Lamps

Gambar 3.15: LED Lamps

3.3          Listing Program

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() {
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() {
//****** 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 feedmySerial.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;

}
}

Tidak ada komentar:

Posting Komentar