Tanisha’s Status Report for 12/06/25

Since we finished our MVP on schedule and even a little ahead of time, we were able to take a short break during Thanksgiving week to enjoy time with family and friends. We still wrapped up a few last-minute bug fixes and aesthetic adjustments.

That week, I finished cutting, gluing, and pasting the extra Catan resource tiles. On Sunday, Rhea, May, and I worked on fixing the remaining software bugs, such as the player-turn light synchronization, and we also recorded the videos for our demo. This included the dice roll, save state, multiplayer features, and a full walkthrough. We also divided the design slide responsibilities to ensure we created a strong presentation that properly showcased our project.

The following week, we added the ports (boats), flags, and magnets to secure the board to its casing. I also wrote the introduction script for our video demo since we wanted a fun way to introduce our use case. Now, with only the video demo and design report left, we’re ready for demo day on Monday!

May’s Status Report for 12/06/25

This week most of the time was spent on the final presentation content. Additionally, I tested all the pegs to ensure they were aligned with the buttons and would press securely. I also worked on glueing the boats, flags, and magnets with the team. We also spent time fixing some small visual aspects like the tiles, water, etc. In terms of schedule, we are ahead of our planned timeline and are exploring further software features, however, the final video and report will be our main focus. 

Rhea’s Status Report for 12/06/25

We finished all the final touches for our boards this week (focusing on the aesthetics). I mostly focused on debugging the code and making it more robust to any errors, as there were a few inconsistencies with the save state and multiplayer features. Additionally, I spent most of my time preparing for my presentation on Wednesday. 

We spent the second half of our week planning our final video. Because we are ahead of schedule, we hope to implement some basic rule checks in our code before our demo. For example, a player shouldn’t be able to place a settlement on a corner adjacent to another settlement. Our main focus for next week will be the final video and report. 

Team Status Report for 12/06/25

We had three different components needed to test: the switch matrix, the LED strip, and the dice detection. As we built the switch matrix and LED strip, we would test connectivity with a multimeter. Once we ensured all connections were secure, we tested the components’ functionality. To test the switch matrix, we ran about 720 total presses and saw over 99% reliability and no issues with ghosting or double-counting. For the LED strips, while soldering, we tested every 2–3 strips at a time to ensure there were no dead pixels or loose connections. Finally, we validated the indexing between each switch position and its corresponding LEDs with a 100% correct match.

To test the dice algorithm, we followed the TA recommendation to evaluate performance over three full games rather than doing isolated 100-roll tests. Across those three games, the system achieved an average of 93% accuracy, which is more than our 90% goal. We also measured the rate at which the system falsely detects rolling motion and triggers a token light-up. Over the same three-game test set, the misfire rate averaged 5%, which is within our target threshold. The time it took for a token to light up after the dice came to a rest averaged to be around 55ms for the same board and 95ms for the other board, both of which are within our target times.

The main idea for synchronization is ensuring both boards have identical game states at all times. To ensure all messages were sent and received as expected between the boards, we tested all possible inputs: a single button press for settlements and cities (3 different times to ensure it would first turn one light on, then all three, then turn them off), adjacent button presses for roads (twice for turning it on and off), non-adjacent button presses to ensure nothing would happen, robber tile presses (ensure that that correct resource token lights up), and finally the dice roll also lights up the correct resource (if that resource isn’t currently being occupied by the robber). We tested each type of button press 25 times on different locations on the board and saw 100% accurate synchronization with only about 40ms latency.

For our demo and user study, our goal was to evaluate whether our synchronized boards actually recreate the feeling of playing an in-person board game with someone who isn’t physically there. We tested the system with about 20 users. We ran one 5-minute game with two different pairs of participants, and after each game, the players completed a brief post-game questionnaire. The survey used a 7-point Likert scale and assessed tactility, sense of co-presence, responsiveness, and how easy it was to differentiate players based on color and LED feedback. Our goal was for at least 80% of users to rate the experience as good as or better than online play in both tactility and co-presence and that players were easy to distinguish. The results were very positive. 95% of participants said the tactility of the system felt better than online play, and 100% said the sense of co-presence was better than online play. Responsiveness had a median of 6 on the 7-point likert, and the ease of differentiating players has a median of 7. We also collected open-ended feedback about any confusing interactions or moments where latency felt noticeable, and those comments helped us refine our transitions and LED cues.

