咖啡制作

Fotis Georgatos < gef@ceid.upatras.gr>

V1.0 2004-08-29


关于软件最令人难忘的评论之一是,这段代码是否可以制作咖啡。咖啡是一种世界商品,其地位仅次于石油。Linux 确实可以制作咖啡;而且味道也很好!

1. 引言

2. 菜单

3. 硬件

4. 软件

5. 构建图灵完备的咖啡机

6. 过量症状

7. 扩展

8. 更多信息


1. 引言

长期以来,人类一直在思考计算机如何制作咖啡...

人们需要咖啡来醒来,并在电脑前长时间保持清醒。众所周知,晚上编码效果更好!

主要的技巧是将咖啡机连接到计算机,以便可以通过软件控制它。本 HOWTO 将向您展示如何做到这一点。

首先,它演示了一个 ON/OFF 开关,该开关实现为电子电路,用于控制咖啡机的电源。另一章将告诉您构建智能、图灵完备的咖啡机的秘密!

本 HOWTO 最初是作为 linux-greek-users 邮件列表中的一场辩论的一部分而编写的,讨论 linux 是否可以制作咖啡。然后它成为我们名为 magaz 的在线杂志上的一篇文章。以防您想知道,magaz 是希腊语,对您来说肯定看起来像那样!

尽情享用。

1.1 版权

版权 © 2004-08-29 Fotis Georgatos。您可以自由

在以下条件下:署名。您必须注明原始作者。相同方式共享。如果您更改、转换或基于此作品进行创作,您只能在与本许可相同的许可下分发由此产生作品。

1.2 免责声明

使用本文档中的信息风险自负。我对本文档的内容不承担任何潜在责任。使用本文档的概念、示例和/或其他内容完全由您自行承担风险。

所有版权均归其所有者所有,除非另有明确说明。在本文档中使用术语不应被视为影响任何商标或服务标志的有效性。

特定产品或品牌的命名不应被视为认可。

强烈建议您在进行重大安装之前备份您的系统,并定期备份。

1.3 版本

咖啡 HOWTO 现在称为咖啡制作 HOWTO,并即将发布 v1.0 版本,该版本将首先出现在此处

http://fotis.home.cern.ch/fotis/Coffee.html.

现在是每个人都知道咖啡制作只是 *任何* Linux 发行版免费提供的标准功能之一的时候了。或者,SCO 也拥有该功能的专利吗?哎...

1.4 翻译

您应该能够轻松找到本咖啡制作 HOWTO 或以前版本的以下语言的翻译

以及希望更多...(西班牙语和葡萄牙语有人吗?)

1.5 致谢

1.6 撰写本文时您喝/抽什么?

就我所知,这是一部不含毒品的作品。

但是,我可以告诉您背景音乐的秘密:几乎所有由 Zampetas 或 Mpithikotsis 拼写的歌曲(布祖基琴等)。

1.7 反馈

有关您自己的 DIY 咖啡机的在线评论,请访问 http://coffee.sf.net/

如果您还有评论要说,这些天电子邮件很容易丢失,所以为什么不给我寄一张明信片,上面有您伟大故乡的照片,并附上您在该地区最喜欢的咖啡馆的推荐呢?

Fotis Georgatos, 
Aliartou 32, 
TK 11142 Athens, 
GREECE

附言。


2. 菜单

2.1 法式咖啡

在程序员中流行的咖啡,因为它不需要太多照顾,而且其烹饪过程已得到简化;就像商业软件一样。其令人兴奋的味道激发了成千上万的程序员编写了令人难以置信的软件,这些软件是在一天的最初几个小时内编写的。例如,M$ Windows 是在早上 5:00 编写的,这完全归功于咖啡!保证获得类似的结果。

2.2 速溶咖啡

速溶咖啡是一种相当浓的咖啡,是通过将热水倒入咖啡、糖和少量水的混合物中制成的。您通常取 1 勺咖啡和 1 勺糖,加入少量水混合。同时,您应该将水烧开。一旦水足够热,您就将它们混合在一起,最好加入炼乳。虽然您可以使用比咖啡机更简单的东西来烧水,但我已经多次看到这样做...

