本文翻译自:https://lapinozz.github.io/learning/2016/11/19/calculator-with-caordboard-and-marbles

LOGIC

logic_name_full.png

这是什么?

LOGIC是一个全部由纸板、弹珠和胶水制作而成的全功能4位计算器,它可以对从0到15的数字进行加法计算,最大的可计算数字为30,我和我的妹妹为了一向科学活动而一起从零开始制作了这个设备。在这之前,我们还没见过任何用乐高或木头之类东西制作的这类计算器,所以这次我们制作的是一个以前从未有过的全新的模型。

为什么要制作?

主要是因为好玩!我一直想要制作一个加法器,但是我一直都没想好要如何制作它,我之前有想过用水或者只用纸板来制作。正好我的妹妹有一个科学活动,活动需要提交一个科学项目,我就帮助她选择了一个科学项目。我无意中看到了一个视频:用多米诺骨牌制成的计算器,因此我就想我也许可以用弹珠来制作一个计算器?

从这个项目可以学到什么?

通过这个项目,我的妹妹已经学会了二进制计数、二进制加法、二进制十进制的互相转换、逻辑门、基本的逻辑电路等等的知识。

我也学到了使用身边常见的材料来制作一个逻辑电路是多么的简单,在我的项目中我使用的都是身边最常见的东西。

它看起来是什么样子的?

LOGIC-low.jpg

哇,那你怎么使用它呢?

将数字用二进制的方式放在输入端,有弹珠的就是1,没有弹珠的就是0。右边的位是最低有效位,在每次计算前我们需要把计算器的部分组件进行重置。之后我们移除一些纸板,这样弹珠就会沿着设定的路径滑动而不会直接掉下来。修改弹珠的滑动路径,弹珠最终会到达底部并且以二进制的方式给出我们计算结果。

LOGIC-IO-low.jpg

例如你想要计算 7 + 5

LOGIC-7-plus-5-low.jpg

它的工作原理是什么呢?

当想要构建逻辑门时,我们首先需要了解一些基础的通用门。我们第一个需要了解的就是与门

与门

什么是与门?简单来说:

如果没有弹珠输入:没有弹珠输出。
如果有一个弹珠输入:没有弹珠输出。
如果有两个弹珠输入:有一个弹珠输出。

所以我们需要设计一个系统,这个系统只会在有两个弹珠的时候才会让一个弹珠通过,否则就不会有任何弹珠输出。

这是我们想出来的:

一个弹珠:不输出
AND-1.gif

两个弹珠:一个输出
AND-2.gif

异或门

异或门稍微有点复杂,因为输入必须要在同一时间进行。

那我们如何构建异或门模型呢?其实很简单!

如果你有一个弹珠,那么就会通过
如果你有两个弹珠,那么就应该取消通过

这其实很简单,我们只需要做一个只能通过一个弹珠的路径,当两个弹珠一起到达的时候它们就会发生碰撞然后掉下来。问题在于这两个弹珠需要非常的同步才行,而让两个弹珠非常同步是很难的。

尽管这个异或门仍然是非常不可靠的,我们还是决定继续制作,因为这个异或门我们只会用来当做原型,后面我们可能会不需真正的用到要它。

XOR.gif

半加器

一般来说我们需要16个与门、16个异或门和4个或门,不过这会导致设备太大了,所以我们也不需要把这些门都真正的制作出来。

Half-Adder-Circuit.gif

在这里我们把门用更通用的方式来组织以方便描述,对于一个半加器而言:

如果只有一个弹珠:使其落在第一个输出中
如果有两个弹珠:让它们之中的一个落在第二个输出中

这个做起来其实并不难。第一个弹珠翻转一小块纸板,此时第二个弹珠会掉入一个洞里面,这第二个弹珠会落在一个翻转架上,这个翻转架阻挡了第一个弹珠的继续下落。

当是一个弹珠的时候它会落入路径1

Half-Adder-1-cropped.gif

当是两个弹珠的时候它会落入路径2

Half-Adder-2-cropped.gif

第一个是开始求和,第二个是开始进位。

全加器

一个全加器一般是用两个半加器和一个或门构成的。但是我们也可以很惊讶地看到,其实只要对半加器稍加修改就可以制造一个全加器。全加器和半加器基本上一致,区别在于如果有了第三个弹珠,它应该掉落到路径1中。

two-half-adder.png

如果有一个弹珠:让它掉落到第一个输出
如果有两个弹珠:让其中一个掉落到第二个输出
如果有三个弹珠:让其中一个掉落到第一个输出,另一个掉落到第二个输出

将第三种情况添加到我们的半加器中其实是非常简单的,只需要添加一小块纸板。我们的全加器看起来有些特别的原因在于我们对它做了一些修改,这样第一个弹珠和第二个弹珠就有了更多的时间来运动,因此弹珠间的同步需求就降低了。

Full-Adder-IO-low.jpg

因此对于一个弹珠,它落在路径1中
Full-Adder-1-cropped.gif

对于两个弹珠,其中一个弹珠落在路径2中
Full-Adder-2-cropped.gif

对于三个弹珠,其中一个落入路径1,另一个落入路径2
Full-Adder-3-cropped.gif

把所有的部件组合起来

现在可以制作全加器来完成我们的计算器了,我们只需要把它们连接起来,这样上一个的输出就会是下一个的输入。

Full-Adder-circuit.jpg

存在的问题

即使我们制作的半加器和全加器都工作的非常好,但是只要组件黏在了一起,这个计算器就没正常工作了。弹珠可能会运动的过快或过慢,或者发生弹出来等等情况。这并不是说它不能正常运行,计算器是可以正常运行的,只是在正常运行之前可能需要进行多次的调整和测试。逻辑本身是没有问题的,只是纸板有的时候需要进行多次的调整才能正常的工作,我们有的时候没有那么多的时间来进行多次的调整工作。

成功!

我们制作了另外两个全加器,剩下的只需要保证弹珠可以运动到正确的输入和输出的路径即可。

LOGIC-gates-low.jpg

结论

在完成了该项目之后,我在互联网上面搜索来看看是否还有人也做出了类似的构造,结果令人惊讶,这个项目其实是充满了多样性和创造性的。我注意到一件事情,大部分的装置中都需要通过翻转来设置相应的数字,而且要用很多的球来进行操作。在我们的模型中,你只需要直接使用弹珠的位置来设置数字并进行计算,这已经十分接近于计算机的工作方式了,并且看起来把这个部件合并到一个更大的工程中也是十分简单的,我现在已经在考虑如何构建一个极简的弹珠计算机或图灵机了。

感谢阅读,希望你喜欢这篇文章。