This week we worked on final touches on the two completed boards such as refueling some pegs. We glued the boats onto the board, and also assembled the flags for it. In terms of software, we fixed some small bugs prior to our presentation and recorded demo videos. The bulk of our time was spent on preparing for the final presentation. In the later half of the week, we met as a team to begin the final video and planning out our storyline. We are ahead of our schedule so in addition to the final video and report we are hoping to implement a couple additional software features. 

Tanisha’s Status Report for 11/22/25

This week I helped work on nearly  every major task we completed from Monday through Friday, but my primary focus was getting the dice-detection system fully working. I spent many hours refining the dice plate algorithm and finally got it to detect pip patterns accurately and consistently on the Raspberry Pi. This required switching to DBSCAN and combining it with the stopping/rolling detection logic I wrote earlier. I had to tune pip size thresholds, adjust clustering parameters, and deal with lighting variability on the Pi camera. After multiple iterations of both software and physical dice-plate designs, the system now detects dice with roughly ≥90% accuracy, which is a big improvement from where we started. I also worked on transferring the entire dice-detection pipeline from the Mac to the Pi, fixing camera issues, debugging FFmpeg and v4l2 errors, and testing everything in real gameplay scenarios.

In addition to the software, I helped with all of the major hardware tasks this week. I helped fix LED soldering problems and worked with May to resolder unstable connections so the rings would behave reliably in-game. I also glued the resource tiles, cut more tiles, and redesigned and reassembled the dice plates. A large part of my time went into building the full base-board structure: using CorelDRAW to design the base support, laser-cutting all required pieces, adding spacers, and assembling the complete board so it was sturdy enough for gameplay. Overall, I spent the week on a combination of coding, debugging, soldering, laser-cutting, and assembly to push the project forward.

My progress is on schedule, and we are not behind. Next week, I plan to focus on polishing the dice-detection code even more, reinforcing the board structure with magnets, and helping prepare the final presentation. I also hope to finish any remaining debugging and clean up the code so everything is ready for final testing.

Below is a video of me testing and refining the dice roll algorithm with a GUI display I coded:
https://drive.google.com/file/d/1DVNEzwVgGazKlUYmCNaQBRux-3qgsN41/view?usp=sharing

Team Status Report for 11/22/25

This week we made major progress on both the software and hardware for our synchronized Catan boards. As we implemented and debugged the system, we had to learn several new tools along the way. On the software side, we learned how to get the Raspberry Pi camera working reliably with OpenCV, how to tune the dice-detection algorithm using DBSCAN, how to fix issues with FFmpeg and v4l2, and how to manage socket threading so both boards stay synchronized. On the hardware side, we learned how to fix LED soldering issues, wire neopixel rings more reliably, and use the laser cutter to create updated tiles, dice plates, and structural pieces. Most of this came from informal learning—videos, forums, GitHub issues, and trying small examples until we understood the behavior and could incorporate it into our system.

Several risks still remain, but we have plans in place to manage them. Dice detection can still be sensitive to lighting and angles, so we tuned parameters extensively, redesigned the dice plate, and tested many camera settings. Our fallback is a manual-entry button if detection ever becomes unreliable. Another risk is the two boards falling out of sync, so we built a save-state system and a resync request so the boards can recover automatically if something goes wrong during gameplay. Hardware reliability, especially LED joints, was also a concern, but after fixing the soldering issues and reinforcing the wiring, the system is now stable. Structurally, the board needed more support because we shrank our layout, and our original design only had space for six numbered tiles; we had four extra numbers, so we added them as corner stand-up resource tiles, which required extra wiring. We will strengthen the board next week with magnets and better adhesion.

We also completed several stretch-goal features. We implemented a save-state system, added clear-board logic controlled by physical buttons, and even added support for multiple players on the same board. These features added time, and the wiring for the extra corner tiles increased complexity, but each addition improves the usability and robustness of the final product. All three stretch goals are fully implemented and working.