2.3 希腊冰咖啡

上述咖啡的流行变体。实际上,您不需要复杂的咖啡机,而是需要一台冰箱来装冷水和冰块。它在温暖的夏季在东南欧非常受欢迎。

2.4 意式冰咖啡

这是一个复杂的问题,请阅读咖啡常见问题解答(阅读更多信息)

2.5 意式浓缩咖啡

意式浓缩咖啡是一种非常浓烈的意大利咖啡。您用小杯子盛放(您问为什么?请参阅章节:过量症状),并搭配一两块方糖。要制作出好的意式浓缩咖啡,您需要新鲜研磨的咖啡豆、水、方糖和一台专用机器。这些机器将水煮沸,并将非常热的蒸汽压过研磨的咖啡豆。您可以花很多钱购买一台超级自动机器。但是低成本的机器也是可用的。

好的,让我们开始吧。在您的机器中注水。让它变热。同时,在您机器的过滤器手柄中装入约 1 茶匙咖啡粉。向下压咖啡粉。不要太用力。现在水温合适了。将过滤器手柄连接到机器上,让机器工作。大约 30 秒后,您可以享用一杯精致的热意式浓缩咖啡。饭后喝一杯非常好。您感觉良好,可以再编码几个小时。

2.6 卡布奇诺

(另请参阅章节:意式浓缩咖啡)如果您有更专业的机器,您可以使用它来发泡牛奶。您需要此功能来制作奶油咖啡。它很容易准备。在咖啡壶中放入一些发泡牛奶,然后用意式浓缩咖啡将其装满。然后用一些巧克力片装饰。就这样。


3. 硬件

通用图表可能如下所示

---------   0-5V  ---------  ~220V   ----------------
|  PC   |====>====|Circuit|==========|Coffee-Machine|
---------         ---------          ----------------

概念是我们从计算机获取控制电压,该电压驱动带有继电器或双向可控硅的电气隔离电路。

如果您的咖啡机功率大于 200W,则必须选择继电器电路。如果您的咖啡机不是高功率的,则可以使用基于双向可控硅的电路。

所展示的所有电路都经过测试,但结果和风险由您自行承担。如果您没有电子方面的经验,则不应尝试基于这些电路进行构建,否则您可能会得到一个糟糕的结果...

在使用 220V 电压进行实验时应非常小心,并且绝对建议使用合适的保险丝。

3.1 来自计算机的 0-5V 驱动电压

这是一个从计算机的并行端口获取 0-5V 电压的简单示例。

      Back View          -----    Pin 10 - ACK
      Male DB-25         |   |    Pin  9 - D7
      Connector          |   |                           Pin 2 - D0
                         v   v                           v   Pin 1 -
~Strobe
       ____________________________________________________________
      /                                                            \
      \     13  12  11  10   9   8   7   6   5   4   3   2   1     /
       \                                                          /
        \     25  24  23  22  21  20  19  18  17  16  15  14     /
         \______________________________________________________/

引脚 1 是选通脉冲 (Strobe)(反向逻辑)

引脚 2-9 是数据总线 (DATA BUS) 的信号,与使用 OUTB 命令写入并行端口锁存器的内容完全相同。

引脚 10 是应答信号 (ACK),由您控制,以便您可以向 CPU 产生中断。

引脚 18-25 短路,这是接地 (GND)。

详细信息

