Main Restorations Software Audio/Jukebox/MP3 Everything Else Buy/Sell/Trade
Project Announcements Monitor/Video GroovyMAME Merit/JVL Touchscreen Meet Up Retail Vendors
Driving & Racing Woodworking Software Support Forums Consoles Project Arcade Reviews
Automated Projects Artwork Frontend Support Forums Pinball Forum Discussion Old Boards
Raspberry Pi & Dev Board controls.dat Linux Miscellaneous Arcade Wiki Discussion Old Archives
Lightguns Arcade1Up Try the site in https mode Site News

Unread posts | New Replies | Recent posts | Rules | Chatroom | Wiki | File Repository | RSS | Submit news

  

Author Topic: Skee Ball Scoring System  (Read 4042 times)

0 Members and 1 Guest are viewing this topic.

wsand90

  • Trade Count: (0)
  • Jr. Member
  • **
  • Offline Offline
  • Posts: 3
  • Last login:November 16, 2019, 09:16:07 am
  • I want to build my own arcade controls!
Skee Ball Scoring System
« on: October 18, 2019, 10:48:40 am »
I have built a skee ball game for my church youth group and I need some help on the scoring electronics.  I have read several posts and I still do not have a scoring system that works.  I am using the classic 7 hole scoring system.  Two holes are 100 points, one hole is 50 points, one hole is 40 points, one hole is 30 points, one hole is 20 points and one hole is 10 points.  I have installed the original type micro switches at the hole exits.  I am going with a single player setup with a score reset after game completion.  I am using an Arduino 2560 micro controller, 20x4 LCD and three Max 7219 matrices in series (display) for the scoring system.  I have attached the schematic in a pdf format and the Arduino code in a Word format.  The schematic only displays one Max 7219.  When using the game, I get the last Max 7219 to display a zero and when any ball switch is actuated, the zero gets a momentary line down the center.  Any help is appreciated.  It appears the code did not upload. 

The following is my code:

/////////////////////////////////////////////
      //    This Sketch is for                   //
     //      Skee                               //   
    //       Ball                              //
   //        Game                             //
  /////////////////////////////////////////////
                                            //include all libraries
 #include <LiquidCrystal.h>
 #include <MaxMatrix.h>
 #include <avr/pgmspace.h>
                                         //assigned micro controller pins to 7 Micro Switches
 int Micro_Switch1= 22;                 // for 10 score switch
 int Micro_Switch2= 24;                // for 20 score switch
 int Micro_Switch3= 26;               // for 30 score switch
 int Micro_Switch4= 28;              // for 40 score switch
 int Micro_Switch5= 30;             // for 50 score switch
 int Micro_Switch6= 32;            // for 100 score switch
 int Micro_Switch7= 34;           // for 100 score switch
 int Reset_Button = 6;           //  reset Button         
                                // defined MAX7219 module pins
int DIN = 48;                  // DIN pin of MAX7219 module
int CS = 50;                  // CS pin of MAX7219 module
int CLK = 52;                // CLK pin of MAX7219 module
int maxInUse = 3;           // define No. of modules
MaxMatrix m(DIN, CS, CLK, maxInUse);
                                               // initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int Score_Count =0;                          // Variable to store score values
 
void setup() {
                                          // put your setup code here, to run once:
  m.init();                              // module initialize
  m.setIntensity(10);                   // dot matix intensity 0-15
  m.clear();                           // Clears the display
Serial.begin(9600);
 lcd.begin(20,4);                     // set up the LCD's number of columns and rows:
  pinMode(Micro_Switch1,INPUT);
   pinMode(Micro_Switch2,INPUT);
    pinMode(Micro_Switch3,INPUT);
     pinMode(Micro_Switch4,INPUT);
      pinMode(Micro_Switch5,INPUT);
       pinMode(Micro_Switch6,INPUT);
        pinMode(Micro_Switch7,INPUT);
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Skee Ball Game");
        lcd.setCursor(0,1);
        lcd.print("Player Score");
        lcd.setCursor(0,2);

}

