| Main > Project Announcements |
| DIY Skeeball |
| << < (22/28) > >> |
| RandyT:
--- Quote from: Ixliam on January 19, 2005, 06:05:52 pm ---Momentary contact is like your arcade buttons. Long as you hold it down, it makes contact. Normal contact is like a lightswitch, you put it in a certain position, it stays there till you switch it to something else. Had I used transistors connected to the switches then directly to the TTL circuit, there would not be a problem, since in order to count the "pulse" must be +5V then 0V. Since I wanted an easy way to handle sound and programming, I'm using an old Pentium (1) 180mhz machine with 16mb ram to handle it. Allegro handles it very well, and the program is very simple when you think about it. At the basic stage it takes a keypress, sends out the pulses to run the score or ballcount circuits, then plays a sound according to the ring you hit. There are no graphics or anything like that at all, but if you wanted that to use with a pc monitor RandyT's Keywiz and associated program will do all of that. --- End quote --- The machine looks great, Brad! So did you end up using the KeyWiz to send the keypresses to your software or hack a keyboard? Just wanted to make a couple of comments on your bounce issue: The most probable reason Skeeball went to optical sensors is maintenance. Microswitches are mechanical devices and like all things mechanical, they wear out. When you consider the original arrangement of the switches where when a 50 point ring was hit, each of the switches were hit to count the score up, it's not hard to guess the failure rate. In fact, you can pretty much guarantee that the the ball counter, 10 and 20 switches would be the first to fail, as these would get the most action. The key, I believe, is going to lie in finding a method to restrict the balls' motion to one plane of movement. Some things that might help would be speed reducing/guiding baffles, tight channels (like the V-groove used by Skeeball) or even PVC pipe that is slightly larger than the ball diameter. Once you achieve smooth movement of the balls, it should be simple to tweak the microswitches so they do what you want. You might also want to consider a switch with a stiffer actuation style...perhaps more of a "roller" or even the "blade" actuator like the ones used on a "Super" or X-arcade joystick, rather than the very sensitive ones used for coin switches. --- Quote ---I'm just waiting on RandyT to start building a skeeball. --- End quote --- Heh. I always have a lot of "irons in the fire", but I actually have a 10' long, "knock-down" or "flat-pack" style machine currently at about 90% completion in CAD. My goal won't be to duplicate the appearance of the original (hopefully that can be improved on a little for a home game-room), only the playing experience....and also the ability to be built from a kit or simple plans. The problem is, a machine that large gets very heavy very quickly, even when every possible optimization is considered, so even a parts kit would need to be palletized and delivered by freight truck. But, I expect to build at least one for my own use, even if not until Spring hits. :) RandyT |
| JackTucky:
Ixliam: How does the play "feel"? Could you play this constantly at home for a year, then go out to the arcade and kill 'em dead with tickets? Get tons of free spider rings and erasers? Art |
| bioart:
Oh, my wife would let me move and build one just for her... now we just need to save enough to move :) Art |
| Ixliam:
RandyT: I am using the Keywiz encoder on the machine. I do understand the whole weight issue, it is pretty heavy. I am able to move both pieces myself, but I would put the weight at around 300lbs or so. That's just a guess. A home version that did not want to duplicate the machine could be done a good bit easier. A simple under the ramp ball return via PVC pipe or straight ramp would be easier than an automated ball return/release like I am working on. Main thing is the ramp and the targets, and depending on what the person wanted, a skeeball-like appearance. Even if the weight was minor, you still have a large amount of space eat up with one of these. I did think about the roller style switches, but went with what I saw on the older skeeball machines. But, eventually I will go to an optical circuit. I don't know how much of a market there would be for a kit, since the shipping would be almost the same as shipping an entire arcade game, which would then drive up the cost to almost what a used skeeball would run. Plans would be better, and I do plan on putting mine online along with a website, possibly even selling the scoreboard circuit if someone wanted to go that route. In either case, those things still take up some significant floorspace. Art: Play-wise, it feels like the real thing. Only thing better will be when I finsgh up the ball-release mechanism to be a one button thing. Right now I push a button to reset the score, and pull a lever to release the balls. This is similar to some of the old ones I played, but I'd rather have a one button system. I think you could get your skill level up then go to an arcade and smoke them. Each machine will play a slight bit different just due to wear and quirks in it, but I would bet after a few rolls you could get it nailed down and walk away with some nice prizes. I play just as well on mine as I do on the real one (i.e.l I kinda suck) but I do have alot of fun at it. Brad |
| Ixliam:
Here is the source code for the program just for the record --- Code: ---/* Roller-Ball PC Interface * compiled with Borland C++ version 5.22 under Windows XP Pro * Copyright (c) 2005 by Brad P. Wilson, Austell GA - USA */ #include <stdio.h> #include <pc.h> #include <bios.h> #include <conio.h> #include <unistd.h> #include <allegro.h> #define DELAY 3000000 // Increase to slow down score counting void delay(void); int main(void) { if (allegro_init()) { allegro_message("Cannot initalize Allegro.\n"); return 1; } install_timer(); if(install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL)) { allegro_message("Sound Error: %s", allegro_error); return 1; } set_volume(255, 255); //digital and music to max levels install_keyboard(); set_keyboard_rate(0,0); int roll; int ball=0; int skbscore=0; printf("------------------------------------------\n"); printf("- Brad Wilson's Roller Ball PC Interface -\n"); printf("------------------------------------------\n"); /*Initialize Skeeball**/ // 0x00 ALL OFF // 0x01 DS0 ON // 0x04 DS2 ON // 0x05 DS0 & DS2 ON (outportb)(0x378,0x00); //Everything off bool score1 = false; bool score2 = false; bool score3 = false; int bkey=0; SAMPLE *SndFx; do { roll = readkey(); printf("Key - %d\n",roll); switch(roll) { case 353: printf(" Ring 10\n"); SndFx = load_wav("10ring.wav"); // or .voc play_sample(SndFx, 255, 128, 1000, 0); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); skbscore += 10; clear_keybuf(); break; case 4979: printf(" Ring 20\n"); SndFx = load_wav("20ring.wav"); // or .voc play_sample(SndFx, 255, 128, 1000, 0); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); skbscore += 20; break; case 4465: printf(" Ring 30\n"); SndFx = load_wav("30ring.wav"); // or .voc play_sample(SndFx, 255, 128, 1000, 0); (outportb)(0x378,0x00); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); skbscore += 30; break; case 6007: printf(" Ring 40\n"); SndFx = load_wav("40ring.wav"); // or .voc play_sample(SndFx, 255, 128, 1000, 0); (outportb)(0x378,0x00); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); skbscore += 40; break; case 2409: printf(" Ring 50\n"); SndFx = load_wav("50ring.wav"); // or .voc play_sample(SndFx, 255, 128, 1000, 0); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); delay(); (outportb)(0x378,0x01); //Score Count (outportb)(0x378,0x00); skbscore += 50; break; case 2666: printf(" Ball Count\n"); // PlaySound("gutter.wav", NULL, SND_ASYNC); (outportb)(0x378,0x04); //Ball Count (outportb)(0x378,0x00); ball +=1; break; case 5750: printf("Program Exit.\n"); break; default: break; } if(skbscore >= 240 && score1 == false) { //PlaySound("240score.wav", NULL, SND_ASYNC); SndFx = load_wav("240score.wav"); // or .voc play_sample(SndFx, 255, 128, 1000, 0); score1 = true; } if(skbscore >= 450 && score2 == false) { SndFx = load_wav("450score.wav"); // or .voc play_sample(SndFx, 255, 128, 1000, 0); score2 = true; } if(skbscore >= 900 && score3 == false) { //PlaySound("900score.wav", NULL, SND_ASYNC); score3 = true; } if(ball == 9) { // PlaySound("gameover.wav", NULL, SND_ASYNC); ball = 1; skbscore = 0; score1 = false; score2 = false; score3 = false; } printf("Score: %d", skbscore); printf(" Ball: %d\n", ball); } while(roll != 5750); // Key M is EXIT - Switch to start later. (outportb)(0x378,0x00); destroy_sample(SndFx); remove_keyboard(); allegro_exit(); return 0; } void delay( void ) { long x; for ( x = 0; x < DELAY; x++ ); } --- End code --- Brad |
| Navigation |
| Message Index |
| Next page |
| Previous page |