<= in   DB25    Cent    Name of         Reg
=> out  pin     pin     Signal          Bit     Function Notes
------  ----    ----    --------        ---     -----------------------------
=>       1       1      -Strobe         C0-     Set Low pulse >0.5 us to send
=>       2       2      Data 0          D0      Set to least significant data
=>       3       3      Data 1          D1      ...
=>       4       4      Data 2          D2      ...
=>       5       5      Data 3          D3      ...
=>       6       6      Data 4          D4      ...
=>       7       7      Data 5          D5      ...
=>       8       8      Data 6          D6      ...
=>       9       9      Data 7          D7      Set to most significant data
<=      10      10      -Ack            S6+ IRQ Low Pulse ~ 5 uS, after accept
<=      11      11      +Busy           S7-     High for Busy/Offline/Error
<=      12      12      +PaperEnd       S5+     High for out of paper
<=      13      13      +SelectIn       S4+     High for printer selected
=>      14      14      -AutoFd         C1-     Set Low to autofeed one line
<=      15      32      -Error          S3+     Low for Error/Offline/PaperEnd
=>      16      31      -Init           C2+     Set Low pulse > 50uS to init
=>      17      36      -Select         C3-     Set Low to select printer
==      18-25   19-30,  Ground

3.2 使用继电器控制

可以构建的直接电路是

                             Vcc
                              |
                              +------+
                              |    __|__
                            Relay   /^\  Diode 1N4002
                             Coil  /---\
                              |      |
                              +------+
                              |
                           | / 
                 4.7K    B |/  C
parallel port >-\/\/\/\/---|        NPN Transistor: BC547A or 2N2222A
data pi                    |\  E
                           | \
                             V
parallel port >--------------+
ground pin                   |
                          Ground
将 Vcc 连接到与继电器类型相同的电压(通常为 5 或 12V)。显然,继电器的规格应根据您的咖啡机进行缩放。

酒吧招待员倾向于将继电器放在晶体管之后,在发射极 (E) 引脚而不是集电极 (C) 引脚处。这是一种不良做法,因为它会错误地偏置晶体管,并可能导致咖啡味道不好 :-)。二极管 1N4002 可用于保护晶体管免受继电器的电流影响。如果您不使用它,晶体管很快就会变得又黑又臭...

3.3 使用双向可控硅 #1 控制

如果您只需要一个简单的电路,则可以使用摩托罗拉的双向可控硅驱动器 MOC301[012],以及通用双向可控硅(TRIAC),如 SC141D。这种方法的优点是您不需要任何额外的电源。

对于非感性负载,电路如下

        270     1 +-------+ 6    180
  +5v -VAVAVA-----+       +----VAVAVA-----+-------------- Line Hot
                2 |  MOC  |               |
  TTL in ---------+ 3012  +nc            VA  SC141D
                  |       | 4           / |
                nc+       +------------/  |
                  +-------+               +----\/\/\/---- Line Neutral
                                                LOAD

如果您要使用 220V 电压,请尝试获取 3021。感性负载应与旁路电容器结合使用,最好查阅摩托罗拉应用笔记 AN-780。咖啡机主要是阻性负载而不是感性负载(如电机),但谁知道您的咖啡机是什么类型呢?

3.4 使用双向可控硅 #2 控制

+5VDC
|    180                      180            2.2k
+---/\/\/\----+-----+   +----/\/\/-+--/\/\/\---+-------> 120V
              |    1|   |6         |           |         Hot
              |    +=====+         |           | MT1
              |    | MC  | TRIAC   |          +-+
              |    | 3032| Driver  |        G | | TRIAC
              |    +=====+         |         /| |
              \    2|   |4         |        / +-+
       2N3904  |----+   |          |        |  | MT2
              /     |   +--------- | -------+  |
             V      \              |        |  |
             |      /              |        \  |
             |      \ 43    .01u  ---   10k /  |
             |      /       500V  ---       \  |
             |      |              |        /  |
             +------+              |        |  |            Neutral
             |                     +--------+--+---o    o--> 120V
             /                                      load
 >-/\/\--|  2N3904
             \
              V
              |
             ---
            ///

This design is for 120V. You should change resistors accordingly for 220V.

电路描述

MC3032 是一种光耦双向可控硅驱动器。180 欧姆电阻为光耦中的 LED 发射器设置电流。如有必要,请更改此电阻的值以获得合理的电流(例如,15 mA)。

请注意,如果不连接负载,则无法测试此电路。双向可控硅不会切换,除非连接到交流电压源,因此如果不施加交流电和负载,则无法测试其简单的切换功能。请注意 .01 电容器上的 500V 额定值。


