Introduction: German Board Game: Mensch Ärgere Dich Nicht
This is a project that I made for my Physical Computing class at Boston College with Professor Gallaugher.
"Mensch ärgere Dich nicht!" is a popular German board game that I always used to play with my family. My idea was to make this traditional game interactive with a gesture sensor and servo (creating a self-closing drawer) and LED strips.
How to operate:
By pressing the red button, you start the game and LEDs turn green. To take out the game pieces, you can open the drawer. To close it, you have to swipe above the gesture sensor (from left to right), which makes the drawer close automatically by winding a thread around a servo that is attached to the drawer. After the drawer is closed, the threat unwinds, so you can open the drawer later on. To help players set up the game pieces on their home base, the LEDs turn yellow, red, green and blue. After a couple of seconds, the lights turn green again and you're ready to play. To end the game, players can put their game pieces into the drawer again and swipe from right to left above the gesture sensor. This closes the drawer again and the lights turn off.
Supplies
Material:
- 1/4" Baltic Birch wood
- 1/8" Baltic Birch wood
- 3mm board of black acrylic (or any other color)
- 3mm board of clear acrylic
- PLA 3D Printing Filament (multiple colors, e.g. yellow, red, green, blue, white)
Machines:
- Trotec Laser Cutter
- Original Pursa MINI + 3D Printer
- Soldering equipment
Electronics:
- Raspberry Pi Pico W
- APDS-9960 Gesture Sensor
- LED strips (4 connectable strips with 30 LEDs each)
- Button
- FS90R Continuous rotation servo
- Jumper wires
Other supplies:
- Superglue
- Thread
- Electrical tape
- Tape
- Wood glue
- Waterproof black marker
- Hot glue gun
- Sanding Paper
Step 1: Design and Game Board
Starting off, I created the game board box by using MakerCase and inserting my measurements. If you also want to use 1/4" Baltic Birch wood and 3mm acrylic for the side parts, you have to adjust the material thickness accordingly. Feel free to use the .ai file below, where I've already made these adjustments. In Adobe Illustrator, I also edited the top part of the board game to resemble the traditional game design (see picture above).
After the design portion of this built is done, I laser cut the top and bottom pieces of the game board out off 1/4" Baltic Birch wood. The side pieces are cut out off 3mm black acrylic. However, feel free to use any other color or material.
Next, I laser cut small clear acrylic squares to cover the holes. To attach the squares, I used superglue.
Attachments
Step 2: Soldering
Before attaching the neopixel strips to the board, I stripped the wires and soldered the ends to jumper wires and taped them with electrical tape to prevent them from touching each other.
To prepare the button, I snipped off two of the metal ends on one side and soldered two jumper wires to the remaining ends. To stabilize and insulate the connection, I used small pieces of electrical tape and wrapped them around the connection.
Step 3: Attaching Parts to Game Board
After all of the preparations are done, I attached the APDS-9960 Gesture Sensor to the middle of the board with the sensor facing outside using regular tape. Now, I superglued the neopixel strips to the backside of the board next to the holes that are covered with acrylic. I placed the strip on the wood parts to create an indirect light. This way, you won't be able to see the actual LEDs from the outside of the game board.
Then I superglued the button into the hole on the bottom right side of the board.
Step 4: Wood Drawer
To create the wood rawer, I used the SlantedTray template from Boxes.py. I laser cut the pieces out of 1/8" baltic birch wood and use wood glue to assemble the box. For the inner part of the box, I used Adobe Illustrator (see the attached .ai document below).
The drawer will slide on the shiny side of an acrylic piece. I used the acrylic piece that was cut out off the side piece (for the drawer to fit in). This acrylic piece can be attached to the bottom piece of the board game. To level the acrylic with the cut out for the drawer, I used one of the clear scrap acrylic pieces and placed it under the black acrylic pieces. This way, the drawer should slide out smoothly. To attach these parts to the bottom, I used superglue.
To make sure that the box does not slide around and stays on top of the acrylic, I used another wooden piece and attached it to the back of the box. Then I sanded down two of the scrap wood circles that were cut out of the top box piece. I glued these circles under the added wood piece.
To prevent the box from sliding out and in too far, I attached two small wood pieces on the inside of the box and two stars on the outside of the box. I used some small wood scraps that I found, but you can also laser cut these small pieces. For the outside stoppers, I 3D printed the stars and I added a 3D printed knob to open the drawer.
Lastly, I used two small wood scraps to attach the thread to the box.
Attachments
Step 5: Game Pieces and Dice
After assembling most of the wood and acrylic parts, I 3D printed the game pieces and the dice. Make sure to color the pips on the dice (I used a waterproof black marker).
Step 6: Attaching the Servo
In the next step, I 3D printed a small spool and glued it to the top part of the servo. This way, the thread can easily wrap around the servo, while the drawer is pulled inside of the box. I attached the FS90R Continuous rotation servo to the bottom board using hot glue. Lastly, I attached the thread to the spule using regular tape.
The .mp4 file below, shows how the servo is pulling the drawer inside of the box.
Step 7: Last Steps
Now that all the electronics are attached, you can glue on the side parts of the box. I also taped down some of the loose wires to make sure that they wouldn't get caught up in the thread pulling in the drawer.
I placed the Raspberry Pi Pico W in the top right corner of the box and wired up all of the parts. I commented the exact position of the wires in the code below.
The last step is to attach the top part of the box to the side parts. You can either use tape, superglue or hot glue. I just place the top part onto the side pieces without using any adhesive. That way I can easily remove the pieces and use them for other projects or fix possible wiring issues :)
Step 8: Code
# "Mensch ärgere Dich nicht!" Code
# all import statements
import board, time
import neopixel
import digitalio
from adafruit_apds9960.apds9960 import APDS9960
import pwmio
from adafruit_motor import servo
from adafruit_debouncer import Button
from adafruit_led_animation.color import (
AMBER, #(255, 100, 0)
AQUA, # (50, 255, 255)
BLACK, #OFF (0, 0, 0)
BLUE, # (0, 0, 255)
CYAN, # (0, 255, 255)
GOLD, # (255, 222, 30)
GREEN, # (0, 255, 0)
JADE, # (0, 255, 40)
MAGENTA, #(255, 0, 20)
OLD_LACE, # (253, 245, 230)
ORANGE, # (255, 40, 0)
PINK, # (242, 90, 255)
PURPLE, # (180, 0, 255)
RED, # (255, 0, 0)
TEAL, # (0, 255, 120)
WHITE, # (255, 255, 255)
YELLOW, # (255, 150, 0)
RAINBOW # a list of colors to cycle through
# RAINBOW is RED, ORANGE, YELLOW, GREEN, BLUE, and PURPLE ((255, 0, 0), (255, 40, 0), (255, 150, 0), (0, 255, 0), (0, 0, 255), (180, 0, 255))
)
# Setting up all parts
# NEOPIXEL
strip = neopixel.NeoPixel(board.GP15, 120, brightness=1, auto_write=True) # Wired to GP15
# BUTTON
button_input= digitalio.DigitalInOut(board.GP6) # Wired to GP9
button_input.switch_to_input(pull=digitalio.Pull.UP)
button = Button(button_input)
# GESTURE SENSOR
# Wired: Blue -> GP4, Yellow -> GP5, Red -> 3.3V, Black -> Ground
i2c = board.STEMMA_I2C()
multi_sensor = APDS9960(i2c)
multi_sensor.enable_proximity = True
multi_sensor.enable_gesture = True
# CONTINUOUS ROTATION SERVO
pwm = pwmio.PWMOut(board.GP16, frequency=50) # Wired to GP16
servo = servo.ContinuousServo(pwm)
pressed = 0
pixels = [7, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
36, 37, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
66, 67, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
96, 97, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119]
while True:
button.update()
strip.fill((0, 0, 0)) # LEDs are turned off at the beginning
gesture = multi_sensor.gesture()
if button.pressed: # Button is pressed to start the game
pressed = 1
if pressed == 1:
strip.fill((127,255,0)) # LEDs turn green
# Open the wooden drawer by pulling on the knob
if gesture == 4: # Gesture Sensor detects left to right swipe
servo.throttle = -0.1 # Wooden Drawer closes (feel free to adjust the speed)
time.sleep(3.5)
servo.throttle = 0 # Servo stops
time.sleep(3)
servo.throttle = 0.1 # Servo unwinds the thread
time.sleep(3.7)
servo.throttle = 0
# LEDs turn yellow, red, green and blue
for i in range(0, 7):
strip[i] = BLUE
for i in range(38, 44):
strip[i] = BLUE
for i in range(8, 14):
strip[i] = RED
for i in range(30, 36):
strip[i] = RED
for i in range(60, 66):
strip[i] = YELLOW
for i in range(98, 104):
strip[i] = YELLOW
for i in range(68, 74):
strip[i] = GREEN
for i in range(90, 96):
strip[i] = GREEN
# Rest of the pixels turn off
for i in pixels:
strip[i] = BLACK
time.sleep(15) # Time to place game pieces on the game board (home base)
# Game ends
# Pull on the knob to open the drawer and place game pieces inside
if gesture == 3: # Gesture sensor detects right to left swipe
servo.throttle = -0.1 # Wooden drawer closes
time.sleep(4)
servo.throttle = 0
time.sleep(3)
servo.throttle = 0.1 # Thread unwinds
time.sleep(3)
servo.throttle = 0 # Servo stops
break
strip.fill((0, 0, 0)) # LEDs turn off
# Game is over!
Attachments
Step 9: Mensch Ärgere Dich Nicht Game Rules
Mensch Ärgere Dich Nicht is a classic German board game that can be played with 2-4 players. The goal of the game is to move all of your pieces around the board and into the "home" space before your opponents do the same.
Gameplay
- Each player starts with 4 pieces in their "out" area (labeled B on the board)
- Players take turns rolling a die to determine how many spaces to move one of their pieces
- A player can only move a piece out of their "out" area if they roll a 6
- If a player lands on a space already occupied by an opponent's piece, the opponent's piece is sent back to their "out" area
- The first player to move all of their pieces into their "home" area wins the game
Special Rules
- If a player rolls a 6, they get an additional turn
Have fun playing! :)