Casino Win uno how the great wall slot evolve
Arduino slot machine
This project is an alien-themed slot machine implementation using two Atmega328P-PU microcontrollers. This slot machine is only for entertainment and educational purposes. I worked hard to simulate the real slot machine as much as possible. The project is completely built. After the parts arrived from China, the housing was added and everything was soldered. This project was made for about a month with free time. The most difficult thing in this project was to understand and prove all the calculations needed to realize the simple slot machines that the casino industry expected.
Step 1: Mechanism of the game
This game has three reels, each reel draws the same 25 symbols (one of the 8x8 matrix with four 8x8 matrix drawn is used). If you have three spaceships, a jackpot. If you have two or two spaceships, you can get credit. If you have three or three symbols, jackpots. As shown in the figure below, if the spacecraft and two symbols match, the game will be paid based on the lowest probability/ highest payout election event. In other words, the winning events are exclusive to each other, and one reel spin cannot win in two different ways. For this reason, the programming became a little simpler. For me, there were many other challenges.
Step 2: Slot machine menu and functions
Slot machines have several interesting features, accessing from 20 Г— 4 I2C compatible LCD displays using two navigation buttons and select buttons. The button uses a fairly sophisticated debus algorithm that uses the external interrupt function of the microcontroller. This is the main menu.
There are six left menus, so to see the entire menu, you need to scroll down using the "Move down" button. There is a lever / knife switch dedicated to "turn" the reel. In addition, you can select "Play" from the main menu. The bed can be changed at any time.
The most exciting function is that you can play games in "auto" mode. In other words, if you select an auto mode option from the LCD screen setting menu, the game will be played again and again until one million plays are performed. This is an important feature for testing games. You can also disable the sound here.
It is also possible to display all metrics generated from the simulation from the menu on the LCD. If you connect the microcomputer to a monitor via an RX pin and TX pin with a USB cable, you can also see these metrics and see it on a serial monitor. The displayed metrics list includes credit balance, number of jackpots, and number of credits in other ways. As a result, a simulation based on various payouts was performed, which helped to establish and prove the payout table. The payout table itself cannot be set. By using the volatility index to move the payout table, it will be possible to set the volatility index, but that will require more work.
The reset options can reset all metrics (excluding eeprom writing) to zero. This chip can be written about 100, 000 times to Eeprom. The chips have 512k EEPROMs and we only use a part of them, so as we approach 100, 000 times, it will be possible to actually move the metrics in Eeprom. I have never implemented this function, but it will be a way to extend the life of the chip.
Finally, you can set the hold, the percentage of each bet, the house holding (depending on the time passed). Remember that you need to set the hold again after reset operation.
The player's credit balance is always displayed on an 8-digit 7-segment display.
Step 3: Understand the calculation
Many work was done to make sure the game was realistic. The probability was calculated, and the payout table was designed to have a volatility index (VI) that can be tolerated for the game. This index measures how much the behavior of the machine is predictable. A highly VI machine is likely to bring a lot of money to players (or houses). The lower the VI, the less predictable. It is true that the exact same game exists in different VIs in different casinos (or even in the same casino). VI is changed by operating the payout schedule. In our games, the probability and payout of each type of victory are as follows.
Note that the odds (far right) and payout (far left) are significantly different. If this game were programmed so that the payout table matched the odds or even followed the odds faithfully, the VI would be unacceptably high. The hold is calculated as a percentage of the payout and is the portion of the wager that the house/casino keeps. As mentioned above, the hold can be set in the LCD menu. Keep in mind that different jurisdictions have different regulations governing the maximum hold percentage for slot machines in that jurisdiction. A typical maximum hold percentage is 15%. Setting the maximum hold allowed by law does not necessarily maximize the profits generated by the machine. However, I suspect that many players ignore the holds that are typically buried in the fine print, that the demand curve for gaming machines is relatively vertical (i. e., holds, which are the cost of using the machine, are largely ignored), and that the profits generated by a gaming machine depend much more on the location and placement of the gaming machine than on the design of the gaming machine itself. But that is just a guess. Some knowledgeable gamblers may be sensitive to holds.
To prove that the game works correctly, a spreadsheet with three tables is provided with the code (the first table is shown above). The first step in creating the spreadsheet was to calculate exactly the probability of each type of win (the Calculated Probabilities column).
3 Spaceships The probability of 3 spaceships appearing is the inverse of the total number of possible combinations. The number of winning combinations out of the total number of possible combinations, 15625, is 1. Since there are 25 unique symbols on each reel, the probability is 1 / (25 x 25 x 25), or 0. 000064. This means that the odds are 1 / Probability - 1, or 1 in 15624. We learned here how to calculate odds from probabilities.
Matching 3 symbols (excluding Spaceship) The odds of matching 3 symbols excluding Spaceship are 24 (the number of unique symbols on each reel excluding Spaceship) divided by the number of possible combinations. There are 24 possible combinations where the 3 symbols can match, so 24 is the numerator. 24/15625 = 0. 001536. This means the odds are 1 in 650. 04.
There are a total of 24 x 3 combinations in which two spaceships match the spacecraft. That's because there are three ways to make one spacecraft into two combinations. X = spacecraft, Y = other symbols, XXY, XYX, YXX. Y has 24 ways, 24 x 3 /15625 = 0. 004608. The odds are one to 216. 01.
A spacecraft appears on each reel, with a combination of 24x24 where one spacecraft appears. Since the spaceship can appear in any reel, it is necessary to multiply the number of combinations possible with one reel with three reels. In other words, the probability is 24 x 24 x 3 /15625 = 0. 110592. The probability is on e-t o-8. 04.
When a symbol matches, when two symbols, excluding spaceships, the symbols other than the spaceship are 23 (one space ship deducted, one symbol with three symbols matches) x 3 reel. It will be 24. The probability is (23 x 3 x 24)/15625 = 0. 105984. The odds are on e-o n-one 8. 44.
It has been confirmed that the Probabilities Actual is almost the same as "Calcullated Probability", and that the "PCT Diff Prob" column is appropriate. In addition, the value of the "House Pays" line is the "InCome High" column and the "InCome Low" column in the "Understanding Potential Income" table (2nd table), and the "Actual RESULTS" table is in line with the value of the "Income Low" column. We have confirmed that the value is within the specified range in the "InCome High" column and the "InCome Low" column. The "Understanding Potential Income" is defined for the expected income range for a hold value, along with a 90%confidence interval. In the following example, since the hold value is set to 0, the possibility of winning and the loss of losing is consumed. If you play this game one million times, the possibility of income between 16, 432 an d-16, 432 is 90%.
As a result of the million simulation using spreadsheets and programs, I can solve the program defects, deal with the flaws of the spreadsheet, and define the value of the payout table that maintains VI. Ta.< 20. Finally I changed the hold to 15% and ran another set of 5 simulations to verify that the game's income is in line with expectations if it were to be deployed in a real world situation Here is the income table for a 15% hold.
And this is the actual result.
If you really want to understand all the mathematics related to the settings of the payout, we recommend that you check the formula for the spreadsheet. I am not a mathematician (or C programmer), so standard exemption is applied.
Step 4: Obtain tools and parts
I used FTDI's USB-to-Serial board to program both ATmega328P-PU microcontrollers in-place. These connections are not depicted in the Fritzing schematic. See this link for instructions on setting up the FTDI breakout board on a solderless breadboard. You may need to do a bit of googling to get it set up. I also found this post helpful in troubleshooting an issue I had trying to get the microcontroller to automatically reset when starting programming via the FTDI breakout board. Don't forget to put a 100 nF capacitor in series with the connection between the reset pin on the ATmega328 (position 1/PC6/Reset pin) and the RTS on the FTDI breakout board. If you're using an Arduino Uno to program the chips, here are the instructions. If you're just going to program the chips once with the included code, it's probably quickest and easiest to program them from an Arduino Uno.
Both microcontrollers are set up with an "Arduino" chip (ATmega328P-PU) on a breadboard. If you intend to eventually solder components together and build this project, or if you just want to mimic what I did here when setting up the project on a breadboard, you'll want to understand how to set up an Arduino on a breadboard. These instructions also include the steps you need to take if you need to load the Arduino bootloader onto the two chips. To do that, you'll need an AVR programmer like the AVRISP mk II or USBTiny ISP. If you have an Arduino, you can also use it to write the bootloader. Follow the link above, which explains all your options.
Parts
# | Cost | Part/ Description |
---|---|---|
2 | $3. 00 | ATMega328P-PU (for slot machines and I2C credit LED display slave) |
1 | $1. 20 | 8-digit 7-segment display |
1 | $3. 78 | 8x8 matrix 4-segment MAX7219 Simulates spinning reels and displays symbols. Only 3 of the segments are used. |
1 | $5. 37 | I2C 2004 Serial Blue Backlight LCD Module 20 X 4 2004 |
2 | $4. 00 | Solderless Breadboard |
6 | $1. 00 | Momentary contact buttons. One to control spinning the reels, three to navigate the menu, two to ground pin 1 on the ATMegas. |
1 | $0. 10 | RGB Diffused Common Dathode Used to send various signals |
1 | $0. 10 | The green LED indicates whether the power is supplied to the substrate. |
6 | $ 0. 30 | 4 10kО© resistors to pull up each button, 2 at ATMEGAS pin 1. |
4 | $ 0. 20 | 1KО© resistance |
This is the ordered housing, putting parts in this:
This product can be purchased here for $ 13. 80. This product can be purchased for $ 13. 80 here. We hope that the upper part is transparent so that there is no need to make a hole to see the reel and credit balance display. Let's see what will happen if it arrives! Proposals welcome.
Step 5: Make a circuit
You can get Fritzing circuit diagram here.
Since the FRITZING diagram is crowded, the wiring method of the microcontroller is described below. This does not indicate all the connections you need, but the confusion should be resolved. All unused pins are not on the ground, but they probably will contact you with the final product. If it is difficult to follow the FRITZING diagram regarding the setup of the power circuit, don't forget to add a power supply circuit. Don't forget to add a switch between the bred board's grand rail and the power circuit so that you can turn off or turn on the circuit without removing or removing the power plug. This is important when putting everything into the housing.
Slot machine
Pin 1-FTDI USB TO SERIAL Breakoutboard RTS, reset button.
Pin 2-FTDI USB TO SERIAL Breakoutboard TXD
Pin 3-FTDI USB TO SERIAL Breakoutboard RXD
Pin 4-1K О© Resistanc e-Momental "Spin" button
Pin 5-330О© Resistanc e-RGB LED Blue Pin
Pin 6-Unused, consider the ground.
Pin 7 VC C-Breadboard Power Rail, 0. 1UF capacitors
Pin 8 GN D-Breadboard Grand Rail, 0. 1UF capacitors
Pin 9 xtal 1-16MHz Crystal Motor, 22PF capacitors to Breadboard Grand Rail
Pin 10 XTAL 2-16MHz Crystal Motor, 22PF capacitors to Bredboard Grand Rail
Pin 1 1-Consider unused, ground
Pin 1 2-Unused, considering the ground
Pin 1 3-Unused, consider grounding
Pin 14-8x8 Matrix DIN
Pin 15-330О© resisto r-RGB LED red pin
Pin 16-330О© Resistanc e-RGB LED Green Pin
Pin 1 7-Piezo Buzer Masa o-Piezo Busze r-Bread Board Grand Rail
Pin 18-8x8 Matrix CS
Pin 19-8x8 Matrix CLK
Pin 20 AVC C-Breadboard Power Rail, 0. 1UF capacitors
Pin 21 AREF --Breadboard Power Rail
Pin 22 GND --Breadboard Grand Rail
Pin 2 3-Leave this pin in the floating.
24th pi n-1kО© resisto r-Momental "Navigate Up" button (mistake of Fritzing Diagram!).
Pin 2 5-1K О© Refe r-Momental "Navigate below" button
Pin 2 6-1K П‰ Restrictio n-Momental "Select" button
Pin 27 SD A-Display I2C Atmega328 P-PU Slave pin 27 SDA
Pin 28 SC L-Display I2C Atmega328 P-PU Slave pin 28 SCL
Display slave
Pin 1-FTDI USB TO SERIAL Breakoutboard RTS, reset button.
Pin 2-FTDI USB TO SERIAL Breakoutboard TXD
Pin 3-FTDI USB TO SERIAL Breakoutboard RXD
Pin 4-Unused.
Pin 5-Unused.
Pin 6-Unused, consider the ground.
Pin 7 VC C-Breadboard Power Rail, 0. 1UF capacitors
Pin 8 GN D-Breadboard Grand Rail, 0. 1UF capacitors
Pin 9 xtal 1-16MHz Crystal Motor, 22PF capacitors to Breadboard Grand Rail
Pin 10 XTAL 2-16MHz Crystal Motor, 22PF capacitors to Bredboard Grand Rail
Pin 1 1-Consider unused, ground
Pin 1 2-Unused, considering the ground
Pin 1 3-Unused, consider grounding
Pin 1 4-Unused, considering the ground
Pin 1 5-Piezo Buzer Masa o-Piezo Busze r-Bread Board Grand Rail
Pin 1 6-7 Segment Display CS
Pin 1 7-7 Segment Display CLK
Pin 18-7 Segment Display DIN
19th Pi n-Examination of unused, taking the ground.
Pin 20 AVC C-Breadboard Power Rail, 0. 1UF capacitors
Pin 21 AREF --Breadboard Power Rail
Pin 22 GND --Breadboard Grand Rail
No. 23 pi n-Consider unused, ground
Pin 2 4-Unused, considering the ground
Pin 2 5-Consider unused, ground
Pin 2 6-Unused, consider grounding
Pin 27 SD A-Slot Machine I2C Atmega328 P-Pu Pin 27 SDA
Pin 28 SC L-Slot Machine I2C Atmega328 P-Pu Pin 28 SCL
Step 6: Installing software
If you want to compile the code and upload it to an Atmega chip, you need to install all these libraries in the Arduino development environment. This page describes how to install the Arduino library.
- Arduino IDE
- Timer Fleetoon Library
- LED control library
- LCD library
- LCD I2C library
Step 7: Slot machine coding
I don't intend to explain the code one by one. It is a wide range of comments, and there is no tricky. So, read the source using the force. If you are not familiar with Atmega386's registered register operation and want to understand how to write AVR microcontroller code without relying on the Arduino library, we recommend that you get the great Elliott William book "Make: AVR Program". If you're subscribing to Safaribooksonline. com, it's there. Otherwise, you can buy it on Amazon. In these programs, some use Arduino functions, while others operate the register directly. I'm sorry.
The first thing you notice is that this program uses a lot of global variables. This topic has a good debate in Stack Overflow. I have no intention of promoting or defending global variables here, but I understand all the perspectives about this topic and use global variables in a limited resource embedded application project. We recommend that you recognize that there is a rationale. < SPAN> I don't intend to explain the code one by one. It is a wide range of comments, and there is no tricky. So, read the source using the force. If you are not familiar with Atmega386's registered register operation and want to understand how to write AVR microcontroller code without relying on the Arduino library, we recommend that you get the great Elliott William book "Make: AVR Program". If you're subscribing to Safaribooksonline. com, it's there. Otherwise, you can buy it on Amazon. In these programs, some use Arduino functions, while others operate the register directly. I'm sorry.
The first thing you notice is that this program uses a lot of global variables. This topic has a good debate in Stack Overflow. I have no intention of promoting or defending global variables here, but I understand all the perspectives about this topic and use global variables in a limited resource embedded application project. We recommend that you recognize that there is a rationale. I don't intend to explain the code one by one. It is a wide range of comments, and there is no tricky. So, read the source using the force. If you are not familiar with Atmega386's registered register operation and want to understand how to write AVR microcontroller code without relying on the Arduino library, we recommend that you get the great Elliott William book "Make: AVR Program". If you're subscribing to Safaribooksonline. com, it's there. Otherwise, you can buy it on Amazon. In these programs, some use Arduino functions, while others operate the register directly. I'm sorry.
The first thing you notice is that this program uses a lot of global variables. This topic has a good debate in Stack Overflow. I have no intention of promoting or defending global variables here, but I understand all the perspectives about this topic and use global variables in a limited resource embedded application project. We recommend that you recognize that there is a rationale.
I use some libraries, but without it would have been impossible. Timer Free Tone Library is used to drive various frequencies with passive piezo speakers. Slotmachine. h will notice that there are many notes definitions. You can use it to create your favorite melody. I use only a hand of hand when the Slotmachine microcomputer is launched and the setup function is executed, to play a part of the theme of "CLOSE ENCOUNTERS OF THIRD Kind". I chose a time r-free library because I thought I needed a timer, but I didn't use the timer at all. You can use it if necessary. The LED control library is used in both slotmachine. ino and slotCreditDissplayslave. ino. In the former, it is used to control the three 8 x 8 LED matrix functioning as a slot machine reel. SlotCreditDISPLAYSLAVE. INO makes the library easier to access the 8-digit 7-segment display that displays the player's credit balance. I tried to avoid using another AVR chip (Atmega328) just to display the credit balance, but there was no way to control 8x8 matrix and 8-digit 7-segment display from one microcontroller. Therefore, it was necessary to create an I2C slave in the end. Certainly, you can display your credit balance with a cheaper AVR, but this time we have selected the following methods to make it simple. < SPAN> I use some libraries, but without it would have been impossible. Timer Free Tone Library is used to drive various frequencies with passive piezo speakers. Slotmachine. h will notice that there are many notes definitions. You can use it to create your favorite melody. I use only a hand of hand when the Slotmachine microcomputer is launched and the setup function is executed, to play a part of the theme of "CLOSE ENCOUNTERS OF THIRD Kind". I chose a time r-free library because I thought I needed a timer, but I didn't use the timer at all. You can use it if necessary. The LED control library is used in both slotmachine. ino and slotCreditDissplayslave. ino. In the former, it is used to control the three 8 x 8 LED matrix functioning as a slot machine reel. SlotCreditDISPLAYSLAVE. INO makes the library easier to access the 8-digit 7-segment display that displays the player's credit balance. I tried to avoid using another AVR chip (Atmega328) just to display the credit balance, but there was no way to control 8x8 matrix and 8-digit 7-segment display from one microcontroller. Therefore, it was necessary to create an I2C slave in the end. Certainly, you can display your credit balance with a cheaper AVR, but this time we have selected the following methods to make it simple. I use some libraries, but without it would have been impossible. Timer Free Tone Library is used to drive various frequencies with passive piezo speakers. Slotmachine. h will notice that there are many notes definitions. You can use it to create your favorite melody. I use only a hand of hand when the Slotmachine microcomputer is launched and the setup function is executed, to play a part of the theme of "CLOSE ENCOUNTERS OF THIRD Kind". I chose a time r-free library because I thought I needed a timer, but I didn't use the timer at all. You can use it if necessary. The LED control library is used in both slotmachine. ino and slotCreditDissplayslave. ino. In the former, it is used to control the three 8 x 8 LED matrix functioning as a slot machine reel. SlotCreditDISPLAYSLAVE. INO makes the library easier to access the 8-digit 7-segment display that displays the player's credit balance. I tried to avoid using another AVR chip (Atmega328) just to display the credit balance, but there was no way to control 8x8 matrix and 8-digit 7-segment display from one microcontroller. Therefore, it was necessary to create an I2C slave in the end. Certainly, you can display your credit balance with a cheaper AVR, but this time we have selected the following methods to make it simple.
The machineState variable keeps track of the state. For example, you can be in "spin" and "auto mode" at the same time. I don't use this concept much inside my programs. But there is a conditional branch depending on the state. There is also a concept of events, which are dispatched and handled by the ProcessEvents function. It would be nice to have an event queue, but I didn't go that far.
In the comments of SlotMachine. ino, there is a list of known bugs and "To Do's". When you 'spin' the reels (by pressing the spin button or selecting the 'Play' option from the LCD menu), one or two reels may not move. This is because the random number generator behind it picks symbols that are already displayed on that reel. This may be fixed to make the game look more realistic, but it is not actually a defect. The reels never finish spinning from left to right like most slot machines. This is by design to keep things simple. It would be possible to make the reels finish spinning from left to right by sorting the three random numbers generated for each spin in ascending order before the reels actually spin, but I didn't bother.
"Todo": I would like to add brownout protection and watchdog protection at some point. 80% of the space allocated for global variables is already consumed. This is the point where ATmega386 and Arduino programs start to become unstable. This program is at that stage. You need some budget to keep this program working, and adding more global variables is not recommended. For example, it will be difficult to add functionality to the Settings part of the menu. I tried to solve the global variable problem by moving the menu into program memory, but I think this is because the compiler needs to pre-allocate all the space for the menu. I'm sure there are more things we can do to make the game more interesting, such as making more use of the RGB LEDs and the piezo buzzer, celebrating wins more, making the sound when you run out of money better, etc.