4. 软件

4.1 编程

您将必须构建一个可执行文件,该文件将执行以下步骤

将 BASE 更改为 /dev/lp0 的 0x3bc,/dev/lp1 的 0x378 和 /dev/lp2 的 0x278;范围 (range)=8。

如果您的程序是 setuid 的,那就太好了,这样每个人都可以喝咖啡!你个 BOFH!

4.2 设备驱动程序

只需阅读 内核黑客指南,即可实现设备驱动程序;您也可以在用户空间中执行此操作。请将其编译为模块,这样我们就不需要在每次更新时都编译内核。然后编写

echo cappuccino >/dev/coffee

您将在几分钟内喝到一杯热咖啡!请记住为 /dev/coffee 提供正确的权限,具体取决于您是否只希望 root 用户制作咖啡。

此方法的优点是它支持来自咖啡机的反馈,通过使用并行端口的 ACK 等,以便智能咖啡机可以在准备就绪时产生中断。

在阅读了 Alessandro Rubini 和 Jonathan Corbet 的优秀著作 Linux 设备驱动程序 并研究了 交叉引用 Linux 源代码存储库后,自己动手做。

4.3 连接互联网

如果您已经用 C 语言实现了控制程序(见上文),您只需编写一个 CGI 脚本来打开和关闭咖啡机或传递更复杂的指令。您应该编写一些漂亮的网页,解释如何制作咖啡,并将它们放在 apache Web 服务器上...

...LAMP 技术(Linux、Apache、MySQL、[Perl|Python|PHP])将帮助您构建一个完美的用户可定制的咖啡系统!

在未来应用程序变得相当复杂的时候,您可能希望在基于流的编程 (Flow-Based Programming) 的基础上进行扩展:http://www.jpaulmorrison.com/fbp/。对于一台伟大的咖啡机来说真是绝配!


5. 构建图灵完备的咖啡机

您是否渴望回到美好的旧时光,那时男人是男人,可以自己制造咖啡机?

本章是关于组装一台智能、智能的!咖啡机。它将是一台采用冯·诺依曼架构设计的计算机,由 CPU、ROM/RAM 和 I/O 组成,并且也适用于通用,又名通用 图灵机

5.1 充分的汇编语言

与其他复杂但流行的系统(CISC 或 RISC)不同,我们的机器将是 MISC:单指令集计算机 (Mono-Instruction Set Computer)!

唉,我们的处理器只会理解一条命令,但即使如此,只要有足够的内存和时间,它也能够执行您的 3GHz Pentium IV 可以做的任何操作,或者只是完全模拟它;它可以解决任何可计算的问题,只需运行如下简单代码

SBN     $mem1, $addr1
SBN     $mem2, $addr2
SBN     $mem3, $addr3
SBN     $mem4, $addr4
SBN     $mem5, $addr5
SBN     $mem6, $addr6
[...]

神奇的命令称为 SBN $mem, $addr(减法和负跳转),它获取内存单元 $mem 的值,从累加器(A 是此架构中唯一可用的寄存器)中减去它,然后将其存储回累加器和内存 $mem : [mem] <= A <= A-[mem]。如果结果为负数,并且只有在结果为负数时,它才会跳转到指定的地址 $addr。如果 $addr 指向下一个命令,则不会发生条件跳转。现在,有了这个命令,您可以进行减法、加法、归零内存地址、移动字节、乘法、比较等等。最棒的是,您可以轻松构建一个优化编译器。

瞧。这是一个适用于任何图灵完备问题的绝佳系统,而且,它的编码甚至比原始图灵机更简单!

5.2 硬件和接口

这种创新的 MISC 处理器的伟大之处在于,您需要 0 位来存储命令的操作码。这使得您的 CPU 变得非常非常简单:您每次只需要读取几个操作数。您可能希望通过将 SBN 指令扩展到 3 或 4 个操作数来扩展处理器的功能,以便它可以直接从主内存加载和存储数据。这是一个留给读者的练习;向 google 致敬。