void loop() {
                            // put your main code here, to run repeatedly:
     const byte NUM_0[]={                                                    // 0
                  4, 8,
                  B00111110,
                  B01000001,
                  B01000001,
                  B00111110,
                  B00000000,
                 };
     
     
     const byte NUM_1[]={                                                    // 1
                 4, 8,
                 B01000010,
                 B01111111,
                 B01000000,
                 B00000000,
                 B00000000,
                 };
                 
     const byte NUM_2[]={                                              // 2
                 4, 8,
                 B01100010,
                 B01010001,
                 B01001001,
                 B01000110,
                 B00000000,
                };
               
      const byte NUM_3[]={                                          // 3
                4, 8,
                B00100010,
                B01000001,
                B01001001,
                B00110110,
                B00000000,
                };
 
       const byte NUM_4[]={                                          // 4
                4, 8,
                B00011000,
                B00010100,
                B00010010,
                B01111111,
                B00000000,
                };
               
       const byte NUM_5[]={                                  //5                       
               4, 8,
               B00100111,
               B01000101,
               B01000101,
               B00111001,
               B00000000,
               };
     const byte NUM_6[]={                             // 6
               4, 8,
               B00111110,
               B01001001,
               B01001001,
               B00110000,
               B00000000,                 
      };
 
      const byte NUM_7[]={                        // 7
               4, 8,
               B01100001,
               B00010001,
               B00001001,
               B00000111,
               B00000000,
     };
       const byte NUM_8[]={                    // 8
               4, 8,
               B00110110,
               B01001001,
               B01001001,
               B00110110,
               B00000000,
       };
       
       const byte NUM_9[]={                 // 9
               4, 8,
               B00000110,
               B01001001,
               B01001001,
               B00111110,
               B00000000,
     };
     
                if(digitalRead(Reset_Button) == HIGH)
               {
                Score_Count = 0;
                lcd.print(Score_Count);
                m.clear();                 // Clears the display
                m.writeSprite(2, 0, NUM_0);
               }
               if(digitalRead(Micro_Switch1) == LOW)
               {
                Score_Count = 10+Score_Count;
                lcd.print(Score_Count);
                m.writeSprite(2, 0, NUM_1);
                m.writeSprite(2, 0, NUM_0);             
               }
                              if(digitalRead(Micro_Switch2) == LOW)
               {
                Score_Count = 20+Score_Count;
                lcd.print(Score_Count);
                m.writeSprite(2, 0, NUM_2);
                m.writeSprite(2, 0, NUM_0);             
               }
                              if(digitalRead(Micro_Switch3) == LOW)
               {
                Score_Count = 30+Score_Count;
                lcd.print(Score_Count);
                m.writeSprite(2, 0, NUM_3);
                m.writeSprite(2, 0, NUM_0);               
               }
                              if(digitalRead(Micro_Switch4) == LOW)
               {
                Score_Count = 40+Score_Count;
                lcd.print(Score_Count);
                m.writeSprite(2, 0, NUM_4);
                m.writeSprite(2, 0, NUM_0);               
               }
                              if(digitalRead(Micro_Switch5) == LOW)
               {
                Score_Count = 50+Score_Count;
                lcd.print(Score_Count);
                m.writeSprite(2, 0, NUM_5);
                m.writeSprite(2, 0, NUM_0);
               
               }
                              if(digitalRead(Micro_Switch6) == LOW)
               {
                Score_Count = 100+Score_Count;
                lcd.print(Score_Count);
                m.writeSprite(2, 0, NUM_1);
                m.writeSprite(2, 0, NUM_0);
                m.writeSprite(2, 0, NUM_0);
               
               }
                              if(digitalRead(Micro_Switch7) == LOW)
               {
                Score_Count = 100+Score_Count;
                lcd.print(Score_Count);
                m.writeSprite(2, 0, NUM_1);
                m.writeSprite(2, 0, NUM_0);
                m.writeSprite(2, 0, NUM_0);
               
               }
}
« Last Edit: October 26, 2019, 09:19:57 am by wsand90 »