Throughout the week we steadily integrated all of these pieces. On Monday, we finalized the dice-detection algorithm on the Mac and got messages sending correctly from the Pi. On Tuesday, we fixed camera issues on the Pi, moved the full dice pipeline onto it, laser-cut additional dice plates, and achieved working synchronization between both boards. On Wednesday, we soldered the pin headers, laser-cut the tiles and the base board, assembled the entire physical structure, added the clear-board buttons, and finished the sync and save-state code. At the end of the week, we fixed several LED soldering problems, tuned the dice algorithm, laser-cut the remaining numbered fixtures, added lights for the tokens, and glued all the resource tiles and water pieces for the final board design. We also finished the multiplayer stretch-goal code during this time.

Overall, we are in a strong position. The core system is working, the stretch goals are complete, and only minor debugging, minor aesthetic improvements, and physical reinforcement remain before the final presentation.

Below is a photo of how one board looks like:


Below is a video demonstration of a 3-person game (we have a feature where you can enter the number of players 2-4):

https://drive.google.com/file/d/1aihQ5PfYeqy9WeP17BvGSp3CvyLi_z7i/view?usp=drive_link

Rhea’s Status Report for 11/22/25

This week, I focused on integrating the two boards. Last week, both boards could independently detect button presses and light up the corresponding LEDs, and we had a simple dice detection algorithm, so this week, I worked on synchronizing the two boards. 

I wrote the code that sends messages between both game boards to ensure they are in sync. Whenever a button press or dice roll is detected, it now sends a message to all connected peers (in this case, only one other board). Each board currently stores its peer information (hostname, IP, etc.) in a configuration file. When the program starts, it reads this config, opens a socket that listens on all ports, and spawns a thread dedicated to receiving and processing incoming messages. Two other threads handle checking for button presses and dice rolls (and sending messages whenever anything is detected). This way, both boards can update each other in real time.

I also implemented a save state system. When a player stops playing, the board records its current state (which LEDs are on, whose turn it is, etc.) and writes it to a file. When the board is powered on again, the script automatically loads this saved state so gameplay can resume exactly where it left off. To complement this, I added a clear board button that resets all LEDs so users can start a new game at any time.

Since we decided to downsize our prototype to six tiles, I also worked on remapping the dice rolls. Normally, Catan uses numbers 2–12, but we only use seven of them (six resource tiles and 7 for the robber). We decided to turn the remaining four numbers into ports. Players can choose what resource will be gained from each port, and when a port’s number is rolled, they can take that resource. This ensures every resource appears at least twice across the six tiles and four ports, keeping the game balanced but flexible.

Finally, we added support for more than two players, even with only two boards. Instead of assigning each board to a fixed player color, I added an “end turn” button. When pressed, it cycles through the colors based on the number of players (2–4) entered at the start of the game. This means four players can now play together using the same board, increasing the overall usability.

Finally, we also finished the visual design: gluing down the printed resource images on each tile and adding the blue water background to make the board match the real Catan aesthetic.

Next week, I plan on thoroughly testing our boards and fixing any minor bugs in the code. I also plan on spending most of my time working on the presentation, as I will be working from home and won’t be on campus to work on the actual game boards. Once I come back, I hope to spend time working on making the RPi start running the script immediately upon it being powered on (so you don’t need to connect a computer to start the script). Any information the user needs to enter can be entered directly through a connected keyboard.

To implement board synchronization, I had to learn more about socket programming and managing multiple threads in Python. I previously took Distributed Systems in Go, so I reused the structure I would normally write in Go, then translated that into Python by reading library docs and small code examples online.

I also had to learn how to debug NeoPixel strip issues that only showed up as segfaults in the terminal. At first it wasn’t obvious that the problem was the LEDs at all, or that it was caused by multiple threads writing to the strips at the same time. I went through a lot of Stack Overflow posts and videos about driving multiple NeoPixel strips from one Raspberry Pi. That’s how I realized the NeoPixel library itself isn’t thread-safe, and that simple locks around the strips weren’t enough. In the end, I fixed it by creating a single dedicated thread whose only job is to update the NeoPixels. All other parts of the code just push “update requests” into a queue, and that one thread processes them in order. This removed the race condition without needing complicated locking and made the LED behavior much more stable.