CPU 图表如下所示

<========= ADDRESS BUS ==============>
        =                =
        =  +---------+   =
        =  | CONTROL |   =
   +---------+  +-----------------+
   | ALU & A |  | Program Counter |
   +---------+  +-----------------+
        =  |  LOGIC  |   =
        =  +---------+   =
        =                =
<=========== DATA BUS ===============>

现在,您所要做的就是将一些内存芯片连接在一起,例如通过回收旧 386 PC 中的静态缓存 RAM、一个 ALU 和一些胶合组件。您可以选择 TTL 或 CMOS 用于逻辑门和锁存器;我是 CMOS 人,但这实际上取决于您喜欢的口味。您可以构建 8 位、16 位、32 位、64 位或任何您需要的位宽系统。以防万一,对于更大的字宽,我发现使用预编程的 27128 EPROM 而不是更难找到的 74x181 来构建 ALU 更可取。还要寻找进位传播单元。

该系统的单片性质仅允许内存映射 I/O,并且需要为双向接口提供特殊的设计规定,但与老一代系统中看到的没有什么特别之处。AGC,驱动阿波罗 11 号登月任务的计算机正在使用此类技术,因此在这种情况下也应该足够了。

请注意,数据总线必须与地址总线完全一样宽,这意味着字节的概念仅适用于 8 位咖啡机,您最终会发现这与其说是错误不如说是一个功能。您会惊讶于 8 位或 16 位总线可以制作出什么样的咖啡!它确实是一个通用的硬件,用极少的成本构建。

5.3 软件

这种纯粹的系统将与以嵌入式系统控制而闻名的 FORTH 编程语言完美契合。这样做的主要先决条件是拥有堆栈机制,在这种情况下,堆栈机制可以通过计数器与内存池相结合来构建。

如果您想声称拥有一个严肃的咖啡开发平台,那么 C 语言的可移植性在当今是绝对必要的。您的选择可能是破解 gcc、lcc 或 sdcc 中的一个,通过在后端进行适当的调整,它们将能够输出专门制作的 MISC 汇编代码。有一天您甚至可能想要重写另一种语言,例如 C,忘记 D 字母 - 它已经被占用了,所以请不要在您的编译器中再次犯同样的错误:https://gnu.ac.cn/software/gcc/projects/beginner.html

以防万一您想编写自己的编译器,请提前阅读有关 flex、yacc 和少量相关理论的知识。特别是,您将很快理解 Noam Chomsky 关于语言的分类

等等。提前阅读 可计算性理论

5.4 对图灵机的小批评

由于图灵机的工作方式(请参阅 http://plato.stanford.edu/entries/turing-machine/ ),它是一种非常复杂的编程和调试设备。原因是,它的行为是一个顺序过程,完全由以下参数决定

图灵机 (TM) 的主要当代缺点是它是顺序性质的,这意味着只有特定范围的问题可以以直接的方式映射到它。TM 适用于在串行存储介质(磁带)上描述良好的问题,并且不使用索引进行数据引用。这与咖啡机 (CM) 形成对比,后者也可以处理任何随机访问算法(在不影响简单性的情况下)。

除此之外,TM 在保持 (1) 和 (2) 简单的前提下,对项目 (3) 施加了非常高且不必要的复杂性。以防万一您不同意所谓的指令表变得真正不堪重负,您是否尝试过为图灵机编写编译器?一个不易于编程且难以调试的系统,至少就计算机工程(!= CS)而言,应该被认为是一个非常值得怀疑的系统。例如,尝试用图灵机模拟咖啡机,反之亦然。嘿,如果您仍然不同意,请给我看代码。

底线:咖啡机 (CM) 是冯·诺依曼架构的更好的模型,并且与当前复杂性理论中算法加权的标准实践具有 O(1) 关系。


6. 过量症状


7. 扩展


8. 更多信息

本章中的链接列表经常过时,因此您可能希望使用出色的时光机器再次找到它们:http://www.archive.org/