pdco_arcade

  • Trade Count: (0)
  • Full Member
  • ***
  • Offline Offline
  • Posts: 27
  • Last login:January 09, 2024, 03:24:54 pm
  • Nothing for now.
Re: Skee Ball Scoring System
« Reply #1 on: October 01, 2023, 01:56:34 pm »
Hi wsand90,

We you able to get you scoring system operating as you wanted it to?


lilshawn

  • Trade Count: (+3)
  • Full Member
  • ***
  • Offline Offline
  • Posts: 7377
  • Last login:Yesterday at 11:41:53 pm
  • I break stuff...then fix it...sometimes
Re: Skee Ball Scoring System
« Reply #2 on: October 02, 2023, 05:45:04 pm »
all y'all way over complicating this bro.

if you look at the original skeeball tracks, the center stack all share a chute with 5 switches and every switch actuation scores 10 points. so if you toss it in 30, it rolls down 3 of the 5 total switches, (scoring 30 points total) you toss it in 10 points... it rolls over 1 switch... etc

the corners that score "100" points each have a switch that scores 50 points... then roll down the center chute (going over the 5 center stack switches as well scoring 50 points. (50+10+10+10+10+10)

2 inputs, one programmed to set the scoring 10 points per actuation the other to set the scoring 50.

EZPZ

pdco_arcade

  • Trade Count: (0)
  • Full Member
  • ***
  • Offline Offline
  • Posts: 27
  • Last login:January 09, 2024, 03:24:54 pm
  • Nothing for now.
Re: Skee Ball Scoring System
« Reply #3 on: October 04, 2023, 11:43:08 am »
I agree with what you say.

I think depends on the Skee-Ball implementation desired.  If is like traditional play then that original method of scoring is good.  If additional game types are desired then would be useful to detect a ball into each hole.  Some folks on this site have described a game where a hole is illuminated via LED and extra points are awarded if a ball enters that specific hole while illuminated.  For this type of game the traditional scoring method would not work so well.

lilshawn

  • Trade Count: (+3)
  • Full Member
  • ***
  • Offline Offline
  • Posts: 7377
  • Last login:Yesterday at 11:41:53 pm
  • I break stuff...then fix it...sometimes
Re: Skee Ball Scoring System
« Reply #4 on: October 04, 2023, 08:56:19 pm »
dont try to complicate with hardware, what can easily be programmed in software.

light up 30... then if switch presses over a 1500ms sample = 3 then add 100 bonus points... otherwise, score regular points.

 :dunno

RandyT

  • Trade Count: (+14)
  • Full Member
  • ***
  • Offline Offline
  • Posts: 6882
  • Last login:March 26, 2024, 03:33:28 pm
  • Friends don't let friends hack keyboards.
    • GroovyGameGear.com
Re: Skee Ball Scoring System
« Reply #5 on: March 12, 2024, 09:16:15 pm »
dont try to complicate with hardware, what can easily be programmed in software.

light up 30... then if switch presses over a 1500ms sample = 3 then add 100 bonus points... otherwise, score regular points.

 :dunno

Yeah, it's an old thread, but I just saw it :)

Honestly, I think the reason it was done that way was a holdover from the mechanical scoring from the original units.  And later it was done to preserve precious inputs on expensive and complicated (at the time) electronics.  There are benefits to running everything with it's own switch.  First is easy identification of a bad switch (i.e. if the ball goes in any of the holes and sometimes doesn't give you any points, you know that switch is not registering.  The second is that each hole is a thrown ball, so both the score and the ball count can update immediately, which can make timed or goal-oriented games feel much more reactive to the player (or as stated before, even possible).  The third is that software can make a direct scoring switch arrangement simulate the old switch arrangement for the purist (by counting up the score with some appropriate delays) but the old arrangement can't offer the same functionality as the directly scoring switches.

The cons are a bit more complicated ball guide, 8 scoring/ball-counting inputs instead of 4, more wire and an extra switch (if you want the 100 holes separated.) But compared to building an arcade machine, all of that is a walk-in-the-park :)

So if I were building my own unit, I would definitely go the more "future-proof" route of having each hole as it's own mappable entity.