IG Voting Machine

Happy 4th of July. This holiday got me thinking about democracy, freedom, and such. So I think we should consider making a voting machine to simplify / automate our annual (and other) elections using the Schulze Method. I wrote a NodeJS script after the last (interim) elections we had to crunch the numbers and compute the results of a set of ballots. I basically just read the Wikipedia article and did that in code.

What would it take to get from there to a functioning machine. Here’s my take on how to do it.

  1. Come up with some standardized paper ballot that we can easily print at election time.

  2. Come up with a user interface for “setting up” an election and readying the machine to accept paper ballots.

  3. Write some kind of OCR script to read a photo of a paper ballot and validate it.

  4. Create some kind of ballot feeder contraption that can roll a ballot into an illuminated photo compartment then either consume the validated ballot fully, or return the ballot to the voter to reject it.

  5. Bonus points: could have a screen that shows the OCR results of the validated ballot and asks the voter to confirm before consuming / accepting it into the results. That same screen could give some feedback to give voters a warm fuzzy that their vote has been counted, and can at the end of the process display the results to the authorities.

I figure the guts is relatively easily implemented using a Raspberry Pi with a camera for the OCR, result tabulation and calculation, and any screen UI and / or Networking aspects, and using an Arduino attached to it to by USB to do some of the more physical computing aspects (e.g. paper feeder control, sound, light, etc.). Could be a fun little project and on occasion be useful.

I mentioned to a couple of folks after the election before last that a formalized voting setup would be a great project, rather than my hacky process based on the Noisebridge Schulze script, and have been poking around at what it might involve.

Things I’ve found in prior research:
LibInsane is handy for accessing scanners.
RescueOMR may be useful for tabulating ballots.
See also OMRMarkEngine.

Various implementations of Schulze:
SVVAMP
python-vote-core

Andrew Appel on what makes a good voting machine. Different ballpark from our use case, but still educational.

1 Like