May’s Status Report for 11/22/25

This week I helped solder header connections for stable wiring and finished assembling the base board. I wired and soldered the save-state and turn-toggling buttons, plus a new set of LEDs for each board to light up ports and improve dice visibility. I worked on testing with the team, where we found a few small bugs to fix.

We had a setback when one LED strip lost connection and the copper pad ripped off. Because the button board and LED board were already joined, replacing that LED while keeping indexing consistent took time, but we were able to swap it and resolder everything more securely. I also helped assemble the ports and glue the visual pieces (water pattern and resource tiles) onto the board. We are ahead of schedule and have most of our stretch goals implemented. Next week I want to help finalize the presentation, record a better demo video, secure the button rods, and help debug remaining software issues.

I also had to learn more detailed CAD skills to design robust parts that could handle multiple iterations and different cut depths. I reviewed past course material, watched online videos, and asked TechSpark staff and friends for help, especially for modeling layered cuts and understanding the switch matrix. Most of what I needed came from knowledge in our earlier classes and projects, and I filled in the gaps with a few targeted videos, quick references, and small experiments.

Rhea’s Status Report for 11/15/25

Over the weekend, I worked with May to complete and finalize the first board. I led the button-to-LED mapping code and helped design the connection between the button board and the LED board. We assembled it and ran LED indexing and mapping tests. I also helped prep for the interim demo and updated the Gantt chart with May.

For the second board, I worked with Tanisha to secure the LEDs and route wires so they lay flat. I connected tokens to the buttons and helped set dowel height for reliable presses. I prepped the board for final assembly and assembled the two boards together with the team and conducted the final end to end tests.

 

Verification:

  • LED indexing/mapping: Thoroughly check every LED index against the board. Pass if mapping is 100% correct.
  • Robber rule logic: Test single press, adjacent pair, non-adjacent pair, and quick repeats. Pass if only one robber position is active and non-adjacent pairs are ignored without errors.

Team Status Report for 11/15/25

This week we finished the first board and got ready for the interim demo. We figured out how to connect the button board to the LED board and assembled the stack. We also finished the software that maps buttons to LEDs. It now enforces that the robber is in only one place. If two presses happen at the same time and they aren’t adjacent, we ignore them without an error.

After the demo, we built the second board using what we learned from the first. We cut and assembled the switch matrix, reworked the LED layout, and did the soldering. We fixed switch-matrix issues and a Raspberry Pi connection bug. We also glued houses, glued LEDs, cut dowels, and laser-cut extra pieces and tokens. We updated the software for the second board too.

Both boards are now fully assembled with full functionality, so we can shift our focus and prioritize software.

Validation:

    • Board synchronization: We will trigger the same action on both boards and compare LED states and game state after each step. The test passes if there are no mismatches in the test log.
    • End-to-end latency: We will measure time from a button press to LEDs lighting on both boards using timestamps or a simple stopwatch video. We will check the result against our latency target from the design report.
    • Full gameplay run (rule-agnostic): We will run a short game flow: setup, placements, resource rolls, robber moves, and a long turn. The run is valid if interactions work, states stay consistent, and no manual rework is needed to recover from normal play.
    • Usability check: Two people not on the team will set up the board and play a short game without our help. We will record task times and note any confusing steps.
    • User Study: We’ll ask 4–6 participants to rate (1–5 Likert) setup ease, feedback clarity, responsiveness, piece placement, and confidence to use without help, plus note one confusion and one change.
    • Safety and Durability: We will tug-test connectors and inspect for sharp edges or exposed wires on the final build. The build passes if nothing comes loose and there are no hazards.

Shared Verification:

  • Button board + dowels: Measure dowel height and press each site 20 times. Pass if each press triggers once (≤1 miss) and no double-triggers.
  • Switch matrix: Press every button 20 times and try adjacent/non-adjacent simultaneous presses. Pass if ≤5% misses, 0 ghosting, and non-adjacent pairs are ignored.
  • Solder/continuity: Inspect joints and check rows/cols and LED conncections with a multimeter. Pass if there are no opens or shorts.