说明: 封面

Table of Contents

目录

扉页

版权

其他

致谢

前言

P.1 你需要什么

P.1.1 储备知识

P.1.2 工具

P.1.3 元器件

P.1.4 数据手册

P.2 如何使用本书

P.2.1 电路图

P.2.2 尺寸

P.2.3 数学

P.2.4 组织

P.3 如果有些东西不工作了

P.4 作者读者交流

P.4.1 你告知我

P.4.2 你问我答

P.5 在你开始制作前

P.6 进阶

P.7 网上资源

准备

S.1 电源

S.1.0 稳压

S.2 搭建电路教程

S.2.1 接线

S.2.2 钩子

S.3 元器件存储

S.3.0 验证

项目1:黏糊糊的阻值

1.1 用胶水粘起来的放大器

1.1.1 发生了什么

1.1.2 符号

1.2 注意事项:非标准的引脚

1.3 背景知识:导体与绝缘体

1.4 拓展

项目2:获取数据

2.1 需求

2.2 三极管行为

2.2.1 请注意:防止万用表受损

2.2.2 缩略语和数据手册

2.2.3 关于电压

2.2.4 关于电压的基本知识回顾

2.3 拓展:老式电表

2.4 关于三极管的一些知识要点

2.5 分压电路样例的答案

项目3:从光到声

3.0 光敏音高

项目4:测量光

4.1 使用光敏三极管

4.2 光敏三极管知识回顾

4.2.0 背景知识:光子和电子

4.3 关于555定时器的知识回顾

4.3.0 CMOS定时器和双极型定时器的知识回顾

项目5:呜呜的声音

5.0 制作更多

项目6:易开易合

6.1 进行比较

6.1.0 比较器基本知识

6.2 反馈

6.3 迟滞

6.4 图标

6.4.0 正负端知识

6.5 输出

6.5.0 更多关于比较器的知识

6.6 芯片内部

6.7 重画电路图

6.7.0 注意:反向比较器

6.8 和微控制器对比

6.9 制作更多内容:基于激光的安保系统

项目7:全年适用光感灯具控制

7.1 不要用危险电压

7.2 基本电路

7.2.1 第二步

7.2.2 电路测试

7.2.3 继电器细节

7.3 耦合电容

7.4 打开一个闹钟

7.4.1 注意:不要用交流的闹钟

7.4.2 看闹钟内部

7.4.3 闹钟的电压

7.4.4 蜂鸣器如何鸣叫

7.5 利用鸣叫

7.5.0 和闹钟连接起来

7.6 预期工作方式

7.7 测试

7.7.1 连接继电器与灯

7.7.2 警告:交流电防护

7.8 制作更多

7.9 下一步干什么

项目8:声音的探险之旅

8.1 放大

8.1.0 驻极体介绍

8.2 能听见我吗

8.3 背景知识:话筒杂记

8.3.0 声音的高高低低

项目9:从mV到V

9.1 加电容

9.2 运算放大器介绍

9.2.1 区别在哪里

9.2.2 完美的匹配组

9.2.3 测量输出

项目10:从声音到光

10.0 LED灯和三极管的组合

项目11:需要负反馈

11.1 测量的麻烦

11.2 直流放大

11.2.1 放大的输入与输出

11.2.2 电子学的镇定剂

11.2.3 增益

11.3 背景知识:负反馈的起源

11.3.0 通往极限

11.4 没有耕耘就没有收获

11.4.1 第一阶段:输出电压

11.4.2 第二阶段:输入电压

11.4.3 第三阶段:画图

11.4.4 第四阶段:增益

11.4.5 结果对吗

11.5 用正负电源消除误差

11.6 基础知识

11.6.0 非正负电源的基础知识

11.7 运算放大器知识回顾

项目12:实际可用的放大器

12.0 LM386芯片介绍

12.0.1 放大电路

12.0.2 调试放大器

项目13:不要大声讲话

13.1 背景:Widlar的故事

13.2 步一步来

13.2.1 感应

13.2.2 电路真的会工作吗

13.2.3 背景知识:电压转换

13.2.4 噪声对抗

13.2.5 电源问题

13.2.6 失败了吗

13.2.7 还有一个小事情

项目14:一个成功的对抗

14.1 时间安排决定一切

14.1.1 更改总结

14.1.2 噪声测试

14.2 制作更多

14.3 大家能用微控制器来完成这个项目吗

14.4 下一步做什么

项目15:一切都是这么有逻辑

15.0 项目15:感应测试

15.0.1 背景知识:超感知觉ESP

15.0.2 项目设置

15.0.3 逻辑芯片知识介绍

15.0.4 超感知觉逻辑

15.0.5 搭建电路

15.0.6 改进

项目16:改进版的超感知觉

16.1 大家准备好了吗

16.1.1 抓住作弊

16.1.2 指示失败结果

16.2 冲突

16.2.1 解开困惑

16.2.2 翻译这张图

16.3 优化

16.3.1 搭建电路

16.3.2 细节

16.3.3 数字化的差异

16.3.4 改进

16.3.5 没那么简单吗

16.3.6 我们能用微控制器来做吗

项目17:我们来玩石头剪子布

17.1 背景:概率

17.1.0 背景知识:博弈论

17.2 逻辑

17.2.0 谁来玩

17.3 谁在作弊

17.3.0 背景知识:逻辑阵列

项目18:是用开关的时候了

18.0 背景知识:用灯具开关做成的同或门

18.0.1 回到石头剪子布游戏

18.0.2 显示是哪个按钮

18.0.3 防止作弊

18.0.4 平手的处理

18.0.5 接线

18.0.6 防止作弊的布线

18.0.7 结论

项目19:解码超感知觉

19.0 解码测试

19.0.1 回忆二进制

19.0.2 上电路板

19.0.3 解码器输出引脚

项目20:解码石头剪刀布

20.0 逻辑

20.0.1 要求

20.0.2 一个无法获得的或门

20.0.3 或非门拯救了世界

20.0.4 将简化版的方案搭出电路来

20.0.5 制作更多内容

20.0.6 逆解码

项目21:接电槽位游戏

21.1 复用

21.1.1 移动接线

21.1.2 复用器基本知识

21.1.3 复用器引脚

21.1.4 复用器应用

21.1.5 模拟复用器与数字复用器

21.1.6 复用器各种变种的知识回顾

21.2 游戏设计

21.2.1 槽位计数

21.2.2 电路设计

21.3 槽位设计

21.3.0 接电槽位测试

21.4 谁会获胜

21.4.1 胜利成果

21.4.2 理解概率

21.4.3 背景:不同的游戏阵列

21.5 那么用微控制器呢

项目22:穿过逻辑听到声音

22.1 背景:不在这里也不是特雷门

22.2 穿过逻辑听到声音

22.2.1 通过异或门来听

22.2.2 将所有的都混在一起

项目23:猜谜项目

23.1 背景:英国猜谜之王

23.2 移动棋子游戏

23.2.1 逻辑网格

23.2.2 使用逻辑芯片

23.2.3 用开关来实现奥维德游戏

23.2.4 制作更多

23.2.5 猜谜的答案

项目24:做加法

24.1 二进制的五个规则

24.1.1 从比特到状态

24.1.2 背景:另一种用与非门做的加法器

24.2 我们自己的小加法器

24.2.0 面包板加法器

项目25:改进加法器

25.1 解码器的返回值

25.2 使用双列直插

25.2.1 编码器介绍

25.2.2 其他的编码器功能

25.2.3 背景:二进制的强大

25.2.4 背景:给自己编码

25.3 制作更多:其他输入的选择

25.3.0 我们是否可以用开关来完成

25.4 制作更多:开关做的二进制加法器

25.4.1 做一张表

25.4.2 开关性能

25.5 制作更多:其他的可能性

项目26:环形计数器

26.1 环形计数器示例

26.1.1 警告:定时器的不兼容

26.1.2 恼人的引脚顺序

26.1.3 排插知识

26.1.4 环形计数器知识

26.2 用来做游戏

26.2.1 额外的功能

26.2.2 可玩性

26.3 制作更多

26.4 拿微控制器来做呢

项目27:移位寄存器

27.1 不要回弹

27.1.0 特别之处

27.2 一个移位寄存器的示例

27.2.1 移位寄存器知识总结

27.2.2 引脚分布

27.3 背景:比特流

27.3.0 现代的应用场合

项目28:八卦盒子

28.1 卦象

28.1.1 显示

28.1.2 直的蓍草的指引

28.1.3 数字

28.1.4 随机采样

28.1.5 外观与感觉

28.1.6 细节

28.1.7 用LED灯还是发光条

28.1.8 搭接八卦电路

28.1.9 组装与测试

28.1.10 八卦的使用

28.2 包装

项目29:常见的传感器

29.1 小小的磁力开关

29.1.1 磁簧管测试

29.1.2 使用方法

29.2 液位传感器

29.2.1 油量表

29.2.2 磁簧开关知识总结

29.2.3 简单的替换

29.2.4 安装磁簧开关

29.3 背景知识:磁场极性

29.3.1 磁体种类和供货渠道

29.3.2 不同形状的磁体

29.3.3 制作更多:涡流

29.4 警告:磁场的危害

项目30:隐藏的探测器

30.1 霍尔测试

30.1.0 应用

30.2 霍尔传感器知识

30.2.1 霍尔传感器类别

30.2.2 传感器想法

30.3 制作更多:小型滚球游戏

30.3.1 弯折塑料

30.3.2 滚球电子电路

项目31:光传感器

31.1 主动光传感器

31.1.0 警告:延长传感器的寿命

31.2 数字

31.2.1 红外传感器测试

31.2.2 红外LED灯测试

31.2.3 光敏三极管测试

31.2.4 逻辑测试

31.2.5 选项

31.2.6 透射式光传感器知识

31.3 更好的槽位

31.3.1 原理验证

31.3.2 电路原理图

31.3.3 面包板

31.4 槽位盒子

项目32:改进奥维德游戏

32.1 逻辑选项

32.1.1 用开关

32.1.2 磁性的问题

32.2 制作更多:使用微控制器

项目33:读取旋转信息

33.1 定义一个旋转编码器

33.1.1 规格

33.1.2 脉冲序列

33.1.3 警告:表现平庸的编码器

33.2 编码器内部结构

33.2.0 编码器的应用

33.3 编码器可以是随机的

33.3.1 旋转决断者

33.3.2 旋转含混器

33.4 严格的随机结果

项目34:感知环境

34.1 用一个定时器来控制另一个定时器

34.1.1 温度控制

34.1.2 随机因素

34.1.3 自动运行随机生成电路

34.1.4 背景知识:计数到较低值

34.1.5 速度调节

34.2 热敏电阻知识

34.2.0 让热敏电阻随机性更强

34.3 湿度传感器

34.3.0 湿度控制

34.4 加速度传感器

34.5 触觉传感器

34.6 经验问题

34.6.0 要多随机才算随机

项目35:线性反馈移位寄存器

35.1 了解线性反馈移位寄存器

35.1.1 线性反馈移位寄存器知识

35.1.2 内部的比特位移

35.1.3 关于0的问题

35.1.4 需要不重复

35.1.5 警告:同或门的特质

35.1.6 运行测试

35.1.7 关于1和0

35.1.8 比例问题

35.1.9 跳过254

35.1.10 共享时钟输入

35.1.11 还有其他选择吗

35.2 种子

35.3 制作更多:其他的游戏和其他的数字

35.4 制作更多:通过微控制器来产生随机数

项目36:单人超能力范例

36.1 最后的逻辑图

36.1.1 看看第二部分

36.1.2 输入逻辑

36.1.3 预备信号

36.1.4 随机种子生成

36.1.5 还需要两个异或门

36.1.6 时间安排最重要

36.2 每次猜测都计数

36.2.1 第二部分电路图

36.2.2 测试这个超感知觉测试器

36.3 超感知觉出现的概率有多低

36.3.1 三角的威力

36.3.2 John Walker

这就是全部了吗?

附录:元器件采购说明

A.1 套件选择

A.2 采购渠道

A.3 通用元器件

A.3.1 电阻

A.3.2 电容

A.3.3 LED

A.3.4 带内置电阻的LED

A.3.5 警告:串联电阻

A.4 芯片家族基本知识

A.4.1 三极管

A.4.2 开关

A.4.3 电源、面包板以及电线

A.5 最小集采购:项目1至项目14

A.6 最小集采购:项目15至项目25

A.7 最小集采购:项目26至项目36

A.8 中等集采购:项目1至项目14

A.9 中等集采购:项目15至项目25

A.10 中等集采购:项目26至项目36

A.11 最大集采购:项目1至项目14

A.12 最大集采购:项目15至项目25

A.13 最大集采购:项目26至项目36

A.14 渐进式采购

目录

封面

扉页

版权

致谢

前言

P.1 你需要什么

P.1.1 储备知识

P.1.2 工具

P.1.3 元器件

P.1.4 数据手册

P.2 如何使用本书

P.2.1 电路图

P.2.2 尺寸

P.2.3 数学

P.2.4 组织

P.3 如果有些东西不工作了

P.4 作者读者交流

P.4.1 你告知我

P.4.2 你问我答

P.5 在你开始制作前

P.6 进阶

P.7 网上资源

准备

S.1 电源

S.1.0 稳压

S.2 搭建电路教程

S.2.1 接线

S.2.2 钩子

S.3 元器件存储

S.3.0 验证

项目1:黏糊糊的阻值

1.1 用胶水粘起来的放大器

1.1.1 发生了什么

1.1.2 符号

1.2 注意事项:非标准的引脚

1.3 背景知识:导体与绝缘体

1.4 拓展

项目2:获取数据

2.1 需求

2.2 三极管行为

2.2.1 请注意:防止万用表受损

2.2.2 缩略语和数据手册

2.2.3 关于电压

2.2.4 关于电压的基本知识回顾

2.3 拓展:老式电表

2.4 关于三极管的一些知识要点

2.5 分压电路样例的答案

项目3:从光到声

3.0 光敏音高

项目4:测量光

4.1 使用光敏三极管

4.2 光敏三极管知识回顾

4.2.0 背景知识:光子和电子

4.3 关于555定时器的知识回顾

4.3.0 CMOS定时器和双极型定时器的知识回顾

项目5:呜呜的声音

5.0 制作更多

项目6:易开易合

6.1 进行比较

6.1.0 比较器基本知识

6.2 反馈

6.3 迟滞

6.4 图标

6.4.0 正负端知识

6.5 输出

6.5.0 更多关于比较器的知识

6.6 芯片内部

6.7 重画电路图

6.7.0 注意:反向比较器

6.8 和微控制器对比

6.9 制作更多内容:基于激光的安保系统

项目7:全年适用光感灯具控制

7.1 不要用危险电压

7.2 基本电路

7.2.1 第二步

7.2.2 电路测试

7.2.3 继电器细节

7.3 耦合电容

7.4 打开一个闹钟

7.4.1 注意:不要用交流的闹钟

7.4.2 看闹钟内部

7.4.3 闹钟的电压

7.4.4 蜂鸣器如何鸣叫

7.5 利用鸣叫

7.5.0 和闹钟连接起来

7.6 预期工作方式

7.7 测试

7.7.1 连接继电器与灯

7.7.2 警告:交流电防护

7.8 制作更多

7.9 下一步干什么

项目8:声音的探险之旅

8.1 放大

8.1.0 驻极体介绍

8.2 能听见我吗

8.3 背景知识:话筒杂记

8.3.0 声音的高高低低

项目9:从mV到V

9.1 增加电容

9.2 运算放大器介绍

9.2.1 区别在哪里

9.2.2 完美的匹配

9.2.3 测量输出

项目10:从声音到光

10.0 LED灯和三极管的组合

项目11:需要负反馈

11.1 测量的麻烦

11.2 直流放大

11.2.1 放大的输入与输出

11.2.2 电子学的镇定剂

11.2.3 增益

11.3 背景知识:负反馈的起源

11.3.0 通往极限

11.4 没有耕耘就没有收获

11.4.1 第一阶段:输出电压

11.4.2 第二阶段:输入电压

11.4.3 第三阶段:画图

11.4.4 第四阶段:增益

11.4.5 结果对吗

11.5 用正负电源消除误差

11.6 基础知识

11.6.0 非正负电源的基础知识

11.7 运算放大器知识回顾

项目12:实际可用的放大器

12.0 LM386片介绍

12.0.1 放大电路

12.0.2 调试放大器

项目13:不要大声讲话

13.1 背景:Widlar的故事

13.2 一步一步来

13.2.1 感应

13.2.2 电路真的会工作吗

13.2.3 背景知识:电压转换

13.2.4 噪声对抗

13.2.5 电源问题

13.2.6 失败了吗

13.2.7 还有一个小事情

项目14:一个成功的对抗

14.1 时间安排决定一切

14.1.1 更改总结

14.1.2 噪声测试

14.2 制作更多

14.3 大家能用微控制器来完成这个项目吗

14.4 下一步做什么

项目15:一切都是这么有逻辑

15.0 项目15:感应测试

15.0.1 背景知识:超感知觉ESP

15.0.2 项目设置

15.0.3 逻辑芯片知识介绍

15.0.4 超感知觉逻辑

15.0.5 搭建电路

15.0.6 改进

项目16:改进版的超感知觉

16.1 大家准备好了吗

16.1.1 抓住作弊

16.1.2 指示失败结果

16.2 冲突

16.2.1 解开困惑

16.2.2 翻译这张图

16.3 优化

16.3.1 搭建电路

16.3.2 细节

16.3.3 数字化的差异

16.3.4 改进

16.3.5 没那么简单吗

16.3.6 我们能用微控制器来做吗

项目17:我们来玩石头剪子布

17.1 背景:概率

17.1.0 背景知识:博弈论

17.2 逻辑

17.2.0 谁来玩

17.3 谁在作弊

17.3.0 背景知识:逻辑阵列

项目18:是用开关的时候了

18.0 背景知识:用灯具开关做成的同或门

18.0.1 回到石头剪子布游戏

18.0.2 显示是哪个按钮

18.0.3 防止作弊

18.0.4 平手的处理

18.0.5 接线

18.0.6 防止作弊的布线

18.0.7 结论

项目19:解码超感知觉

19.0 解码测试

19.0.1 回忆二进制

19.0.2 上电路板

19.0.3 解码器输出引脚

项目20:解码石头剪刀布

20.0 逻辑

20.0.1 要求

20.0.2 一个无法获得的或门

20.0.3 或非门拯救了世界

20.0.4 将简化版的方案搭出电路来

20.0.5 制作更多内容

20.0.6 逆解码

项目21:接电槽位游戏

21.1 复用

21.1.1 移动接线

21.1.2 复用器基本知识

21.1.3 复用器引脚

21.1.4 复用器应用

21.1.5 模拟复用器与数字复用器

21.1.6 复用器各种变种的知识回顾

21.2 游戏设计

21.2.1 槽位计数

21.2.2 电路设计

21.3 槽位设计

21.3.0 接电槽位测试

21.4 谁会获胜

21.4.1 胜利成果

21.4.2 理解概率

21.4.3 背景:不同的游戏阵列

21.5 那么用微控制器呢

项目22:穿过逻辑听到声音

22.1 背景:不在这里也不是特雷门

22.2 穿过逻辑听到声音

22.2.1 通过异或门来听

22.2.2 将所有的都混在一起

项目23:猜谜项目

23.1 背景:英国猜谜之王

23.2 移动棋子游戏

23.2.1 逻辑网格

23.2.2 使用逻辑芯片

23.2.3 用开关来实现奥维德游戏

23.2.4 制作更多

23.2.5 猜谜的答案

项目24:做加法

24.1 二进制的五个规则

24.1.1 从比特到状态

24.1.2 背景:另一种用与非门做的加法器

24.2 我们自己的小加法器

24.2.0 面包板加法器

项目25:改进加法器

25.1 解码器的返回值

25.2 使用双列直插

25.2.1 编码器介绍

25.2.2 其他的编码器功能

25.2.3 背景:二进制的强大

25.2.4 背景:给自己编码

25.3 制作更多:其他输入的选择

25.3.0 我们是否可以用开关来完成

25.4 制作更多:开关做的二进制加法器

25.4.1 做一张表

25.4.2 开关性能

25.5 制作更多:其他的可能性

项目26:环形计数器

26.1 环形计数器示例

26.1.1 警告:定时器的不兼容

26.1.2 恼人的引脚顺序

26.1.3 排插知识

26.1.4 环形计数器知识

26.2 用来做游戏

26.2.1 额外的功能

26.2.2 可玩性

26.3 制作更多

26.4 拿微控制器来做呢

项目27:移位寄存器

27.1 不要回弹

27.1.0 特别之处

27.2 一个移位寄存器的示例

27.2.1 移位寄存器知识总结

27.2.2 引脚分布

27.3 背景:比特流

27.3.0 现代的应用场合

项目28:八卦盒子

28.1 卦象

28.1.1 显示

28.1.2 直的蓍草的指引

28.1.3 数字

28.1.4 随机采样

28.1.5 外观与感觉

28.1.6 细节

28.1.7 用LED灯还是发光条

28.1.8 搭接八卦电路

28.1.9 组装与测试

28.1.10 八卦的使用

28.2 包装

项目29:常见的传感器

29.1 小小的磁力开关

29.1.1 磁簧管测试

29.1.2 使用方法

29.2 液位传感器

29.2.1 油量表

29.2.2 磁簧开关知识总结

29.2.3 简单的替换

29.2.4 安装磁簧开关

29.3 背景知识:磁场极性

29.3.1 磁体种类和供货渠道

29.3.2 不同形状的磁体

29.3.3 制作更多:涡流

29.4 警告:磁场的危害

项目30:隐藏的探测器

30.1 霍尔测试

30.1.0 应用

30.2 霍尔传感器知识

30.2.1 霍尔传感器类别

30.2.2 传感器想法

30.3 制作更多:小型滚球游戏

30.3.1 弯折塑料

30.3.2 滚球电子电路

项目31:光传感器

31.1 主动光传感器

31.1.0 警告:延长传感器的寿命

31.2 数字

31.2.1 红外传感器测试

31.2.2 红外LED灯测试

31.2.3 光敏三极管测试

31.2.4 逻辑测试

31.2.5 选项

31.2.6 透射式光传感器知识

31.3 更好的槽位

31.3.1 原理验证

31.3.2 电路原理图

31.3.3 面包板

31.4 槽位盒子

项目32:改进奥维德游戏

32.1 逻辑选项

32.1.1 用开关

32.1.2 磁性的问题

32.2 制作更多:使用微控制器

项目33:读取旋转信息

33.1 定义一个旋转编码器

33.1.1 规格

33.1.2 脉冲序列

33.1.3 警告:表现平庸的编码器

33.2 编码器内部结构

33.2.0 编码器的应用

33.3 编码器可以是随机的

33.3.1 旋转决断者

33.3.2 旋转含混器

33.4 严格的随机结果

项目34:感知环境

34.1 用一个定时器来控制另一个定时器

34.1.1 温度控制

34.1.2 随机因素

34.1.3 自动运行随机生成电路

34.1.4 背景知识:计数到较低值

34.1.5 速度调节

34.2 热敏电阻知识

34.2.0 让热敏电阻随机性更强

34.3 湿度传感器

34.3.0 湿度控制

34.4 加速度传感器

34.5 触觉传感器

34.6 经验问题

34.6.0 要多随机才算随机

项目35:线性反馈移位寄存器

35.1 了解线性反馈移位寄存器

35.1.1 线性反馈移位寄存器知识

35.1.2 内部的比特位移

35.1.3 关于0的问题

35.1.4 需要不重复

35.1.5 警告:同或门的特质

35.1.6 运行测试

35.1.7 关于1和0

35.1.8 例问题

35.1.9 跳过254

35.1.10 共享时钟输入

35.1.11 还有其他选择吗

35.2 种子

35.3 制作更多:其他的游戏和其他的数字

35.4 制作更多:通过微控制器来产生随机数

项目36:单人超能力范例

36.1 最后的逻辑图

36.1.1 看看第二部分

36.1.2 输入逻辑

36.1.3 预备信号

36.1.4 随机种子生成

36.1.5 还需要两个异或门

36.1.6 时间安排最重要

36.2 每次猜测都计数

36.2.1 第二部分电路图

36.2.2 测试这个超感知觉测试器

36.3 超感知觉出现的概率有多低

36.3.1 三角的威力

36.3.2 John Walker概率

这就是全部了吗?

附录:元器件采购说明

A.1 套件选择

A.2 采购渠道

A.3 通用元器件

A.3.1 电阻

A.3.2 电容

A.3.3 LED

A.3.4 带内置电阻的LED

A.3.5 警告:串联电阻

A.4 芯片家族基本知识

A.4.1 三极管

A.4.2 开关

A.4.3 电源、面包板以及电线

A.5 最小集采购:项目1至项目14

A.6 最小集采购:项目15至项目25

A.7 最小集采购:项目26至项目36

A.8 中等集采购:项目1至项目14

A.9 中等集采购:项目15至项目25

A.10 中等集采购:项目26至项目36

A.11 最大集采购:项目1至项目14

A.12 最大集采购:项目15至项目25

A.13 最大集采购:项目26至项目36

A.14 渐进式采购

MAKER MEDIA

SEBASTOPOL,CA

创客电子制作实例精选 36个趣味电子DIY项目

[]Charles Platt 著

夏明新 译

人民邮电出版社

北京

图书在版编目(CIP)数据

创客电子制作实例精选:36个趣味电子DIY项目/(美)查尔斯·普拉特(Charles Platt)著;夏明新译.--北京:人民邮电出版社,2016.8

(爱上制作)

ISBN 978-7-115-42582-9

Ⅰ.① Ⅱ.①…② Ⅲ.①电子器件制作 Ⅳ.①TN

中国版本图书馆CIP数据核字(2016)第136836

版权声明

© 2016 year of first publication of the Translation Posts Telecom Press.

Authorized Simplified Chinese translation of the English edition of Make:More Electronics(ISBN 9781449344047) © 2014 Maker Media,Inc.published by O'Reilly Media,Inc.

This translation is published and sold by permission of O'Reilly Media,Inc.,which owns or controls all rights to sell the same.

本书英文版版权归Maker Media,Inc.所有,由O'Reilly Media,Inc.2014年出版。简体中文版通过O'Reilly Media,Inc.授权给人民邮电出版社,于2016年出版发行,得到原出版方的授权。版权所有,未得书面许可,本书的任何部分不得以任何形式重制。

内容提要

本书将通过36个有趣的实例项目,来教你使用运算放大器、比较器、计数器、编码器、解码器、复用器、移位寄存器、定时器、发光条、达林顿阵列、光敏三极管还有各种传感器,制作出一些智能化的互动项目,体验创客的工作日常。这本书中的制作项目配图全面,还包括了全套的元器件列表,以便大家将制作项目所需的元器件准备齐全。

著 []Charles Platt

译 夏明新

责任编辑 马涵

责任印制 周昇亮

人民邮电出版社出版发行  北京市丰台区成寿寺路11

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

北京画中画印刷有限公司印刷

开本:800×1000 1/16

印张:19  20168月第1

字数:550千字  20168月北京第1次印刷

著作权合同登记号 图字:01-2015-2400

定价:99.00

读者服务热线:(010)81055339 印装质量热线:(010)81055316

反盗版热线:(010)81055315

广告经营许可证:京东工商广字第8052

其他

谨以此书纪念我的父亲Maurice Platt,他给我展示了工程师是一个多么优秀与有价值的职业。

致谢

在真空管(注:即电子管)的年代,我和我学校的朋友们一起在电子学的领域探索。我们就是那种书呆子,而且书呆子这个词当时还不存在。Patrick FaggHugh LevinsonGraham RogersJohn Witty,他们给我指引了电子学的方向,而50年后,Graham还为本书提供了一张电路图。

Mark Frauenfelder让我回归到了制作的道路上。Gareth Branwyn帮我出版了Make:ElectronicsBrian Jepson则帮我策划了这个续集。这三位是我所认识的最棒的三个编辑,也是我最喜欢的三个人。绝大部分的作者可没有我这么好的运气。

我还特别感谢Dale Dougherty,他策划了一个我从没想过会这么重要的项目,还热情地欢迎我加入。

在我做这个项目的时候,Fredrik Jansson给了我很多建议,也为我纠正了很多错误。他很耐心,也很有幽默感,这些对我都非常重要。

Philipp Marek为我做了正误检查。如果这本书里面还有错误,请不要指责PhilippFredrik。请记住,我犯错误比别人找到这个错误要简单很多。

电路由Frank TengA.Golin搭建并测试,非常感谢他们的帮助。同时,对于参与本书制作和校对的Kara EbrahimKristen BrownAmanda Kersey致以诚挚的感谢。

前言

这本书是我前一本入门指南Make:Electronics《身边的电子学》的续集。在本书中,你会发现不少以前我没有详细展开的话题,或者因为篇幅不够我压根就没提起的话题。你还会发现这本书在学术性上走得更远,这样有助于对概念的深入理解。同时,我一直试着做到边探索边学习,当然快乐也是我的目标。

之前通过各种方式,我已经在《爱上制作》系列书中讨论过书中的一些观点。我一直很享受为《爱上制作》撰写专栏文章,不过短篇的形式限制住了篇幅和图示。现在在这本书里,我可以提供更详尽的阐述了。

我没有在微控制器方面纠结太深,因为详细解释它们的安装和编程语言实在需要太多篇幅。已经有其他书籍解释过了不同微控制器芯片家族的内容了。当然你可以自己下功夫在微控制器上多研究一下,不过我建议让项目简单点,用一个现成的微控制器。

P.1 你需要什么

P.1.1 储备知识

你需要对我以前出版的书Make:Electronics中提到的各种话题有基本的了解,包括电压、电流、电阻和欧姆定律,电容、开关、晶体管和计数器,焊接和电路集成,以及逻辑门的入门知识。当然,你也可以从其他的指导书中学习到这些内容。通常,我会默认你已经读过Make:Electronics或者一本类似的电子学基础知识的书了,虽然你忘了一些,但你能记得大概。所以我只会稍作提醒,但不会重复解释那些特别基础的原理了。

P.1.2 工具

我假设你已经有了Make:Electronics中列出的设备:

万用表

●24规格的多色连接线(每种颜色25英尺,至少4种颜色)

剥线钳

钳子

烙铁和焊丝

面包板(要求的型号后面会讨论)

●9V电池,或者可以提供912V输出1A的电源适配器(直流输出)

P.1.3 元器件

我已经在附录中列出了该项目可能需要的元器件,而且附上了推荐的购买来源。

P.1.4 数据手册

Make:Electronics中我已经讨论过数据手册,它的重要性怎么强调也不为过。请试着建立在尝试新元器件前查阅数据手册的习惯。

如果你用一般的引擎搜索某型号,会有许多网站向你提供数据表。这些网站根据点击量排序而不是考虑你的方便与否。最后你很可能得点开数据手册里的所有页才能找到你想找的信息,因为网站的作者希望向你展示尽可能多的信息。

如果选择某些网站作为信息源搜索元器件信息的话,比如http://www.mouser.com,那么你可以节省很多时间,这些网站上你只需要点一个按钮就可以打开一个多页的PDF文件,这样读起来就比较方便,打印也更容易些。

P.2 如何使用本书

本书和前一本Make:Electronics在风格和组织形式上有些不同。你还得知道如何阅读我使用的符号。

P.2.1 电路图

Make:Electronics中的电路图是以一种老派风格绘制的,电线相交的地方用半圆跳过表示。我采用这种表现形式是因为可以避免错误地理解成回路。在本书中,我觉得我的读者们已经有足够的经验来阅读电路图,所以遵照现在通用的更现代的风格更重要一些,见图P-1的说明。

说明: 00002.jpeg 

P-1

上:本书中所有的电路图上,用黑圆点表示导线连接。最右图的表示方式不会采用,因为这跟交叉但不连接容易混淆。下:Make:Electronics中用左边的风格表示导线交叉但不连接,在本书里采用的是右侧使用得更普遍的风格

P.2.2 尺寸

集成电路芯片(以及其他多种元器件)是通过电线来安装的,这些电线腿一般被称作引脚。引脚可以用来插进线路板上的圆洞中。线路板上布满了间隔0.1英寸的圆洞,用你的指头可以很容易安装和拔出各种元器件。

引入公制后,有些生产商将插孔的间距标准由2.54mm(也就是0.1英寸)改成了2mm,我们这些用0.1英寸洞洞板的人因此受到了一些影响。公制在其他地方也突然出现了。举个例子,一种无处不在的元器件——面板LED,它通常的直径是5mm,这个尺寸对于3/16英寸的洞来说太大了,但是对于13/64英寸的洞来说又太小了,而不能牢固地装上,我还是愿意用英制尺寸(1英寸=2.54cm1英尺=0.3048m)。

另外一个更显著的问题是,整个电子行业已经转向了表面贴装方式。根本不是0.1英寸间隔洞阵的事儿,现在已经没有洞了,整个元器件一般不会比0.1英寸更长。要想用这些材料做个电路,你要的是镊子、显微镜和特殊的烙铁。它可以被制作出来,但是我个人并不觉得好玩,你在本书中不会看到一个用这种表面贴装元器件的项目。

P.2.3 数学

本书中的制作项目不会用到什么高深的数学知识,不过你得理解书中涉及的简单的计算原理。

我所用的数学表达风格是通用的。叉号“×”代表乘,斜杠“/”代表除。在圆括号里的算式应该先计算。中括号里头有小括号,应从最里头的括号算起。下面是个例子:

A=30/7+(4×2)

你先算4乘以2,得到8;然后加7,得到15;然后用30除以15,得到A=2

P.2.4 组织

与之前的那本书不一样,这本书基本遵循着线性结构。这对操作设备很有利,不用在跨页上翻来翻去找散落的细节。我想的是,你可以把这书一气呵成从头翻到尾,而不需要跳来跳去地看。

第一个项目中提出的概念会在第二个项目里用上,第二个项目为第三个项目打下基础。如果你不按这个顺序阅读,理解起来就有些麻烦了。

在小标题里,你会找到5种类型的章节:

项目

动手制作是本书的主线。

速览

介绍一个新概念后,我会进行重点总结,这样以后就容易查询了。

背景知识

当我觉得有意思或者有用时,我会偏离主线提供一些额外的信息,这些信息可能不是完成项目所严格需要的,只是一个简要的补充介绍,后面就交给你自己去探究了。

拓展

我没有篇幅展开所有可能的项目,所以我讲一些关于其他可以做的项目的简短概述。

警告

有时我会提到一些你应该避免的事情,这是为了保护你正在用的元器件,或者为了避免一个麻烦的错误,或者是为了保护你自己。

P.3 如果有些东西不工作了

通常建立一个能工作的电路只有一个方式,但出错让它不工作的路径有千百条。所以概率对你不利,除非你制作的时候非常小心且守规矩。我知道元器件装上但什么都没动静是多么让人沮丧的事情,如果你遇到问题,下面这些步骤可以帮你排查出那些最常见的错误。

1.把万用表的黑笔放在电池或电源的负极,将表调到电压测量模式(直流电压,除非项目要求其他)。确认你电路的电源是开着的。然后用表的红笔去接触线路的不同位置,寻找电压不对劲儿或者压根没有电压的地方。

2.仔细检查连接线和元器件的引脚在面包板上安装在正确的位置上。

关于面包板有两种错误特别常见:导线接入的地方比正确的地儿差了一行;把元器件或者连接件在同一行紧挨着摆放,忘记了面包板里的导体会让它们短路。图P-2是这些错误的示意。请确认你理解这些图所示的情况。

说明: 00003.jpeg 

P-2

两种最常见的面包板错误(上图);正确的摆放方法(下图)

在图P-2里,电容的引脚插在面包板的第1315行。不过由于视角的关系,很容易出错将蓝色导线的一头塞进第14行。在右侧,芯片的5号引脚应该通过一个陶瓷电容接地,但是由于面包板上不同行之间相邻的洞是连接着的,电容就短路了,而芯片直接接地了。图P-2更正了这些错误。

如果你的电路供电没有问题,元器件和导线在面包板上的安装位置也没问题,这里有5种可能值得记住:

元器件方位

复杂电路元器件需要牢牢地安装在板子上。确认引脚没有弯曲藏在芯片下。二极管、电容之类有极性的,需要以正确的方向安装。

连接不畅

有时(比较少见,但确实会发生)元器件在面包板内的连接并不好。如果你有一个断断续续令人费解的错误或者零电压的现象出现,可以试试重新安装元器件。根据我的经验,出现这个问题很大的可能是因为你买的面包板质量不好。如果你用的导线的直径小于24号,这问题也很可能发生(记住,高标号意味着更细一些的导线)。

元器件参数值

确认所有的电阻的阻值和电容容值是正确的。我的标准做法是在安装前用万用表检查每个电阻的阻值。这么做比较费时间,但是长远来看节省了你的时间。对于这点后面我还有话要说。

损坏

复杂电路和晶体管在不正确的电压、错误的极性和静电下可能会坏掉。手上多备些备用件,这样就可以替换了。

过度疲劳

当排除了所有情况之后,适当去休息一下吧!长时间工作会让你视野变窄,看不到哪里出了问题。如果你能把注意力转向别的地方一段时间,然后再回来找问题,答案会突然显现出来。

P.4 作者读者交流

有三种情况我想得到你的反馈,或者你想得知我的反应,它们是:

我要告诉你书里有个错误会导致你不能成功完成某个项目。我也可能是要告诉你梳理相关的某个套件出现的毛病。提出问题之后,我会告诉你是怎么解决的。这就是我告知你的互动形式。

如果你发现了书里或者是套件的错误,你可以告诉我。这是你告知我的互动形式。

在做某个作品的时候,如果你遇到了困难,你不知道是我的错误还是自己的错误。你想得到一些帮助,那么你可以和我一起讨论。这是你提问我回答的互动形式。

我鼓励你参加交流的原因是,如果有错误被发现了,我没办法通知你,后来你自己发现了,你一定会感到恼怒。

所以你只要简单地寄一封空白内容(如果你喜欢,也可以写些评论)到make.electronics@gmail.com,并在主题里注明注册,那么每次有更新内容我都会发邮件给你。

P.4.1 你告知我

如果你只是想通知我一个你发现的错误,最好是用我的出版商管理的勘误表系统。出版商用勘误信息来订正书籍的后续更新。

如果你确定自己找到了一个错误,请访问:http://oreil.ly/1jJr6DH

这个网站会告诉你如何提交勘误。

P.4.2 你问我答

我的时间显然比较有限,可能不一定会帮你解决所有问题。但是,如果你能附上那个不好使的项目的照片,我很可能可以给点建议。照片很关键。如果想知道为什么电路不运作,但是却不能见到它长什么样,要解决问题几乎是不可能的。

为此,你可以发邮件到make.electronics@gmail.com。请在主题里注明求助

P.5 在你开始制作前

在你报告一项错误或者项目不运转的问题前,我有一些要求:

请至少重建该电路一次。书里所有的项目在出版前都是我自己、很少部分是别人亲手搭建的。虽然我告诉你是你自己搞砸的不太礼貌,但是最可能的原因总是布线问题。

请记住我在完成书中的项目时至少遇到过十来次致命的接线错误。有一次我烧坏了好几个芯片,另外一次我把面包板烧熔了一部分。错误总是会发生的,无论是对于我还是对于你。

请意识到你作为读者的力量,并且合理地使用它。一个负面的评价造成的影响可能远超你想象。一条负面评价要抵过好几条正面评价。我得到的Make:Electronics反馈一般都是很正面的,但是有些时候人们因为一些小问题很恼怒,比如找不到一个我推荐的零件。但事实上这些零件是可以买到的,我很乐意提供来源,但这时负面评价已经出现了。

我会在网站上阅读评论,并且必要时总能提供反馈。

当然你可能只是不喜欢我写这书的方式,不要有心理负担直接说就可以。

P.6 进阶

从头到尾阅读完本书后,我想你应该掌握了电子学的中级知识。如果你还想知道的更多,我告诉你自己一直没提及的内容包括电子学原理、电路设计和电路测试。如果你想自己设计一个电路,你需要知道足够多的理论知识以理解和预测什么会发生,你才能够发现电路在你完成后将如何表现。要想做到这一步,你需要示波器和电路模拟软件。从维基百科上你可以找到一串的无偿软件。一些模拟软件可以给你展示电子回路的工作表现,一些软件专注模拟电路,还有一些两方面都注重。不过这些话题已经超过了一本普通书的范围,大概也超过了大部分把电子当作一项爱好而不是工作的人的范围。

我一直觉得应该有一个关于电子元器件的百科辞典以供查阅。我总会想怎么没有这么一类的书,所以我打算自己写一本。推荐《电子元器件百宝箱》的第1卷和第2卷现在已经发售了。总共会有3卷。

你正在阅读的这本书是一本亲身实践的指导书,而百科辞典的编写意图是为了迅速找到需要的信息,它也有些更偏技术性,撰写的风格也不那么易读但是更简洁明了。我个人觉得元器件百科辞典是个加深你对于各种会用到的零件的性能和使用方法记忆的非常宝贵的方法。

P.7 网上资源

Safari® Books Onlinehttp://my.safarBooksonline.com/?portal=oreilly)是一个按需电子图书馆,它能够提供科技和商业方面全球领先作家的书籍和视频的专业内容。

只要订阅,你就可以从我们的在线图书馆中读到任意一页或者看到任意一个视频;在新书出版前阅读,看到独家的还在撰写中的手稿,向作者提交反馈;复制和粘贴代码详例,管理你最喜欢的材料,下载章节,在关键地方做书签、写笔记、打印以及从其他众多节省时间的功能中获益。

制作传媒已经将本书上传到了Safari® Books Online。想要获得本书以及其他制作或者其他出版商的类似题材书籍,请到http://my.safarIbooksonline.com免费注册。

制作团结、鼓舞了一个不断壮大的聪明人的团体,制作传播信息,让他们快乐。这个团体在他们的后院、地下室和车库里进行着有趣的项目制作。制作为你们按照自己意愿把玩技术的权利欢呼。制作的读者是一个正在发展的文化和团体,他们相信更好的自己、更好的环境和更好的教育体系——我们整个世界。这已经不单单是种阅读,这是制作领导的一次世界范围的运动,我们称它为制作运动。

想得到制作的更多信息,访问我们的网站:

爱上制作:http://makezine.com/magazine/

Maker Faire: http://makerfaire.com

Makezine.com: http://makezine.com

Maker Shed: http://makershed.com/

关于本书,我们有个网页,网页上列出了勘误、示例和其他各种信息。你可以通过http://bit.ly/more-electronics访问它。

准备

我在Make:Electronics中给出了关于工作区域、元器件存储、工具和其他基本用具。在这里我会对之前的部分建议做一定的修改,而其他的会直接重新说一遍或者阐述一下。

S.1 电源

这本书中绝大部分的电路都可以用9V的电池供电,这种电池的优点在于不仅便宜而且能提供稳定电流,还没有毛刺和尖峰。另一方面讲,电池电压会随着逐渐使用而显著降低,而且电压还会随着输出电流的大小不同而发生变化。

如果能有一个可调电源,可以在0V直流到20V直流(或者更高)之间调整输出的话真的是很方便的,但是价格可能大家有点舍不得。比较合理的折中的办法是买一种电源适配器,可以直接插在墙面插座上,然后可以用开关来选择电压,如我在上一本书中建议的那样。

还有一种选择是买单电压的用在笔记本电脑上的交流适配器。很多这些适配器的输出电压是12V直流,可以接一个稳压芯片得到5V直流或者9V直流,这样就能满足这本书里面绝大多数的项目的需求了。稳压芯片的价钱每个不超过1美元,而笔记本电源适配器则不会超过10美元,这样这个选择就相当有吸引力了。这种电源可以提供高达1A1000mA)的电流。

大家可能还愿意选择手机充电器,特别是如果手机坏掉了,充电器还完好的时候。但是绝大多数的充电器只能输出5V直流,这就不太适合用在我描述的使用9V直流电源的项目中了。而且,由于这些充电器设计的目的是为电池充电,会随着负载的不同而降低输出电压的。

所以底线是这样的:如果你预算很紧张,而且不想在本书中制作永久性的项目存留,用9V的电池就可以了。如果不是这样,那就选个自己能承受价格范围内的12V电源适配器。

S.1.0 稳压

很多项目需要一个5V直流稳压电源。那么我们需要准备如下部件:

●LM7805稳压芯片

陶瓷电容:0.33μF0.1μF

电阻:2.2kΩ

单刀单掷或者单刀双掷开关,直插在电路板上的那种(比如说,引脚可以插在面包板的孔里面的那种)

通用型的LED

S-1展示了这些元器件如何挤进面包板最顶上的几行,从而做出一个左边的电源正极总线和右边的电源负极总线。这种配置我们在这本书里面会用在很多的项目中。这张照片展示了一个9V电池,当然大家是可以使用交流适配器的。请确认这个电源适配器的直流输出至少要不低于7V。为了防止产生过多的无效热量,电源适配器的输出也不应该超过12V直流。

说明: 00004.jpeg 

S-1

提供5V直流稳压电源的元器件布局

S-2展示了同样的电路原理图。即使你在使用电源的时候,电容也是不能省略掉的,因为这些电容保证了稳压芯片的正常工作。

我建议大家再加上一个开关和一个LED灯,这样就能方便很多。如果你在寻思为什么电路没有工作的时候,就可以看看LED灯是否亮起,来确认电源是不是给到了电路板上。而且如果你移动电线来更改电路,有一个开关来控制电源开关,也会感到万分幸运的。我建议大家在LED上串联一个相对高阻值的2.2kΩ电阻,这样就可以在使用电池的时候节约电力。

说明: 00005.jpeg 

S-2

5V直流稳压电源的原理图

S.2 搭建电路教程

Make:Electronics中,我用了那种两个长边的边缘各两条总线的面包板,这样我们就可以在板子的两侧各放置电源正极总线和电源负极总线了。在这本书中,我决定用更加简单的面包板,就是两边各只有一条总线的类型,如图S-3所示。

说明: 00006.jpeg 

S-3

每边只有一条总线的面包板的外观,这本书中所有的项目都是按照这种面包板进行设计的

我做这个改变有以下几个理由:

这种面包板价格特别便宜,关于更多元器件采购渠道的建议,请参见附录。如果你要买好几个面包板,可以将之前的电路保留着,然后在一块新板子上搭建新的电路。

如果你想通过将元器件焊接在印制版上做成永久版本的电路,最简单的办法就是使用走线和面包板一样的印制电路板。这种印制电路板通常情况下是每一边有一根总线(如RadioShack276-170)。如果元器件布局完全一致,从面包板上将元器件转过去要简单很多。

从读者给我的反馈里,我发现如果面包板两侧各有一组电源正负极,大家比较容易犯错误。这些错误可能代价会比较惨痛,也会导致很多的不方便,因为有一些元器件对反向极性几乎没有任何的容忍度。

大家需要时刻在脑子里面有一张面包板内部的连线图,因此我在这里放了一张我上一本书里面的图片,图S-4所示的就是面包板的剖面图。

说明: 00007.jpeg 

S-4

面包板剖面图,展示了面包板内部的导体情况

请记住,很多面包板的总线里面都有一个或者两个中断,这样就可以在板子上不同的部分使用不同的电源。我不希望大家使用这个功能,因此当大家拿出来一个新的面包板的时候,必须用万用表检查一下总线是否从头到尾都是连通的。如果不是连通的,那么就需要使用跳线来桥接总线上的这些空隙了。如忘了做这件事情,可能会是电路不能工作的常见原因。

S.2.1 接线

时不时地会有读者给我发邮件,附一张面包板电路的照片,问我为什么这个电路不工作。如果读者用了两头带小插头的跳线,我的答案总是一样的:我提供不了任何建议。即使电路就摆在我面前,我还是不能提供什么建议,我能做的也是将所有的电线拉出来重新开始搭接一遍。

面包板的跳线搭接起来很快很简单,我经常忍不住用这些跳线。当然,很多时候也会后悔,因为只要有一个地方接错了,想在这一堆凌乱的线里面找出问题来是非常难的。

在这本书的绝大部分照片中,大家会发现,在需要将面包板的设备与面包板连接的时候,我只用了带插头的跳线。在面包板上,我用了一小段单芯线,两头剥掉一段绝缘皮。这些线在进行错误诊断的时候特别容易处理。

如果大家买的套件里面已经有处理好的单芯线,你会发现这些线随着长度的不同而颜色有所区别。这是没有什么实际用途的,我需要的是面包板上的线根据功能而选择不同的颜色。比如说,连接到面包板上电源正极总线需要用红色,不管这根线长度到底是多少。两根同等长度的线,如果并排走在一块儿的话,需要用不同的颜色来区分,这样才不会搞混。这样我看着面包板的时候才能快速地做出判断,并能更简单地找到放错了的电线。

也许大家会觉得自己来做这些不同颜色的跳线过于复杂。如果是这样,我有一个建议。图S-5展示了我在这本书中的项目中用于面包板搭接的全套方法。

首先将任意长度的一段绝缘皮去掉(几个英寸),然后估计一下你在面包板上的跳线长度,我将这个长度称为X。在电线的绝缘皮上测量一个这个长度,如图中的第二步所示,然后在虚线的位置上用剥线钳。在第三步的时候将绝缘皮往线的最外侧方向推,距离最外侧大约3/8英寸,然后将实心线剪断。将两头弯一弯,这就搞定了。

说明: 00008.jpeg 

S-5

简化的制作面包板跳线的方法

在剪完这些电线之后,如果把它们进行分类储存,可以自己做一个线长工装。这在弯折一定长度的电线的时候也很有用。这个工装其实只有一个简单的三角形塑料或者木料,在斜边上有切出来的台阶而已,如图S-6和图S-7所示。由于细线会使做出来的线略长,因此这个工装上的台阶需要比实际代表的长度短1/16英寸左右。

另外一个检查跳线长度的方法是将这些电线和一片纯通孔板(通常被称为通孔板)进行比较,这些通孔板的孔距都是0.1英寸。

请记住,面包板上孔的间距都是0.1英寸,横向和纵向都是,而面包板中间的通道则是0.3英寸宽。

至于线粗细的问题,我觉得就目前而言24号线是面包板接线中最佳的选择。如果大家用了26号线,就会在插进面包板的孔里面的时候容易打弯,而插进去之后又会觉得太松。另外一方面,22号线又太紧了。

说明: 00009.jpeg 

S-6

自制的面包板线长工装

说明: 00010.jpeg 

S-7

一个长1.1英寸的跳线放在线长工装上

大家在eBay上能找到很多的线,也可以到类似Bulk Wirehttp://www.bulkwire.com)这样的渠道去买。我个人有10种基本的不同颜色的线:红色、橘色、黄色、绿色和蓝色(这些是亮色),还有黑色、褐色、紫色、灰色和白色(这些是暗色)。如果大家比较有条理一些,在面包板上每种不同的用途使用一个颜色,就会使事情变得容易很多。

最后,请大家看一看图P-2,来看看两种在面包板最常见的连接错误。大家可能觉得自己不会犯这么明显的错误,但是我自己也会忙中出错,或者在疲惫的时候出现过好几次这样的状况。

S.2.2 钩子

Make:Electronics里面我提到过小钩子,这种钩子可以装在万用表的表笔牵头。这种钩子以前是很难买的,不过现在比较容易了,比如到Radioshack这样的渠道购买(目录里面的部件号为270-0334,在小型测试夹具部分)。图S-8展示了一个装在万用表表笔上的黑色钩子,而红色钩子没有连接。我觉得这种组合很实用。大家可以将黑色的钩子勾在任意一个地线上,然后用红色的表笔在电路中测量电压。这种钩子推上去会连接得很紧,我觉得最多只会增加1的电阻而已。

说明: 00011.jpeg 

S-8

用小钩子装在万用表的一个或者两个表笔上,这样就可以固定在电线上了,握表笔的手就可以解放出来了

钩子的原理如图S-9所示,图中钩子因为内部弹簧的挤压而探了出来。如图S-10所示,弹簧被松开,这样钩子就勾住了电阻的引脚。

我们也可以用两头带鳄鱼夹的跳线(如图S-11所示),其中一个鳄鱼夹被夹在了万用表的表笔上,而另一个则夹到电路中合适的地方。大家会发现,我在本书后文中也会提到,我们需要把手解放出来,不能把表笔按在电线上。我个人觉得小钩子会更好用一些,但是如果大家觉得不想把万用表的表笔半永久地做成这个样子,两头带鳄鱼夹的跳线也是可以用的。

说明: 00012.jpeg 

S-9

由于内部弹力的的挤压,小钩子的勾连顶端探了出来

说明: 00013.jpeg 

S-10

当弹簧回撤的时候,钩子会牢固地抓在小的东西上,比如一个电阻的引脚

说明: 00014.jpeg 

S-11

这种跳线两头各有一个鳄鱼夹,用来替代钩子,用一头夹住万用表的表笔,另一头夹住电路中需要测试的电线

最后大家可以直接买两头带钩子的跳线,如图S-12所示。大家可以再次去Radioshack购买,货号为278-0016,名称为小夹具跳线。这些跳线的优势在于这些小夹子(体积比之前的还要小)可以锁在很小的部件上,而这些地方鳄鱼夹很容易碰到旁边的线而导致短路。

说明: 00015.jpeg 

S-12

两头各带一个小钩子的跳线,这种跳线特别适合用在大号的鳄鱼夹容易碰到周边导体的情况下

S.3 元器件存储

在存储电容的时候,由于陶瓷电容体积很小,我在Make:Elctronics中给出的建议就过时了。这些特别小的元器件可以很有效地收集在很小的容器里面,业余饰品爱好者那里就有我们需要的这些容器。

在美国的工具店,如Michaels's里面,我们可以找到各种各样巧妙的存储系统,它们可以存放各种小东西。我用来放多层陶瓷电容的就是如图S-13所示的小存储盒子。陶瓷电容很容易放进这些带螺口的容器里面,这些容器的直径只有1英寸。这样我们就可以将几乎从0.01μF10nF)往上所有的常用容值的电容收到只有6.5英寸×5.5英寸的盒子,从而都放到桌面上了。而且,由于每个容器都有一个带螺口的盖子,如果我不小心将盒子掉到地板上,电容也还会留在盒子里面,而不会散开。这个是很重要的,因为电容看起来都差不多,要想通过容值来区分开实在是太困难了。

而对于电阻来说,我的建议是将电阻腿截断,这样就也可以放进小的容器里面了。我们很少需要电阻腿的全长——在那种少见的情况下,如果需要长的电阻腿,可以用额外的一根绝缘电线加到面包板上。图S-14展示了存储30种最常用阻值的电阻的方法。和电容的存储系统类似,这种存储系统也不会在打翻盒子的时候洒出元器件。每个容器可以放至少50个电阻(参见图S-15)。

说明: 00016.jpeg 

S-13

现代的多层陶瓷电容很小,用来放小东西的存储盒子用起来正好

说明: 00017.jpeg 

S-14

稍微大一点的首饰盒子可以用来存储电阻,但是要先把电阻腿截掉

说明: 00018.jpeg 

S-15

每个这种小盒子可以放50个电阻

S.3.0 验证

当我在搭建电路的时候,我会在将电阻电容放到面包板上之前检查阻值和容值。10μF的陶瓷电容看起来和0.1μF的陶瓷电容一模一样,而1kΩ1MΩ的电阻也就只有一个色条的差别。如果不同值的元器件混在一起,我们就可能遭遇到非常复杂的错误状况。

为了简化电阻的检查流程,我使用了一个小号的面包板,而将跳线夹在自动量程的万用表表笔上,如图S-16所示。我需要做的只是将电阻的引脚插在面包板上,然后验证过程只需要5s。面包板的插座会使电阻值增加一点点,但是只有几欧姆,我通常并不关心准确的阻值了。我只需要确认我没有犯比较大的错误。同样的原因,最便宜的万用表就能完成。

说明: 00019.jpeg 

S-16

在电阻用到某个项目之前,简单快速验证电阻阻值的系统

介绍的部分就到这里了,现在我们就可以开始边玩边学习电子知识了。

项目1:黏糊糊的阻值

我想从一些简单的娱乐活动开始,因为我一直认为电子学的理论学习和实验过程中始终是有着娱乐的元素的。

在这个项目里,我会使用到胶水和纸板。我意识到这些材料并不是电子学课本上常常用到的材料,但是我用它们有两个意图。首先,这些材料能提醒我们电流并不是一定就在电线和电路板里面流动。其次,这个实验将让我们更深刻地理解最基础也是最重要的元件:双极型三极管。当然还有第三条,这个项目将会引导我们进行一个更宏观的关于离子、阻值和电阻率的讨论。

我意识到如果你读了Make:Electronics,应该从中学到了关于晶体管的基础知识,但是我在进行一小段概况之后,将会谈论到更深入的内容。

请注意,每个项目用到的电子元器件都列在这本书的后面,参见附录。

1.1 用胶水粘起来的放大器

1-1就是我们的第一个实验。这个纸板就是大家用来组装电路的基础,这个项目里面不会用到面包板。我们首先将晶体管的引脚插到纸板里面。这个2N2222型号的晶体管有两种版本在售,一种是带一个小的金属帽的,另一种是用小的黑色塑料密封的。如果你正巧用到的是金属帽的,那么晶体管留在外面的引脚就应该是左边的,顺序是按照图上的视角去看的。如果你用的是黑色塑料密封的,2N2222或者PN2222留下来的引脚就是右边的了——但是如果你正好买到了P2N2222的变种(这个元器件在你搜索物料号的时候有时候会跳出来,标示为可替换元器件),平的一边应该在左边。用放大镜来检查一下部件号,如果你对这些还有疑惑,可以在后面的符号部分查看。

说明: 00020.jpeg 

1-1

你的第一个项目,只需要如下器材:一个三极管、一个220Ω的电阻、一个9V的电池、连接电缆和一些电线,以及一些白胶水和纸板

如图1-1所示将各个元器件连接起来。LED灯的长引脚是在右边的,短的引脚在左边。和LED灯的长引脚相连的电阻阻值是220Ω。线夹的夹子在夹三极管引脚的时候注意不要相互接触。现在将装着Elmer胶水的容器拿过来,挤出一个蛇形的路线,长度大概控制在12英寸,厚度不要超过1/8英寸。如果能如图1-2里面所示从顶铺到底,就很好了。注意挤胶的时候中间不能间断。

说明: 00021.jpeg 

1-2

实际的试验内容,放在这里只是想消除你的疑虑,这个电路是能工作的

为什么我会推荐Elmer胶呢?因为绝大部分人家里可能都常用到,应该会还有剩余,而且这种胶的导电特性正好是我需要的。它不是绝缘体,但也不是良好的导体。

做这个项目手脚需要比较快,因为这种胶干的比较快。将绿色的导线(这个和三极管的中间引脚相连)拿起来粘到胶线的中间。这个LED灯应当能比较亮。现在将绿色导线碰到胶线的尾端,LED灯就应该变暗一些了。

如果大家读过我以前的书,就知道这个现象的原因了——当然我还是会给大家进行讲解。

1.1.1 发生了什么

大家挤出来的胶线的阻值从顶到底在1ΜΩ左右,也就是每一英寸的阻值是10kΩ。如果大家想用万用表确认一下阻值,可以用一些线绑在表笔上测量,免得表笔上沾上胶水。

这个三极管就是一个放大器,它将流进基极(中间的引脚)的电流放大,经过放大的电流从发射极(图1-1中左边的引脚)流出。在这个项目中,大家将流进三极管基极的电流通过旁路到高阻值的胶水中来加以限制,而LED灯的亮度是和电流有关的,通过亮度的变化就展示了内部的变化。

如果大家想直观地看到三极管是如何工作的,可以将其从电路中拆出来,如图1-3所示。绿色的线夹限制连着串联电阻,而串联电阻连接着LED灯,这时候LED灯应该是不亮的。胶水的阻值非常高,因此流经LED灯的电流太小了,点不亮它。如果你将绿色的线夹沿着胶线逐渐移到距离电源正极大概1/4英寸的位置的时候,LED灯就能大概看出来微微亮了。

说明: 00022.jpeg 

1-3

当电路不再对流经LED灯的电流进行放大时,胶线的高阻值会使得电流变得很小,不足以将LED灯点亮

1.1.2 符号

为了避免大家费力去记NPN三极管的电路符号与实际元器件的引脚图,我在图1-4中给做了总结。从金属外壳的三极管中伸出来的尾巴有可能是图示的两种朝向之一,也有可能是其他,但是肯定距离发射极比其他极要近。而这个电路符号更好记,大家记住这个谐音,它叫NPN三极管就是因为这个箭头“Never Points In(不对着内部)

说明: 00023.jpeg 

1-4

NPN三极管电路符号,以及俯视时元器件的简化视图。大家需要特别看一下文章里面讲的P2N2222的关于引脚次序相反的重要注意事项

1.2 注意事项:非标准的引脚

请大家记住这一点,当你从顶上往下看塑料封装的2N2222的时候,如果将平的一侧放在右边,引脚的顺序总是按照集电极、基极和发射极的顺序从上往下排列的。有些生产商将这种三极管命名为PN2222,但是引脚顺序还是一样的。

有一点容易搞错的地方,原因是大概在2010年,On半导体公司、摩托罗拉,可能还有其他的一些半导体公司生产了一种部件号为P2N2222的变种型号。这个元器件的功能和2N2222以及PN2222完全一样,但是引脚顺序却反了过来。

如果你在网店上搜索2N2222的时候,搜索2N2222是很正常的一件事情,因为这种三极管的通用版本的型号就是2N2222,这个时候有可能搜索结果会把P2N2222的结果也包括进来。因为你的搜索关键字是“2N2222”,而P2N2222包括了这个关键字。如果你没有注意,直接买了这个元器件,虽然功能看起来一样,却有可能在电路安装的时候插错了方向。

如果出现了这个问题,三极管插反了,开始可能能在有限的程度里面工作,当然会有一些性能的变化。因此如果你用了P2N2222,但是插反了,安在电路里的作用还是有的,就是不能完全符合你的要求。如果你及时发现了这个错误,然后将插的方向纠正过来,很可能还是不能得到正确的效果,因为插进去的时候把极性弄反了,三极管有可能已经损坏了。

因此大家在网上购买电子元器件的时候,需要认真地看清楚元器件型号,并记住图1-4中的配置。而且一定要记住,认真对照元器件手册使用它们是每次必做的功课!

1.3 背景知识:导体与绝缘体

如果你等待着胶水凝固,就能从这个项目中学到更多的东西。在胶水逐渐干掉的过程中,LED灯的亮度会逐渐变弱。为什么会发生这种情况呢?因为胶水中的一部分水分在逐渐挥发,而其他部分的水分则被纸板吸收了。

大家可能还记得在Make:Electronics的书里讲过,电流是电子流动造成的。带电的分子或者原子因为有着多余的电子或者缺少电子,被称为离子。我虽然不清楚Elmer胶水的具体成分,但是里面肯定包含了能让离子迁移的化学物质。胶水里面的水分能够有助于离子的移动,因为离子的移动本身就是通过水分来进行的。

水本身不是一个良导体。为了证明这一点,大家可以取一些纯水——这不是直接从水龙头里面接来的水,水龙头里的水通常含有矿物杂质。纯水以前有个名字叫做蒸馏水,顾名思义是通过将水煮开形成水蒸气(这样就和杂质剥离开来了),然后再让水蒸气冷凝而成。如今大家有时候还会把纯水说成蒸馏水,但是基本上没人再用蒸馏的方式来获取纯水了,毕竟这种方式过于浪费能源了。现在通常见到的纯水是去离子水,获取的流程是通过类似反渗透的过程。去离子的意思就是里面没有离子了,是吧?因此水不是电的良导体也就毫不奇怪了。

将万用表的表笔插到一杯蒸馏水或者去离子水里面,当两支表笔距离几英寸的时候,大家会发现阻值在1ΜΩ以上。我们在水里融化一些盐,阻值就会立刻下降,因为盐能提供大量的离子。

大家可能想知道导体和绝缘体的分界线在哪里。为了回答这个问题,我们需要了解一下电阻率的测量过程。其实很简单:如果R代表的是电阻值,单位是ΩA是横截面积,单位是平方米,L是长度,单位是米。那么:

电阻率=R*A/L

电阻率的单位是Ω×米。非常好的良导体如铝,电阻率在0.00000003Ω×米。这是一亿分之三。而在另一个极端,良好的绝缘体如玻璃,电阻率在1000000000000(一万亿)Ω×米。

而在导体和绝缘体两者之间的就是半导体,比如硅的电阻率大约在640Ω×米。当然可以通过在硅中间掺入其他具有电势的极微量物质来帮助电子通过硅本身。

Elmer胶水的电阻率大概是多少呢?我知道大家已经用万用表得出结果了。那么纸板呢?纸板的电阻率非常高,怎样才能测量出来呢?大家想一想看看能否找到测量的方法。

1.4 拓展

如果大家重复做这个项目1,胶线是三倍或者四倍宽,结果如何?如果你将两个LED灯并联或者串联放置,结果又将如何呢?

也许大家都认为自己已经能知道结果是什么了,若是通过实践来验证设想总不是一件坏事吧。

上面提到,若将三极管插反,电路可能还能在一定程度内工作。在基极和发射极之间能够承受一定的反向电压(通常这个极限低于6V),但是我们用的是9V电池,很可能会有些损失。大家去试的时候这种情况会真实发生吗?如果真的发生了,原因是什么?如果大家搜索这个问题的更多信息,大家可能能学到三极管结构里面的各个分层,以及电荷是如何从一极迁移到另一极的。这个也是下面的学习内容。

当你将三极管在电路中反过来插之后,三极管可能会有所损坏,不能在其他电路中使用。但是,大家还是可以在下一个项目中对其进行测试,并将结果与没有乱用的三极管进行比较。

项目2:获取数据

我的计划是,在接下来的一系列项目中,我将给大家展示一些在Make:Electronics中没有涉及的电子元器件。

首先介绍的三种是:

光电晶体三极管

比较器

放大器

这些元器件的相关项目很有意思,也很有趣。这些项目从项目3一直延续到项目14,主题将涵盖电路设计,特别是使用模拟元器件的电路设计。

在介绍完这些元器件之后,我们将要用到数字芯片,比如:

逻辑门

解码器、编码器和选择器

定时器和移位寄存器

然后我会和大家聊一聊随机性以及传感器——

但是在这些之前,就在现在,我需要跟大家一起将一些基本概念理清,保证我们理解一致。尽管大家可能觉得对这些概念已经十分熟悉了,但是温故而知新,请大家稍微花一些时间看完本书的这个章节。大家需要这些信息来完成后面的项目。

2.1 需求

请记住每个项目需要的元器件在本书的后面均有罗列。

我假定每个人都有一个5V的直流稳压电源,就是之前在图S-2中用的那种。每当你在电路图中看到稳压的字样,我们就需要一个带LM7805以及两个电容的基本稳压电源。在这个项目中,由于我们要进行一些准确的测量,需要更精确的电压。

2.2 三极管行为

电子电路中数字都是必不可少的。事实上,大家见到这些数字应该高兴一些,因为这些数字展示了电子电路的工作状况。准确的测量也很重要,如果你的测量结果不够精确,这些数字将会误导你,而数字本身也将变得毫无意义。

因此我在这里将用可调变阻器代替Elmer胶做的胶线,用万用表来代替LED灯,这样来测量电路的表现(这和Make:Electronics中的项目10类似,但是在放大这个课题上我讲得更加深入一些)。

你是不是擅长进行精确测量?现在有机会来一试身手了。

第一步

首先将万用表调节到直流μA挡。根据大家用的万用表的差异,可能需要将表笔插入电流测量插口或者将旋钮扭到电流测量挡。如果大家的万用表没有自动量程功能,需要通过选择器选择μA挡。但是无论怎样,大家都要选择直流挡,而不是交流挡,并确认万用表红色的表笔是插在电流插口里面的。

大家要将万用表用在图2-1所示的电路中。

说明: 00024.jpeg 

2-1

万用表测量的是流进三极管基极的电流

如果大家对这个电路图还有疑惑,可以看看图2-2,这个图上展示的是用一个手动量程的万用表的μA挡来测量流经变阻器调节端与2N2222之间的电流,用夹子夹着跳线。图中右边双绞的红黑线为电路板提供了稳压过的5V直流电和电源地。万用表的读数没有什么参考意义。

说明: 00025.jpeg 

2-2

用万用表μA挡来测量流经变阻器调节端与2N2222之间的电流。上面的文字部分讲得更详细

说明: 00026.jpeg 

2-3

上一张图中面包板的特写

这个面包板的特写我们在图2-3中特意放出来了。图中红黑的双绞线从左边进来,连接到圆的插头插在面包板上,这个双绞线是连接到万用表上的。板子上的变阻器的方向和原理图中的是一致的,每个引脚都插在面包板上单独的一行中。如果大家把变阻器转90°,它的两个引脚就会在面包板同一行上短路了,电路就不能工作了。

调节电阻器使万用表读数为5μA。这就是基极电流——即从变阻器左侧引脚流进三极管基极的电流。

第二步

记录下基极电流。记项目笔记是个很好的习惯,大家应该从现在开始就认真做记录。如果你的项目记录是一步一步的,以后翻开来看的时候也容易看清楚。大家也可以选用我们的The Make's Notebook,这个本子能方便大家做记录。

第三步

将万用表的表笔从面包板上拿走,在原来的位置放上跳线。如果万用表不是自动量程,将电流表调到mA挡,即图2-4中的位置。

说明: 00027.jpeg 

2-4

现在万用表测量的是流进三极管集电极的电流

2-5是这个配置的一张照片。其中黄色跳线取代了之前的万用表表笔,而现在万用表放在了面包板的正极与三极管集电极之间。

说明: 00028.jpeg 

2-5

图中左方的红黑线连接到万用表,用于测量流进三极管集电极的电流

第四步

在刚才记录下来的基极电流旁边,记下电流表现在的读数,这个读数就是集电极电流。

第五步

我们回到第一步,但是需要调节变阻器将基极电流增加5μA(如果你的万用表没有自动量程,别忘了调回μA挡)。

重复第一步到第五步,做一个表格,其中左侧一列记录的是基极电流从5μA40μA,每次增加5μA,第二列记录的是每一步的集电极电流。总共要记8个数值——工作量不算太大,即使算上来回来去重复地调电流挡。这个结果看起来和图2-6上前两列类似。这个表里面是我自己测量的,这些值和你们测量的结果相似吗?

现在大家需要将集电极电流从mA转成μA了,因为除法得到比值的一个前提是数值的单位需要一致。1mA相当于1000μA,因此大家只需要将mA挡测得的集电极电流乘以1000,就得到对应的μA数。大家可以在图2-6的表中的第三列里面看到我测量得到的值。

说明: 00029.jpeg 

2-6

对比NPN三极管基极电流与集电极电流

最后,请大家拿出计算器,将集电极电流(已经换算成μA)除以基极电流(单位是μA),8组数据都计算一下。算完一两组大家就能发现这个比值几乎是常数。得到的结果就在我的这个表里面的第4列。

用集电极电流除以流进基极的电流,就得到了三极管的放大倍数。

2.2.1 请注意:防止万用表受损

在测量电流的时候,要特别小心。如果过流的话,会烧掉万用表里面的熔丝。如果手头能有一些备用熔丝就比较方便了。而且,当你测量完电流把万用表放一边的时候,可能会忘记将红色的表笔从电流插孔里面拔出来插回到电压插孔里面。需要养成习惯测量结束一定要回到电压挡,因为这种模式下,万用表就比较耐用了。

2.2.2 缩略语和数据手册

在图2-6中,注意到缩略语IBIC。大家要记住I这个字母通常用来表示电流。所以,IB代表的就是基极电流,而IC就是集电极电流。

大家在几乎任何一个三极管的数据手册中都会看到这样的缩略语,而且数据手册里面会标明允许正常使用的相关最大值。这个信息是很有用的。如果你想自己做一个项目,基极和集电极的电流的最大允许值会有助于我们来选择三极管,防止过载。

现在,大家来猜一猜IE代表的是什么?如果你的答案是流经发射极的电流,那么你又猜对了。当然这个IE的缩略语用的要少一些,因为事实上,IE就是IBIC之和。流进基极和集电极的电流只能通过发射极从三极管流出,因此:

IE=IB+IC

这里我还列举了一些NPN三极管常用到的通用缩略语。

●VCC是供电电压,代表的是集电极的电压,但是即使电路中没有双极型的三极管也常用来代表供电电压。

●VCE代表的是集电极和发射极之间的电压。

●VCB代表的是集电极和基极之间的电压。

●VBE代表的是基极和发射极之间的电压。

数据手册中通常还会提到三极管的β值,用的就是希腊字母β。这个值表示的就是三极管放大基极电流的程度,直接用集电极电流IC除以基极电流IB就可以了,也就是大家在第五步之后做的事情。注意到上面的表里面的第四列就标注着β值。

在图2-6中第四列中计算得到的β值基本相同,这告诉我们三极管是一种线性元器件。换句话说,如果你用这些值来画一张图,会得到一条直线,如图2-7所示。

大家也可以用自己得到的数值来画图,可以选用画图软件(Excel就可以)或者用老一些的画图纸。The Maker's Notebook里面有很多画图纸,网上也到处有PDF版本的文件可以用电脑打印成画图纸,大家只要在网上搜索一下打印画图纸就可以了。

那么为什么大家测到的β值并不是严格一致呢?因为大家所用的万用表也并不是完全精准的(特别是在测量μA级的微小电流的时候),大家测的三极管也可能会有危险的制造缺陷。即使是这样,放大倍数还是相当稳定的,因此三极管可以用在为敏感的波动信号进行精准放大的场合,比如音频信号的放大(如果我只是将三极管用来当开关,就不用太管这些了)。

说明: 00030.jpeg 

2-7

用图2-6的表里面的前两列数据画成的图

那么为什么大家测量得到的数字和我测量得到的数字不完全相同呢?因为不可控的因素太多了。大家用的万用表和我用的万用表很可能不是同一家厂商生产的,大家用的稳压芯片和我用的也会稍有差别。万用表的表笔接触也不完全良好。三极管的环境温度也会造成一定差异。这个世界上不可控的变量太多了,而且我们也没有办法去摆脱它们。

除此之外,三极管还有生产带来的差别。一个数据手册会列出同一类型元器件β值的范围,而不会定死,无论你的测量仪器有多精准。

大家写软件写习惯了,也习惯于使用绝对准确的数据——但是在硬件的世界里面,我们能做到最好的也就是搭出电路,在相对合理的情况下得到一个相对恒定的结果。这个世界就是这个样子的。

2.2.3 关于电压

大家也许还记得在Make:Electronics中,三极管就是一个电流放大器。一些入门书籍也常常这么说,β值就是电流放大倍数的测量值。但是他们常常忘记提及NPN三极管发射极上的电压也会跟随基极电流而变化,即使其他因素保持不变(比如三极管的负载)。

2-8上画的电路将给大家证明这一点。请大家记住,大家测量电压的时候通常是测量自己感兴趣的想测量的点和电源负极之间。因此,请不要将万用表和电路中的470Ω电阻串联在一起!另外再给大家一个提醒,不要忘了将万用表设置为测量电压,不能还在测量电流。如有必要,还需要将红色的表笔插在万用表上合适的插孔里面(通常都需要的)。

说明: 00031.jpeg 

2-8

在这个电路中,万用表测量的是三极管发射极和电源负极之间的电压(大家一定要记住将万用表设置为测量电压而不是测量电流)

在图2-6中,第五列就是我测量得到的电压值。我用这些值画了另一张图,参见图2-9,对比的是基极电流和发射极电压。同样,这也是一条很直的线。

如果说三极管是一个电流放大器,那么为什么发射极的电压会发生变化呢?发射极电流也发生了变化吗?那么,让我们来思考一下三极管内部究竟发生了什么。

基极电流的增加使得三极管等效内阻减小了,这是流经三极管的电流增大的原因。

说明: 00032.jpeg 

2-9

2N2222三极管上,发射极电压随着基极电流的变化几乎线性的变化。这个图是用图2-6表里面的数字画成的

同时三极管和470Ω电阻是串联的,这两个元器件组成了分压电路。

大家可能还记得我在Make:Electronics中提及的,如果你有两个串联电阻,那么这两个电阻会根据各自电阻的相对大小来分掉加在它们上面的电压。如果第一个电阻的阻值较小,那就分不到多少电压,而第二个电阻会分到较大的电压差——反过来也是这样。

大家看一看图2-10。在这个电路图里面,我们没有用三极管来和470Ω电阻串联,而是用了多种不同的其他电阻。大家能预测到在ABCD四点上测得的电压值吗?这个项目大家可以很快地做一遍,我会在这本书的最后提供理论答案。

我在这里帮助大家再回忆一下计算两个电阻之间的电压的公式,公式如下:

●VM代表中间点的电压。

●VCC代表电源电压。

●R1代表电源正极一侧的电阻阻值(单位为Ω)。

●R2代表电源负极一侧的电阻阻值(单位为Ω),如图2-10所示。

说明: 00033.jpeg 

2-10

分压电路的概念在电子学里面是一个很基本的概念。大家一定要很透彻地理解

于是公式为

VM=VCC×[R2/(R1+R2)]

大家到这里可能就明白了为什么图2-8中的电路里面,三极管发射极的电压会随着基极电流的增加而增加。因为基极电流的增加降低了三极管的等效内阻。从而在这个分压电路里面三极管从发射极和电源之间分到了更少的电压(当大家在测量电压时)。进而导致了你的测量电压的提升。我们在图2-11里面也解释了这些。

发射极的电压无论如何是超不过电源电压的,同样的道理,加在三极管上的电压也一定是在0V到供电电压之间的某一个值。为什么呢?因为基极电压是从1ΜΩ电阻的变阻器上面分到的,而那又是一个分压电路,分的是电源正负极之间的电压。

因为发射极电压不会超过基极电压,我们可以得出结论:双极型三极管是不能做电压放大器的。

但是,发射极电压的变化是有用处的,大家在项目3中做光敏三极管项目的时候会理解这一点。

说明: 00034.jpeg 

2-11

当更大的电流或者更小的电流流过NPN三极管基极时发生的一系列事件。在真实世界里面,这些假设可不完全正确

2.2.4 关于电压的基本知识回顾

到现在为止,我做了一些假设,默认它们是正确的。我做的假设有:

电路里面的正极电压是固定值。

电路里面的所有点都直接连到电源负极,而电源负极的电势为0V

分压电路的行为是用简单的算数定义的。

我们测量电压或者电流可以任意进行,不会对电路施加干扰。

VCC可能要比VCC

所有的电源都有极限。如果你给电源加上一个很低阻值的负载,就会拉低电压。LM7805稳压芯片能有效地防止电压掉落,但是也做不到完美。

零电压可能高于0V

我们一直认为地是0V,但是各种不同的元器件都会通过它们的连接点向地灌注电流,而流回电源负极的电线也是有一个很小的电阻的。根据电路和地线连接点的不同,这些地的电位可能就和电源负极的电位有所区别,而不完全是0V了。

分压电路是近似规律

当你在分压电路中加入的元器件的电阻值很低的时候,会从分压电路上分走电流或者给分压电路注入电流,这样中间点的电压值就会发生较大变化。

测量本身会影响被测量值

测量电压(或者电流)的过程会影响你想测量的对象的值,这是因为你的万用表本身是有内阻的。在测量电压的时候这个内阻虽然非常大,但却不是无限大。在测量电流的时候表的内阻虽然非常低,但也不是零。如果大家用的万用表和我用的不一致,你们测量得到的值和我测量得到的值就不会完全相同。

2.3 拓展:老式电表

现在,对于那些喜欢各种小工具的人(比如我)来说,我在这里提供一个重做项目2 的绝佳方法。

很久以前,在多量程多功能万用表未被发明的时候,我们就已经能买到那种模拟万用电表,但是只能完成一项功能。这些表可以用V特挡测量电压,也可以用mV挡测量电压,或者用A挡来测量电流,也可以用μA挡来测量电流。现在其实大家还是可以买到这种电表的,而且可以在大家的三极管测量电路中装上一对,这样就不用将万用表拆来拆去了。

我通过eBay订购了一些很漂亮的小电表,价格是每个5美元(大家如果愿意稍微多花点钱的话,可以在亚马逊网站上买到,而且到货会快很多)。我选了一个表来测电流,选的是μA挡,量程是0μA50μA,再选择一个表用来测电流,选的是mA挡,量程是0mA10mA。这两个测量范围是我正好需要的。我将这两个表如图2-12所示装了起来。在我调节变阻器的时候,我很满意地看到两个电表的指针同时的来回运动。也许并不是所有人都喜欢在周六晚上(甚至是周一晚上)来玩这个东西,但是确实用来做展示是很吸引眼球的。

说明: 00035.jpeg 

2-12

用两块模拟电表就能即刻展示基本的2N2222双极型三极管的电流放大功能。这张图中前面方形的蓝色元器件就是带螺钉调节的变阻器

2.4 关于三极管的一些知识要点

有人天生喜欢各种数字,也有的人不喜欢。我有时觉得,直接把一些电子元器件拼凑到一块,来看能发生些什么(可以加Elmer胶,也可以不加),可能更加有趣,但是一旦大家更深入地了解了电子学知识,就需要知道电路的内部运行原理了。而且为了达到这个目的,大家需要进行一些数学运算。这种算术谈不上复杂,因为在直流电路里,大家基本上用到的最复杂的就是乘法和除法。但是到了交流电路里面,就得有点真功夫了——但是本书并不涉及这些内容。

下面是大家需要记住的从这个简单的示例里面学到的信息。

双极型三极管是一种线性元器件,意思是流进集电极的电流和流进基极的电流的比例几乎是一个常数,用这两组数据画出来的图形几乎是一条直线。

●β值是一个三极管的放大因子——流进集电极的电流与流进基极的电流之比。

●NPN双极型三极管的发射极电压会随着电流的变化而变化,只要这个发射极上的负载保持恒定就会一直如此。

双极型三极管不是一种电压放大器,因为发射极的电压不能超过基极的电压。

接下来我再给大家讲一些其他的知识。

正向偏置电压是指NPN三极管上基极相对发射极的正电压。负向偏置电压则是指基极的电位要比发射极低。请尽量避免加负向偏置电压,因为这样会对三极管造成损伤。

截止区指的是VBE(即正向偏置电压)小于0.6V。在这个区域里面,三极管中的带电粒子不够活跃,因而无法导通。在正向偏置电压不够高的时候只有一种非常小的电流,我们称之为漏电流,它能通过这个元器件。因为这个原因,三极管常常被用来当作开关。

双极型三极管的线性区指的是三极管将基极电流进行放大的区域。这个线性区到达上限的时候,集电极与发射极之间的内阻变得很低,已经对流经它们的电流没有任何限制了。过了这个上限就是饱和区了,这时会使三级管发生过热。

当然,三极管在线性区里面如果不限制电流也会过热。因此大家在搭三极管电路的时候一定记得要加入电阻(可以用电阻,也可以用带阻值的元器件)。千万不要将电源的正负极直接接到三极管的发射极和集电极上。

在数据手册里面常常有叫做VCESAT)的条款,这就是告诉你饱和区的边界在哪里。数据手册看起来很痛苦——比如说,如果他们有时候会忘了标注一个内容,或者没有在里面附上常用电路。尽管如此,数据手册还是非常重要的,非常有助于我们进行电路改动和自行搭建。如果大家第一次使用某个元器件,强烈推荐到网上去找一下数据手册,然后打印下来供参考。

2.5 分压电路样例的答案

A.5×470/1970=大约1.2V

B.5×470/1970=大约1.6V

C.5×470/940=2.5V

D.5×470/690=大约3.4V

数字就谈论到这里,下来我们开始接触光。

项目3:从光到声

在这个项目里,大家会了解光敏三极管。光敏三极管的图标见图3-1所示,它看起来非常像一个双极型的NPN三极管。事实上,这个光敏三极管的集电极和发射极的功能和普通的双极型三极管是一样的。最大的区别是这个三极管的基极是用入射光来激发的,在图示中我们用了一道或者两道箭头指向基极。

在有的场合上的圆圈会被省略掉,也有的场合下不用两道箭头,而是用一个自行的箭头。这些变化都不代表三极管在功能上有任何不同。但是如果在连接图上基极有一根线突出来了,那就意味着三极管上是有基极连接的,用来辅助光电转换。我在这里提醒大家的目的是希望大家看到这些图标时能认出来。在这本书里面我不会用到这种光敏三极管。

说明: 00036.jpeg 

3-1

光敏三极管的电路图标。左边的和中间的在功能上是完全一致的。右边的图标表示着基极上有一个连接用来增强因为入射光产生的电压

大家不要将光敏三极管和光敏电阻混淆起来!光敏电阻也被称为光敏单元,我在Make:Electronics里面也有提及。这种光敏电阻用起来很方便,因为它不需要额外的电源,只是根据光的情况而变化阻值。由于这些光敏电阻里面常常含有硫化镉成分,而镉是一种公认的对环境有害的物质,因此现在这些光敏电阻在大型的零售商比如http://www.mouser.com那里已经不会有大量存货了。大家现在也还能从eBay上买到,不过我会避免在电路中用到它,因为以后会越来越难买到。

光敏三极管现在被广泛用来替代光敏电阻,可以用在开关路灯,或者在电视遥控器上按下开关时感应红外光等。

3.0 光敏音高

请注意项目里面所有用到的元器件在本书的背后都有罗列。

我们先来组装一个如图3-2所示的电路。这里用到一个555定时器,这种器件在展示的时候非常好用。最传统的双极型555定时器的输出可以驱动一个LED灯或者一个继电器——也可以驱动一个小的扬声器,我这个项目就是用来驱动扬声器的。现在新的CMOS版本通常没有这样的驱动能力,而且型号通常是7555

说明: 00037.jpeg 

3-2

这个电路用声音的形式来展示光敏三极管的功能

大家在安装光敏三极管的时候要注意方向安装正确。规则如下:

正向电流通过较短的引脚流入光敏三极管,从较长的引脚流出。

因此在图3-2的电路图中,较短的引脚应该在电路图的左侧。

这样看起来有点容易把人搞糊涂,因为LED和光敏三极管看起来很相像,而大家都知道LED灯的长引脚是要接正极的。光敏三极管与LED灯正好相反。大家可以把光敏三极管看成是LED灯的逆元器件,因为光敏三极管是吸收光而不是发出光,所以连接时应该反过来。

这里还有另外一条规则,因为LED灯和光敏三极管看起来几乎一样。

请将你的光敏三极管用盒子装好,做好标签,这样就不会和LED灯混在一起了。

3-2中这个电路的照片如图3-3所示。在这张图里,100Ω的扬声器串联电阻被省略掉了,因为我用的扬声器内阻是63Ω的。其他所有的连接和电路图完全一致。

大家一定记住要把555定时器的2号引脚与6号引脚用跳线连起来。这根跳线在图3-3中是绿色的那根,在电路图中就是跨过芯片的那根线。如果你确认电路没问题了,可以上电试试,你会发现扬声器中的声音会随着照在光敏三极管上的光的强弱而发生变化。

说明: 00038.jpeg 

3-3

555定时器做的光敏三极管测试电路的面包板电路。光敏三极管是图中间的那个透明的物体,旁边有黄色的电线。扬声器在图的右边只露出了一部分

555定时器的引脚图如图3-4中所示。我会在下一个试验中跟大家详细解释这些引脚的功能。

大家可以用不同阻值的电阻来替代10kΩ33kΩ的电阻。或者用一个稍大一些或者稍小一些的电容来替代图3-3中的0.01μF电容。大家还记得决定自运行定时器频率的公式吗?我会在下一个项目中给大家回顾一下基本知识。这里的关键就在第5个引脚(芯片右下角的引脚),这是一个控制引脚。在这个引脚上施加的电压会调节555定时器用到的参考电平,到了这个点电路的闭合周期结束时,断开周期开始。因此控制引脚会调节定时器在对应的音频发出声音的音高。

说明: 00039.jpeg 

3-4

555定时器的引脚图。供电电压仅适用于使用传统TTL电平的双极型芯片

光敏三极管和3.3kΩ电阻在一起组成了分压电路,这和我在前面章节中描述的关于电压里面是一致的。当光照在光敏三极管上时,其等效内阻下降,进而改变引脚5上的电压。但是怎么能知道电压会下降多少呢?我们一起来研究一下。

项目4:测量光

请注意,本项目中用到的所有元器件都可以在本书后面找到。

大家看一下图4-1中的非常简单的电路原理图,看起来和图2-8中的电路非常相似。大家可以将其作为一个独立电路加到项目3的电路面包板上,而不破坏项目3 的电路。只需要将光敏三极管和电阻移远一点就行了。

说明: 00040.jpeg 

4-1

光电三极管测试电路

我选的电阻的阻值是3.3kΩ,因为我需要从光敏三极管的发射极获取最大的电压范围,我的结论是3.3kΩ是最合适的。

现在,在光敏三极管上面照一些光,然后测量一下光敏三极管发射极的电压。大家可以用台灯、白色的LED灯、手电筒或者彩色的LED灯来测试。入射光会在光敏三极管的基极产生一个非常小的电流,经三板管放大为一个较大的电流,并从集电极流到发射极。

入射光越强,光敏三极管的等效内阻就会越小。大家可以用光能够将阻值赶走的形象来记忆这个结论。

说明: 00041.jpeg 

4-2

如果光敏三极管和电阻换个位置,测量点的电压就会随着入射光的增加而降低了

如果你还记得我在项目2末尾写的分压电路,就会发现当光敏三极管的内阻减小时,图4-1电路中的电压的测量值就会增高。光敏三极管在测量点和电源正极之间的阻碍作用变小了。在这个电路中:

入射光增强将使得发射极电压增高。

这一点只在图4-1所示的电路情形下是正确的。

现在换成如图4-2所示的电路。在这个时候,入射光增强会导致电压降低,因为这时光敏三极管在测量点和电源地之间,而且阻值变低了。

4.1 使用光敏三极管

光敏三极管有很多种。我选的光敏三极管接受的入射光频率范围很宽,几乎所有的可见光都能有所反应。很多光敏三极管只对红外光起反应,因为它们是通过红外LED来激发的。当光敏三极管和对应的LED有着一样的窄带灵敏度时,就能避免受到噪声或错误信号的干扰了。

请大家记住,我们用的万用表的内阻很高。如果大家不用万用表,而是用了一个相对低阻值的元器件的话,就会和3.3kΩ的电阻有冲突了,它会从光敏三极管中吸取电流,还有可能导致过载。幸运的是,在我们的使用场合,用的多是逻辑芯片、微处理器和其他的数字元器件,这些元器件的输入阻抗都很高,因此我们可以将它们直接与光敏三极管的发射极直接连在一起——当然我们需要用一个合适的电源,通常是5V直流电源。

如果你用一个模拟元器件(如三极管或者光敏三极管)的输出直接驱动数字芯片的输入引脚,大家一定要注意测量一下输入到芯片引脚上的电压范围,各种情况包括将来可能存在的情况都要测量,以保证输入电压处于可接受的范围之内。

4.2 光敏三极管知识回顾

光敏三极管是通过其敏感的光波长来分类的,光波长的单位是纳米,缩写是nm

人眼能观测到的光的波长在380750nm

红外光的波长要比750nm还要长。紫外光的波长比380nm还要短。确实有只对紫外光敏感的光敏三极管,但并不常见。

红外光敏三极管通常表面是硬质的,颜色是黑色。

4.2.0 背景知识:光子和电子

光是一种能量,光敏三极管吸收这个能量来产生电子。有好几种可以产生光电反应的元器件,例如:

光敏二极管,它里面有一个半导体可以被光子(表现为粒子的光)穿透。光子会使得一些电子脱离束缚,跨越边界跑到旁边的N型半导体层,从而累计其电位差。这种光电反应几乎是纯线性的,因此光敏二极管很适合用来制作光度计。

太阳能电池,它其实就是表面积很大的光敏二极管。

光敏三极管,这种元器件的工作原理和三极管几乎一样,但是需要一个外置的直流电源来协助激发电子流,它是通过光来控制电流,而不是由光来直接产生电流。

光敏达林顿管,它本质上还是光敏三极管,但是功能是两级放大,和达林顿三极管一样。这种元器件对光的敏感度比起常见的光敏三极管要高出不少,但是响应时间要慢一些。

光敏电阻,在入射光下阻值会降低。

4.3 关于555定时器的知识回顾

Make:Electronics里面有一个章节,很详尽地讲解了555定时器。我在这里总结一些重要的内容,帮大家回忆一下。

引脚功能

不管你是想要一个单脉冲还是要一个序列的脉冲来测试电路,不用多考虑,直接抓一个555定时器来就好。大家可以回到图3-4来回忆一下定时器各个引脚的名字。

单稳态电路

4-3可以让你回忆一下555定时器在单稳电路模式下的行为,这种模式有时也被成为单脉冲模式。在触发管脚上的电压一旦变为低电平,就能在输出引脚上产生一个高电平脉冲。这个脉冲的宽度取决于电阻R1的阻值和电容C1的容值。如果定时器的复位功能不用,就需要将其和电源的正极连在一块儿了,这样就可以防止无意间复位引脚被触发。

说明: 00042.jpeg 

4-3

简化的电路,展示的是555定时器在单稳态模式下的典型电路

单稳态脉冲宽度

4-4是单稳态脉冲宽度的快速查找表,单位是秒,对应单稳态模式下的多种电阻R1阻值和电容C1容值。大家可以在Make:Electronics或者制造商数据手册里面找到更详细的表格。

说明: 00043.jpeg 

4-4

555定时器在单稳态模式下的脉冲宽度,单位为秒

非稳态电路

4-5可以帮大家回忆一下定时器在谐振模式或者叫做自运行模式下的基本接线形式,在这种模式下会产生一组脉冲。在这个配置下,定时器会上电自启动,而且只要电源还接着而且复位引脚没有拉低,就会一直保持下去。

说明: 00044.jpeg 

4-5

简化的电路,展示的是555定时器在谐振模式下的典型电路

基本谐振原理

4-6展示的是555定时器在谐振模式下的基本原理,电容通过R1R2进行充电,然后再通过R2向芯片内部进行放电,这也就解释了为什么输出的充电时间比放电的时间要长。

说明: 00045.jpeg 

4-6

定时器在谐振模式下的工作原理,电容C1通过R1+R2来充电,通过R2来放电

谐振频率

4-7是定时器在谐振模式下的输出频率快速查找表,单位是赫兹。假定R1的阻值为10kΩ,对应电容C1容值和电阻R2阻值的各种不同值。大家为R1选择更低的阻值,但是芯片会消耗更多的电能。

说明: 00046.jpeg 

4-7

555定时器在谐振模式下的谐振频率,R1固定为10kΩR2的阻值和C1的容值为不同选择

总的周期

定时器在谐振模式下的总周期是和R1+R2+R2成比例的,因为整个周期包括了一个充电周期以及这个充电周期和下个充电周期之间的间隙,在图4-8中用图形表示出来了。

说明: 00047.jpeg 

4-8

图形化展示555定时器(使用5V直流电源)在谐振模式下的充电周期和放电周期,解释了为什么从一个周期的起始点到下一个周期的起始点之间的总时间为什么和R1+R2+R2成正比

频率计算

如果大家用来记录R1R2,而用μF来记录C1,就可以这样来计算555定时器在谐振模式下的频率,单位是赫兹,公式如下,其中R=R1+R2+R2

F=1440/R×C1

大电容

如果用了很大的电容(比如说大于470μF)可能会产生一些不稳定的结果,原因是电容自身有漏电。这是无法避免的(特别是电解电容),由于一些缺陷导致电荷损失。如果通过大电阻进行充电,一些大电容的漏电流是可以和它的充电电流相当的。

速度测量

如果大家想知道定时器的运行速度,由于这个速度是没有办法用秒表来测量的,大家也可能没有示波器,办法是用10倍大或者100倍大的电容来替代原有电容,这样定时器的周期也会成比例的增加。由于电容器生产可接受的误差是很大的,再加上上面提到的漏电问题,这种替换方法只能给出一个近似的结果。

电源

555定时器可以用的电源最低是5V直流,最高是15V直流,在此范围内都不会显著影响脉冲频率。

输出电压

555定时器的输出电压会比电源输入电压稍微低一些,如果大家希望用这个输出直接驱动一个逻辑芯片,但是对于输入高低电平有要求的话,就需要在555定时器运行在特别慢的情况下(比如5s的脉冲周期下)来检查输出电压。大家可以考虑用10kΩ的上拉电阻或者下拉电阻接在逻辑芯片的输入引脚上。

如果这些回顾大家还是觉得有些迷糊,可以回去翻一翻Make:Electronics或者其他的入门书籍,也可以翻一翻制造商的数据手册。

4.3.0 CMOS定时器和双极型定时器的知识回顾

最初版本的555定时器(现在还在生产)内部有双极型三极管,通常被称为TTL芯片,特性如下:

对静电的抗扰能力比较强

可以接受比较宽泛的电源电压输入

可以提供或者吸入高达200mA的电流

在充放电切换的时候会产生尖峰噪声

耗电较大

较新的CMOS版本的555定时器特性稍有不同:

对静电的抗扰能力比较弱

对电源输入电压有比较严格的要求

提供或者吸入的电流有限(具体的能力各厂家的产品不一致)

在充放电切换时不会产生尖峰噪声

耗电较小

比较让人疑惑的是CMOS和双极型的定时器都称为555定时器,而且元器件型号还很类似。以德州仪器的产品为例,TLC555-Q1CMOS的版本,NE555P是双极型的。更让人搞不清楚的是有些CMOS版本的用3.3V电压,而有些用5V电压,而还有一些可接受的电压输入更宽泛一些。

如果大家自己买定时器,就需要对照数据手册看清楚。CMOS的定时器在我们的项目里面是驱动不了扬声器的。

项目5:呜呜的声音

我们可以不用光敏三极管来调节555定时器上控制引脚的电压,改用第二个运行周期更长的555定时器来控制,这样就能自动产生声音频率的升降变化了。

在图5-1中,之前的电路图向下延伸了(面包板版本的电路照片在图5-2中有展示)。第二个定时器的输出经过47μF的耦合电容之后接到了第一个定时器的控制引脚。为什么要用这个耦合电容呢?这是为了产生呜呜的声音。这个呼叫的声音到底是什么样的声音呢?大家听到的时候就知道了。

说明: 00048.jpeg 

5-1

通过利用第二个555定时器来调节第一个555定时器的控制引脚的电压,大家可以得到特别恼人的呜呜的声音

第二个定时器用的是150kΩ的电阻来为1μF10μF的电容进行充电。大家可以先用10μF的电容,这种情况下定时器的周期大概是一秒。开始的时候,对第一个定时器没有什么作用,但是当第二个定时器的输出缓慢地给47μF的耦合电容充电时,会导致第一个定时器的频率逐渐升高。然后下面的定时器充电周期结束,切换到放电周期。在这个时候,耦合电容将开始放电,然后上面的定时器的运行周期又会降下来。

说明: 00049.jpeg 

5-2

双定时器电路的面包板版本

我在Make:Electronics中的项目17里面用到了这个电路,但是生成的声音有所不同。大家可以拿那个电路图和图5-1的电路图进行比较,看看能不能发现不同之处。

在图5-1中,如果大家用1μF的电容来替代10μF的电容,一切会变得快10倍,而且大家会听到明显类似夜警防盗的噪声(这是我说的呜呜的声音)。大家可以换不同阻值容值的电阻和电容玩一玩,也可以换不同容值的耦合电容,可以得到特别恼人特别刺激的噪声。

光敏三极管也可以使用。大家可以试试用手在光敏三极管前面晃动,迅速改变光的亮度,看看有什么结果。

如果用两个光敏三极管来调节这两个定时器的控制引脚的电压,将会发生什么呢?

5.0 制作更多

我们可以用很多其他元器件来替代555定时器,这些元器件就是为了解决我在上一个项目结束的时候列出来的定时器的局限性而设计的。

●7555555定时器引脚是完全兼容的,但是耗电更少一些,可以用低至2V直流的电源来驱动,电路中也会产生较少的噪声。最高供电电压和最大供应电流则根据生产商不同而有所不同。

●4047B则能提供额外的功能,使得芯片更好用。有一个触发引脚用来接受从高电平到低电平的转化,而另一个触发引脚则是接受从低电平到高电平的转化。这个芯片还有两个互补的输出,如果一个是高电平,另一个是低电平。这个定时器根据另一个引脚的设定不同,可以运行在单稳态模式或者谐振模式下。供电电压范围则和老式的双极型555定时器完全一致。

●74HC221是一个双单稳态定时器芯片。换句话说,这个芯片里面有两个定时器,每个定时器都运行在单稳态模式下。这样输出的就是一个可以分别设定高电平时长和低电平时长的脉冲流。最高的供电电压是7V直流,但是建议还是用5V直流。

●4528B是一个双单稳态定时器,设计思路和74HC221类似,但它是一个老式的CMOS芯片,可以接受的电源输入电压范围比较大(最高可以到15V直流)。

还有其他的双单稳态定时器,包括74HC12374HC42374HC4538 4098B,工作原理大体相同,只是特定指标上稍有差异。

●556是一个双定时器,一个芯片里面有两个555定时器。这两个定时器可以相互触发,但是局限性和传统的555定时器一样。556芯片现在不常用了,甚至以后可能都买不到了。由于这个原因,同时因为单个的定时器在电路上排布更加方便,这本书里面没有使用556芯片。

最后还要介绍一下74HC5555芯片,里面有一个24级的计数器。这样可以将时钟频率分成大约一千六百万份,如果你愿意,就可以使时间间隔以天来计算。这个芯片可以用一个外接的晶振来得到比阻容电路更精确的时钟,但是晶振的时钟频率通常很高,会降低定时器的最大周期时长——当然大家也可以用两个来级联,用一个的输出来触发另一个芯片。

我们有这么多的选择,都是为了增加555定时器缺失的功能,那么为什么老的双极型555定时器还是这么常用呢?也许是因为大家都太熟悉555定时器了。就像QWERTY键盘,不是特别理想,但是大家都知道怎么用。另外,传统的双极型直插555定时器比任何的后续版本所能提供的电流都要大,这个对于一些快速搭建的简单电路来说是很有用的。而且很便宜!

大家也许会考虑用以上的某些变种来搭电路。就我个人而言,我玩定时器是玩不够的,因为这些简单的芯片能做出无数的变化来。当然该是向前走的时候了,我们下面将有新的元器件来玩耍,这就是比较器。

项目6:易开易合

大家在前面两个项目中可以看到光敏三极管会随着入射光的变化成比例地改变输出。这是一个非常有用的功能——尽管说这个功能还不够强大。在实际的应用场合中,我们通常希望一个光敏元器件有两个精确的状态:闭合和断开。举个例子,侵入警报器是在有人打断了光束的时候被触发,需要给出一个明确的信号,这个时候可不能逐渐给出判断或者时断时无的给出结果。

有没有办法将光敏三极管输出的逐渐变化的输出转变为一个清晰的状态信号?毫无疑问,比较器就是干这个的。

6.1 进行比较

将图6-1中的电路组装起来,里面的500kΩ变阻器是可以直接插到面包板上的。光敏三极管和以前一样与3.3kΩ的电阻串联着,但是这次发射极的输出连接着一个100kΩ的电阻接到了LM339芯片的输出上了。这个芯片内部有一个比较器。事实上,芯片内部有4个比较器,当然我们这会儿只用其中一个。在这个示例里面,没有用到的比较器可以不接。

将变阻器调到可变范围的中间点。首先将光敏三极管拿东西遮住,此时没有入射光。现在让光照上去,大家应该能够看到LED灯亮起来了。这时再遮住光,LED灯应该会再次灭掉。

说明: 00050.jpeg 

6-1

电路最初形态,其中用比较器来开关LED灯,电路的输入是光敏三极管上的入射光

这个500kΩ的变阻器可以为比较器提供一个参考电压。当变阻器在可变范围的中间点的时候,参考电平大约就是2.5V,毕竟变阻器实际上就是一个分压电路,两头分别是电源的正负极。

在弱光条件下,从光敏三极管的发射极上来的电压会低于2.5V,因此比较器是不会有反应的。当光逐渐增强的时候,光敏三极管发射极的电压会高于2.5V(还记得为什么了吗?)。这个比较器会检测到这个不同之处,然后改变输出(100kΩ的电阻是必须的,因为下一步还要增加其他的元器件。由于比较器的输入阻抗特别高,电阻几乎不会影响到芯片的输入电压)。

现在给光敏三极管保持中等强度的光照,同时调节变阻器。LED灯会灭掉或者亮起,原因是我们在改变比较器使用的参考电压。

6.1.0 比较器基本知识

比较器是将一个可变电压和另一个引脚上的固定的参考电压进行比较的元器件。

我们可以用变阻器来设定参考电压。

说明: 00051.jpeg 

6-2

当比较器接受到的电压输入是一个缓慢变化的信号(上图)的时候,输出就可能不可预测的在开和关之间来振荡(下图)

目前一切进展顺利。但是如果光敏三极管上的入射光在LED灯开关点附近稍微变化一些的时候就有问题了。大家可以这么做,首先将光敏三极管遮住,然后逐渐增强入射光,直到LED灯亮起来。这时稍微减弱一点入射光,LED灯就该开始闪烁了。

这个过程在图6-2里面用图形来展示了。这个闪烁就是比较器在来回振荡,没法确定目前的状态是开还是关。

怎样才能避免这个情形呢?答案是用一种非常强大的技术,名字叫做正反馈。

6.2 反馈

6-3展示的是同样的电路,但是在右边又加了一个变阻器。

说明: 00052.jpeg 

6-3

比较器基本电路已经被更改了,增加了正反馈来处理输出的毛刺

6-4展示的是这个电路的面包板版本。

这个电路的基本思想如图6-5所示。注意比较器的2号引脚现在和5号引脚连接在一起。2号引脚是输出引脚。5号引脚是可变的输入——光敏三极管通过100kΩ的电阻连接到这个点上了。因此图6-3中的第二个变阻器会从这个输出上分掉一部分电压,然后再输出到输入上。这就是正反馈。

说明: 00053.jpeg 

6-4

正反馈比较器的电路用面包板搭出来了,里面用了两个变阻器,左下角用了一个光敏三极管,还有一个LED灯来展示输出

说明: 00054.jpeg 

6-5

正反馈基本思想

当两个变阻器都在变化范围的中间的时候,如果大家在光敏三极管入射光光强做一点小的调整(和之前做的相同),你会发现这次LED灯不再闪烁了,输出很明确,不是开就是关。

正反馈的工作特点如下:

当输出为正的时候,这个输出会通过反馈环路加到输入上。

输入电压增加,会继续增大输出。

这个更高的输出又会通过反馈环路再次加到输入上,继续抬高输入。

这个变化过程非常快,因此LED灯会亮起来,而且保持亮灯状态。现在如果落在光敏三极管上的入射光逐渐减弱,一开始没有任何反应,因为反馈回来的还是足以支持正输入的。但是随着灯光减弱,如下过程会发生:

较低的输入将导致输出降低。

从输出的反馈不能如之前一样增高输入。

由于正反馈,输入突然降低,比较器的输出变为低电平。

这个过程也非常快,LED直接灭掉,而不是闪烁或者逐渐暗掉。

6.3 迟滞

调节右手的变阻器,降低其在电路中的电阻值。这样就会增强正反馈,使得刚才的现象更容易观察到。

现在特别缓慢地调节落在光敏三极管上的光。如果你把电路放在台灯下面,可以手靠近台灯,把光与影的模糊边缘投射到三极管上。

大家应该能发现LED灯亮起的时候,如果只是减弱一点点光,LED灯还是亮着的。大家可以这么理解,比较器有黏滞性,会持续处于闭合状态。

当灯最后灭掉后,慢慢地增强入射光,这个时候比较器会持续处于关断状态。图6-6中展示了这个过程。

这个现象被称为迟滞,而且这个特性很有用。比如说我们使用光敏三极管在日落之后打开灯。当云彩飘过落日,导致光变暗了。这个时候你会希望随着光强任何的变化都来开关灯吗?不会的,一旦灯亮了,我们都会希望灯一直亮着,而不会去管那些小的变化。

说明: 00055.jpeg 

6-6

有了正反馈之后,比较器的输出变化会有滞后,会持续处于原有状态。这个黏滞区就是迟滞区

又比如说我们用一个温度传感器来控制暖气。如果我们希望室温低于70°F(华氏度)的时候就打开暖气,大家不会希望当有人经过这个传感器带来一阵暖风就停掉暖气吧。我们需要暖气忽略掉这些细微的变化,要温度到达72°F以上才行。这个时候我们希望暖气关掉,直到温度降到70°F以下再打开。在这种情况下,我们的迟滞区就需要70°F72°F的上下线(华氏度=32+摄氏度×1.8)。

迟滞的量可以通过增加或减少比较器的正反馈的量来调节。用较低的电阻可以使得正反馈增强,比较器就会忽略掉较大的输入波动,这样得到的就是很简化的输出。图6-7用图形展示了这个过程。

6-7中图形的下半部分展示的是我们期望的比较器输出,这个比较器忽略掉了输入的各种小的变化。基本上,比较器会忽略掉灰色区域内的任何变化,只有当信号穿透了灰色区域出现在确定的闭合区,或者到灰色区以下到达确定的关断区才会有变化。

大家应该了解迟滞通常使用类似图6-8中的图形来表示的。这张图大家可以在很多的电子学书籍中找到,但是有点难以理解。曲线右边的部分展示的是比较器的输出(测量值在纵轴),对应的是输入电压平滑而逐渐地增加(测量值在横轴,从左向右)。比较器会有一个等待的过程,直到输出变化。如果输入电压平滑而逐渐地变小,就到了左方的曲线,比较器也会有一个等待的过程,最后输出才能变成关断状态。

说明: 00056.jpeg 

6-7

在比较器电路中增加正反馈会增大迟滞区,使得比较器能在有错误信号时忽略掉更大的变化

说明: 00057.jpeg 

6-8

经典的迟滞区图示。大家可以看看文字的细节解释

6.4 图标

现在我们讲一讲比较器的一些细节。首先,比较器的图标如图6-9所示。比较器和逻辑芯片一样,需要有独立的电源。我在图6-9里面用了正负极的图标,但是在很多电路图中,比较器的电源都会被省略掉。大家都知道肯定要有电源,所以很多画电路图的人可能都不再来画它。

说明: 00058.jpeg 

6-9

比较器的原理图图标。电源是必须要的,但是电路中不见得会表现出来

电路里面的参考电平其实就接在比较器的负端输入上。我们用正端输入来接光敏三极管输出的变化的电压。我会在后面解释为什么这些输入这么起名字。在这个电路图图标里面,这两个输入分别标着配的正负标示——这个容易让别人搞混,因为这并不是让你接电源正负极进去的意思。

6.4.0 正负端知识

比较器在正端输入的电压高于负端输入的电压的时候,输出会是处于闭合状态。这个标着正的输入就被称为正端输入。

同样的,当比较器负端输入的电压低于正端输入的电压的时候,比较器的输出就同样是闭合状态,这个标着负的输入被称为负端输入。

6.5 输出

我讲了不少比较器的输出了,但是很多比较器的输出并不是简单的高电平或者低电平。它们提供的是一个开路集电极输出,如图6-10所示。

说明: 00059.jpeg 

6-10

简化的比较器内部工作示意图。两个电源正极可以不同,但是需要电源地是相同的

比较器通常里面有各种不同的元器件,但是我们这里关心的是输出三极管,这个三极管通常是双极型的。当这个三极管导通的时候,会吸收电流,因此会从外部的上拉电阻吸取电流并传到电源地里面。这个三极管同样也会从其他和比较器相连的元器件里面吸取电流。这样看起来,这个比较器的输出就是低电平了。

当这个三极管关断的时候,就会阻断电流。从上拉电阻过来的电流不能通过比较器流到地,因此会借助其他的与比较器输出相连的元器件输出电流。这样看起来这个比较器的输出就是高电平了。

6-11用图形的方式展示了这个比较器的工作原理。

实际上,大家不需要记住比较器内部三极管的工作状态。大家只要记住比较器的高电平输出实际上是通过上拉电阻来供电的,而低电平则意味着电流通过比较器流向了地。

在图6-1中,大家可能会有疑问,我为什么没有给LED串联电阻,正常情况下LED灯都要串联电阻的。这是因为LM339有一个开路集电极输出,因此实际上LED灯是通过470Ω的上拉电阻供电的。

现在我们总结一下我们对于输出所了解到的知识。

说明: 00060.jpeg 

6-11

当比较器用在正端输入模式(电压接在正端输入,而不是负端输入上),输出的行为如图所示

6.5.0 更多关于比较器的知识

如果比较器的输出是开路集电极输出,我们必须在输出端加一个上拉电阻。否则比较器就没法正常工作。大家在用比较器的时候要检查一下数据手册。

如果大家用的是一个低阻值的上拉电阻,通过比较器流进的电流会比较大,有可能会过载。如果有相关疑问,可以用万用表来测一下流经上拉电阻流进比较器输出引脚的电流。

一般而言,绝大多数比较器的输出引脚连接到高阻元器件的输入,比如接到逻辑芯片上,这样就可以用相对高阻值的上拉电阻了,比如5kΩ的。项目4中使用的470Ω电阻相对来说很低了,原因在于要通过这个来驱动LED灯。

比较器没有办法吸取超过20mA的电流。这时,大家可以在输出引脚外部再接外置的三极管,就能提供更多的电流了。

现在要注意,下面的一点很重要,也是一个新概念。

连接上拉电阻的电源正极不一定要和比较器的电源正极完全一致,但是电源地需要是一致的。比如说,我们比较器用的电源和地之间的电压可以用5V直流,但是上拉电阻可以用相对同样地的9V直流电源来连接。这样比较器就可以当作升压器来用了。

很有意思吧——我们现在已经知道如何用三极管来放大电流,并用比较器来放大电压了。这个信息在将来会很有用。

要注意不能让内部的三极管通过太多电流。比较器的数据手册会讲清楚电流上限会是多少。

6.6 芯片内部

我在这个项目里用的是LM339,因为这个是最古老的比较器,也是最常用的比较器,而且也很便宜。在图6-12中,我们会看到这其实是一个四比较器芯片,内部在4个比较器,而在这个项目中我们(目前为止)只用了一个。

说明: 00061.jpeg 

6-12

LM339芯片内部有4个比较器

6.7 重画电路图

我在图6-3中展示的电路图画得比较简单,为的是能最方便地用面包板搭起来。面包板的布局常常上部是电源正极,下部是电源地,左方是输入,右方是输出。这么画的原因是这样电路在第一次看的时候比较容易理解。

6-13是传统的带比较器的电路图。里面的元器件和电路连接其实和图6-3是完全一致的。

说明: 00062.jpeg 

6-13

使用比较器搭基本正反馈回路的常见元器件排布

6-13中原理图的精髓在图6-14中展示了。

说明: 00063.jpeg 

6-14

正反馈电路中的迟滞基本概念

6.7.0 注意:反向比较器

在这本书里,我用比较器(后面还会用到运算放大器)的时候,一直用的是正端输入在负端输入下面。这种配置是常见配置,在其他地方的原理图里面可以看到——但是这并不是唯一的情况。有时候画电路图的人可能认为将正端输入放在负端输入上面更加方便,那样连线的时候交叉更少,或者布局能更加紧凑。

这种情况可能让人疑惑。我们在标注正端输入和负端输入的时候一定要小心。如果你没有注意比较器上下画反了,电路可能就跟你想要的功能背道而驰了。

6.8 和微控制器对比

比较器芯片是很传统的芯片,现在的人们如果要对一个可变的信号做处理需要一个开合输出的话,都倾向用微控制器。

在很多的微处理器中都有一个或者多个的模数转换器(通常简写为ADC)。而且通常每个ADC都被分配了一个引脚。这个引脚可以接受一个可变的电压,然后将其转化为一个整数,是的,整个数字,通常从0到至少100010进制)。

如果大家为光敏三极管提供5V直流供电,这也是我在这些项目中建议的,其输出也就能和5V供电的微处理器相互兼容。这个听起来很不错也很简单:只要将光敏三极管和微处理器连起来(事实上,大家也许希望在两者之间插入一个5kΩ或者10kΩ的电阻,这样可以保护微处理器的输入引脚。由于芯片的输入有着高阻抗,电阻本身不会使得输入引脚的电压显著下降)。

下一步是将光敏三极管暴露在光照之下,光强设在暗光和强光中间,这样可以确定一个转换点。在这个点以上,我们希望微处理器去做一些事情,在这个点以下,我们希望微处理器停止目前在做的某件事情。

当光开始变化的时候,我们需要找到微处理器模数转换器转换得到的数字。最简单的办法是给微处理器接上某种数字显示屏,然后用个小程序将数字显示到这种显示屏上。

现在大家可以写个新程序,里面包括一个条件判断,告诉微处理器在光强高于某个分界线的时候开始工作,而在光强低于某个分界线的时候停止工作。

到现在为止,听起来需要干的活儿其实不多,尽管如果你想法变了,转换点想换一换,就需要重新来写程序,并重新装载到微处理器里面。很明显这个比起调节变阻器来说还是要复杂一些的。

但是我们还需要迟滞效应是吧?在这种情况下,如果我们定义两种不同强度的光,建立灰色区域的高低阈水平,让微处理器忽略掉这个区间内的光强的微小变化。基本上这个程序就是告诉微处理器芯片:如果光强升到上限以上了,那就开始干活,如果光强降到下限以下了,那就停止干活;如果光强在上下限之间,那就保持之前的状态。

情况又一次出现了,真正的问题在于如果大家改变主意,需要改变参数的情况下的处理。比如说大家用微处理器,在使用光敏三极管的情况下根据阳光强度,在日落时打开外面的灯,然后在黎明的时候关掉。我们需要使用迟滞效应,这样防止灯随着微光下云彩的多少而闪烁。我们怎样才能在调试状态下就知道这一切呢?对,我们不可能在调试的时候知道。我们必须先装好硬件,然后将设备装到预定的使用地点,再看看效果如何。要调节迟滞效应,我们需要用电脑,为设备装载新的程序,定义好新的上下光强限值。

对我来说,这可不是那么好玩。

微控制器在很多场合是必不可少的,但是有时候简单的用某些芯片搭建的模拟电路总价不会超过1美元,这相比而言是一个更加实际的选择。

6.9 制作更多内容:基于激光的安保系统

我们现在已经具备了足够的电子学知识,可以用我们刚刚搭建的电路,再加上一个激光笔和一些反射激光的镜子,将镜子布置在需要保护的区域的边缘上,来做一套侵入防卫系统。我们这次在比较器的输出端不装设LED灯,而是将输出连接到2N2222三极管上,为继电器的线圈提供电源。这个继电器会驱动警报——也可以用更隐蔽的方式通知你有入侵者了。

如果大家还想做个更复杂一些的系统,可以用多个激光和光敏三极管,这样如果某一个被触发了,我们就能知道大约这个入侵在哪里发生了。记住,LM339芯片内部有四个比较器芯片,每个都能独立工作。

为了让系统更好地工作,我们需要将光敏三极管装到一个密闭的盒子里面,只留下激光通行的孔径。这样,光敏三极管就不会被周围的光干扰,系统在白天的情况下也能工作。即使如此,大家还是需要调节光敏三极管的灵敏度和系统的迟滞程度。而唯一能达成这个目的的方法就是不断地测试与改进。

大家还能想出多少光敏三极管的用法呢?如果你展开想象,我相信你会有很多的想法。我最喜欢的一个做法是用来做全年适用光感灯具开关,我们下一个项目中会讲到。

项目7:全年适用光感灯具控制

在这个项目里面,我会用到前面项目中学到的各种知识,包括三极管、光敏三极管、555定时器以及比较器。而且,学好之前的基础知识有个好处,现在大家就能利用这些知识来制作一个有着实际用途的东西了。而且,还有额外奖励,就是打开一个数字闹钟,弄清楚工作原理,然后重新改变工作目的,在这整个过程中得到乐趣。

我在《爱上制作》系列书里面曾经发表过一个稍微有点区别,但是要少很多的项目。在那个项目里面,我为了节约空间,省略了很多解释的内容。现在,在这个新版本里面作了一些改进,而且要详细得多,应该比较容易理解,还能适用于更多种的闹钟。

这个项目的目的很简单:制作一个设备,根据人是否在家来开关家里的某个灯。当然我们可以买各种便宜的设备,看起来我们就像在家一样。但是在我看来,活儿干的还是不够地道。在我住的地方,夏天的太阳比冬天要晚下山两个小时,如果我用定时器的话,就需要一年调几次才能满足要求。

这个灯应当通过感应到黄昏时光线逐渐变暗而自动亮起,我们用光敏三极管连接上比较器来完成这项工作。我们可以直接买一个设备来完成这个工作,但是那些设备只能在固定时长之后关掉灯,不能满足我的要求。很多人睡觉的生物钟相当一致,并不会因为太阳下山晚了就会更晚关灯睡觉。因此从实际的使用角度来说,灯应当每晚同一时间关掉。

这就是我想要的灯控制器的要求:需要用光亮传感器来控制开灯,并用定时器来关灯。这种设备存在吗?当然不存在。因此我发明了这个全年适用光感灯具控制器,因为我别无选择。

7.1 不要用危险电压

这个电路可以控制最高60W的家庭灯具,供电电源还是家庭用电。如果大家需要的就是这个,我也找不到阻止的理由。但是我觉得最好还是用一个12VLED灯或者12V的卤素灯。家庭电源用的是110V交流或者120V交流电,这个电压确实很危险。如果你还年轻,请一定在做之前问问家长的建议。不管你多大年纪,总是可能会犯错,如果你在低电压上面犯错结果还好,如果是家庭用电上犯了错误,那就可能有严重伤害了。

如果你一定要用家庭电源,比较好的折中是买一些专为这个设计的东西,比如制客小栈的PowerSwitch Tail。这个元器件用的是312V直流的输入,然后通过内部的光耦隔离,这样隔绝了高电压,保护了我们(和我们的面包板)。大家可以在我们的这个全年适用光感灯具开关里面使用6V的总线电压,这个电压是通过电路里面的继电器来控制的,直接连接到了PowerSwitch Tail。当然了,为了这个保护的目的,我们得额外有些花费。

7.2 基本电路

7-1的电路图可以帮助我们熟悉一些元器件。图7-1中上面部分一般和项目6中间的比较器电路很类似(如图6-3所示),个别电线重新连了。主要的区别是连接在LM339输出引脚上的LED灯被去掉了,LM339输出左侧的上拉电阻从470Ω增加到了10kΩ,之前连接在输出和输入引脚之间用来调节正反馈的500kΩ电阻被换成了220kΩ的固定电阻。我们用这个电阻来设定一个固定的迟滞量。

在做完这些改动之后,就可以将电路中其他的元器件加进去了。图7-2是一个在面包板上实现了的电路,大家可以参考。

这个电路现在是一个6V直流电路。由于我会在电路里面增加一个用三极管来驱动的继电器,而且这个继电器的地接在两个线圈中间,和三极管的地是同一个地,用三极管来驱动继电器必须用共集电极模式,这样可以有比较大的电压降。而6V的电源将对此进行补偿。

我们需要拿掉LM7805稳压电源芯片,改成用LM7806。这个改变很简单,因为这两个芯片引脚完全兼容。我在电路图里面连电源都没有画,因为这个实在是太简单了。

LM339的引脚2的输出通过电路图左下角的1μF电容输出到555定时器的触发引脚。这个定时器有一个自己的10kΩ上拉电阻,保证触发引脚通常处于高电平,因此定时器的输出通常处于低电平。需要记住以下几个方面:

说明: 00064.jpeg 

7-1

项目6中的光敏三极管和比较器现在用来驱动555定时器,产生一个1s的脉冲。这个电路现在是使用6V直流电源来供电的

说明: 00065.jpeg 

7-2

全年适用光感灯具开关的第一部分

555定时器连线方式是单稳态时,只要触发引脚上保持高电平,那么输出就一直是低电平。

当触发引脚拉低时,输出会变成高电平,输出的宽度取决于连接到定时器的电容和电阻的大小。

整体的思路如下,当光变暗的时候,光敏三极管会导致LM339的输出发生变化,进而触发了定时器,这样会产生一个宽度大约为1s的脉冲。这个脉冲进而使能了自锁继电器(图中没有画出来),进而打开了灯。目前我只是在定时器的输出上连接了一个LED灯,来给大家展示这个方法可以行得通。

加上电源,等待定时器重启,在光敏三极管上照一些强光,然后慢慢地将光源移走(或者用手遮住产生阴影),这样来模拟太阳落山时变暗的过程。大家应该能看到LED1s的脉冲。现在可以用变阻器来调节一下光敏三极管的灵敏度再重新试一试。在继续之前一定要确定电路能否可靠地工作。

7.2.1 第二步

这个项目的下一步见图7-3所示。定时器的输出现在通过1kΩ的电阻输入到三极管的基极,而三极管将吸合3V直流自锁继电器的一个线圈。继电器的另一个线圈是通过按钮比如触动开关来激活的。47Ω的电阻是必要的,它用来保护继电器上加载全部电源的电压。这个按钮在电路的最终版本中将不存在,但是展示用的时候还是很有用的。同样,在继电器的输出上加了LED灯,用来表明目前的状态。

大家可能还记得在Make:Electronics中曾经讲过,自锁继电器在维持它的两个状态的时候是不消耗能量的,只需要一个简单的脉冲来翻转状态。因此,这个继电器用在长时间才变化的开关控制电路上非常合适,能够最大程度地降低电力消耗。

大家也许会好奇为什么我们在继电器和定时器的输出中间需要一个三极管。双极型的555定时器不是能够直接驱动一个小继电器的吗?当然,理论上没有问题,但是当我们使用一个相对低的供电电压的时候,这个继电器有可能干扰到定时器的行为。这一点在定时器的数据手册中没有提到,但是我亲眼见过。

说明: 00066.jpeg 

7-3

之前的电路图现在增加了继电器

7.2.2 电路测试

按照如下几步来测试我们的电路。

按下按钮,继电器旁边下方的LED灯会亮起来,在最终版本里面继电器的这种接法会用来驱动外置的灯。

松开按钮,然后逐渐调低落到光敏三极管上的灯光,模拟太阳下山的过程。

在这个过程中,继电器会跳到另一个状态,导致继电器旁边上方的LED灯亮起来。在最终的版本里面,我们会用一个灯来替代LED灯,在日出的时候亮起。

再次按下按钮,这个按钮最后会用一个时钟来替代,用于在预定的时间关灯。

逐渐调高所在光敏三极管上的光强,模拟新的一天的开始。这个时候应该没有什么事情发生。

再次调低灯光,整个过程会重复一遍。

7.2.3 继电器细节

我选的继电器是松下的DS1E-SL2-DC3V,里面的线圈设计工作电压是3V直流,由于三极管输出的电压在4V左右,不能可靠地驱动一个5V的继电器。根据3V直流继电器的数据手册,这个继电器可以承受高达4.8V直流的线圈电压,因此用在我们的场合是很合适的。

这个继电器在图7-3中按照大家会用的引脚排布展示给大家了(从上往下看)。大家如果还不太确定这些引脚的功能可以看图7-4中的说明。引脚旁边的数字在继电器下面刻进了环氧胶里面。也许大家还在想为什么这些引脚不直接标成16,这是因为松下希望这些数字在它的所有的继电器里面都能统一,而它的某些继电器的引脚多达12个。

说明: 00067.jpeg 

7-4

松下DS1E-SL2-DC3V继电器的引脚图,从上往下看的分布。如果大家用不同的继电器的话,引脚布局几乎是不一样的

如果大家不用这个继电器,需要查一下对应的继电器的数据手册,了解各个引脚的位置和功能,因为不同的制造商这方面的定义是不一样的。但是大家必须选择3V直流的双线圈自锁继电器,而且驱动电流应该标称为2A

注意继电器内部的线圈可能不一定是双方向的,对于松下的继电器来说,我们需要在图中的位置接电源地。如果大家把电源正极接在这里,它是没有办法工作的。

7.3 耦合电容

这个电路中一个关键的地方是1μF的电容,放置在比较器的输出和555定时器的触发引脚之间。记住这个配置的电容会起到阻断直流的效果,但是当上面施加的电压发生变化的时候,电容会将这个变化传递过去。

它的工作原理如下:

光敏三极管上的亮光将使得比较器的输入为高电平。

这个高电平的输入最终使得比较器的输出为高电平,使得电容这一侧聚集正电荷。

●555定时器的输入为高电平,因为有一个10kΩ的上拉电阻在保持这个电平。

继电器目前处于关断位置。

没有任何事情发生。

如果照在光敏三极管上的光逐渐减弱,将会有如下现象:

光敏三极管上的电压降到比较器的参考电压以下了。

比较器的输出翻转为低电平。

耦合电容将这个波动传递给了定时器,瞬间比上拉电阻的效果更占据主导位置。

这个定时器的反应是输出一个高电平的脉冲,触发继电器。继电器会变到闭合的位置(这个位置能驱动一个灯)。

在此之后,耦合电容继续着阻断直流的工作。

请确认这个电路能否正常工作。到目前为止,它只能被光子触发(大家可以想成光的粒子)或者用触觉开关控制。下一步是在里面加入全年可用光感控制中的各部分了。

7.4 打开一个闹钟

如果大家想自己做可编程的定时器,就需要买一个定时器芯片、一个数字显示模块和一些按键来设定这个定时器——但是这个方案听起来花费不少,而且对我来说也有些复杂了。另一个方案是用微控制器和外部晶振,但是还是需要有个数字显示模块,调节和设定还是比我想要的复杂很多。

我在本地的WalmatTarget或者walgree都可以买到使用电池的数字闹钟,价格在5美元左右,里面有显示模块也有按键,我能把这个用在我的全年可用光感灯具控制电路中吗?我觉得是可以的。

请大家确认选的闹钟是用两节1.5V的干电池来当作电源的。这一点尤其需要注意:有些闹钟只用一节1.5V的电池,那种闹钟在我们的电路中是没有用处的。旅行闹钟常常就用一节1.5V的电池。大家需要在买的时候看好了!

7.4.1 注意:不要用交流的闹钟

请不要选插在墙上电源口上的闹钟。在这种闹钟里面基本上会有一个变压器将110V的交流电转化为安全电压,但是处理高压连接如果出错还是会很危险的。

7.4.2 看闹钟内部

只要我们用的是3V电池供电的闹钟,品牌和型号就都不重要了。因为任何的数字闹钟在内部都要用电来驱动蜂鸣器,而这种驱动正好是我们的电路所需要的。

我们的第一步是打开闹钟的塑料外壳。图7-5中黑色的闹钟底下有4颗螺钉(已画圈标明),其中的三颗比较深。图7-6中的白色闹钟只有一颗螺钉,藏在电池仓里面。图7-6这张图上展示的是用小号十字螺丝刀来拧开螺钉的时刻,这种螺丝刀大家应该会用到。附近任何的五金店里面几块美元就能买到一套。

说明: 00068.jpeg 

7-5

所有的4颗螺钉(已画圈标明)都需要拧掉才能打开闹钟

说明: 00069.jpeg 

7-6

这个闹钟只用了一颗螺钉来拧外壳,但是藏在电池仓里面

7.4.3 闹钟的电压

我们打开外壳,首先要做的事情是检查电源。将电池再装进去,然后看看电池仓的下面。图7-7、图7-8和图7-9中共展示了三个闹钟,在每个图里面标着AB的接头分别提供了+3V和地,大家需要用万用表检查一下你的闹钟里面接头的电压。

说明: 00070.jpeg 

7-7

3V的电池电压通过接头AB输出来,接头C没有接任何东西,D表示的是蜂鸣器,ELED连接在一起,用于在闹铃完成之后点亮显示屏

说明: 00071.jpeg 

7-8

3V的电池电压通过接头AB输出来,接头C为闹钟芯片提供1.5V电压,D表示的是蜂鸣器

说明: 00072.jpeg 

7-9

3V的电池电压通过接头AB输出来。接头C为闹钟芯片提供1.5V电压,D表示蜂鸣器

在这三个图片里面,标着C的接头可以提供1.5V直流电,它接在两个电池中间。有些闹钟不用这个功能,有些闹钟则用它来驱动低压芯片。这对我们没有用处,因为我们需要的是用来驱动闹钟蜂鸣器的3V电压。

每个闹钟里面的蜂鸣器都标着D。图7-7中的红色闹钟有根线标着E,是用来点亮LED灯的。

现在大家需要找出来闹钟在开始鸣叫的时候到底做了些什么。当开始鸣叫的时候,将黑色的表笔按在接头B上,这个是电源的负极。大家用带鳄鱼夹的连接线缆来夹住对应的接头可能更加方便。用一个鳄鱼夹来夹住接头,另一个鳄鱼夹夹住黑色的万用表表笔。这样我们的两只手就能解放出来干别的事情了。图7-10中展示的就是测量蜂鸣器行为的连接示意图。

说明: 00073.jpeg 

7-10

用带鳄鱼夹的连接线来测量闹钟内部的蜂鸣器电压,这样可以解放双手来做别的事情。蜂鸣器是很薄的圆形物件,红色的鳄鱼夹现在夹在上面的一个焊点上

用红色的表笔点一下接头A,确认一下现在至少3V直流还能测量到。现在将红色的表笔点到蜂鸣器背面焊接点的隆起部分,很大程度上大家测到的和在电池上测到的是一样的3V电压,而且也应该是3V。因为蜂鸣器两端都是正电压,上面没有电位差,这也解释了蜂鸣器为什么没有鸣叫的原因!

现在将闹钟的闹铃时间设在当前时间,确认闹钟开关已经打开了。大家万用表的黑色表笔需要牢牢地加在电池负极上。当闹钟开始鸣叫的时候,将红色的表笔点到蜂鸣器的两个焊点上,这个时候我敢打赌蜂鸣器的有一端测到的是不稳定的低一些的并且变化的电压,而另一端则还是高电压。我将这个不稳定的蜂鸣器的一侧称为低压侧。

将万用表调到交流电压挡,然后在蜂鸣器鸣叫的时候测试一下这个低压侧。我想大家应该看到一个低于3V的交流电压,而且这个电压应该比1V要高。这个电压的变化幅度要比用直流挡的时候变化要小。

7.4.4 蜂鸣器如何鸣叫

这里发生了什么呢?好吧,总有一个东西在控制蜂鸣器的开关,这应该是闹钟里面的三极管。在我检查过的所有的闹钟里面,三极管都连着蜂鸣器的低压侧(就像比较器的开路集电极输出一样),并吸取电流,使得蜂鸣器开始鸣叫。图7-11描述了这个原理。

大家可能看不到一个实际的三极管,因为这个三极管被嵌入到闹钟功能的主芯片里面。而且很大程度上这个三极管是一个CMOS型的三极管而不是图7-11里面描述的双极型的三极管,但是工作原理还是相同的。我将这个三极管称为蜂鸣器三极管。

说明: 00074.jpeg 

7-11

闹钟里面的驱动蜂鸣器的典型配置。在实际情况中,里面用的应该是CMOS三极管,但是原理是一样的

当闹钟不响的时候,蜂鸣器三极管会阻断电流。电池处的电压无处可去,这就是我们用万用表测到满载电压的原因。不管是在高压侧测电压还是在低压侧测传递过去的电压都是一样的。

当闹钟再响的时候,三极管会通过蜂鸣器吸取电流,也会从万用表表笔里面吸取电流,这样我们才能在蜂鸣器的低压侧测到一个稍微低一些的电压。但是这个电压不会消失,也不会波动,为什么呢?

大家可以去买那些只要加直流电就能发出固有音频频率的蜂鸣器。但是这种蜂鸣器要比那些被动的类似扬声器的蜂鸣器贵一些。便宜的闹钟里面的蜂鸣器应该会便宜一些,而闹钟里的芯片会负责产生对应的声音频率。这是一种交流电流,在12kHz,这也是用万用表的交流电压挡读到的读数会更有意义一些的原因。

我猜这个电压的变化范围是高到3V左右,而低到0V左右。大家在万用表上看不到这个,因为变得实在是太快了,反应不过来。

7.5 利用鸣叫

我们怎么样才能利用这个变化的鸣叫信号呢?在LM339的内部有四个比较器,现在只用了其中一个来处理光敏三极管。我把这个比较器称为比较器A。现在我们可以用另一个比较器,我称之为比较器B,用来处理闹钟。当从闹钟过来一个信号的时候,比较器B会触发另一个555定时器,再给第二个继电器线圈充电,从而关掉灯。

剩下的只有一个比较难的问题了:如何将闹钟和我们的比较器B连在一起?这个闹钟用的是3V的直流电,而比较器电路用的是6V的直流电。我们必须保护闹钟免受高电压的危害。完成这个任务的方法是我之前提到的比较器有个比较方便的特性:比较器控制的电压可以和比较器用的电压完全不同。

大家看一下图7-12,再看一下图7-13里面的面包板的照片,电路图上部的三个白色的标签标示着从闹钟的电源正极、电源地和蜂鸣器低压侧过来的电线。蜂鸣器过来的信号穿过耦合电容连接到比较器B的正端输入,位置是LM339芯片的引脚11,这个电压是3V直流或者低一些的电压,用来激活比较器。

引脚13是比较器B的输出引脚,用的是6V直流电(通过10kΩ的电阻传过来的),用来触发第二个555定时器,并通过一个双极型的三极管来控制第二个继电器线圈,而定时器现在插在继电器的上面。

说明: 00075.jpeg 

7-12

全年可用光感灯具开关的电路图全图

有件事情,当大家在连线的时候,要注意LM339,它上面的正端输入和右手的负端输入并不是正好对着的引脚。大家需要去看下图6-12里面的LM339引脚图,确保输入不要混淆了。记住,标着正的输入是正端输入。

说明: 00076.jpeg 

7-13

最终的全年可用光感灯具开关的面包板,里面没有闹钟和需要的电源。图片右上角上消失的三色电线就是连接到闹钟上的

要想保证这套电路正常工作,闹钟和面包板必须使用同样的电源地。所有的电源电压都是相对于这个统一的地而言的。但是3V的闹钟正电压需要和面包板上其他的元器件分离开来,与之有关系的只有LM339的输入。我们前面说了,比较器通过电流流过而产生的电压和比较器本身的电源电压是可以完全分开的。

当大家讲一根电线接到闹钟的蜂鸣器上时,请注意一定接在低压侧——就是在蜂鸣器鸣叫的时候测到的有波动电压的那个焊点上。

在焊点上增加一根电线,如果过热会损坏蜂鸣器,而同样麻烦的是在焊接这根电线的时候,有可能把原有的电线也焊掉了。因此我用的是剪线钳,剥开现在的电线的一段,然后把新线搭上去。如图7-14所示。

说明: 00077.jpeg 

7-14

黄色的线现在搭在已有的白色的线上,这根线是闹钟内部蜂鸣器的低压侧的线。蓝色的和红色的线连接着电池盒

在最终的配置里面,我们还是要将蜂鸣器去掉的,因为这种噪声跟我们要的灯具控制器没有任何关系。但是现在,这个噪声有助于提醒我们在调试过程中了解目前闹钟的状态。

7.5.0 和闹钟连接起来

下面是升级电路的几个精确的步骤。在到第六步之前一定记得把闹钟里面的电池先拿掉。

.将电池仓的负极一侧和面包板的电源负极总线连在一起。

.将闹钟电池仓的电源正极连接到500kΩ变阻器的一侧,这个是用来给比较器B提供参考电压的。将变阻器的另一侧连接到面包板的电源负极总线上。将变阻器的中间引脚连接到LM339的引脚10上,这是一个负端输入,就是接收参考电压的。将变阻器调到中间点,这些连接在电路图的右手一侧都标示清楚了。

.在变阻器的低压侧连接一根电线,并连到面包板上的1μF电容(这又是一个耦合电容)。将电容的另一侧连接到LM339的引脚11,这是正端输入。电容器会将闹钟过来的脉冲传递给比较器,从而阻断直流电压。

.在引脚11和引脚13上接上两个上拉电阻。注意其中一个是100kΩ,而给这个100kΩ电阻供电的电源是从闹钟过来的3V,不是面包板上的6V。这一点很重要。

.给面包板上电,仔细检查各个电压,特别是连接到闹钟上的电线上的电压。大家一定不愿意看到从面包板上过来的6V电压把3V供电的闹钟给烧毁了。

.将电池装回到闹钟里面,检查一下从闹钟到面包板的电线上现在是否有了3V电压了。检查闹钟的电源地和面包板的电源地现在是否连在了一起。

.将闹钟调到1min以后,然后等待闹钟响起。现在大家应该能看到万用表的红色表笔测到的是比较器B输出的不断变化的输出电压。

这一切听起来有点复杂,但是只要能正常工作,可靠性是没有问题的。

下一步是把我们的第二个555定时器加进去。将这个定时器连到LM339的右手边,连接方式和第一个555定时器连到LM339左手边是完全一致的。

7.6 预期工作方式

当闹钟不在闹铃的时候,闹钟电源正极的电压会通过100kΩ的上拉电阻将比较器B的正端输入拉在大约3V直流的电压左右。LM339的输入阻抗非常高,只会吃掉几个μA。当闹铃响起的时候,闹钟内部的蜂鸣器三极管将开始按照一定声音的频率开始振荡,通过比较器的正端输入发送一组组的脉冲。比较器看到的情况是在每个脉冲和下一个脉冲之间,电压降到了低于1.5V,这时电路右侧将变阻器设到中间得到的参考电压。于是比较器会触发555定时器,继而激活继电器,从而关掉灯。

对于一个比较器,声音的频率其实是很慢的。当电压跌落到1.5V以下非常短的时间,比较器就会将输出的电压拉低,从而触发定时器。而定时器和比较器一样,在快速反应输出上也一样灵敏,会给继电器发送一个1s长的脉冲。

当闹钟的闹铃还在响的时候,同样会使得比较器不断重新触发定时器,而定时器也会继续给继电器发送高电平输出——但是这没有关系。继电器已经处于关灯状态,后面的高电平输入只是让继电器做现在已经做完的事情。一分钟左右之后,闹钟就不再响了,一切归于宁静。电路在夜里剩余的时间里面就都是稳定的了。

接下来会发生什么呢?黎明的阳光会照醒光敏三极管,比较器A将会改变输出,从低电平变为高电平。再接着就是会给第一个555定时器发送正信号,而定时器会忽略掉这个信号,因为从上拉电阻上来的已经是稳定的高电平输入了。

在整个白天,什么事情都不会发生。当太阳开始下山,会是光敏三极管给比较器A输出低电平。这时比较器的开路集电极输出会吸取电流,对于第一个555定时器来说,这就是一个低电平脉冲,而会暂时压制10kΩ的上拉电阻。于是定时器被触发,并给继电器发送一个脉冲从而将灯打开。

现在灯就一直亮着,直到闹钟将灯灭掉。然后又是一个循环开始。

大家可能会奇怪,这个真的能正常工作吗?当然,我做的电路正常工作了(用了三种不同的闹钟),我也相信大家的电路也能正常工作。事实上,用哪种闹钟是无所谓的,只要是电池供电的数字闹钟(别用老式的指针闹钟就行)。任何一个数字闹钟里面都有一个蜂鸣器,而蜂鸣器开始鸣叫的时候,蜂鸣器上面的电压肯定会变化,而我们就是要将这个电压的变化抓住,在抓取这个电压的时候,闹钟根本感受不到有什么区别(我们将一个非常高阻抗的设备,比如一个比较器连接上去,几乎不会吸取电流)。

也许有的闹钟的蜂鸣器的电压是从低变到高的,也有可能用的是直流电压,而不是我刚讲到的快速的脉冲群。但是所有的数字闹钟的蜂鸣器声音都是时断时续的,因此总有高低脉冲的。而只要有第一个低电平脉冲就会触发比较器B

7.7 测试

为了测试这个电路,我们需要加上电源,然后将光敏三极管遮住再暴露到强光下,然后再遮住。这样就能将继电器转换到开灯的状态。然后将闹钟调到一分钟以后,当闹钟响铃的时候,就应该能将继电器翻转到关灯的状态。如果这个开关周期没有奏效,大家就需要用万用表来测量电路里面每个点的电压。要想成功,关键点就是不能急,要冷静还得坚持!

一旦电路开始工作,大家就可以将LED灯拿掉,现在再也不需要了。

为了电路的可靠工作,也为了减少电力消耗,我们可以让LM339中其他不用的输出断开,因为这几个比较器在输入没有连接的时候输出是不确定的。图7-15展示了它们的端接方法。将一个输入接到明确的高电平状态,而另一个接到明确的低电平状态。至于哪个接高电平哪个接低电平则完全没有影响。

说明: 00078.jpeg 

7-15

如何禁掉LM339中其他两个没有用的比较器

7.7.1 连接继电器与灯

将给继电器底下右边的引脚供6V直流电的电线断掉。将这个引脚连接到灯的电源上,然后再连一根电线到继电器上右边的引脚。灯的另一侧连到了电源的另外一根线上。大家一定要小心,不要将灯的电源和其他元器件和电路上的导体接触上。图7-16展示了这个电路。

说明: 00079.jpeg 

7-16

在电路经过完整的测试之后,LED指示灯就可以从继电器那里去除了,然后可以将一盏灯如图所示的连上去

我前面说过,我强烈建议大家使用12V的灯。大家可以找到很多种12VLED灯,而且价格很便宜,另外12V的直流电源也很容易找到,因为笔记本用的就是12V,已经生产过的这种电源早就堆成山了。大家可以到eBay上搜索12V电源适配器。

如果大家的全年可用光感灯具控制器正常工作了,还需要决定一下安装在哪里。比较理想的位置是透过朝北的窗户看出去。这样光敏三极管不会被直射的阳光照到,也不会看到它控制的灯。

等到太阳落山的时候,调节左手的变阻器以设定光敏三极管的参考电压。调节变阻器直至灯亮起来,然后在往回稍微调一点点就可以了。

7.7.2 警告:交流电防护

如果大家执意要用家庭电源来给灯供电,请做好如下防护:

请制作一个永久性的焊接好的电路。千万不要将家庭电力直接接到面包板上。因为面包板上插错一个空总是很难免的。大家肯定不希望某个元器件忽然炸开来。另外连线也很容易会变松的。

任何暴露在外面的焊接点,如果上面走的是110V交流电或者更高的电压需要增加一些液体绝缘,其他的化合物也可以,只要凝固之后是绝缘体就可以。

电源的火线需要穿过一个1A的熔丝再接到继电器上。

电路必须要罩个壳子。如果壳子是金属的,这个壳子还得接地。

不要尝试去驱动超过60W的白炽灯,也不要用荧光灯。这些灯的启动电流比较大。这种冲击对我们的继电器是很不好的。

7.8 制作更多

这个电路的耗电相当少。拿掉LED灯之后,我的电路在非激活状态时耗电总共是11mA。继电器在开灯和关灯之间切换的时候需要用大约65mA的电流。但是这种高耗能的时刻每天也只有两次。因此我们的灯具控制器是可以用电池来供电的——但是这也只是暂时的。一个9V的电池大概能撑大约24h

我们需要用电源适配器来提供长期的电源。与此同时,如果大家住的地方经常会停电,还是需要在电路里面放一个9V的电池做紧急备份用。

7-17里面展示了如何制作这个电路。只要6V稳压芯片的输入能够有10V9V电池上面就不会有负载,因此就至少能用好几年(大家要用碱性电池,而不要用充电电池。充电电池里面电压没法维持太长时间)。如果电源适配器总是要往电池里面充电的话,这个电池也会吃不消,因此我们可以在中间放上一个二极管。如果电源适配器供电失败了,电池就开始工作了,而第二个二极管则是用来阻止电池向着电源适配器里面灌电流,避免电力浪费的。

如果大家买的电源适配器输出为12V,大家还可以用它来给12VLED灯或者卤素灯供电。大家需要在适配器的输出上增加一个100μF(至少)的电容,用以防止可能的不平滑的电压输出。

大家可以在面包板上增加一个3.3V的稳压芯片,这样就可以不用闹钟里面的电池了,如图7-17所示。这个3.3V的输出闹钟是可以用的,因为新的电池差不多就是这个电压了。稳压芯片会连接到电路图里面标着闹钟地和闹钟电源正极3V的线上。连接到闹钟的电线还在那里,但是现在不是往外输出电力,而是往里面输入电力了。

说明: 00080.jpeg 

7-17

对灯具开关的改进可以用电源适配器来供电,增加9V的备用电池,增加3.3V的稳压芯片来给闹钟供电,从而免除闹钟的电池

3.3V稳压芯片的输入可以从现在已有的6V直流电源取得。两个的电源地需要统一,但是必须注意不要将稳压芯片的输出连到6V总线上。

而且大家还需要再加上常用的 0.1μF 0.33μF的电容来保证稳压芯片的精准输出。大家可以参见图7-17,上面标注了细节。

7.9 下一步干什么

这是一个相对很基础的项目,现在到了可以真正接触自然的一些东西的时候了:驻极体的话筒价格不会超过1美元,再加上和比较器非常相似的运算放大器——尽管采用的反馈方式不一样,我们就可以做很多有意思的东西了。

项目8:声音的探险之旅

现在是去探索模拟设备中美妙世界的时候了。在模拟电路里面,电压是有可能为负的,当然也可以是正的。电压可能神秘而不可预测的波动,输出的电压可能是输入的百倍以上,甚至更多。

我们的探险之旅是从一个话筒和一个放大器开始的。由于模拟世界里面,各种元器件的行为易变,我们需要找到一些方法来了解电路里面到底发生了什么,这就要求我们深入了解各种测量方法(这也是我为什么在项目2中增加三极管的测试练习的原因)。

在掌握了相关的必备知识之后,在项目13和项目14中,我们最终会制作一个娱乐设备,通过制作一些噪声来抵消噪声。但是我得先警告各位,就像任何探索未知世界一样,这次的探索也要做好一次失败的准备,通往成功结论的道路没有那么容易达到。

8.1 放大

模拟世界的核心是一个元器件:运算放大器op-amp。这个英文是operational amplifIer运算放大器的简写。

运算放大器在比较器出现之前就存在了。事实上,比较器是从运算放大器发展过来的,但是我还是先给大家介绍了比较器,因为比较器的输出不是高就是低,介绍起来比较简单。

运算放大器和比较器的原理图图标是一样的,因为这两个元器件都是通过比较两个输入来工作。但是它们的目的是不一样的。比较器使用的是正反馈,通常用来剔除掉中间状态恼人的电压波动。而运算放大器则是要将输入上任何微小的波动都保留下来,为了实现这个目的,大家可以看到,运算放大器使用了负反馈。

8.1.0 驻极体介绍

话筒是一种展示放大器能力的很简单也很方便的元器件,因此我就从话筒切入我们的主题。驻极体话筒很便宜就能买到(通常低于1美元),而且对应的指标也足够好,用在几十种消费类电子产品中完全能胜任,比如手机,游戏耳麦通话等等。

为什么这种话筒叫做驻极体话筒呢?因为这种话筒里面有一片静电薄膜,它一直加着电,有点像磁铁。声波会改变这个薄膜和附近另一个元器件之间的电容,在话筒里面有一个很小的前置放大器,用来感应这些变化,从而产生一个输出。这种输出非常小,因此我们需要用运算放大器来将其放大一些。

有些驻极体话筒有三个端子,但是更常见的是两个端子的,我在这个项目中用的就是两个端子的。这些端子中总有一个是要连到电源地上的,但是粗略一看,大家是分辨不出来这几个端子有什么区别的。而且更糟的是,厂家的数据手册上估计也不会标明哪个端子是地。这个事情还没法解释(至少我没法解释),驻极体话筒的文挡和其他各种元器件的数据手册比起来讲的太概略了。

幸运的是,我们做点调查的工作就能找到地。大家从底面看驻极体话筒,会发现里面有一个透明的绝缘层。在这个绝缘层下面大家会看到有些金属的引线从圆柱的外壳上面伸出来。这就是电源负极或者是电源地的引脚。

大家看一看图8-1中的两个驻极体话筒的底面。其中的一个是有引脚连着的,另一个只有用来标贴的焊盘。不管是哪种,大家都能看到细小的绿色引线从右边的端子上伸出来,这个端子就是地端子。

说明: 00081.jpeg 

8-1

两种典型的驻极体话筒的底面。一个话筒有引脚,另一个用于标贴,只有焊点。地端子都在右边,透过透明的绝缘层都能看到上面都有金属引线

也有一些驻极体话筒的组装方式和图8-1里面的不一样,可能端子很大,也可能绝缘层不是绿色的。但是大家应该还能看到在绝缘层下面,某一个端子和话筒的外壳通过一些银色的或者金色的连线连着。

如果我们选的话筒没有引脚的话,就需要自己焊接了。大家可以用一些24号的线,但是上面要带上不同颜色的彩色绝缘层,提醒我们哪个引脚是哪个。图8-2所示就是我们需要的一个结果。

说明: 00082.jpeg 

8-2

这个驻极体话筒上面没有引脚,因此需要焊接上一些短的线来插到面包板上,如图所示。这些线需要有不同颜色的绝缘层

和所有的小的元器件一样,高热会对驻极体话筒造成伤害,如果你自己焊接了引脚的话,就得试一下这个元器件是否经受住了这次考验。所以我们来试试吧。

8.2 能听见我吗

在电路图里面,话筒可以用图8-3中任意的符号来表示。上面一行的图标可以表示通用的话筒,但是下面的一行的图标是专门表示驻极体话筒的。这个圆圈里面的部件看起来像一个电容,这就是代表驻极体话筒里面圆盘的。

说明: 00083.jpeg 

8-3

不同的电路图图标都可以用来代表话筒。所有的图标里面,都是想象声波从左边进入话筒,右上方的图标看起来很让人疑惑,因为这个图标如果翻转方向也可以用来代表耳塞或者耳机。底下的两个图标是特指驻极体话筒的,但是很多电路图里面用到驻极体话筒的时候还是使用通用的话筒图标

我用的就是左下方的图标,这个图标比右下方的图标用的稍微多一些。

在图8-4中,大家会看到话筒测试的最简单的电路图。大家会看到这个电路图和图4-2中间的三极管的测试电路图几乎一样。这是因为话筒和三极管里面都有着集成的三极管放大器,而且带了开路集电极输出。当大家看到本书最后的时候,就会看到当今几乎所有的传感器都有类似的输出。

说明: 00084.jpeg 

8-4

最简单的验证驻极体话筒功能的电路

大家注意,我在这里建议用的是9V的直流电源。用9V的电池就可以了。大家不需要去加稳压芯片和去耦电容。我在这里画的是4.7kΩ的电阻,但是大家可以用其他的1kΩ以上的电阻来替代。我们的话筒没写清楚的数据手册又立功了,里面没有写电阻用什么规格的,大家需要根据我的描述将电路搭起来,然后换换电阻找到和你的驻极体话筒最匹配的电阻。最匹配的意思是这个阻值从声音的音量和音质综合来看是最优的。

大家将驻极体话筒的方向装对了,然后把万用表设到交流电压挡测一下。没错是交流挡,不是直流挡!测到的直流电压是没有任何意义的。

如果大家的万用表不是自动量程的话,需要设到mV挡,而不是V挡。

这个时候当万用表表笔点上的那个读数稳定之后,大家会看到一个很小的电压值,可能只有0.1mV。现在对着话筒啊哈的喊一声,就会看到这个电压测量值跳到了1020mV。大家的驻极体话筒听到了这个声音,并且做出了反应。

由于话筒是相对比较敏感的元器件,弹话筒或者是吹话筒都不是很合适的。大家应该能用声波来测试,因为话筒设计的使用场合就是用这个刺激的。

8.3 背景知识:话筒杂记

第一个实际投入使用的且大规模生产的话筒是用在电话里面的。这是Thomas Edison1877年申请的专利,这个话筒里面用两个圆盘夹着碳粒。其中的一个盘子会随着声波而振动,每次振动都会将碳粒暂时地推得更靠近。这样内阻就降低了,从而改变了通过他们的直流电流。

碳粒话筒是非常原始的产品,只能对非常窄的音频信号起作用,但是非常便宜且容易制作,直到20世纪50年代末期还在部分电话中使用(在某些国家,这个时间还需要往后延长)。

电容式(condenser)话筒是一项创新,它能够在声波的作用下改变两个带电圆盘之间的电容。这种话筒的工作原理和驻极体话筒类似,但是需要一个一直加着的极化电压。Condenser实际上就是电容器的早期名称。

飘带式话筒,比如早期的Shure系列话筒,在20世纪50年代的摇滚艺术家中广泛使用(包括猫王和詹姆斯·布朗),这种话筒里面有一个金属的飘带,会随着声波而振动。这种设计后来被动圈话筒取代了,而动圈话筒的原理和扬声器或者耳机完全相反。一个隔板使得线圈在磁场中振动,从而感应出线圈电流。

话筒技术上最大的难点一直是找到一种机械设计,可以使得一个很宽范围内的声音频率的响应都相同。当20世纪60年代,贝尔项目室发明了驻极体话筒的时候,这种话筒的表现还因为可选的材料有限而有所不足。而到了20世纪90年代,材料学的发展极大地提升了这种话筒的性能,已经到了和老式的动圈话筒性能几乎相媲美了,而价格只是其中一个零头。

8.3.0 声音的高高低低

在图8-4中,驻极体话筒接收到外界信号后,会通过外置的电阻来过滤掉电流。我在前面也说过了,这是一个开路集电极输出的东西,和光敏三极管里面用的方式其实是非常相似的,但是除了上拉电阻更大,电源也不一样之外,还有一个更大的区别在于测话筒用的是交流挡而不是直流挡。

这是因为声波里面是往复的压力波,频率从20Hz15kHz不等(尽管有些人说可以听到20kHz以上的声波)。对比而言,光敏三极管能感应到光,但是光波的频率要高得多,可以认为是一种相对稳定的能源。这也是光敏三极管看起来产生了直流电压的原因。

声音的频率要低得多,由于声波会通过振动耳朵里的耳膜产生神经冲动,我们还得将这些振动保留下来,这样我们才能听得见。

8-5中图形上面的部分表示的是一个人正在发出尖锐的声音,并通过高压力的声波传输,这里的声波用白色表示。由于人的声带是通过来回的震动来发声的,因此这个相对高压的声波实际上在每次高压波动之后都会有相对低压的波,这在图里面是用黑色表示的。

说明: 00085.jpeg 

8-5

一个好的放大器的输出中电压的变化应该和声音输入的压力变化完全匹配

因为我在讨论的都是相对的压力。大家也许有疑问,到底相对的是什么呢?答案是,相对的是周围空气的压力,也就是我们周围的压力。这在图中是用灰色表示的。

图的下半部分描述的是理想的情况从声音输入获得的电子学输出。电压的变化精确地反应了声波的压力变化,在周围大气压对应的参考电平0V上下波动。这就意味着我们的运算放大器必须接受比参考电平更高或者更低的电压,而实际上,绝大多数的运算放大器都是承担这个工作的。

为了达到这个目的,他们通常要求用正负电源。一个常见的电源可以提供12V直流、0V-12V直流的输出。而在本书这一章的项目中,我们需要的是4.5V直流、0V-4.5V直流。这个要求比较让人郁闷,因为绝大多数的元器件是不需要分立电源的,而且我相信大家也不会为了满足一个运算放大器的要求而去买正负电源。还好,我们还是有办法来绕过这个问题完成我们的运算放大器项目的。

绕过这个问题的方法理论上很简单。因为高电压和低电压都是相对零电压来说的,就像高气压和低气压都是相对周边压力而言的。比如说我们不用得到绝对的4.5V0V-4.5V,我们可以用9V4.5V0V来代替。因为高电压,中电压和低电压之间的差是一样的,而电路中的元器件是看不到这两种情况之间的差别的。但是如果我们只有9V的电池,怎么得到4.5V的电压呢?图8-6给出了答案。这张图上面的部分是我们想要的结果,而中间的是我们如何用简单的分压电路来模拟这个结果,用两个等阻值的电阻就可以了。

不幸的是,这个情况没有简单的解决办法。如果大家在9V直流总线和分压器中点的4.5V直流中间加上一些元器件的话,元器件的电阻就和分压器左边一侧的电阻并联了。这个如图8-6下面部分所示。现在我们就不知道中间点的确切电压值了,因为这个元器件已经改变了电源正极和分压器中点的阻值,这样中间点的电压就会增加而超过4.5V了。

说明: 00086.jpeg 

8-6

最理想的情况下,运算放大器应该用正负电压电源,中间点是中性的,也就是图中上面部分上面画着地图标的那个。这个正负电源可以用一个分压电路来模拟,如图的中间部分所示。但是中间点的电压值会因为有电子元器件注入电流(或者吸取电流)而发声变化,如图的下面部分所示

我们来处理这个问题的最好的办法就是用一些相对低阻值的电阻,当有元器件连接到分压器中间点的时候,这种元器件的等效内阻也要选得尽可能高。这样还是或多或少影响到中间点的电压,但是影响会被减小到最小。

我会在这本书下个项目中再次谈到这个问题。

项目9:从mVV

在之前的项目中,我们确定驻极体话筒可以正常工作,现在我们需要用它来实现一些用途了。

9.1 增加电容

我们要做的第一步是安装一个耦合电容,如图9-1所示。如果大家还记得电容的基本知识,应该知道这个电容能将脉冲传递过去。事实上,根据这个电容大小不同,还会传输很多小的电压波动,比如交流音频信号中的电压波动。

说明: 00087.jpeg 

9-1

这个用万用表来做的简单测试展示了电容可以阻断直流电压信号而传输交流音频信号

先试试用V挡测量电源上下两侧的直流电压(相对电源地)。大家会发现电容上侧的测量点上,我们测到的是从电池过来的接近9V直流。在下侧的测量点上,我们能测到只有很小的电压,因为这个电容将直流电压阻断了(如果电容工作正常的话,我们应该测不到任何电压的)。

现在如果大家将万用表调到交流mV挡测量的话,然后在啊哈一声后做测试。在电容上下两端测到的读数就应该几乎一样了。这里的原理很简单但是很重要。

电容将9V直流从信号中去除了。

电容将交流信号从话筒中传了出去。

我们不希望我们的运算放大器去放大直流电压,但是它需要去放大话筒过来的交流信号。因此电容是我们需要的去连接话筒和放大器的合适元器件。

如果大家还在奇怪为什么电容的容值是0.68μF的话,解释这一点有点难度。较大容值的电容通常在这种场合下效果要好一些,但是较大的电容比起小电容来说要贵一些,而且小电容会滤除掉一些高频噪声,这也是电路需要的。大家可以试试不同容值的电容,然后不断地进行啊哈发声测试,看看测量值有什么不一样。

9.2 运算放大器介绍

现在是去将话筒信号放大的时候了。双极性的三极管用在这里不是很合适的,因为三极管是放大电流的,而不是放大电压的。我们需要的是一个电压放大器。大家在项目6中看到了比较器能放大电压,因为比较器的开路集电极输出用电源和自己用的供电电源可以不是同一个。运算放大器的用法类似,可以将从话筒过来的正负20mV的信号放大到了输出的正负3V左右。

我在这里会用LM741作为我们使用的运算放大器。这是最古老的运算放大器之一,而且现在还在大量生产和使用,原因就是这款放大器价格便宜而且容易获取到,性能还不错。这个芯片的引脚图如图9-2所示,大家会看到和LM339不一样的是,LM741里面只有一个运算放大器。我在前面说过,运算放大器的图标和比较器的图标是一样的,因为都是比较两个输入。如果大家在看电路图的时候不知道这个三角形的图标是表示运算放大器还是表示比较器,可以看看旁边的元器件型号和注解,应该就明白了。

说明: 00088.jpeg 

9-2

LM741运算放大器的主要引脚功能。引脚1和引脚5是用于校准的,但是不常用,引脚8在芯片内部没有连接

9.2.1 区别在哪里

下面我要做的事情如下:我会在运算放大器的负端输入上加4.5V的直流电压(标着负号的那个),而4.5V则是用分压电路来获得。这就是我要用的参考电压。我会用另一个分压电路产生另一个4.5V直流电压,并将其连接到正端输入(标着正号的那个)上,然后再把话筒过来的信号(通过耦合电容)加到正端输入引脚上。这样正端输入就会在4.5V电压附近波动了,如图9-3上半部分所示,而输入的信号则是绿色的波浪线,同时4.5V则是水平的一根黑线。

运算放大器将会把正端输入的信号与负端输入的参考电压之间的差值进行放大,理想情况下将会产生如图9-3下半部分的输出。

说明: 00089.jpeg 

9-3

运算放大器的基本原理就是将输入信号与参考电压(这个例子里面就是4.5V直流电压)之间的电压差值进行放大。这里的输入信号用绿色表示,输出用橘黄色表示,参考电压则是一条水平的黑线。绿色线表示变化已经放大到能看的地步了

为了让这套东西能工作起来,我需要在运算放大器的两个输入上连接上同样的参考电压,尽管其中一个一会还会加上话筒过来的交变电压。这就意味着我需要两套不同的电源来提供同一电压值。我可以用两个独立的分压电路,但是需要确定这两个分压电路出来的电压确实是相同的,每个分压器里面的两个电阻必须和另一个分压电路中的两个电阻精确匹配。

9-4展示了电路的模样。大家可以在之前做简单驻极体话筒测试的电路中增加原件来搭建。

说明: 00090.jpeg 

9-4

搭起来两组分压电路用来测试运算放大器。如果大家的电池不能提供准确的9V直流,A分压器电路的中点的电压可能不是严格的4.5V。而应该是实际电池电压的一半(这个电路是用来展示运算放大器工作原理的,实际应用不是这么使用的)

现在话筒还没有连接上。我会在下一步加上话筒。而首先我们需要解决电阻匹配的问题。

9.2.2 完美的匹配组

由于厂商的生产都有不完美的地方,电阻的阻值总会有些差异。如果误差是5%的话,那么标称100kΩ的电阻的实际阻值可能是95105kΩ之间。即使电阻的误差是1%,也还是会有一个99101kΩ的阻值范围。

要解决这个问题,我们需要用万用表找到电阻的完美匹配组。大家照着如下步骤来进行。

测量10100kΩ电阻的阻值,选两个阻值相同的,至少要我们的万用表看不出来阻值的差别。电阻到底是多大到并不重要,重要的是这两个电阻的阻值相等。我们在图A里面标称A组。

再选一组阻值相同的电阻,然后标称B组。为了防止混淆,可以按照如下的方法来进行,将各个电阻都放平,直到找到完美匹配的一对为止,如图9-5所示。

说明: 00091.jpeg 

9-5

找两对完美匹配的100kΩ电阻

注意每个A组的电阻和B组里面的电阻的阻值不需要相同。A组里面的两个电阻阻值一致就可以,B组内部电阻阻值也要求一样。

测量电阻阻值的时候,不要一边用手指拿着电阻一边拿表笔测量两个引脚之间的电阻。大家皮肤上的电阻的影响将使得我们的测量值发生错误。将每个电阻放在绝缘体上面,用干的塑料、纸张、纸壳板或者木头都可以,然后再用表笔按在引脚上。另一个方法是考虑搭一个电阻测试的小面包板,我在这本书的介绍部分有过描述,参见图S-16

大家是否还在担心需要每次在用运算放大器的时候都得花很长时间来完成这个挑选电阻的工作?不是这样的,绝对不是!选择匹配的电阻只有在这个测试电路中会用到,因为接下来在这里我会精确测试运算放大器的表现。另外,有两个分压电路可以比较容易地看到电路里面发生了什么。

9.2.3 测量输出

大家在搭建完图9-4所示的电路之后,可以测一下正端输入和负端输入的电压,参考电平是电源地。测量值应该是电池电压的一半(电池电压应该在9V直流附近)。如果电压有一些细微差别的话,也不用担心。如果差别比较大了(比如一个电压是4.7V,另一个电压是4.4V),那就是我们在选电阻对的时候没选好了。

现在可以将话筒接进电路完成整个电路了,如图9-6所示。

说明: 00092.jpeg 

9-6

完成电路,用驻极体话筒来测量运算放大器的性能

面包板电路的照片见图9-7

话筒的部分通过耦合电容和1kΩ的电阻连接到了运算放大器的正端输入上。运算放大器的输出通过另一个耦合电容输出,大家可以将万用表设到交流电压挡,选V挡来测量这个电压,千万不要用mV挡,因为现在电压已经被放大了。

说明: 00093.jpeg 

9-7

用来评价驻极体话筒信号放大输出的电路。电路下方红色和蓝色的连接线连接到万用表的表笔,万用表需用交流电压挡,选V挡。电路板的电源总线是用9V的电池来供电的(图中没有显示)

LM339比较器不一样,这个比较器里面有一个开路集电极输出,需要一个上拉电阻,而LM741的输出是直接输出一个较小的电流的,不需要上拉电阻。

如果大家把万用表连到运算放大器的输出引脚和A组电压比较器的中点上,大家就能测量到其偏离参考电压的量了。但是当运算放大器输出通过另一个耦合电容之后,信号的直流部分被阻断了,现在大家就可以以0V的电源地为参考测量信号了。

对着话筒再发出啊哈的声音,然后保持住,这样让万用表有时间反应并稳定下来。大家应该会发现话筒输进来的20mV的输入会产生超过2V的输出。这个运算放大器可以以超过100:1的比例来放大电压。这个比较被称为增益。

现在,我们如何来用这个放大了的输出呢?我们可以有很多种使用的方法,下一个项目里面会开始讲解。

项目10:从声音到光

大家现在可以做一个用噪声触发的LED灯。图10-1展示的是和以前相同的电路,但是加了5个元器件。对应照片见图10-2

说明: 00094.jpeg 

10-1

这个运算放大器测试电路会在驻极体话筒接收到中等强度的声音的时候点亮LED

说明: 00095.jpeg 

10-2

噪声触发LED灯的电路的面包板图(9V的电池没有显示)

10.0 LED灯和三极管的组合

LM741的输出穿过耦合电容之后,会到达1kΩ电阻和10kΩ电阻的中间点。从而运放产生的电压波动现在就是以地为参考电压的了。这个电压穿过1kΩ的电阻到达老黄牛2N2222三极管的基极。三极管则放大电流且通过LED灯。

当大家对着话筒讲话的时候,电路上面的LED灯就会同步的闪。不知道为什么我觉着这个场景很魔幻。也许我是一个很容易得到满足的人!如果大家对简单事物的好奇心和我不一样的话,请不要着急,我们刚迈开通往更复杂电路的长征的第一步。

如果电路的反应和我描述的不一致的话,有可能是如下的一些问题。

LED灯不亮

这个基本上肯定是接线接错了。不要着急,仔细地检查各个接线,然后在电路的每一级都用万用表去测量一下,记住直流挡交流挡都要测量。

LED灯一直亮着

这个情况不太可能发生,但是元器件各有差异,可能有些会造成想象不到的结果。我们用的2N2222三极管以及LED灯可能会轻微地影响到这个电路的行为。如果大家的LED灯也是一直亮着的,很可能是三极管基极的电压太高了,即使没有运算放大器过来的信号,也能确保有电流从集电极流到发射极。大家可以将基极的1kΩ电阻换成一个较大阻值的电阻,就能解决这个问题。

LED灯有节奏的闪烁

这种振动可能是运算放大器的电路出了问题。当LED灯亮着的时候,会吸取多一些的电流,这样会拉低9V电池的电压。这会影响到分压电路的电压。电压差偏低会导致LED灯变暗,这个时候又会从电池吸取较少的电流——如此循环。这在我们向话筒输入的噪声水平比较低的时候最容易发生。而用电源适配器给电路或者比电池更加稳定的直流电源供电的时候,是非常不容易发生的。

我们走下一步之前,还有一件要去尝试的事情。将LED灯拿掉,然后换成一个非常小的扬声器。将扬声器凑到耳边。现在你可以对着话筒说话,应该能听到一个淡淡的但是却非常嘈杂的恐怖版的自己的声音——尽管这个声音也有可能有我上面描述的振荡现象。

大家可能需要一个相对高阻抗的扬声器来完成这个测试。我用的是一个2英寸的63Ω扬声器。如果大家通过减小470Ω电阻来调大声音的话,可能会发现扬声器里面传来的声音变形会更厉害。为什么会听起来这么糟糕?为了解决这个问题,我们需要加入之前提到的负反馈。

项目11:需要负反馈

现在大家知道运算放大器可以放大电压了,我想解决如下两个问题:

1.我们怎么知道运算放大器放大了多少倍?

2.输出是怎么变成输入的精确倍数的,这样我们通过扬声器来听的时候,噪声不会太刺耳?

在这个项目里,我会指导大家一步一步来回答第一个问题。而在项目12中来处理第二个问题。

11.1 测量的麻烦

在理想世界里面,测量运算放大器的放大能力是很简单的。用信号发生器产生一个稳定的正弦波作为输入,再用一个示波器,将这个正弦波显示在屏幕上。然后在屏幕上对比正弦波的幅度和示波器的标尺,接下来再对照输出。要想计算出放大比例,只需要将输出的幅度除以输入的幅度就可以了。就是这么简单!

信号的幅度基本上说的就是这个信号有多大,尽管对于复杂的交流波来说,事情没有那么简单。可以是每个脉冲的最高电压、或者平均电压、或者均方根电压。如果大家对均方根电压有兴趣的话,可以自己去做功课。

不幸的是,很多人没有信号发生器,也没有示波器。想测运算放大器的指标,但是手头只有一个万用表怎么办?我觉得还是能搞定的,但是事情没有那么简单,因为仅仅拿万用表是没有办法对你朝着话筒喊声啊哈得到的信号进行精准的测量的。

解决这个问题的办法是暂时先不管交流量。如果我们把阻断直流信号的电容先去掉的话,运算放大器可以放大一个稳定的直流电压差,而我们可以用万用表来测量这个电压差。

到底能不能呢?这里又有另一个问题,只要你把万用表的表笔搭在运算放大器的一个输出上,电压都会有一点点变化,而这一点点输入上的变化会被放大为一个较大的变化混在信号中。我在项目2中说到过,测量过程会影响测量结果(参见项目2)。去发现电压值的过程本身会改变这个电压的。

幸运的是这个问题还是有解决办法的,我觉得解决问题的过程本身是很有趣也很有指导意义的。现在我们开始。

11.2 直流放大

虽然会冒一些风险导致使用不便,我这会儿还是要请你们将之前安装的一些元器件拆掉先放一边。要让大家搭建的新电路如图11-1所示。请一定注意原来的电路上该去除的原件都去掉了,不要搞混了。

说明: 00096.jpeg 

11-1

运算放大器性能测试基本电路

要注意现在我们在A路分压电路上用的是两个2.2kΩ的电阻。这是因为我们需要向分压电路中注入一点点电流,因此我希望A路的电阻阻值要低一些(在前面的项目中,我们用到的是100kΩ的电阻,那是因为运算放大器的输入阻抗非常高,而且两路分压电路上面都加了运算放大器)。

我们需要通过一个程序来找到两个严格匹配的2.2kΩ电阻,这个程序就是在前一个项目中找两个严格匹配的100kΩ电阻走过的过程。我向大家保证,这是最后一次这么干了,绝对没有下次了。

话筒和耦合电容都被拿掉了,因为我们在这个项目里面只对直流信号的放大感兴趣。但是没有了话筒,我们如何来做出运放两个输入之间的电压差呢?总得给运算放大器点东西让它放大吧。

答案是用一个5kΩ的变阻器。注意这个变阻器是放在B路分压电路的两个电阻之间。只要调节这个变阻器,就可以改变分压电路的平衡,从而改变正端输入的电压。当我们在来回调节变阻器的时候,大家可以想象有一个非常非常慢的话筒输入——慢到我们的万用表能捕捉到的程度。

在这个电路里面要将电阻的电阻腿剪到最短,防止感应到干扰的电磁场从而有噪声被运算放大器放大。所有的电阻都要妥当地插在面包板上。记住,运算放大器放大的不仅仅是大家输进去的信号,还放大上面的电子噪声。

电路搭建完毕之后,大家可以用万用表的红色表笔搭在运算放大器的输出上,而黑色的表笔则点在A路分压电路的电阻连接点上。注意这个时候万用表要回到直流电压挡。

11.2.1 放大的输入与输出

大家现在测量的是运算放大器的输出和4.5V直流电源之间的电压差。因此如果从运算放大器过来的信号相对很低的话,我们测到的就是一个相对为负的电压值。还好几乎所有的数字万用表现在显示负电压和显示正电压一样没有什么问题,但是我们还是得关注一下万用表显示屏上的负号。

大家可以先折腾一下这个电路,用一用,慢慢改变变阻器的阻值,看看万用表上测得的电压有什么变化。我敢打赌当变阻器越过中间点的时候,电压读数会从负电压跳变到正电压。为什么会这样呢?

11-2中的上面的图形是按照我的电路的实际读数绘制出来的。万用表测得的输出电压的单位是V,但是我将其转换为mV了,这样输入图形的单位就和输出图形的单位一致了。

大家能发现,输出是从一个极端跳到了另一个极端。这是因为运算放大器的放大倍数非常大。当变阻器在阻值中间位置附近时,任何小的电压变化都会对结果产生巨大的影响。

如果大家将这个5kΩ的变阻器换成一个的变阻器(不见得能找到),我们就有可能将这个输出的上升曲线放平一些,但是输出曲线的形状和输入曲线的形状还是不可能匹配得很好,而且由于放大倍数很大,很多电子噪声也会一起被放大了。当然如果我们只是想看看LED灯亮起来的话,这些都没有什么影响,但是如果要用来重现音频信号的话就不太妥当了。我们需要的是让输出和输入是同样的形状——换句话说,应该是线性关系。

说明: 00097.jpeg 

11-2

下面的图形是计算得到的运算放大器正端输入的线性电压变化。上面的图形是运算放大器输出相对运算放大器电源中点的电压

要想达到这个效果需要用负反馈。正反馈可以让比较器的输出变得干净整洁,而负反馈则可以让运算放大器的输出规矩起来。

大家看一看图11-3里面的图形,里面的线性输入产生了几乎精确的线性输出。这就是我们要的效果,而且实现起来很简单。要想自己看到这个效果的话,可以对电路做如下的改动。

拿掉连接两个A路分压电路电阻和运算放大器负端输入之间的连线。

说明: 00098.jpeg 

11-3

绿色输入曲线的中间区域在输出曲线中被正确地重现了,这是负反馈的功劳

增加两个电阻FG,如图11-4所示。图11-5中的照片就是对应的面包板的照片。

电阻F是一个1MΩ的负反馈电阻,接在运算放大器的输出和负端输入之间。工作原理是这样的:

当我们在用比较器的时候,是将输出的一部分连接到了正端输入上,这样形成了正反馈。

现在我们用运算放大器,是将输出连接到了负端输入上,这样形成了负反馈。

电阻G是一个10kΩ的接地电阻。这个电阻并不是真的接到地上,而是接到A组分压电路电阻的中点上。这是因为运算放大器还在使用这个中点作为参考电压。

说明: 00099.jpeg 

11-4

之前的电路图引入负反馈之后改成的模样,只是增加了两个电阻

说明: 00100.jpeg 

11-5

之前用负反馈调节测量的电路图的面包板原型。红色和黑色的线连接到测量电压的万用表上

小心地改装完电路。现在大家在调变阻器的时候,就会发现万用表测得的输出电压非常平滑地在变化。不再是从一个极端跳到另一个极端了。在图11-3中,黄色的线有一些很小的偏差(这个复制的版本里面可能看不出来),但是我认为这些是测量过程引入的瑕疵。在面包板上,每个插孔都有一些小的电阻,就算是晃一晃元器件都会在某种程度上或多或少地改变我们的测量值。

那么负反馈是如何工作的呢?

11.2.2 电子学的镇定剂

运算放大器可以放大一个非常大的倍数,高达100000:1,但是负反馈可以如下降低放大倍数:

如果正端输入的电压比负端输入的电压略微高一点,那么运算放大器的输出就会上升。

一部分输出的结果会反馈到负端输入上,这样正负端输入之间的电压差就会减小。

两个输入之间的电压差减小之后,运算放大器的输出的电压就会降低。

换句话说,当运算放大器有过激反应时,负反馈会让它平静下来。

如果正端输入的电压比负端输入的电压低会怎样呢?在这种情况下,输出就会变成一个负值——然后这个负值的一部分反馈到负端输入上,导致负端输入降低,还是这个结果,两个输入之间的的减压差会降低。

这里有一个额外的因素,接地电阻,在图11-4中用G来表示。这个电阻会将一部分负反馈引导到A分压电路的中点去。换句话说:

负反馈能控制运算放大器的输出,防止放大的得过多。

接地电阻控制负反馈的效果,防止反馈得的过多。

11.2.3 增益

增益这个词通常是与和放大比例一个意思的,因为词短,比较容易上口。

我们可以从数学上证明放大器的增益可以用一个特别简单的公式得到,下面的公式中F表示F电阻的阻值,G表示G电阻的阻值。

增益=1+F/G

我在这里讲得更加清楚一些,大家看一看图11-6,图中我把相关的反馈电路的各个部分都画出来了。大家可以看到F电阻和G电阻其实就是另一组分压电路。

说明: 00101.jpeg 

11-6

运算放大器测试电路的一部分重新画了一下,目的是为了明确控制负反馈中两个电阻的功能

在图11-6中的上半部分,我显示了大家可能得到的真实电压。在图的下半部分,我展示的是这些电压的一个相对值,目的是为了在下面的计算过程中能方便一些。如果运算放大器的输出是6.5V,而电阻G的另一端的电压是4.5V,那么相对来说,这就和输出为2V而电阻G的另一端为0V是一样的。

大家还记得如何计算分压电路中点的电压计算公式吗?大家可以翻回到第2关于电压这一节就能找到,当然我这里用的是电阻FG,而不是电阻R1R2。如果用VM来表示中间点的电压:

VM=V×[G/(F+G)]

我这里用V来表示运算放大器的输出电压,也就是这两个电阻左端的电压。我们不能将这个电压称为VCC(我上一个公式中用的是VCC),因为我们一般用VCC来代表完整的电源电压。这里的V只是代表分压电路左端相对右端的电压。

如果我把图11-6中实际的电阻值(以为单位)代入的话,我们得到如下结果:

VM=2×[10/(1000+10)]

这个结果在0.02V左右。

但是现在假设我把反馈电阻从1MΩ变成100kΩ,那么公式就变成这样了:

VM=2×[10/(100+10)]

这个结果在0.2V左右。

也就是说,当我降低反馈电阻的阻值的时候(接地电阻还是保持不变),负反馈增强了10倍,而放大器的增益下降了同样的比例。

现在想象一下我们不去减小负反馈电阻F的阻值,而是增加这个阻值。事实上我们可以将其想象为无限大的一个阻值。在那种情况下,负反馈电压就变成接近0。这就是负反馈网络完全没有应用的场景,输出和输入之间什么也没有接。这也是为什么运算放大器变得这么极端的原因:没有任何负反馈。

基本规则如下:

当负反馈电阻相对接地电阻在阻值上减小的话,负反馈就会增强,而运算放大器的增益将会减弱。

当负反馈电阻相对接地电阻在阻值上增加的话,负反馈就会减弱,而运算放大器的增益将会增强。

11.3 背景知识:负反馈的起源

负反馈听起来是个很简单的想法,但是当负反馈在20世纪30年代被发明的时候还是相当超越时代的。事实上,最开始的时候专利事务所都不愿意发布这个专利,因为这个专利看起来没有什么用处。放大器就是用来放大的,那为什么要用一套系统来降低它的放大效果呢?事实上,大家可以看到,降低放大效果还是很有必要的。这是一套控制输出,将其强制与输入形状匹配的简单办法。

负反馈的概念推出的时候,还没有真正的运算放大器面世。事实上,运算放大器的名字是1947年才有的,当时是在模拟计算机中用来进行数学运算(这也是命名为运算放大器的原因)。

由于用到了真空管,运算放大器内部又有很多元器件,因此占据了大量的体积而且产生了很多的热量。直到20世纪60年代,集成电路的大发展将运算放大器做了大量改进,将价格降了下来,才让它们变得实际可用。

11.3.0 通往极限

我们往回看一下图11-3,其中橘黄色的线在两头变成平直的了这好像是在说这个时候的表现就不是线性的了,是的,确实是这样,而且理由很充分。运算放大器的输出电压是不可能超过输入电源的正负电压差的。事实上,输出电压的最大最小值是比电源正负极电压差稍小一点点的,因为运算放大器也用掉一点点电压来完成自己的功能。因此,当你增大输出超过某一个阈值的时候,就得不到更高的电压了。这种现象在音频信号中出现的时候,大家就会听到杂声。

11-7中下面的图形展示的是绿色的输入信号和橘黄色的输出信号,都做了加粗处理。橘黄色箭头的高度除以绿色箭头的高度就是我们得到的增益。这一个运算放大器上施加了比较多的负反馈,因此增益大约只有6:1。如果我们减弱负反馈,会发生什么呢?现在输入信号受到的控制没有那么强了,因此输出就会变大一些。运算放大器努力地要将信号放大,但是输出电压到达最高电压了,而信号还没有到达极值。因此这个顶就被削平了。

在这种情况下,运算放大器开始有点像饱和的三极管了。还能放大信号里面较弱的部分,但是当信号到达极值的时候,就放大不了了。我们说这个时候运算放大器过载了,而结果叫做削波,因为信号的顶部被削平了(我在Make:Electronics中也简单地提到了这个)。如果这个信号是音频信号的话,就会得到一个嘈杂而拖沓的声音,就像电吉他的垃圾音效果一样。而且事实上,这个垃圾音就是用过载放大器做出来的。

说明: 00102.jpeg 

11-7

在上面的图形中,输入(绿色的线)产生了一个放大的输出(黄色的线),刚刚达到放大器的极限放大值。在下面的图形里面,输入的幅度增加了,但是由于输出不可能超过电源电压允许的极限,运算放大器的输出的顶部被削平了。虚线展示的是如果有足够的电压来供放大的话,放大后的曲线

11.4 没有耕耘就没有收获

现在我要回到运算放大器的增益测量的主题上来。请大家记住:

增益指的是输出电压与输入电压的比值。

11-8中展示了我测量的一些输入电压和输出电压,用的是图11-4中的电路图,并调节变阻器到不同位置。这些数字也是我画图11-3中的图形的来源。然后我用这些图来计算我的运算放大器的增益。

大家可以在自己的运算放大器上做相同的事情。我会一步一步的带领大家来做。总共有四个阶段。

第一阶段

大家通过测量建立图11-8的表中的前两列的数据。

说明: 00103.jpeg 

11-8

这些测量值被用来画了前面的图形,以展示带负反馈的运算放大器的性能

第二阶段

大家来计算你们对应的表的第三列。实际上在不干扰这个微小的输入电压情况下是测不到这个电压的值的,因此我们用计算的方法来替代。我们需要用的只是很简单的算术运算。

第三阶段

用大家对应的表里面的数据,来画两条曲线,就像我画的那两条一样。

第四阶段

大家比较图形的曲线就能得到运算放大器的增益值。

整个过程耗时大约在十五分钟。准备好了吗?我们来一起看看大家的运算放大器的能力如何。

11.4.1 第一阶段:输出电压

用万用表表笔来触碰运算放大器的输出侧是不会对输出结果有很大干扰的。因此,大家可以直接测量输出电平。但是要记住,大家要算出来每次电压输出对应的变阻器的阻值变化。下面是具体步骤:

第一步

将变阻器从电路中拿出来,然后测量一下变阻器的引脚(中间的那个引脚)和连接右手100kΩ B 路电阻的引脚之间的电阻(参见图 11-4)。调节变阻器,直到我们的测量值为1.5kΩ1500Ω)。

在测量的时候,不要去碰引脚的金属端。如果大家用一些带鳄鱼夹的连接线的话其实很简单。用连接线一头的鳄鱼夹夹住万用表的表笔,而连接线另一头的鳄鱼夹则夹住变阻器的引脚。

第二步

记下刚测到的变阻器的阻值。

第三步

将变阻器放回到面包板上,将其按照和之前相同的方法放置。

第四步

将万用表归到直流电压挡来测量运算放大器的输出,用V挡,并将万用表表笔如图11-4所示进行放置。一定将红色的表笔和黑色的表笔如图11-4所示的位置放置,注意观察在数字前面有没有一个负号。

第五步

将输出的电压值记录下来,但是要乘以1000,用mV做单位而不用V做单位——也就是将小数点向右移动3位。后面要将输出电压和输入电压进行比较,因此需要单位是一样的。比如说,如果大家测到的是-3.5V,就要写成-3500mV。第六步

将变阻器拿出来,一边测量右半部分的阻值一边调节变阻器,直到阻值增加了250Ω。然后我们回到上面第二步,再重新开始。

每次我们改变变阻器阻值的时候,要增加精确的250Ω。然后再去测量,直到电阻值为3750Ω3.75kΩ)。要确保你们的变阻器阻值范围在1.53.75kΩ,这样就能将你们的数据表格和我的数据表格直接对比了。

11.4.2 第二阶段:输入电压

大家可以通过电阻和电源电压来计算输入电压。如果我能用项目室的工作台上拿万用表给大家演示一下,也许就能变得非常简单。但是我做不到,因此次优的方案就是给大家展示我画在图11-9中的电路图。这就是图11-4中,包含了B路分压电路的部分电路图。

说明: 00104.jpeg 

11-9

运算放大器正端输入的电压是可以计算出来的,只要大家知道上面所示的对应阻值。

我们现在想要知道的是VM即中点的电压。这个和施加到运算放大器正端输入上的电压是一样的。我们通过电路图中的VCCR1R2三个值来得出这个电压。因为R1R2组成了一个分压电路,注意R1的阻值是左手的电阻阻值加上变压器左手部分的阻值,而R2的阻值是右手的电阻阻值加上变压器右手部分的阻值。

过程如下:

第一步

测量VCC。大家将万用表调到电压挡,然后测量电源在正极总线和负极总线之间的电压。如果大家的9V电池还比较新的话,会得到一个至少为9.2V的电压值。不管怎么样,要记下来。我将这个值称为VCC,是因为VCC常被用作电源供电电压的缩写。

第二步

我将左手的电阻的阻值标记为RL,而将右手的电阻的阻值标记为RR。这两个阻值应该是一样的,因为我们在安装电路的时候特别挑选了。但是为了确保这件事情,可以单独地将电阻拿出来再现场测量一下。注意这些阻值的单位都是Ω(而不是)。阻值应该在100000附近略有差异。然后将电阻放回到电路中。

第三步

将变阻器从电路中拆除,然后测量一下在两边的引脚之间的总电阻,暂时忽略中间的引脚,单位是Ω。记住在测量的时候手不要触碰引脚,也不要碰万用表的表笔。

我的5kΩ变阻器的总电阻测量出来是5220Ω(我的万用表显示的结果)。大家的结果可能会稍微高一些,也可能稍微低一些。这些值无关大局,只要知道确切结果是什么就可以了。我将这个值标记为RT(变阻器电阻)。

第四步

为了得到R2,我们需要将RR(右手100kΩ电阻的实际阻值)和变阻器中间引脚和右边引脚之间的电阻阻值相加。这个阻值在前面项目中是不断变化的,因为大家不断地调节了变阻器的位置。但是最开始的时候,大家用的都是1.5kΩ,或者说1500Ω,那么我们就从这个点开始,这个时候:

R2=RR+1500

第五步

为了得到变阻器左手部分的阻值,我们来用RT减掉右手部分的阻值。在图11-9所示中,右手部分的电阻阻值为1500Ω,因此:

R1=RL+RT-1500

第六步

现在我们可以使用计算分压电路中点电压的老公式了。

VM=VCC×[R2/(R1+R2)]

这些变量现在的意义和以前稍有些不一样,因为我现在用的是B路分压电路,而VM是运算放大器的正端输入。大家记住,VCC是电源供电电压,就是在第一步中测到的。大家在第四步中得到了R2的值,在第五步中得到了R1的值。于是,大家将这些值代入到公式中。我是没有办法替大家计算了,因为我是不知道大家手里的100kΩ的电阻的具体阻值,也不知道大家的5kΩ变阻器的具体阻值的。但是你们自己已经测量过了,应该是知道的。

第七步

VM是当变阻器调到1.5kΩ的时候,正端输入上的电压。但是等一下,运算放大器放大的可不是这个电压,它放大的是这个电压与参考电压之间的电压差。那么参考电压(A路分压电路的中点)是多少呢?按理说应该正好是电源电压的一半。因此为了得到运算放大器正负输入的电压差(我将其称为VI),我们的公式就是这样的:

VI=VCC/2-VM

只要将VCC除以2,再减去VM,就得到了两个输入之间的差。这个差值规范的名字叫作电压差,而且应该是一个负值,因此记得带上一个负号。将这个值记在大家的数据表格第一行的第三列里面。在我的表格里面,我记录的值是-47.3mV。大家测的是不是也是类似?

这些计算看起来都有些无聊——但是,大家只用再做一次了。因为在第一阶段里面测量的时候每次调整变阻器都是步进250Ω,因此也就基本上确定输入电压也是每次按照同样相等的步进增加的。换句话说,输入电压一定是按照一条直线来增加的。因此,大家只要计算一下最低和最高的两个输入电压,然后只要在中间画一条直线就可以了。

因此我们现在回到第四步,重新计算R2的阻值,如下所示:

R2=RR+3750

同时在第五步里面,如下所示计算R1的新阻值:

R1=RL+RT-3750

现在用这两个新的阻值代入到第六步中,找到第七步中的VI的新值,然后记录在表格中最后一行的第三列中。

11.4.3 第三阶段:画图

我在项目2中曾经让大家将三极管的β值画出来,因此大家到这里的时候已经有过一些实践经验了。请记住,大家可以在网上搜索一下打印画图纸就可以不花钱用画图纸了。

在横轴上用来做刻度,纵轴用1000mV来做刻度,然后画出我在图11-3上半部分的图形。大家用的值应该是自己的数据表里面的第二列。

现在大家可以画我在图11-3下半部分里面的图了,用的数据是表里面的第三列。

11.4.4 第四阶段:增益

你们需要比较两张图的斜率。这只有在图上的线是完全直的情况下才有意义,大家应该还记得在图11-3里面的输出图形的两头都是弯曲的。但是有一点很重要:要选择输入图形里面同样范围的电阻值。

我从我的图里面选取的那部分如图11-10所示。你会发现在这一段里面,电阻的范围是2.253.25kΩ。大家可以用一个不同的电阻范围,只要输出图和输入图用的是同一段就可以了。

说明: 00105.jpeg 

11-10

输入电压和输出电压的变化图,文字部分有更多的细节描述

直线的斜率(我用S表示)可以用纵轴的增量(V)除以横轴的增量(H)得到。

S=V/H

这样,大家就可以计算输出图形的斜率了(我们用S1来表示),然后除以输入图形的斜率(S2),这样就得到了运算放大器的增益。

增益=S1/S2

如果大家计算出了两条线的斜率,然后相除,就得到了结果。但是因为两个情形下横轴的增加都是相同的,在除的过程中会被抵消掉,因此这个公式有一个看起来更加简单的版本。用V1代替输出图形中纵轴的增量,用V2代表输入图形中纵轴的增量,那么:

增益=V1/V2

只要V1V2是同样单位的测量结果,这公式就没错了。(大家还记得我让你们用mV为单位记录所有的测量值吧?)

在图11-10中,我的V1的变化范围是-11402800。但是要记住,这第一个值的意思是中点电压以下1140mV,而第二个值的意思是中点电压以上2800mV。因此总的电压变化增量为2800+1140,是3940mV

同样的道理,V2的变化范围是-14.329.7,总共是14.3+29.7,是44.0mV

现在,我最后能算出来增益了!

增益=3940/40

这个结果大概是89.6。我将这个值四舍五入为90,因为我的测量过程没有办法保证小数点后面一位还能是精确的。大家的计算得到的结果是多少呢?而且另外一个问题是——大家觉得对吗?

11.4.5 结果对吗

经过这么一长串的算术运算之后,我总是在想有没有犯什么错误。我可以将这个结果和我所知的增益理论值来进行比对。我说过,如果说F是负反馈电阻的阻值,而G是接地电阻的阻值,(在图11-4中有标示),那么:

增益=1+G/F

由于G的阻值是1MΩ1000000Ω),而F电阻的阻值是10kΩ10000Ω),因此理论上正确的增益值是101:1

我觉得90:1已经相当接近了,因为我们用的方法都比较原始粗犷。

太遗憾了,大家没有我在一开头提到的信号发生器,也没有示波器。但是即使大家有这些设备,而且能在一个比较完备的电子学项目室里面工作,还是需要测这些值,做一些简单的数学工作,也要做预备工作,尽量增加精确度。这些过程在科学和项目上是无法避免的。这也是我在这里讲到这些过程的原因。

当然,把电路搭起来,看着他们开始能工作更加有趣。如果这是大家更喜欢的——那就上吧,我不介意!大家可以跳过这本书里面讲到的测量部分,直接搭建电路,然后上电吧。

但是问题在于,大家会不知道他们为什么能工作。大家也没有办法去测量他们的工作性能,也没有办法自己设计电路。如果大家想认真地学一学电子学的话,一些简单的计算和测量是有必要的,特别是在做模拟信号和放大这一部分的时候。

11.5 用正负电源消除误差

如果大家还在想这个项目里面,最大的误差在什么地方,从而导致了我们的测量值是90:1而不是101:1,我觉得应该是A路的分压电路。G电阻会向着A分压电路的中点灌注一些电流。这样就会稍微抬高一些分压电路中的电压,这样中点电压就不再是供电电压的一半了。我也不知道确切会增大多少,因为测量过程(还是这个道理)也会稍微改变这个值。

最简单消除这些误差的办法是用一个合适的正负电源。而且,如果大家注意看运算放大器电路的时候,很多情况下都默认大家有一个类似的电源的。

如图11-4中的电路的例子,这个画法在布局上是适合用面包板来实现的,也可以用图11-11上面的更正规的格式来画。B路分压电路我们还需要,用来给正端输入提供可变的电压输入,而A路分压电路就不需要了。在对应的地方大家能看到一个地的符号(图的下方中间的位置)。这个符号的意思是电路的这个点接着正负电源的中性地,这样就有了参考电压。

这有一些让人疑惑,因为在很多的电路里面,用的是正常的单输出电源(不是正负电源),地的负号都是表示电源负极。我想跟大家说的是通常情况下,地的符号表示这个地方的电势是0V

说明: 00106.jpeg 

11-11

之前的电路原理图的目的是为了方便地在面包板上布局,而且假设的是电源输入只有一个9V的电池。这里重新画的电路图用的是更加正规的格式,假设我们有正负电源。注意地的负号,表示那里的电势是0V

我给大家讲解运算放大器的理论就只到这里了。而实际上,我只讲了一点点皮毛,但是我们的这本书也只是一个非常初级的入门书。比如我没有花篇幅去解释为什么增益是1+F/G)。(大家可以到任何一本电子学书上面去查找,只要里面有运算放大器的章节就肯定会有。)如果你们跟着我一步一步走到现在,就已经有了一个很大的优势,你们已经亲眼目睹了运算放大器如何工作。我希望这个经历能让其他书里面的理论解释更容易理解。

11.6 基础知识

到了这个时候,我要讲一讲绝大部分书放在开头讲的内容了:给大家展示两个最常见最简单的运算放大器基本电路。我没有一开始就讲这些,原因在于我总是会先去做一些容易上手的项目。基本的运算放大器电路对大家来说其实没有什么用途,必须得了解更多的元器件并加进去才能完成对应的功能。

这两个基本的电路如图11-12和图11-13所示。在图11-12中,信号直接接到了正端输入上。这是我们到现在为止一直在用的配置。反馈电阻,我将其称为F,通常被称为R2。我将其称为F是因为在这本书里面已经用了R1R2了,再用R2会造成混乱。但是大家应该知道通常是如何来称呼反馈电阻和接地电阻的。

说明: 00107.jpeg 

11-12

运算放大器最简单的电路,在这个电路里面信号接在正端输入上

说明: 00108.jpeg 

11-13

运算放大器最简单的电路,在这个电路里面信号接在负端输入上

运算放大器的增益现在的公式如下:

增益=1+R2/R1

这个公式和我之前用的增益=1+F/G)是一样一样的。

在图11-13中,大家会找到另一种电路接法,之前我没有提过。信号会通过电阻R1接到负端输入上,然后再接到反馈电阻R2上。正端输入则是连接到中性的地上来提供参考电压。和之前电路一样,如果R2的阻值比R1高,那么反馈就会比较弱而放大效果比较强,但是输出是真正反过来了——因为信号是加在负端输入上的。在负端输入上施加高电压会得到一个低的输出,反过来也是。因此增益的计算公式上面要加一个负号:增益=-R2/R1

在以上的两个电路中,如果R2被省略掉了,负反馈电阻就是变成无限大了,从而增益也变成无限大了。这就是在上一个项目中用到的运算放大器模式了。在没有负反馈的时候,只要输入之间有一个非常小的变化,输出就会有很大的反应。

11.6.0 非正负电源的基础知识

在之前的基本电路中假设的是大家有正负电源的。有些书上会建议大家用两节9V电池来做正负电源。做法如图11-14所示。大家可以将一节电池的正极和另一节电池的负极连在一起,这个连接点就变成了理论上的中性地了。每节电池上剩下的端子就分别变成了电源的9V-9V了。

说明: 00109.jpeg 

11-14

两个9V电池可以用来做出正负电源,虽然这种接法会有一些弊端(参见文字描述)

这个方法听起来挺简单的,但是为什么我在一开始不建议这么做呢?这是有原因的:

1.我觉得用分压电路来做出中间电压是一个很有用的事情,大家应该学会。

2.我知道,大家可能倾向于用一个交流电源适配器,但是我觉得用两个电源适配器就有点浪费了。

3.电池相互之间是不一定能完全匹配的,因此0V的中点电压可能并不是0V

4.增加一个0V的参考电压,需要在面包板上增加一路总线,这样用面包板风格的电路图不太好画,而且容易引起混淆。

5.我不认为大家将两个电池这么用能有好的性能。电池的电压总是随着使用时间和负载电流的变化而变化。

不管怎么说,虽然需要正负电压,但是最后还是用了一些已知的替代方案,帮助了我们最后不用为了选择完美匹配的A组和B组电阻而争论。

11-15展示的是图11-12中没有用正负电源的实际电路图。里面所用元器件的相应大小都是适合音频信号的。里面两个68kΩ的电阻组成了一个分压电路,来提供参考电压,但是电路里面只有这么一个地方需要分压电路,而且电阻也不需要完美的匹配。输入电压可以是相对任何电平的,因为用了一个1μF的电容来把电路和输入的直流分量隔离开来了。同样,输出上面也有一个10μF的电容用来与后续元器件隔离。唯一的遗留问题是这个10kΩ的接地电阻,应该和中性的地相接,但是10kΩ的电容将其隔离开来了,因此就不需要中性地了。

说明: 00110.jpeg 

11-15

用于音频放大的运算放大器,使用单电源,信号接在正端输入上

由于用了一个100220kΩ阻值的反馈电阻,同时用了一个10kΩ的接地电阻,大家得到的增益在11:123:1之间。较小的放大值适合用在放大比较靠近话筒的人的讲话的声音,而较大的放大值则适合用在检测房间的背景噪声。

11-16展示的是一个做了类似妥协的电路,这次使用的是单电源来放大接在负端输入上的信号。大家可以将这个电路和图11-13中的理论电路相比较。

说明: 00111.jpeg 

11-16

用于音频放大的运算放大器,使用单电源,信号接在负端输入上

11.7 运算放大器知识回顾

现在是总结的时间了,大家可以到这个章节来重新整理一下关于一些不容易理解的概念。

运算放大器和比较器是类似的,都用了相同的原理图图标。两者都有一对输入,而且都是通过比较输入引脚上的电压来得到输出的。

两个输入中一个是正端输入,另一个是负端输入。

运算放大器和比较器都用了反馈来改变某一个输入,但是比较器用的是正反馈,用于得到确定的高电平或者低电平,而运算放大器则是用了负反馈,这样输出就和输入的波形相同了。

负反馈一定是加在负端输入上的。

正反馈可以让比较器忽略掉输入上的细微变化。这个特性叫做迟滞。而在运算放大器里面,是绝对不希望有迟滞的,因为运算放大器必须要放大(而不是忽略)输入上的任何细节。

运算放大器的基本应用是放大变化的信号,比如音频信号。而比较器则常用在直流输入上。

运算放大器的输入信号可以接到正端输入上,也可以接到负端输入上。运算放大器放大的是差值,不管是接在正端输入上还是负端输入上。但是,如果大家把信号接在负端输入上,得到的输出就是反过来的(这也是为什么这个输入被称为负端输入的原因)。

没有接输入信号的输入引脚上的电压需要加以控制,这是用来做参考电压的。

比较器的输出通常有上拉电阻,这样就可以和数字芯片接口。而运算放大器的输出则通常不能用来作为数字输入,因为这是一个模拟信号,包含了很多细微的变化的细节。

比较器通常需要一个上拉电阻来产生输出,而运算放大器则能自己产生输出。

现在,我已经走过一遍运算放大器所有的理论要点。是时候来点实际的东西了:制作一个真正可用的音频放大器。

项目12:实际可用的放大器

大家在项目10中看到,LM741新品是不适合用来驱动扬声器的,即使加上一个2N2222三极管也不适合。实际上,LM741是用来做基本前置放大器的,用于将某个非常小的输入信号的电压抬升,但是不会提供特别大的能量。前置放大器经常被简写为“preamp”

全功能的前置放大器在消费类电子里面常常用到,而且是作为独立元器件来使用,用于放大磁带的输入、话筒的输入或者唱片的输入。这种前置放大器会包括音量、重音和颤音的调节,然后将信号传递给功率放大器,这才是设计来驱动扬声器的。现在前置放大器和功率放大器常常组合在一个单元里面,比如典型的立体声接收机或者家庭娱乐系统里面都有。对我们来说,LM741就是一个前置放大器,我们现在需要一个功率放大器。

也可以选另一个基础芯片LM386,这个芯片和运算放大器一样有着双输入,但是设计是用来驱动小的扬声器的,可以提供300mW的功率。这个功率和现代音频系统的功率比起来好像太小儿科了,但是实际上300mW在很多的实际场合里面都足够用了。

12.0 LM386芯片介绍

LM386芯片的引脚图如图12-1所示。这与LM741类似,但是并不是完全相同的,因此在接电源和输出的时候要特别小心。

说明: 00112.jpeg 

12-1

LM386放大器芯片的内部图。引脚1和引脚8是预留用来连接外部电容的,有了这些电容,可以将芯片的增益从默认的20:1提升到200:1

图中引脚1、引脚7和引脚8没有连接。这些引脚可以和外部的元器件配合使用,这样就可以按照大家的意愿,将放大器的增益从20:1(默认的增益)提升到200:1。这种做法会有可能引入很多的失真,但是如果大家想试试的话,可以在引脚1和引脚8之间加入一个10μF的电容,并在引脚7和地之间加入一个0.1μF的电容。这种配置有个好处,可以防止LM386进入振荡,或者产生噪声,但是如果觉得200:1的放大比例还是太高了,可以在引脚1和引脚8之间给10μF的电容增加一个1kΩ或者更高阻值的串联电阻。

12.0.1 放大电路

如果看图12-2的电路图的话,会觉得里面有好几个地方看着很眼熟。大家在之前见过简单话筒的里面部分。放大器的输出会改变用两个68kΩ电阻搭起来的分压电路的中点电压值。变化的电压然后连接到了LM741的正端输入上。

说明: 00113.jpeg 

12-2

完整的带话筒和扬声器的音频放大器电路。其中LM741担任的是前置放大器,而LM386则是功率放大器

LM741引脚6的反馈经过100kΩ的反馈电阻输入到负端输入上,同时被10kΩ的接地电阻改变了。在电阻和电源负极总线之间的10μF电容则使得LM741的负端输入悬空,从而与电源电压无关,这样在这个输入上就不需要用分压电路了(如果这些名词看得不太明白,我建议大家返回去读一读项目11开始的相关技术资料,我假定大家都想知道这些名词的含义)。

LM741的输出经过一个10μF的耦合电容连接到一个10kΩ的变阻器上,这个变阻器被用来当作LM386的音量调节。这个变阻器的调节端连在LM386的引脚3上,即芯片的正端输入引脚。而引脚2这个负端输入则连接在电源地上。LM386能将两个输入之间的电压变化放大,这一点和LM741一样,区别只是LM386的输出足够驱动小的扬声器。注意看和扬声器串联的330μF电容和100Ω电阻。

这个电路给大家展示了增益和失真之间的平衡。如果用一个更小阻值的电阻代替100Ω电阻的话,大家的声音就会变得更大,但是失真更严重。可以用不同的阻值来替代这个电阻做项目,也可以用不同的扬声器来测试,还可以用变阻器来调节增益。

12-2中这个电路的面包板版本如图12-3所示。

说明: 00114.jpeg 

12-3

使用LM386的简单电路的面包板版本。图片底部黄色的线连接到扬声器,在图中未显示。这个电路可以用一个9V电池运行一段时间

12.0.2 调试放大器

这里有几种方法来调试放大器。

噪声

如果大家在给电路上电的时候听到嘶叫音、垃圾音或者有规律的振荡,可能是如下不同的原因造成的。

接线错误。如果大家用的是跳线,两头都有夹子的话,这些电线的缠绕肯定会引入噪声的。电路上用的电线必须长度合适,并在面包板上铺平。元器件应当越靠近越好。

回音。尝试将扬声器远离话筒放置。

按照我在前面描述的,将元器件LM386的引脚1、引脚7和引脚8连起来。将LM386的引脚7接一个0.1μF的电容在接到地上,同时在引脚1和引脚8之间接上电容并可以同时串联一个电阻,这样可以抑制噪声。

0.047μF的电容增加到0.1μF

如果大家用的是项目室电源,而不是电池的话,可能会通过扬声器引入一些嗡嗡的或者其他的杂声。这时可以在电路板的电源正极总线和电源负极总线之间加入能找到的最大电容。尽管我本人用的电源已经是相当好的了,我还是用了4700μF的电容,并成功去除了一些背景的嗡嗡声。

失真

由于这是一个很简单的电路,有一些失真是在所难免的。大家可以尝试按如下方法去做:

用一个3.3kΩ的电阻来替代与驻极体话筒串联的4.7kΩ电阻。

10kΩ的变阻器的调节端和LM386的引脚3输入之间插入一个10kΩ的串行电阻。

声音不够响亮

这个小电路是没可能产生特别大的音量的。但是有几个选择可以去尝试增大。

●LM741的这些电阻的组合在前置放大阶段产生的增益是1+100/10=11:1。大家可以用150kΩ的电阻来替代100kΩ的电阻,这样就能将增益增加到16:1。大家同时也可以减小10kΩ接地电阻的阻值。

可以将扬声器放在一个密闭的盒子或者罐子里面,这样听到的声音就能变大。我找了一个6英寸长直径2英寸的PVC水管,这个用来装2英寸的扬声器的效果很不错。

我将LM386的输出和一根底线连接到了电脑的扬声器(里面有一个自带的放大器)的输入插头上,效果不错。大家可以自己试试,但是风险自己承担!330μF的电容应该能保护扬声器,但是如果大家接错了话,结果就无法预测了。

项目13:不要大声讲话

这一系列的音频项目最终目的是一个设备,但是最开始的时候只是一个利用声音来开关某个东西的一个概念。我在项目10中展示了怎样去做,但是现在我还要拓展。这个项目其实是受模拟集成电路中某位先驱的一个故事启发而来的。

13.1 背景:Widlar的故事

20世纪60年代,一位传奇项目师名字叫作鲍勃·维德拉(Bob Widlar)在第一次半导体浪潮中对运算放大器的早期发展有非常大的贡献。他在早期硅谷的创业公司如仙童(Fairehild)等里面也是一位重要的人物,他被人记住倒不是因为他的创新型设计,而是因为他的那些坏习惯。他一生挚爱喝酒,同事们描述他总是说他偏执,不愿意与人交往,难以相处——尽管人们还是得和他相处,毕竟他是一位伟大的项目师。在那个年代,硅谷里面还是能包容这些不稳定而且不好相处的人们的,因为电子学当时还是一片处女地,而人力资源部门是几乎控制不了招聘流程的。

Widlar对于缺陷部件和出错的样品无法容忍,以至于他喜欢用一把大锤子来毁灭这些缺陷品。这后来被称为被维德拉了。他还无法容忍噪声,并在办公室安装了一个设备,当来客提高嗓门对着他大声说话的时候,就会发出一种穿透力特别强的哨声。一位仙童的项目师告诉我,这个设备在公司里面被称为哈斯勒

我在这里将这个设备称为噪声对抗装置,并将向大家展示如何自己制作一个。由于Widlar的名气在于设计运算放大器,那么我们这个项目围绕着运算放大器来做似乎也是恰如其分的。

13.2 一步一步来

我将一步一步地完整讲解一遍从设计到制作电路的过程,这样大家如果要自己设计电路就知道这个过程是什么样的了。

也许电路设计看起来是挺难的一件事情。比如——从哪里开始呢?但是只要一个电路可以分解成多个部分,而且这些部分之间可以可靠地相互通信,那样就可以一次测一个,而设计的过程也就不会太过于困难了。

当然,设计一个样品最初的尝试可能不能完全成功。但是那也是我们对样品的期望。

我们要做的第一步是要想清楚电路需要完成哪些功能,然后列出可能能完成这些功能的元器件来。对于这个噪声对抗装置,我的列表如下:

1.一个用来检测噪声的装置,并将其转化为电信号。这里用驻极体话筒很合适。

2.一个前置放大器来放大这个信号,用LM741运算放大器比较合适。

3.一个电流放大器,我们可以像以前一样使用2N2222三极管。

4.当电压或者电流超过可调节的一个阈值的时候,就需要触发某个东西,但是现在还不清楚要触发什么。

5.这个被触发的设备需要能制造出一个噪声来对抗。我将这个称为对抗输出。我可以用555定时器,使用振荡模式输出音频频率的输出。

13.2.1 感应

要完成这个,关键一步是上面的第四步。这个事情如何搞定呢?

那么,我们思考下555定时器在振荡模式下是如何工作的。当上电之后,就会自己立即启动,而当掉电之后就会停止振荡。但是这并不是全部都这样。定时器芯片还有一个复位引脚。当复位引脚收到一个高电平输入的时候,定时器就被使能。当复位引脚被拉低了,定时器芯片也会被停止工作。

也许我可以将运算放大器的输出用来驱动复位引脚。这个方案听起来可行。

当驻极体话筒没有感应到噪声的时候,运算放大器的输出为低电平,这样的一个低电平输入将防止定时器产生对抗输出。

当驻极体话筒听到有人在喊叫的时候,运算放大器的输出就会变成高电平,而高电平的输出将使得定时器的复位引脚使能,进而输出抗议输出。

唯一的问题在于运算放大器的输出是交流的。如果我让这个信号通过一个耦合电容,偏置到电源地上,这样输出就是相对地的一个变化量了,就像项目10一样?然后我可以增加一些平滑电容来去除信号中的纹波——至少可以去掉一部分。

如果大家读过Make:Electronics,就知道平滑电容通常是放在信号和地之间的,用来平滑掉一些波峰和波谷。得到的信号就应该比较干净,可以用来驱动定时器的复位引脚。

现在该去查阅一下555定时器的数据手册了。上面说当复位引脚的电平为1V或者更低的时候,就会停止定时器的工作。除此之外,就都允许定时器运行。

因此,如果我能将运算放大器的输出调整到有人喊叫的时候高于1V,而没有喊叫的时候低于1V,定时器就能按照我们的要求工作了。

13.2.2 电路真的会工作吗

在这个时候,我可以在类似SPICE的软件里面做一个模拟,来显示元器件之间的交互。但是由于我用的是多变的模拟信号,不能模拟,还得把元器件都搭起来,看看是否能够按照我期望的工作方式来运行。

噪声对抗装置电路的第一部分如图13-1所示。这和项目12中图12-2里面电路的上半部分很相似。主要的区别在于反馈电阻被换成了一个1MΩ的可调电阻,这样就可以来改变敏感度。在输出耦合电容下面和地之间还增加了一个10kΩ的电阻,用来偏置电容。

下一步是检查电路在实际中会发生什么。这个时候能有一个示波器会非常有用,但是既然大家可能都没有,我这里也就不用了。

将电路组装起来,然后将1MΩ的可调电阻调节到运放输出与正端输入之间的电阻为最大,这样就使得负反馈变得最小,而使得增益为最大。

现在做一次啊哈的测试,吹口哨也可以,同时检查电路中ABCD四点的电压,只用将万用表的黑色表笔点在电源地上,而红色的表笔点到箭头指引的对应地方就可以。大家测到的电压应该类似我在图13-2里面的列出来的(大家可能会奇怪表上为什么会列着E,而图13-1里面是没有E的。当这个电路图向下扩展的时候就会有E了)。

说明: 00115.jpeg 

13-1

搭建噪声对抗电路的第一步

说明: 00116.jpeg 

13-2

电路中各点的电压测量值,展示了一个非常小的交流信号是如何被放大并转换为可用直流输出的

如果大家的测量值和我的不完全一样,有可能是如下几个原因。大家发的啊哈的声音没有我发的响(也许大家发的声音比我还响)。话筒可能和我的话筒敏感度稍有不同,或者大家的万用表需要更长时间来稳定,又或者万用表测量交流的方法不一样。不管是哪种情况,这些小的偏差是无关紧要的。

最开始的时候,大家对这话筒喊叫的时候,话筒会在A点产生一个30mV的交流信号。这个信号在电容的另一端B点还是同样大,因为交流信号对电容是直通的。但是对应的直流电压则被分压电路的电阻重置为4.5V。继续往下,当话筒有噪声输入的时候。LM741直接输出在C点被放大到交流2.5VC点的直流分量仍然是4.5V,但是输出的耦合电容会阻断直流,因此在D点,我们只有交流有测量值,在有噪声输入的时候在0V2.5V之间变化。到目前为止一切还算正常。从0V2.5V的交流变化看起来还是很靠谱的。

现在要检查下电路图的下一个版本,参见图13-3。我在其中增加了一个三极管,用来提供更多的电力,还增加了一个100μF的电容。为什么用100μF呢?经验告诉我们这么大对于音频的频率范围差不多正好用。但是我会去试一下好不好用,如有必要会换掉的。

说明: 00117.jpeg 

13-3

制作噪声对抗装置的第二步

在图13-3的电路中,三极管使得E点的电流在闭合的状态下内阻很小。但是如果三极管为非导通状态的时候,等效的内阻相对于10kΩ的电阻来说就很高了,这个时候E点的电压就会变低。

这是一个发射极跟随电路,因为发射极的电压是和基极一样的(只是因为三极管而有一个略微的降低)。当然三极管还会放大电流。

如果大家将三极管和10kΩ的电阻互换位置,这个效果就是完全反过来的。这个电路如图13-4所示,里面的三极管可以根据配置将一个电压导通过去,也可以将其反向。

说明: 00118.jpeg 

13-4

通过在三极管的发射极或者集电极一侧插入一个电阻,就可以让输出电压随着基极的电流的变大而升高或者降低

我会深入讲解一些这个课题,因为这个技术在很多场合里面用到。

13.2.3 背景知识:电压转换

如果大家想自己查验一下这个部分,可以用一个三极管和两个电阻很简单地搭出来。

在图13-5中,大家可以见到我在2N2222三极管的集电极侧测量得到的实际读数。在每个电路图里面,基极的电阻都是1kΩ,而且都是先接到电源地,然后再接到电源的正极。当基极有输入时,三极管从关断模式(不导通)转变为闭合模式(导通)。三极管在不导通更多时候显示为灰色。

所有的数字都四舍五入到小数点后面一位,这样实际的最高输出在9V电源供应下应该是比9V直流稍微低一点点。

当大家这样在三极管的集电极上插入电阻的时候,得到的结果是和输入相反的。

说明: 00119.jpeg 

13-5

在三极管配置为从集电极侧传递输出的时候,测到的实际结果。所有的数字都四舍五入到小数点后面一位

但是要记住:

实际的效果取决于电路中连接到输出的设备。这里的数值都是用万用表测量得到的,而万用表有着非常高的阻抗。如果大家用不同的设备,这些数值可能会发生变化。而从另一方面讲,很多设备,包括运算放大器、比较器和很多的数字芯片也有着非常高的输入阻抗。

这些数值是三极管处于饱和模式下测得的。如果流经三极管的电流比较低的话,输出也会不一样。

在处理三极管的时候一定要注意不能施加超过极限的数值。当三极管在导通状态时,大家不能通过它来灌注过多的电流。需要查一下数据手册确保这一点!

现在我们转到图13-6。这里我将10kΩ电阻和三极管的位置调换了一下,并将电阻放到了发射极一侧。在这种发射极跟随模式下,三极管不会再将电压反向。电压会跟随着输入的极性,但是输出电压的变化范围没有那么广了。当然,这些测量值也是被四舍五入到小数点后面一位。

大家还可以在每种情况下都通过在三极管的另一侧增加电阻来调节电压。这些电阻将组成另一个分压电路(大家肯定能猜到)。

说明: 00120.jpeg 

13-6

在三极管配置为从发射极侧输出的时候,测到的实际结果

很自然地,在每一种情况下,三极管均会表现为一个电流放大器。

13.2.4 噪声对抗

噪声对抗装置的完整的电路见图13-7,而对应的面包板版本的照片见图13-8

为了防止大家还没有完全掌握这些基本概念,我在图13-9里面画了一个流程图来示意这个设备的逻辑。

大家应该接着把自己的电路做完,看看是否能正常工作。当然,需要尽量避免使用两头都有夹子的跳线。那种跳线会缠绕形成各种环,并且有相互的电磁干扰,从总体上会引入噪声并可能导致错误发生。运算放大器的电路里面应该尽量用短的线,而且各个元器件应当靠得越近越好。

先检查一下运算放大器的输入和输出电压,并将这些电压和图13-2中的表格里面的数据进行对比。如果值都差不多,那么下一步就是去确认555定时器的连线是否有问题。把引脚4的线拔掉,就应该能听到扬声器里面传来一个非常烦人的高音哨声。这就是555定时器的输出。如果大家什么都听不到,就需要一步一步去检查接线,看看是否有错。然后才能继续。

说明: 00121.jpeg 

13-7

噪声对抗装置完整的基本电路

现在当大家把引脚4的线重新插回去,这种哨音应该就会停止了,虽说可能时间上稍有延迟,因为毕竟有一个100μF的电容在放电。调节1MΩ的可调电阻,让反馈电阻为最大值,然后对着话筒大声说话。这时可能还有一点延迟,毕竟100μF的电容这会儿在充电,但是然后定时器就应该开始发出哨音了,一直到你停止大声说话为止。

说明: 00122.jpeg 

13-8

这个噪声对抗装置电路的面包板版本是设计使用9V电池的。照片底部黄色的线是连接到扬声器上的(扬声器未在图中显示)

说明: 00123.jpeg 

13-9

本图画出了这个噪声对抗电路的各个部分之间是如何跟其他部分交互的

这就是电路的预期工作方式。事实上,我的电路工作正常——但是也只是在有一个好的项目室电源的情况下才能正常工作。当我换上9V电池的时候,电路的表现很奇怪。

这非常令人失望,但是就像我在刚开始的时候说过的,样品的第一个版本不一定能正常工作。

因此我需要找出来问题的原因是什么。我用我的万用表去测量,结果很明显:只要E点不和万用表之外的器件连接的话,E点的电压范围就是正常的,但是一旦我将这个点输入给555定时器的复位引脚,一切就都不一样了。

555定时器的数据手册没有告诉我所有的事情。我之前假定复位引脚有着很高的输入阻抗,和逻辑芯片的输入一样,但是,很显然,事实不是如此。另外,我觉得100μF的平滑电容也还不够大。这个电容还是会漏掉电流中的纹波和尖峰,而这些纹波和尖峰则足够抬升定时器复位引脚的电压。这样即使话筒只听到了非常小的声音,定时器也会持续发出噪声来。

不管是哪种情况,三极管的输出都变得和定时器无法匹配。怎么办呢?在这种情况下,有两种选择。

做各种调整,尝试去让电路工作起来。

试试完全不同的解决方案。

第一种选择看起来总是要比从头重新搭建电路要快一些。当然,大多数情况下其实并不快,但是我还是试了试。我将复位引脚的电压通过增加了又一路的分压电路来进行调整。用的是电路上标着FG的电阻。为了确定这两个电阻的阻值,我没有用任何的计算,而是通过项目的方法试了各种阻值的电阻。

这些操作起到了一定的作用,但是我对电路的表现还是不满意,因为不够可靠。我能听到扬声器里面传来时钟走动的声音,有时候能听到快速的哔哔声。我也听到过哨声的嘈杂版本,这意味着从三极管过来的信号被纹波调制了。我尝试过用330μF的电容来提到100μF的电容,但是只能产生振荡。我还尝试过47μF的电容,大家可以自行尝试这些电容,看看电路是表现得更好还是表现得更差了。

13.2.5 电源问题

电路没法工作总是很恼人的,但是我们一定要在寻找答案的过程中保持思路清晰。

我在这里假定大家使用了9V的电池给电路供电。将555定时器的引脚4再次断开,这样扬声器就开始播放闹人的声音。将万用表黑色的表笔点在面包板的电源地总线上,并将红色的表笔点在两个68kΩ电阻的中间点B上。记住,这是电路产生参考电压的地方,而运算放大器就是将话筒的输入和这个电压来比较,从而输出的。大家需要将万用表调在直流电压挡。

检查电压,现在将为555定时器提供电源正极的电线断开。当定时器没有电的时候,就会停止噪声。我敢打赌,这个时候大家会发现参考电压变了。原因在于尽管555定时器在鸣叫的时候不需要耗费太多的电流(大约20mA),但是这个耗电也足够拉低9V电池的电压了。这又接着会改变参考电压,进而影响运算放大器的输出,再进而降低E点的电压,从而关断定时器。但是当定时器停止鸣叫的时候,会消耗较少的电能,这样电池的电压又抬升了,定时器又开始鸣叫了——这就是大家看到振荡的原因。

即使大家没有看到这个问题,也有可能遇到(也许是电路中有嘈杂声,或者哔哔的声音响个不停),因为电池的电压随着正常的使用会逐渐降低的。

如下有几种可能的解决方案。我现在就告诉大家,这几种方案我都不满意——但是这些都是一些比较容易操作的方案。

1.用一个正规的电源,不使用电池。我的电路能比较可靠地工作,因为我用了一个稳压电源,用瑞霞的多电压电源适配器也能工作,只是有一点点的延迟。

2.用两个9V电池,一个用在电路的上半部分,另一个用在电路的下半部分。一个电源的正极用来给运算放大器供电,而另一个电源的正极则用来给定时器供电。但是要记住,两个电池的地要连在一起。

3.用一个电压高一些的电源(12V直流或者更高的),然后再用9V的稳压电源芯片来处理。这样就能补偿掉电源消耗带来的波动。

4.将扬声器的串联电阻增大。但是稍微等一下——这样做会降低扬声器的音量,但是我们的主旨则是要在某个人大声喊叫的时候发出响亮的噪声的。

大家知道,我们不应该在这个电路上纠缠不休,应尝试让其正常工作。我之前也说过,我们要的电路是需要极其可靠的。我发现我犯了个错误,不应该在这个电路上尝试让它工作,而应该尝试一些完全不同的东西。

13.2.6 失败了吗

这是不是意味着我的电路完全失败了呢?不是的,我不喜欢失败这个词,因为这意味着我们的东西完全没有价值。在现实生活中,任何的成功人士都曾尝试过不能奏效的策略。人们就是因为不放弃,吸取经验教训才会变得成功的。

如果有东西第一次就能特别完美的成功,我们能学到的东西就少了。如果我们遇到问题,这才是我们真正去学习的好时候。那么,在这里,大家学到了什么呢?

我们看到带放大功能的电路可能有不稳定现象。常常有不想要的反馈和振荡。

我们看到电源不是一个被动的电流源而已。电源是电路的一个主动部件,而电池有一些局限性,但是电源适配器没有电池的问题。

我们看到需要用不同的选择来验证电路的性能(比如用不同种的电源),不能说我的设备用着没问题,如果你的设备没法用,那就是你的问题了

我们看到如果电路的一个部分和另一部分只是刚好能匹配,那么这个电路还是不够好。

13.2.7 还有一个小事情

当我在改动电路的时候,还发生了一件我没有提到的事情。我恰巧将扬声器放得和话筒比较近。大家能想象一下接着发生了什么吗?当然是回音!当扬声器发出对抗的输出声的时候,话筒将这个声音捕捉到。话筒是没有智能的,它无法知道这是对抗输出还是某个人在喊叫的,于是电路接着被启动。噪声就不断地发出来而且停不下来。

这是一个概念上的问题,而不是硬件问题。设备的构想是随着某个人的喊叫发出更大的噪声,这在一开始就有缺陷。最后电路会对着自己喊叫的。

当我在写电路指标的时候,大家预见到了这一点吗?我没有预见到,因为我的视野有局限。这在某个新设备的设计阶段是很常见的事情。我过于关注结果(在这里是去随着某个人的喊叫来发出噪声),而忘记了其他的事情。

很多时候,我们知道样品做出来开始测试的时候才发现一些很显而易见的问题。然后大家感觉很尴尬,因为其他人会说:那是多么明显的事情啊!

这是另一个很宝贵的学习过程。不管你是多么有经验,都有可能无法预见一些很显而易见的问题。举个例子,有个经典的样例是Steve Jobs在豆子里面装着最初的iPhone样机,装了几个星期,来测试使用。但是在产品发布前的两个月,他发现只用了这么短的时间,电话的塑料屏幕变花了,还有很多痕迹。额,他是应该预见到这个的。应该是很明显的事情吧?

也许是iPhone的设计师一开始都假定塑料只是唯一的选择,因为玻璃太容易碎裂了。但是当Jobs看到屏幕变花了,他就要将其换成玻璃的屏幕,尽管电话即将投入生产,而且他想要的那种特别薄而且特别坚固的玻璃还没有足够的供应。他就遇到了一个显而易见的问题,没有人真正思考过这个问题,但是他没有耸耸肩来接受这个情况,而是启动了一个巨大的重新设计过程来解决这个问题。

有了这种心态,我就不准备只是耸耸肩,然后说我们可以将对抗输出调低,这样装置就不会重新给自己来触发了,这样就好了。而我肯定会这样说:这个噪声抗议装置没能正常工作,因此让我们忘了它,继续往前走。我将要做的事情是大家在设计产品的时候遇到缺陷的时候应该做的事情。我要来解决这个问题。

项目14:一个成功的对抗

首先我要重新描述一下这个问题。如果用我上一个项目中的噪声对抗装置的想法,一旦某个人开始大声喊叫,这个对抗输出就会开始工作,而且停不下来。我怎么处理这个情况。

一个解决方案是在话筒输入上增加一个音频滤波器,这样噪声对抗装置就不会听到自己的噪声,但是还是能听到别人喊叫。这个是有可能的,但是我还是担心这样是否能够可靠地工作。

另一个解决方案很简单,限制对抗输出的时间,比如,只允许输出几秒。这样,就有一个间隙,在此期间对抗输出会被抑制。在这个间隙结束的时候,是没有对抗输出的,这样就不会重新触发电路,如果这个时候没有人喊叫,那装置的工作就会告一段落而保持安静。如果还有人继续喊叫的话,这个过程又会重复。

这要比原来的要求要复杂,但是这也是做完样品之后常常发生的事情。即使样品能良好地工作,如果我们发现它缺少某个我们想要的功能,我们也需要再做一个版本。我写的所有的书,包括我做过的所有的东西,在最初版本发布到用户那里之后,用户总是希望更多的内容,我也希望加入更多的内容。

14.1 时间安排决定一切

我如何在对抗输出上设定时间限制呢?当时是靠定时器了!这个时候就用单触发模式。然后我就能用这个脉冲来做一个间断了。那么,如果用两个定时器,当第一个定时器到了周期结束的时候来触发第二个定时器行不行呢?这个是可行的。在Make:Electronics中,我给大家展示了如何用一个定时器来触发第二个定时器。

最好为我的两个定时器来命名,这样可以区分开。我将这两个定时器称呼为噪声时长定时器和间隙时长定时器。

噪声时长定时器用运算放大器来触发。但是稍等一下——这里是我上一个版本中所有问题的起点,是的没错。但是555定时器的触发引脚和复位引脚的行为是有很大区别的。首先,如果供电电压是9V直流的话,触发引脚只需要一个低于3V直流的电压就可以使能,而复位引脚则要求一个低于1V直流的电压才可以。其次,如果定时器被触发之后,触发的电平还有波动,定时器是不理会的,而是会等到周期结束才会继续响应。

大家看,这就是仔细阅读数据手册了解细节的重要性了。不管怎样,我相信可以让触发引脚和LM741的输出引脚匹配好。

噪声时长定时器会为买来的噪声装置提供能量,比如说蜂鸣器——或许也可以是个防盗警报器,这个警报器真是能引起别人注意的。蜂鸣器的花费在几个美元,而警报器大约要花费10美元。这两个都可以用9V来供电。

说明: 00124.jpeg 

14-1

噪声对抗装置的正确版本的电路图,纠正了原来版本里面的缺陷

当噪声时长定时器到达周期结束的时候,输出会被拉低,从而关断外置的噪声装置。这个输出还会经过一个耦合电容来到间隙时长定时器,而这个输出电压突然的跌落会触发第二个定时器,现在间隙时长定时器开始它的周期了,必须要用某种方法阻止电路重新开始鸣叫。

也许我可以用间隙时长定时器的输出来拉低噪声时长定时器的复位引脚。为什么,我们又回到使用复位引脚的老路上来了?是的,但是间隙时长定时器的输出是一个直流信号,是没有纹波的,而且会比运算放大器经过三极管的输出要稳定得多。我相信这条路是能走通的。

在这个间隙结束的时候,间隙时长定时器将不再控制噪声时长定时器,这样,如果这个时候有人在喊叫的话,整个电路还是会重新工作起来的。

电路的最终版本如图14-1所示。我还更新了图13-9的流程图来解释我们的新逻辑。这个更改后的版本见图14-2。最终版本的噪声对抗装置如图14-3所示。

说明: 00125.jpeg 

14-2

流程图画出了最终版本的噪声对抗装置的逻辑

说明: 00126.jpeg 

14-3

最终版本的噪声对抗装置。大号的圆的物体是一个重型蜂鸣器。电路用9V的电池可以工作一段时间

14.1.1 更改总结

有一个重要的更改是我必须要做的:就是接地电阻,这个电阻用来调整LM741的负反馈,从10kΩ调整到了4.7kΩ。我在新的电路原理图上标了一个绿色的A。这个改变的原因在于增加运算放大器的放大能力从而使之更加敏感。如果电路变得过于敏感了,可以将1MΩ的可调电阻调小。

之前的2N2222三极管的走线有了变化,现在它的输出不再用来禁止555定时器,而是用低电平信号来触发噪声时长定时器。大家记住,这个电压只需要低于3V直流(供电电压的三分之一)就能触发了。大家用万用表测一下标着B的位置,并对着话筒喊一声,看看反应。

噪声时长定时器的输出接到了LED上面,这是为了做展示使用的。我在电路原理图里面给LED标了一个D,如果大家希望这个电路能实际投入使用,只需要将LED灯换成一个蜂鸣器就可以了。如果希望噪声更大些,可以用继电器来驱动一个更强有力的外置设备。用光耦是最好的,可以完全将设备和带有包括LM741的敏感电路完全隔离开。但是一个非常小的电磁继电器也是可以使用的。

当噪声时长定时器在工作的时候,输出是高电平,而在这个工作周期结束的时候,输出会被拉低。这个电压变化会穿过耦合电容,暂时地压制住10kΩ的上拉电阻而触发间隙时长定时器。这个定时器的输出会接到电路图下边的三极管,三极管将这个输出转变为低电平的输出,将噪声时长定时器的复位引脚拉低,从而禁止其工作。大家可以检查C点的电压,看看是不是在正确的范围内。间隙时长定时器的输出接的LED灯用来让大家看看到电路的工作状态;在最终电路里面这个灯是可以省略掉的。

当我们电路接线完成之后,可以上电。最初的电压抬升可能会激活一两个定时器。大家可以不用理会它。

为了检查定时器是否正常工作,可以将两个定时器的引脚2(触发引脚)暂时短接到地上。这种短接都会使得对应的LED灯亮起来。大家还可以用万用表来验证一下第一个定时器的触发引脚的输入电压。当你对着话筒大声喊叫的时候,会看到有电压跌落。

14.1.2 噪声测试

现在大家可以做一个啊哈测试,并尽可能地持续发声足够长时间。电路在最开始可能会有一个延迟,然后就能看到第一个LED灯亮起来并持续大约两秒。大家想象一下这个输出在启动外置噪声装置。然后这个LED灯会灭掉,而第二个LED灯会亮起来,通知间隙时长定时器去禁止噪声时长定时器。大家可以持续地喊着,但是噪声时长定时器被禁止做出反应,所以对应的LED灯是灭着的。这种情况一直等到间隙时长定时器完成整个周期才能结束。

如果大家将万用表的表笔搭在B点上,还是会观察到电压上有一些小的振荡,但是这已经无关紧要了,因为电路比之前有了更大的容错裕量了。

我的噪声对抗装置能够很好地工作,我也相信大家的版本也能够工作。但是我还是有一些关于电路工作方式的心得。

100μF的电解电容(在电路原理图中标记为F)是很有必要的,它用在给从运算放大器经由电阻过来的交流信号做平滑。但是这个电容需要1秒左右的时间来充电。当电容在充电的时候,噪声时长定时器是没有任何响应的。这意味着从某个人开始喊叫到对抗输出正式开始之间会有一个短暂的延迟。同样的道理,当某个人不再喊叫,这个电容开始放电也需要1秒的时间,这样大家有可能在停止喊叫之后还会多出一个噪声对抗的周期。

从我个人来说,我是喜欢电路的这种行为的,因为电路给了喊叫的人一点点时间来控制自己的行为,但是一旦电路觉得这个人一直在喊叫,就再加上一个额外的周期,让他充分了解电路的意思。

如果大家还是喜欢那种即时反应的效果,可以用47μF的电解电容来替代进行信号平滑。这样可能导致噪声时长定时器立刻重复自触发,毕竟平滑电容变小了,就有更多的电压脉冲能通过了。大家可以通过调低1MΩ的可调电阻来降低重新触发的可能性,但是还是会有一些敏感的电路反应的。

用项目室的电源和用9V的电池在电路上表现还是会有明显区别的。电池要给100μF的电容充电需要更长的时间,电路看起来也会更加敏感。如果1MΩ的可调电阻无法提供足够的电压范围,我们还可以通过降低4.7kΩ的电阻来提高敏感度,这个电阻就是在电路原理图中标着A的那个。

我将电路调整来使用电源适配器,因为我这个电路更多是用于展示,这需要非常多的电力,所以用9V电池实在是不够了。

我用了塑料封装的2N2222三极管。如果你们用的是金属封装的,那些三极管的放大能力会稍微大一些,大家可以稍微调节一下470Ω的电阻,就是电路原理图中标着E的那个位置。

我的电路没有振荡的现象,如果你的电路有,可以尝试增加100μF电容的容值,就是标着F的那个位置。

14.2 制作更多

我在做这个项目的时候,开始想象这个设备可以用在其他什么地方。我的一个朋友有两个小孩儿,喜欢将家里的电视声音开得特别大。他可以不需要对着孩子大喊把电视声音调低点!,而是可以装一个噪声抗议装置来完成这个目的。

另外也可以用来当作汽车报警器。如果大家将它贴装在车窗里面,如果有突然的震动的话,就可以触发驻极体话筒。

如果大家的邻居有一条吵得特别凶的狗的话,可以用这个噪声对抗装置的输出来触发一个超声发射器来对付它。

我的一个朋友还评论说,她可以把这个噪声对抗装置用在自己身上,提醒自己不能对着自己的合作伙伴大喊大叫,即使是自己因为工作项目进展不够快,觉得很崩溃也不行。

而我个人还是喜欢噪声对抗装置最初的用途。我喜欢想象电子学先驱BobWidlar将一个类似这样的东西装在自己的办公室,这样当他狠狠地激怒了某个人(这种事情常常发生),然后这些人对着他大喊大叫的时候,他只需要坐好,等待分贝数到达一个阈值,然后他的噪声对抗装置就会发挥作用了。

当然很大可能这样会使得他的访客更加愤怒。

14.3 大家能用微控制器来完成这个项目吗

常见的微控制器的模数转换器要求输入的电压比话筒输出的几个mV来说要高得多,因此我觉得大家需要将话筒的输出通过运算放大器,然后再将运算放大器的输出连接到微控制器上。事实上,可以买一个焊接着驻极体话筒和一个表贴放大器的小板子。

大家也可以这么做,有些微控制器有内置的可编程增益。但是大家处理的是交流波形,需要非常快地进行采样并确定幅度。而如果用微处理器来处理经过整形或者平滑过的信号就会容易得多。做这件事情需要一个三极管和一个电容,因为运算放大器没有足够的电流来做整形。

这样,我们就需要使用在已有的电路里面用到的很多元器件了。

在此之后,需要做的事情就简单了,因为给微处理器编程序,来对某个输入做出反应是很简单的。做出一个噪声输出,然后停顿,然后在等待下一个输入,非常简单。事实上,还可以加入一些新的功能。

比如说,大家可以写代码,来确定在一个较短的时间内,某个人大喊大叫了多少次、喊叫得越频繁,微处理器就可以让噪声设备越密集地发出噪声。我们还可以加上一些其他的元器件,让微控制器控制噪声输出每次被触发的时候声音更加响亮。

我很确信大家可以发明类似的方案。但是别忘了,不管大家用不用微处理器,总是需要了解运算放大器怎么去使用的。

14.4 下一步做什么

运算放大器有很多其他的用途,但是很多其他的应用需要有相当高深的知识。我这个话题留给大家,如果大家有兴趣可以去研究一下。

我下面要讲数字芯片了。我喜欢数字芯片,有很多原因。数字芯片之间交互不用担心电压不匹配的问题,也不会因为一点点纹波或者毛刺就会过激放大。在相当大的范围内,数字芯片的输入输出不是高就是低。大家可以想象为开和关,或者(2进制)1或者0

BobWidlar对数字芯片以及数字芯片使用的二进制代码是没有兴趣的。比如他曾经说过,不管多傻都能数到1”。当然我们中的一些人是不像Bob那么聪明的,而且对我们来说,数字电路可以让我们不用去担心电路里面什么东西都不可预测的波动的那种情形。

项目15:一切都是这么有逻辑

Make:Electronics中,我对数字逻辑电路做了一点点介绍,但是没有加入更多有挑战的内容,也没有去处理类似复用器或者移位寄存器之类的元器件。这种逻辑芯片现在比起以前用得要少很多了,但是对于所有的计算设备来说,逻辑是最基础的。因此,现在我们要在数字世界里面更加深入一些,去学习它们的工作原理——同时享受其中的乐趣。

15.0 项目15:感应测试

第一个逻辑项目看起来特别简单。大家需要4个按键开关,几个芯片还有一个LED。当我们逐渐深入的时候,就会发现这个其实不是那么简单的。

这个项目表面上的目的是为了测试大家的超感官的知觉,这也常用一个名词ESP来描述。我会将这个电路称为感应测试。

15.0.1 背景知识:超感知觉ESP

很多年来,传统科学边界上的研究者们都在研究人脑的超自然能力。J.B.Rhine是其中的先驱者之一,他在杜克大学工作。他在1934年出版了Extrasen Sory Perception《超感知觉》这本书,然后继续进行严肃的科学研究直到20世纪70年代。他的研究成果遭受到比较大的批评在于其中有好几次,他发现他的研究助手们有欺骗行为。这也许是因为他们这些人都相信超感知觉,不希望有一天项目不成功,导致他们的平均分下降。大家要记住,如果大家来做这个课题:即使别人本意是好的也会在误导他们自己的同时误导你。

15.0.2 项目设置

真正的读心术是不常见到的(如果有的话),因此我们需要采用一个统计学的方法,我们进行几十次甚至是几千次的尝试,然后将正确率和我们预期的随机概率来对比。

我即将描述的这个项目就是基于这个来进行的。两个按键开关放在一个人面前,再将两个按键开关放在第二个人面前。让两个人相对而坐。两人的中间放一个屏幕,这样这两个人都看不见对面人的手。图15-1会给大家展示我所设想内容的顶视图。大家可能不太想来制作整个项目,特别是当你没有一个合适的合作者的时候。但是大家可以凑合一下,至少将这些元器件组装起来看看工作的怎么样。

我将两个测试人员称为AnnabelBoris,因为我喜欢有个性的名字,这样比较容易记住。在某些图里面,我将他们简写为AB

说明: 00127.jpeg 

15-1

AnnahelBoris准备好去测试他们在超感知觉上的能力了

大家会注意到Annabel面前的按钮开关被标记为A0A1,而Boris面前的按钮开关则被标记为B0B1。我们的目的是让他们去感应对方的意图,从而按直接对着的按钮。如果Annabel按下了A0Boris按下了B0,或者他们分别按下了A1B1,那就是成功。相反,如果他们按下了A0B1或者A1B0,那就是失败了。

由于一共有4个可能组合,而且只有两个表示是成功的,那么概率就是5050了。偏离这个结果比较大就表明其中有一个人能通过超能力感知对方的意图了,不然就表明有人在作弊了。我会在稍后处理作弊检测的问题。

15-2展示了与门和或门,看他们是如何用在按键开关上来确定某一个尝试是否成功了。

如果大家已经记不得这些符号和对应的逻辑门的功能的话,我在图15-3和图15-4中展示了六种基本的变化,其中输入输出的高低电平分别用红色和黑色来表示。

说明: 00128.jpeg 

15-2

这些逻辑门会在A0B0同时被按下或者A1B1同时被按下的时候激活一个成功的指示灯(AND代表与门,OR代表或门)

说明: 00129.jpeg 

15-3

输入通常显示在每个逻辑门的上面,而每个逻辑门的输出放在下面。如果两个输出中的每一个都可以有一个高电平或者低电平的状态(在这张图是通过红色和黑色表示),那么总共有4种不同的组合,每一种组合的输出如本图所示(XOR代表异或门)

说明: 00130.jpeg 

15-4

与非门,或非门和同或门的输入输出。红色的线表示高电平的输入或者输出,黑色的线表示低电平的输入或者输出(NAND代表与非门,NOR代表或非门,XNOR代表同或门)

为了快速查找方便,图15-5的左侧栏展示了四种可能的组合,而对应的旁边则为对应的输出。

说明: 00131.jpeg 

15-5

这张快速查找图里面展示了四种可能的输入组合以及对应每种逻辑门会产生的输出

每次我们在电路开发中使用逻辑门符号的时候,都可以用仿真软件来测试并展示其行为。比如http://www.neuroproductions.be/logic-lab/就是一个免费的在线模拟器。大家可能需要先打开我的逻辑图,然后在模拟器里面搭建一个新的项目,因为我倾向于从顶到底来展示逻辑流,而仿真器则是倾向于从左向右。不管是哪种情况,逻辑模拟器只是在开始硬件搭建电路之前的一个中间步骤。

15.0.3 逻辑芯片知识介绍

每个逻辑门都是由若干个三极管蚀刻到硅片上形成的。最初的直插式DIP通孔封装的逻辑门芯片有14个引脚,现在还在生产。但是现在标贴的版本用得更广泛。

尽管现在计算机已经不再是用逻辑门来搭建的了,这些逻辑门还是有用处的——比如在胶连逻辑上,这种逻辑将电路板上不同的部分连接到一起。

一个14引脚的芯片可能含有四个双输入逻辑门,三个三输入逻辑门,两个四输入逻辑门或者是一个八输入逻辑门。这些配置通常被称为四门、三门、双门、单门,它们描述的是一个芯片里面有多少个逻辑门。

每一个多门芯片里面单独的逻辑门和其他的多几门都是完全独立的。

一个芯片里面没有使用的逻辑门的输入应当连接到地上,防止接受电磁场干扰并作出反应。

一个高电平输入或者输出的电平和电源正极的电压接近,而一个低电平的输入或者输出则和0V接近。负电平的逻辑芯片也是有的,但是用的很少。

逻辑族是相继开发的几代芯片。我将用到的是74HC00芯片族,它的这个叫法是因为所有的部件都是以数字74开头,而HC则是说这是一个高速的CMOS芯片。00的位置可以是两个数字,可以是三个数字,也可以是四个数字,用来表明是哪种芯片。在有必要的时候,我还会使用更老的4000B族的CMOS芯片。

大家在订购芯片的时候要注意,因为这些通孔的芯片和表贴的芯片的序列号几乎是一样的。很多在线的提供商都有一个过滤,可以只搜索DIP或者PDIP通孔封装的芯片。

逻辑芯片设计已经考虑了级联使用,这样一个芯片的输出就可以直接连接到另一个芯片的输入上,只要这些芯片属于同一个芯片族就可以了。

一个芯片在高电平的时候会吸取电流,而低电平的时候会输出电流。

●HC族中的每个逻辑芯片都能够吸取或者输出25mA的直流电流,这个电流足够驱动常见的LED灯。但是,当你的芯片在输出这样大的电流的时候,输出电压会被拉低。大家可以在驱动LED灯的时候用一个万用表来检查电压,而在这个时候用这个输出给另一个芯片做输入的时候也要小心。大家在有必要的时候可以增加LED灯串联电阻的阻值。

当一个按键开关或者单刀单掷开关连在逻辑门的输入上的时候,大家一定不要让输入引脚的电压在关断的时候悬空着。要用一个下拉或者上拉电阻来保持这个输入引脚的高电平或者低电平。参见图15-6

说明: 00132.jpeg 

15-6

当电源正极通过按键开关或者机电开关连接在逻辑门输入上的时候,需要用一个下拉电阻来保证当开关断开的时候输入不是悬空的。如果图中电源正极和电源负极对调一下,电阻就变成了一个上拉电阻

逻辑图和元器件电路原理图是不一样的。在逻辑图中,比如图15-2中的逻辑图,向逻辑芯片供电的电源常常是不会画出来的,而上拉或者下拉电阻也会被省略掉。而在元器件电路原理图中,画出来的是带引脚连接的芯片而不是逻辑门,所有需要的电源连接都需要画出来。

15.0.4 超感知觉逻辑

15-2中的概念是非常简单的,可以用如下的一句话来总结。

如果按钮A0B0被按下,或按钮A1B1被按下,结果就是成功。

这个句子里面的与和或和对应的逻辑图中的逻辑门是清晰对应的。

我将这个图中的绿色的方框称为指示灯,但是这可以只是一个LED灯,亮起来告诉AnnabelBoris他们的想法是正确的(或者读到了对方想的东西,如果你愿意相信事实就是这样的话)。

到这里,逻辑都很基础,但是请稍等一下再去搭建电路。跟往常一样,上手的过程是学习的最好机会。

15.0.5 搭建电路

四门双输入与门和四门双输入或门的内部工作原理如图15-7所示。

说明: 00133.jpeg 

15-7

每个14引脚的逻辑芯片里面都含有4个独立的与门或者或门,如图所示。这种芯片被称为四门双输入芯片

和图15-2中的逻辑图相对应的电路原理图见图15-8。我在图15-7中逻辑芯片里面画了几个小的逻辑门的图标来表示中间的内容。&表示的是与门,而O表示的是或门(这些不是标准的简写方式)。

现在电源正极总线在电路原理图的右侧,这也是逻辑芯片的电源惯例,14号引脚接受电源正极。这本书里面接下来的很多电路的电源正极总线都是在右边。请大家注意不要把芯片的电源极性接反了。接反之后可就不能恢复了。

说明: 00134.jpeg 

15-8

这个电路原理图展示了超感知觉测试的最简单的适合面包板的电路

这个电路搭出来的面包板版本见图15-9

电路图中没有显示7805稳压芯片和两个电容,这些在用74HC00芯片的时候是必须要有的。大家只要在电路图中看到5V直流稳压电源,就知道需要稳压芯片和电容了。

闲置不用的芯片的输出引脚需要接地,防止它们受到电磁场的干扰。每个逻辑门的不用的输出引脚可以不用连接。

说明: 00135.jpeg 

15-9

最简单的也是最基本的超感知觉测试的原型版本。用上部的4个按键开关来充当给测试者使用的按扭开关。左下方的LED灯是唯一的一个输出

大家会发现如果你同时按下标着A0B0的按键,或者同时按下标着A1B1的按键,LED灯就会亮起来,而按下其他的组合则什么事情都不会发生。

到目前为止一切都还顺利。但是现在大家面前摆好了电路了,我想我是能说服你去对这个电路进行一些必要地改进,然后才能真正去使用的。

15.0.6 改进

总的来说,我觉得我们需要增加一些用户友好的提示,并防止作弊。

在超感知觉测试中,Annabel必须看不到Boris在按下哪个键,而Boris也必须看不到Annabel在按哪个键。这样就有一个问题:两个人怎么知道什么时候开始下一次测试呢?我们需要给Annabel一个预备的提示,这个提示需要在Boris按下按键但是她自己还没有按下的时候亮起;还需要给Boris一个预备的提示,也是在Annabel按下按键,而他自己没有按下的时候亮起。

我在前面提到过,即使是真诚的人也会因为他们相信他们的超感知觉而去作弊,因为他们觉得这一天他们的状态不好需要稍微帮一点忙。不幸的是,在我们的超感知觉测试中,作弊其实是很简单的。A或者B可以同时按下按键来保证有一个能命中!

现在我们只有一个指示灯,来指示当AnnabelBoris成功了。我们还需要有另一个指示灯来指示他们失败了。

在下一个项目里面,我会将这些改进都实施进去,并会得到一些让人吃惊的结果。

项目16:改进版的超感知觉

在给大家提供改进版的电路原理图之前,我要先将需求用语言描述出来。我觉得口头的描述是逻辑图开发的第一步。

第二步则是将逻辑图转换为使用实际元器件的电路原理图。

16.1 大家准备好了吗

在超感知觉测试中增加预备看起来是很容易的,也许我应该如下描述这个任务:

说明: 00136.jpeg 

16-1

用两个或门可以给每个人展示对方是否已经按下了按键。这个预备的提示灯不会告诉你到底按下的是哪个按键

说明: 00137.jpeg 

16-2

之前的两个逻辑图在这里已经合并在一起了。按键的输出连接到两个不同的逻辑门的输入上。不幸的是,将多个逻辑图合并在一起会很快增加复杂度,导致解读很困难。为了更容易看清楚,这里我们将之前逻辑图中的部分用灰色显示

如果A0A1被按下,那么需要一个指示灯告知Boris Annabel已经就绪。反过来,如果B0或者B1被按下,就需要另一个指示灯告知Annabel Boris已经就绪。

16-1将这两句话翻译成为一个逻辑图。为了看得更清楚一些,我将这个图和之前在图15-2中的逻辑图分开画了。但是这两个图是可以合并起来的,如图16-2所示,因为大家可以将按键开关的输出连接到两个或者多个逻辑输入上(在图16-2中,我用灰色展示了图15-2的部分,将其与新的连接区别开来)。

16.1.1 抓住作弊

那作弊指示灯怎么做呢?这个可以如此的描述:

如果A0A1均被按下,那么就有一个指示灯来显示 Annabel作弊了。如果B0B1均被按下了,那么就有一个指示灯来显示Boris作弊了。

16-3用另一个逻辑图展示了这个逻辑。也是同样的,这部分也可以和其他的逻辑图合并在一起,在多个逻辑门之间共用每个按键开关的输出。

说明: 00138.jpeg 

16-3

增加了两个与门之后,我们就可以看到是否有选手同时按下了两个按钮来作弊了

16.1.2 指示失败结果

最后是失败指示灯。如果选手们按下的按键不是对应着的,那么测试结果就是失败。这个也很容易来显示。我们可以如下描述:

如果A0B1被同时按下,或A1B0被同时按下,选手们就失败了。

16-4展示了代表这个条件的逻辑图。

说明: 00139.jpeg 

16-4

再加两个与门,并将结果输入给或门,用来显示是否有错误的组合被按下

大家想把这个功能加到图15-8的电路里面吗?大家可能注意到了在那个电路原理图中,有几个芯片的若干逻辑门没有被用到。由于在多门逻辑芯片中各个逻辑门都是相互独立运行的,我们可以把这些没有用上的逻辑门利用起来提供我上面描述的功能。比如说,预备测试需要两个或门,而74HC32芯片里面就有三个没有用到的或门。

我会倾向于说:没问题,做吧,把新功能加上去!但是大家可能不一定这么想,因为我不想大家因为花了大量时间搭出一个不能正常工作的东西,回头朝我发火。而且事实是,如果你把我刚才描述的这些功能加进去的话,电路是没有办法正常工作的。我可以通过让大家做一些思维项目来证明这一点。

16.2 冲突

假如 Boris 作弊了,他同时按下了 B0 B1。在此同时,Annabel没有作弊,她只按下了一个按钮A0,这个时候会发生什么?

按键 A0B0 B1被按下了,由于 B0 B1构成了作弊,因此作弊指示灯会亮起来,而且应该亮起来。

但是等一下——Annabel按下的是A0,因为A0B0同时被按下了,所以成功指示灯也亮起来了!

这还没完,B1A0也被同时按下了,因此错误指示灯也亮起来了。另外由于每个选手都按下了至少一个灯,所以两个预备指示灯也亮起来了。

这时就是一团乱麻,所有的指示灯都亮起来了。

什么地方出错了呢?这个问题在于我的描述不够详细。我只想到了这些按钮按下去形成的逻辑输出,没有去想这些按钮并不需要被按下去也能产生输出。比如,我开始描述预备的逻辑是这样描述的:

如果按键A0A1均被按下,那么一个指示灯将亮起,告知Boris Annabel已经准备就绪。

但是我应该这么说:

如果 A0 A1 被按下,且 B0 B1 都没有被按下,那么一个指示灯会亮起告知Boris Annabel已经准备就绪。

换句话说,我需要确保Boris还没有按下他的按键时,才能让系统告诉他 Annabel正在等待他去按下他的按键。

类似的,成功指示灯或者失败指示灯也应当在AB都没有作弊的情况下亮起。

嗯,这里都没有这个词现在出现了两次。很显然我在这里需要用一个异或门。不知道为什么,这一切开始变得特别复杂了。谁会想到这个简单的游戏会产生这么多预料不到的问题呢?我觉得画个图将有助于解开这个困惑。

16.2.1 解开困惑

大家看一看图16-5。现在这个图考虑了按键没有被按下的情况,也考虑到了按键被按下的情况。A0A1B0B1代表了4个按钮,红色表示按钮被按下了,而黑色表示按钮没有被按下。灰色带X的按钮表示这个状态无关紧要,与这个逻辑测试没有关联。在图16-5的右侧是每种按键组合应当产生的输出信息。大家记住,黑色(没有被按下)的按钮状态现在和红色(被按下)的按钮状态一样重要了。

说明: 00140.jpeg 

16-5

在这张图里面,A0A1B0B1代表的是一个按键被按下(红色)还是没有被按下(黑色)。灰色的X表示在这个测试中,按键的状态无关紧要,可以被忽略。右边彩色的盒子代表的是与各个按键组合相对应的应当亮起的指示灯

在第一行,Boris应当在 Annabel按下一个按键(不能同时按下,因为那就是作弊),而且Boris还没有按下B0也没有按下B1的时候收到一个准备指示,表示 Annabel已经准备就绪。

第二行用的是同样的逻辑,得到的是 Annabel准备指示灯。

在第三条线和第四条线上,如果某个人同时按下两个按键,我们就不用关心另外一个人到底做了什么了。

失败指示灯和成功指示灯只有在那些特别的红色按键被按下,而其他的按键没有被按下的时候才会亮起。

16.2.2 翻译这张图

也许大家还在想有没有其他的按键组合会导致我没有预料到的结果。没有,图16-5中已经将所有可能按键组合的结果都罗列出来了(如果有三个或者四个按键被同时按下的话,这些组合就都在作弊测试中了)。

现在我能将图中的每一行都转化为一个逻辑图,而这次我很有信心电路能正常工作。但是,我还需要两种其他的逻辑门来完成工作。它们是或非门和异或门。如果大家不记得这两个逻辑门的功能,可以查一下图15-5

如果用语言来描述的话,或非门和异或门的功能如下:

或非门是当两个输入有一个为高电平时输出为低电平,只有当两个输入都为低电平的时候,输出才会是高电平。

异或门是当两个输入同时为高电平或者同时为低电平的时候输出为低电平,而只有当两个输入一个为高电平另一个为低电平的时候输出才为高电平(解释一下,异或的意思是两个不一样,读法是ex-or)。

在图16-6中,大家可以看到这些逻辑门是如何被用来模拟图16-5中这些测试的。

在图16-7中,我选了四种可能的按键组合作为一个样例,来看他们在逻辑图中是如何决定“A已经准备好这个指示灯应该亮起的。在下面的两种组合中,预备指示灯则没有亮起来。

16-6中的图可以用如下的语句来总结:

●“选手A已经准备好测试:如果A0A1有一个为高电平(不是同时),而且B0B1都没有被按下,那么“A已经准备好指示灯就会亮起。

●“选手B已经准备好测试:如果B0B1有一个为高电平(不是同时),而且A0A1都没有被按下,那么“B已经准备好指示灯就会亮起。

说明: 00141.jpeg 

16-6

列举前面图中关系的逻辑图。每个逻辑门的输入(A0A1B0B1)都代表可能被按下或者没有被按下的按键的连接,而按键则是在按下的时候提供高电平输入,在没有按下的时候通过下拉电阻(图中未显示)来提供低电平输入

●“选手A作弊测试:如果A1A0都被按下了,那么“A作弊指示灯将会亮起。

●“选手B作弊测试:如果B1B0都被按下了,那么“B作弊指示灯将会亮起。

现在事情又变复杂了:

●“失败情形测试:如果A0B1被同时按下,而且A1B0都没有被按下,那么失败指示灯将会亮起。或者,如果A1B0被同时按下,而且A0B1都没有被按下,那么失败灯也会亮起。

●“成功情形测试:如果A0B0被同时按下,而且A1B1都没有被按下,那么成功指示灯将会亮起。或者,如果A1B1被同时按下,而且A0B0都没有被按下,那么成功灯也会亮起。

说明: 00142.jpeg 

16-7

A选手的预备测试中四种按键的任意组合的结果

这些描述都是从图16-5中每一组按键的组合而来的。如果大家自己将这些描述大声朗读出来,同时看着按键的图标,就会发现他们是一一对应的。

现在可以搭建电路了。大家有足够的芯片来提供所有需要的逻辑门,也需要将各个按键和这些逻辑门合适的输入连接在一起。大家要记住,一个按键接多个逻辑门的输入是没有问题的。

问题在于,这样就会变成一个大家没有想象到的大得多的项目了。为了将图16-6中所有的逻辑门都表达出来,我们需要三个四门双输入与门芯片,一个四门双输入或门芯片,两个四门双输入或非门芯片,还要一个四门双输入异或门芯片。这加起来就是七个芯片了。而这些芯片一块面包板可布不下。

嗯,这个电路能简化吗?怎么简化?事实上,这个电路是可以简化的。我们可以将这个过程称为逻辑优化。

16.3 优化

大家还记得在前面我说过作弊的条件将由于其他所有的情形吗?这个概念可以用来优化电路。我想的是这样:如果 AnnabelBoris有一个人作弊了,我们不需要去想成功或者失败的结果。我们只需要亮起作弊指示灯,同时阻止其他指示灯亮起,这就结束了。

说明: 00143.jpeg 

16-8

用来验证是否有人作弊的概念的流程图,在验证完是否有作弊之后再去决定输出是成功还是失败

用逻辑门来实现这个就是去做一个作弊检测的分电路,如果没有作弊,这个电路会给成功/失败分电阻发送一个“OK”的信号。成功和失败指示灯没有收到“OK”,没有作弊的信息就不会亮起来。我将这个概念用流程图表示了出来,见图16-8。在这张图中,我们需要先去确认A或者B是否有作弊,然后将OK的信号传递到下面看看这次尝试是否成功。

我们怎样将这个逻辑转换成逻辑门呢?好吧,一个或非门可以只在两个输入为低电平的时候输出高电平。如果我们用一个低电平来表示一个人没有作弊的话,那么或非门的输出就会在没有人作弊的时候输出高电平。

说明: 00144.jpeg 

16-9

前面逻辑图增加异或门之后的简化版本,异或门需要在AB都没有作弊的时候给出高电平输出,然后再去决定成功指示灯和失败指示灯是否亮起

在图16-9的下面部分,大家可以看到我们增加了一个或非门,插在AB指示灯中间。只要AnnabelBoris都没有作弊,这个或非门就会给出一个高电平输出。这个输出被加到三输入与门上,而这个三输入与门要求所有的输入都是高电平,才能将成功或者失败的指示灯点亮。换句话说就是如果有任何一个选手作弊的话,成功和失败指示灯就不会亮起。

为了容纳下这个三输入的与门,我需要更改电路图底部的逻辑,我使用了四个异或门。这部分留给大家去思考它们如何工作,不明白的时候请回到图16-5去参考。

也许大家在想——简化或者优化一个逻辑图要怎样去做呢?标准的做法是学习布尔标记符,然后去寻找重复或者矛盾的部分。在维基百科上有一个这样的例子,但是我觉得难度稍大。我宁愿盯着逻辑图看,想象所有可能的状态,然后再去寻找是否有其他办法来满足这些需求。一旦我觉得有了一个简化版本,我就去检查所有的输入的组合,确保电路能工作。这是一个依靠直觉的方法,不是经典的做法,但是对我很有效。

16.3.1 搭建电路

现在电路已经优化了,可以开始来搭建了。大家需要一个四门双输入与门芯片,一个三门三输入与门芯片,一个四门双输入或非门芯片,和两个四门双输入异或门芯片。这样就只要五个芯片,而不用七个芯片了(我成功地去掉了所有的或门芯片)。

额外芯片的引脚图如图16-10和图16-11所示。注意或非门、和与门、或门以及异或门相比,在芯片内部是反过来的。在连接电线的时候要注意。

大家可以看到所有的元器件可以如图16-12所示布置在一个面包板上并连接起来。异或门上面有个X的符号,与门上有个&的符号,或非门用字母N来代表。(这些并不是标准的缩写)。

因为图16-12里的电路图差一点都放不进印刷的页面,我只好把按键(这些按键本来也要分开来安装)都扔一边了。这些按键在图16-13中有展示,每个按键的输出会连接到5个标签。大家需要将每一个标签都先接到图16-12上对应的标签上。这样,图16-13中第一个A0标签可以连接到图16-12里面顶上的异或门芯片的A0标签上,等等。实现这个最简单的办法是用彩色的排线来连接。

也许大家还要独立安装LED信息指示灯。只用在每个LED灯上串联一个220Ω的电阻,防止逻辑芯片过来的输出过载(除非你用的LED灯内部带了串联电阻)。

说明: 00145.jpeg 

16-10

一个14引脚的逻辑芯片在图中所示的配置下,内部可以包含四个双输入或非门,或者四个双输入异或门。记住或非门的输入输出和其他四门双输入芯片内部的逻辑门的顺序是不一样的,这很重要

说明: 00146.jpeg 

16-11

一个14引脚的逻辑芯片可以包含三个三输入逻辑门,如图所示

在图16-14中,大家可以看到这个电路的面包板版本。我在连接完五个逻辑芯片之间的连线之后,意识到在面包板的底部还有足够的空间来安放四个按键开关。因此我又加了上去,然后分别将其连接到了对应的逻辑输入上。面包板的两侧已经没有空间去排布从开关过来的电线,所以我将这些电线都放到了中间位置。

说明: 00147.jpeg 

16-12

最终的超感知觉测试的电路原理图,用了五个逻辑芯片

说明: 00148.jpeg 

16-13

在超感知觉测试电路中,需要用四个单刀单掷常开按键开关。每个开关的输出都要分给五个逻辑芯片。由于每一组的五个按键的输入都是同时为高电平或者同时为低电平的,每一组输入用一个下拉电阻就足够了

说明: 00149.jpeg 

16-14

超感知觉测试的面包板电路的完整版本。里面用了五个逻辑芯片,利用LED灯用来做输出,各自在电路的原理图中都标出了。这里面没有LED的串联电阻,是因为我选的LED灯内部带了串联电阻。两个图底部的按键开关是红色的,交由选手A使用;有两个按键开关是黑色的,交由选手B使用。电路的这个配置仅仅用于展示。在真正可用的超感知觉测试里面,这些按键应该相距甚远,这样选手们才不会看到对方选了哪一个按键

16.3.2 细节

大家还要注意,我们选来做作弊指示灯的LED灯(电路图中黄色的方形指示灯)并不会太多影响与门输出的电压。这些与门的输出并不只是用来给LED灯供电,它们也同时和下一级异或门的输入相连。这些输入在与门供过来为高电平的时候至少要有4V。一个LED灯可能会拉低这个电压,因此要用你的万用表去确认一下。

如果你决定要去搭建一个全功能版本的电路,而不是只是做一个面包板的演示。大家会需要两份成功和失败指示灯——每一份是为某一个选手而准备的。为了控制这两个LED灯并联而形成的负载,我们可以增加对应的串联电阻或者放大芯片的输出。简单放大输出的方法是将这些信号通过达林顿阵列中的三极管对,比如用ULN2003芯片。达林顿管有可以一次放大七八个输入的型号。

或者,大家可以每一组LED灯都串联共同驱动。这个方式的优势在于从逻辑芯片上过来的电力都没有浪费在电阻上。不幸的是结果会难以预测,因为LED灯对电流比起对电压来说要敏感得多,而且不同的LED灯指标各不相同。在将LED灯串联的时候,注意要测量流过LED灯的电流,在发现LED灯的电流超过额定值的时候要加上串联电阻。

我特别鼓励大家去自己搭建这个电路。很简单,因为用的元器件很少。唯一的要求就是在连接的时候要小心而精确。我想如果你决定要试试的话一定是可以完成的。

如果你真的去用这样一个电路,不管哪个版本,请记住一个选手的行为并不是完全随机的,另一个选手可能会捕捉到这种行为模式——即使第一位选手对此毫不知情。这就把我们带进了随机性的领域,我会在后面谈到这些。

16.3.3 数字化的差异

粗略地看一下图16-12中的电路,会觉得这个电路和用到运算放大器的项目中的那些电路很不一样。首先,这些电路不用电容,而且电阻只是用来作为上拉或者下拉使用。也不用三极管,这是因为逻辑芯片设计的时候就考虑到能够在没有其他元器件的情况下直接相连。只要大家用的芯片是来自同一个家族,一个芯片的输出就肯定能够作为另一个芯片的输入。

大家还可以将某一个逻辑门的输出连接到其他几个逻辑门的输入上。比如说,在图16-12中左下方的74HC02芯片的或非门的输出连接到了下面两个与门的输入上。用一个逻辑门的输出来驱动多个逻辑门的输入被称为扇出。HC系列的逻辑门允许一个逻辑输出直接连接多达10个的逻辑输入。

16.3.4 改进

现在,电路原理图还能优化得更好吗?我觉得我们可以不只是去测试是否失败或者成功。我们可以用这样的逻辑:如果中间的或非门说没有一个选手在作弊,有两个按键被按下,而且我们没有失败,那就是一定成功了。换句话说,成功可以重新定义为没有失败

但是我现在有点头疼,不想去想这个了,因此我就不去进一步优化电路了。大家感兴趣的话可以去试一试。如果大家成功地将芯片的数目从五个减少到了四个的话,请一定告诉我。但是不要太费心,因为在下一个项目之后,我会告诉你逻辑芯片的数目可以减少到两个,只要我们加入一个新的芯片编码器。不要走开哦!

16.3.5 没那么简单吗

当大家开始阅读超感知觉测试的时候,可能觉得这个东西太简单了,提不起兴趣来。但是现在会觉得这个东西过于复杂,也提不起兴趣来!好吧,大家如果没有兴趣的话,没有必要在这里纠缠。记住我们得到的结论,因为这些是数字电路中不断会重现的:

逻辑问题一开始看起来很简单,但是当增加很多额外的判断和条件之后会变得很复杂。可能会有逻辑的冲突。想象一下有新的功能是没有问题的——但是在将这些功能加到电路之前要认真地想想。

用户输入永远是一个问题,因为我们必须穷尽所有可能的人的行为,然后再去妥当地处理。

搭建逻辑电路有系统的方法,但是他们不一定会产生最简单、使用芯片数目最少的电路。优化绝大部分的时候是减少芯片数目——但是从另一方面来讲,会做出更加难以理解的电路来,这些电路可能会有错误,而且后续还更加难以修改。

桌面电脑中一直在使用微处理器,但是逻辑芯片也会用到。逻辑芯片的数目(芯片数)很重要,因为那个年代芯片是很贵的。超感知觉测试告诉我们计算机先驱们是如何开展设计工作的。即使到了现在,人们在设计CPU的时候还在处理逻辑状态——但是他们的任务已经变得简单很多了,因为他们现在有了更好的设计工具和更强大的模拟软件来辅助了。

16.3.6 我们能用微控制器来做吗

我们能吗?结论当然是可以的,当然可以!每个按键可以连接到微控制器的输入上,然后大家可以写段代码来寻找不同按键被按下的组合。用if-then语句就能将不同的结果罗列出来了。

逻辑错误还是有可能存在的(事实上,可能性还很大),但是总的来说,设计流程可能比较让人头疼,而硬件的问题可能会很小。我们可以不使用五个逻辑芯片里面的十五个逻辑门,而是使用一个微控制器。如果有人让我明天搭建一个超感知觉测试电路,我肯定会用微控制器的。

但是我在这里的目的是给大家展示这些装置是如何工作的。逻辑在所有的数字设备中毫无疑问是最基础的,而学习这些逻辑的最好(一直是)的方法是自己上手。为了这个目的,我们不用去替换这些传统的逻辑芯片。

但是,事实上,我们有两个可能的替代方案。我刚提到了,有一种可能性是用编码器,里面有多个逻辑门,这样就不需要自己将多个逻辑门连接在一起了。我会在项目19和项目20中谈到编码器。

另一个可能是将每一个逻辑门都换成一组老式的机电开关。

我将在下面给大家展示一个游戏电路,这个电路可以用开关来搭建,尽管大家会发现这个电路还是可以用芯片来搭建的,当然如果愿意,还可以用开关和芯片混合搭建。

项目17:我们来玩石头剪子布

石头剪子布是一个真正历史悠久的国际性的游戏,但是为了防止真的有人没有玩过,我还是在这里描述一下规则。两个选手面对面站立,当数到三的时候,每个人都做出一个手势。手势有如下几种:

一个拳头,代表石头。

一个平放的手掌,代表布。

两个手指,代表剪刀。

手势之间作对比,来决定胜者。石头崩掉剪刀,剪刀剪断布,布能蒙住石头。这个游戏和我们的超感知觉测试有着很明显的相似,因为都是两个人面对面,尝试去感知对手的意图。但是,对于做成电子版的游戏,两者还是有一些区别的。首先,在这个游戏里面,每个选手有三个选择,而不是两个。其次,如果两个选手做出了同样的选择,那么游戏的结果就是平手。最后,如果他们做出了不同的选择,那么就会是一个人赢,另一个人输。

17.1 背景:概率

我们暂时先假定超感知觉不存在。这是否意味着石头剪子布是一个纯粹概率的游戏呢?

不是的,因为有两个人来玩这个游戏,而且这两个人的选择也不是完全随机的,事实上很多人对于随机性都有一些不太理性的想法。

比如说,大部分人相信,如果你在扔一枚硬币的时候,如果连续出现了10次的字朝上,那么下次应该就会更可能是花朝上。这被人称为蒙特卡罗谬论,命名来源于蒙特卡罗的一个赌场,在1913818日那里其中的一台轮盘赌上面连续出现了26次的黑色。很多人在中间赌红色而输了个精光。毕竟如果黑色已经连续出现了10次、15次、甚至是20次,红色应该就在下一次了,至少他们是这么相信的。

这个想法是一个谬论,因为轮盘赌是没有记忆的。硬币也没有,如果大家能连续扔20次的字,硬币也是不知道这个情况的。因此下一次扔的结果是字的概率还是和以前任意一次完全相同的。

但是,人是不一样的。他们会记得他们做过什么,而且他们的记忆会影响他们的决定。如果有人在玩石头剪子布,知道他自己连续三轮出了石头,那他是有可能觉得为了不让对手预测到,他就不应该继续出石头了。因此他下一轮更大可能会选择布或者剪刀。

大家可以这个时候来出剪刀来对付他,这样你要么是赢了,要么是平手。不管哪样,你是不会输的。

问题在于,如果你在和一个有经验的选手来比赛的话,他可能知道你会期望他不再重复他的选择,因此他可能就会去继续出石头,从而跳出你的期望。

但是如果你足够了解他,反而知道他会这么做呢?那么有一次,你就预料到了他的策略并可以相应更改你自己的策略了——但是如果他再一次捕捉到了这一点,他也会更改自己策略的。

这是一种回归的过程,人们会去想好几轮对手会怎么做,这在博弈论这个迷人的数学分支中是一个非常常见的主题,博弈论在20世纪60年代影响力变得特别巨大,甚至影响了美国的外交策略和核武器竞赛进程。

17.1.0 背景知识:博弈论

博弈论是在1944年成为一门学科的,当时的计算机天才John von NeumanOskar Morgenstern出版了Theory of Games and Economic Behavior一书。这些概念在20世纪50年代早期被改进并迅速在华盛顿特区智囊团RAND的理论家中流行起来。

博弈论可以描述任何两个(或者更多个)选手在寻求一个获胜的策略但是又没有足够的信息,还不能信任对方的情形。比如说,在扑克游戏中,有一个选手可以虚张声势,而其他人必须要想明白这个人到底是不是在虚张声势。如果是的,那么怎么去应对。这种应对会返回来影响他们,他们会不会也去虚张声势直到最后所有的牌都亮起来,有一位选手获胜。

军事对抗也是有一个类似虚张声势、挑衅并多次猜测对手的一种博弈。这使得RAND的顾问如Herman Kahn在某些情况下会去认为苏联首先对美国进行核打击是有道理的。因此两个国家需要拥有在遭受核打击之后还能拥有二次打击的能力,因为这就是对于第一次核打击的威慑。

大家可以到http://www.gametheory.net去看看,那里有一些关于博弈论的基本假设的描述。其中一个假设就是选手们将理性地最大化个人的利益。但是国家领导人是不是真的会觉得杀掉另一个国家上亿人,将其变成一个满是核辐射的废土以获取利益是理性的?

也许不是这样的——但是博弈论告诉我们这是无法保证的。因此美国花了天文数字的资金开发了氢弹并在发射井里面布置了导弹,以度过第一轮打击。

这个话题好像和我们的石头剪子布游戏离得有点远,但是实际上唯一的差别是规模、变量数目以及结果的严重程度而已。

17.2 逻辑

应当如何来描述石头剪子布游戏的逻辑?如果我们一步一步地跟着开发了超感知觉测试机,那么这个逻辑就不是那么难了。选手A的基本逻辑见图17-1AnnabelBoris现在在玩这个游戏了,他们的名字还是选手A和选手B,而他们每个人现在有三个选择可以去按三个按键,分别标着石头,剪子和布。为了描述方便,我将 Annabel的三个按键简化标记为ARAPAS,而Boris的三个则标记为BRBPBS

说明: 00150.jpeg 

17-1

石头剪子布的游戏汇总,这个逻辑门的网络会在选手A任意的三种获胜组合情况下显示出获胜的该信息

如果 Annabel按下了石头按键,而Boris按下了剪刀按键,Annabel就赢了,因为石头崩掉了剪刀。如果A按下了布,而B按下了石头,那个A又赢了,因为布蒙住了石头。如果A按下了剪刀而B按下了布,那么还是A赢,因为剪刀剪断了布。这三种获胜的选择都在图中有显示,大家可以注意看连接线。

当然Boris也有他自己获胜的三种选择,而游戏中还有三种可能的平局就是 AnnabelBoris同时选择了同样的按键,这些情况都在图17-2中总结出来了。

说明: 00151.jpeg 

17-2

在石头剪子布游戏中,这三个逻辑网络在每组获胜组合和每组平分组合时都会给出对应的信息

到现在还很简单。但是和往常一样,问题都是在我们增加游戏的娱乐性和防止作弊的时候随之而来的。

17.2.0 谁来玩

和超感知觉测试一样,每一位选手的一组按键都需要让对手看不见。但是这就意味着在每一轮结束的时候,是看不到每位选手到底按下了什么的。我们只有三个指示灯,分别表示选手A获胜,选手B获胜和平局。

在每个按键旁边应该是有一个LED灯,在按键被按下的时候让这个灯亮起——但是必须在两个选手都相应作出选择之后。怎么样来实现这个呢?好吧,我们还是先将逻辑讲出来吧。

说明: 00152.jpeg 

17-3

这个逻辑网络的结构只有游戏结束的时候按键旁边的LED灯才能亮起来

首先我们需要等待游戏结束,不管是选手A获胜,还是选手B获胜还是平局。如果我用一个三输入的或门来代表这个的话,我可以将三种游戏结果都容纳进来,如图17-2所示。结果就有点像图17-3,三种游戏结果输入到三输入或门里面,当这个或门有一个高电平输出端时候,就表示游戏已经结束了,不管是哪种结果。这个输出和各个按键与在一起,作为允许LED灯亮起的条件。这些LED灯为了节约空间在图中用黄色的圆圈来表示。每一个LED灯都用与对应的按键同样的两个字母的简写来表示。

17.3 谁在作弊

这个图一开始看起来有点复杂(又是这样)。但是真正麻烦还在后面(又是这样),因为有作弊的问题。我们如何能在某个人同时按下两个按键的时候发出信号呢?在超感知觉测试机里面,我们用了异或门来完成这个功能,因为异或门在一个输入为高电平,一个输入为低电平的时候会是高电平输出,但是如果两个输入同时为高电平则会输出低电平。在超感知觉测试机里面,异或门输出的高电平意味着这位选手走了一步,但是没有作弊。

但是异或门通常是只有两个输入的,而在石头剪子布游戏里面我们每个选手有三个按键,这是一个问题!

将问题大声地读出来有助于解决问题。Annabel如果同时按下ARAP就是作弊如果同时按下APAS也是作弊,如果按下ASAR也是作弊(她如果同时按下三个按键也是作弊,但是我们不需要测试这一点,因为同时按下三个按键必定已经同时按下了两个按键,而我们已经把所有的两个按键的组合都包括进来了)。

如果有作弊,我们就需要亮起一盏警告指示灯,并禁止游戏的任何正常输出结果。如果Boris作弊的话,也应该如此处理。换句话说,如果 Annabel作弊或者Boris作弊,获胜指示灯和平手指示灯都不应该亮起。

这个功能是可以实现的。我们只需要为每位选手拿出三个与门来与每一对按键连起来,然后用一个或门将这些与门的输出接入,再用一个或非门在两个选手都没有作弊的时候给出高电平,这样或非门就会给游戏的所有的合法输出的与门增加一个输入。这样就可以了。只是这听起来不是很容易去搭建。

17.3.0 背景知识:逻辑阵列

20世纪70年代时,制造商们推出了含有可编程逻辑门阵列的芯片。所有的设计都有着同样的目的,要用完全一样的通用逻辑阵列来经过连接与编程,从而在芯片内部形成定制的逻辑电路。为了达到这个目的使用了很多种的方法,有很多设备,比如PLAPALGALCPLD(大家如果感兴趣的话,可以到网上去搜索)。最终现场可编程逻辑门阵列(FPGAs)出现了,里面不仅包含了逻辑门,还有更多复杂的功能,可以让终端客户来选择。

不幸的是,为FPGA编程需要一门硬件描述语言,得有合适的软件(通常是芯片制造商授权的),还得有合适的硬件。这种可不是通常家里的工作室能有的东西,因此为了我们的目的,我们还是用老式的芯片吧。

是吗?我还是想用比起逻辑图和一页纸画不下多个逻辑门要简单一些的选择——而且幸运的是,这种选择是存在的。

项目18:是用开关的时候了

18-1介绍了一个新的概念,它显示了如何用普通而常见的开关来模拟逻辑门,每个开关相当于逻辑门的一个输入。

当一个开关被按下时,和逻辑输入为高电平是等效的。当没有被按下时,和逻辑输入为低电平等效。因此在图18-1中,上部的一组开关只有在左边的开关和右边的开关同时被按下时才会给出高电平输出。这和与门的逻辑是一样的。

但是——还是不完全一样。与门的输出要么是高电平要么是低电平。而开关在图18-1中是开路,输出是一个断开的电路。是一个悬空的状态,没有定义电平。我们需要在上面增加一个下拉电阻来控制每一个悬空输出的状态。我为了简洁,将电阻都省略了。

逻辑门和一组开关之间还有另外一个非常重要的区别:开关在两个方向都会导电,而逻辑门则不是这样。大家不可能将电流灌到逻辑门的输出,然后在输入上流出来的。这个区别会产生一些头疼的后果——虽说在某些情况下,这个区别会使得事情变简单。

18.0 背景知识:用灯具开关做成的同或门

简单地消化一下——大家知不知道你的家里很可能在灯的走线上有一个同或门?这种情况通常发生在楼梯的灯上。我们在楼梯的上面有一个开关,但是楼梯的下面也需要有一个开关。当灯亮着的时候,任何一个开关都能将灯关掉,而当灯灭着的时候,任何一个开关也能将灯打开。

大家看一下图18-1中同或门的开关逻辑。想象一下电势如何在每一种的开关组合的情况下流动的——还有如果两个开关在变化的时候电流又是如何流动的。

大家能想象一个和三个开关一样功能的逻辑电路吗?要求是任何一个开关都能改变单个灯泡的状态。我给大家一个提示:中间的开关必须有两个刀。

18.0.1 回到石头剪子布游戏

我们看一看图18-2,并将其和图17-1对比。两者有着相同的功能,但是新的版本不需要逻辑门。而每一组开关在选手A获胜的时候都是串联在一起的,这个和与门是一样的。三组开关被连在一块儿,形成了一个O型环。

如果大家还在想为什么我这会儿给大家看电路原理图中的开关,而不用按键。这是因为电路以后会使用多刀双掷开关,而且虽然多刀双掷的按键也存在,但是画在电路图中难以表达,还占据太多空间。大家只要将这些开关想象为带弹簧的就行了,当不按着的时候就会回到开路的状态。

说明: 00153.jpeg 

18-1

每个开关都模拟了一个逻辑门的输入,按下开关等同于高电平输入。为了防止输出为悬浮状态,需要给输出加上下拉电阻

18-2中的导体都加了颜色,这是为了让大家看得更清楚,因为我们马上要在下面的几步中将他们加进来。大家可以将这些颜色想象为连接线外层绝缘的颜色。

现在如果大家看图18-3的话,会发现这些开关和连线的逻辑和选手B获胜是一致的。我们能将这两个电路合并起来吗?我们在逻辑电路里面可以将一个输出连接到好几个输入上,但是却不能将一个开关的输出连接到多个开关的输入上。这种直接用电线的连接会使得电流来回流转,导致错误的后果。我们这里就必须用到多刀开关了,这样能保证各个电路独立工作,如图18-4所示。

说明: 00154.jpeg 

18-2

我们只用开关,也可以搭出这个电路,在石头剪子布的游戏中产生选手A获胜的任意三种组合的输出。电线都加了颜色,是为了让大家看得更加清楚,大家也可以将其看成对应的电线的绝缘外皮的颜色

说明: 00155.jpeg 

18-3

这是一个用开关做的电路,在石头剪子布游戏中产生了所有选手B获胜的组合的输出

这个电路需要双刀开关,但是当我增加新的额外的功能的时候,就需要更多的刀了。幸运的是,按键开关和自锁按键开关(按一下开,再按一下关)都有双刀,四刀,六刀甚至八刀的选择(这些开关常用于相对低廉的立体声设备上)。

说明: 00156.jpeg 

18-4

当要把前面两个原理图合并在一起的时候,我们需要用到双刀开关,来保证两个电路电气上相互独立

18.0.2 显示是哪个按钮

在项目17中,我抱怨说用逻辑门来做所有的事情会头疼的。那是在我给大家展示完图17-3中的逻辑图,用于在两个选手都做完选择之后点亮按键附近的LED灯的时候。

有没有简单的方法来完成这个功能,而不用逻辑门呢?我觉得是有的。图18-5就展示了如何去做。由于我在上部为选手B放置了一个电源正极,而在底下为选手A放置了一个电源负极,就可以将LED灯插在电路中间了。

18-6展示了这个电路是如何工作的样例,情形是选手B按下了石头,而选手A按下了剪刀。直接连接到电源正极的导线用红色显示,直接连接到电源负极的导线用蓝色来表示。不导通的电线、开关、LED灯和指示灯都用灰色来表示。紫色的线上面的电流会小一些,因为刚过了第一个LED灯而没有过第二个LED灯。

一个元器件需要在一侧接正极,另一侧接负极才能正常工作,因此选手B获胜指示灯亮起来了,而选手A获胜的指示灯就不能够亮起来。

说明: 00157.jpeg 

18-5

这个配置可以使LED灯来显示哪一个按键被按下了,但是需要在两个选手都做完选择之后

电流需要经过第一个LED灯才能到达第二个LED灯。在两个LED灯之间的连线用紫色来表示,因为这里是中间电压。如果你将两个LED灯认为是串联的,一侧是正极另一侧是负极,你就会发现为什么靠近开关的两个LED灯会亮起来,而其他的都没有亮。记住因为LED灯是二极管,它们会阻断反向电压。

如果你去尝试其他的开关组合的话,我想你会发现也只有对应正确的LED灯和指示灯会亮起的。

在实际电路里面,如果大家将两个LED灯串联,而且每个LED灯都是那种内置电阻的,就会发现LED灯暗得不行。这是因为电流连续流经两个LED灯和两个电阻。如果大家尝试使用两个通用LED灯,而不用串联电阻的话,可以用万用表检查一下电流,有没有超过每个元器件的标称最大电流。很可能的情况是,为了保证有最好的输出效果,我们需要用通用的LED灯和一个小阻值的电阻来替代电路图左方连接两组LED灯的垂直紫色连接线。我们可以不断地尝试各种阻值的电阻,从220Ω往下一直试,直到有了合适的电流。记住,绝大多数LED灯的最佳电流在20mA,但是也有一些的限值会低一些。

说明: 00158.jpeg 

18-6

在这个图中展示了两个开关如何点亮对应的LED灯的样例。选手B选择了石头,而选手A选择了剪刀

18.0.3 防止作弊

现在到了一个比较难的地方了:防止作弊。我选择来完成这个任务的方法是使用已有电路,但是要加上一个额外的开关来控制输给每一位选手的电力。

这个器件的原理见图18-7,里面有三个双刀开关,但是组合方式不一样。注意所有的这些开关都是常闭的。当你按下一个开关的时候,会将开关断开。为了吸引大家的注意力,我还将被按下而断开的开关涂成了绿色。

在最上部,没有一个开关被按下,因此所有的开关都是闭合的,电流能通过。在接下来的三个组合中,每次只有一个开关被按下,这样电流至少能有一条通道可以流过。在接下来的三个组合里面,每次有两个开关被按下(记住,绿色表示开关被按下),只剩下一个开关没有办法导通电路。在最后一个组合里面,所有的三个开关都被按下了,电流也被阻断了。

说明: 00159.jpeg 

18-7

这么连接的时候,三个常闭双刀开关就能使得在没有开关被按下或者只有一个开关被按下的时候才能有电流通过。而当有两个或者三个开关被按下的时候会阻断电流。绿色的高亮显示的是现在被按下的开关

走电流的电线用红色来表示,可以看到如果没有开关被按下,或者有任何一个开关被按下的话,电路是导通的,而如果有两个或者三个开关被按下,那电流就被阻断了。这样就组成了一个防止作弊的系统,它可以用在剪刀石头布游戏里面了。

18-8就是将防作弊系统加到之前的电路里面了,每个开关又加了两个刀。为了更清楚地展示,我只显示了电路中用到的节点。没有用到的开关节点都略去了。因此每个开关上显示了两个常开节点和两个常闭节点。

说明: 00160.jpeg 

18-8

之前的电路扩展增加了防作弊系统,这样当有选手按下两个或者三个开关而不是按下一个开关的时候,就能阻断电源。大家可以看文字的细节描述

我尝试用颜色来更清晰地表示。直接连接到电源正极的用红色表示,通常上面是正电压而通过常闭节点的用紫色表示。如果有两个或者三个开关被同时按下,紫色的线就不再是正电压了。

类似的道理,在电路的底部,黑色的线表示直接连接到电源负极的,而浅蓝色(青色)的线在两个或者三个开关被按下的时候就不再连接到电源负极了。

这样,系统就能在有人作弊的时候切断电源了。

18.0.4 平手的处理

最后,我们是不是需要在 AnnabelBoris同时按下相同按键的时候发出一个声音呢?他们会通过观察到按键的LED灯知道现在是平手,但是如果大家想加一个蜂鸣器的话,是可以的。要去完成这个功能而不再增加开关的刀数的话,就需要三个蜂鸣器。还好蜂鸣器不贵(有些蜂鸣器还不到1美元)。大家可以如图18-9来将这些蜂鸣器加到电路中。圆形的图标就是蜂鸣器应该放置的位置。这些蜂鸣器应该是有极性的,电流只能从一个方向流过,而且应该是加直流电压才能响的那种。这个时候可不能用扬声器或者那种需要输入音频信号的蜂鸣器。

为什么需要多个蜂鸣器呢?因为如果大家只有一个蜂鸣器的话,就需要每一侧用三根线引到已有的三个开关的节点上,这样才能使得电流从一端流入,从另一端流出。这样每一组开关都能让蜂鸣器鸣叫。

18.0.5 接线

要想搭建电路,我们需要将这些点对点的电线都焊接上。开关上触点的间距可能是0.1英寸的,但是如果大家将开关插到面包板上的话,每组引脚就会因为面包板上的横向的导线而连接在一起,从而无法单独供电了。我见过的开关的引脚间距要比直插芯片引脚的间距还要小,没有办法插到面包板中间的那一路上。

18-10展示了一个用电脑渲染的常见的四刀双掷按键开关。红色的标签开头是P,它表示这是开关的刀的连接点,而对应这四个触点的另一端则是用C1C2C3C4来表示,NC表示这个触点是常闭节点,NO表示这个节点是常开节点。不管大家用的是弹簧按键开关还是自锁按键开关,这种开关通常都被称为滑块,因为内部有触点滑块。

18-11中的两个常见的原理图图标都是表示四刀双掷滑块开关的。标签则和开关的三维渲染图相对应。在右手边,竖着的条里面有绝缘材料也有导体,黑色的表示导体。这些黑色的小段会将相邻的触点短接起来。当这个小条被开关往下推的时候,就会短接不同的触点。大家可以在厂商的数据手册中看到两种符号中的一种。

18-12显示的是如何连线完成剪刀石头布的游戏电路。需要焊接的触点用黑色表示,而不使用的触点则用白色表示。部分的连线与之前的电流原理图相比被移动了位置,这是为了尽量减少线的交叉,并防止有三根电线汇集在一个引脚上。这样的位置在焊接上会有一些难度。

说明: 00161.jpeg 

18-9

每个蜂鸣器(就是图上两个同心圆的图标)会在两个与之相连的开关被按下的时候响起,表示这是一个平局

说明: 00162.jpeg 

18-10

一个常见的四刀双掷滑块开关的引脚图,其中P1P4是四个触点,而对应的连接点是C1C4。常闭节点用NC来表示,常开接点用NO来表示

说明: 00163.jpeg 

18-11

两个常用的四刀双掷滑块开关的电路原理图符号

这个电路里面没有作弊检测的功能,但是整个电路相对会简单一些(至少,开始的时候)。线的颜色与我在电路原理图中使用的颜色是一致的,当然其实用什么颜色都是无所谓的。请大家注意底部的开关和顶部的开关相比是颠倒过来的。这是因为我们需要将这些开关安装在板子或者盒子的对面,这种情况下,开关就需要旋转过来。

说明: 00164.jpeg 

18-12

六个四刀双掷开关接线图,用于简单的剪刀石头布游戏。这个版本没有作弊检测。LED灯的串联电阻没有显示

将电线焊接到开关的引脚上需要小心,防止焊锡粘连导致短路。我觉得大家如果用比24号线还要细一些的线,估计能好一些,而我给大家推荐用在面包板接线的就是24号线。我个人喜欢用彩色的排线,这种排线可以很容易地扯成单独的彩色导线。散线更容易弯折,也比较好处理,就是焊接完成后看着比较乱。

18-13展示的是我焊接的板子的底面。我的焊接看着不是很整洁,但是我们这里的目的只是做一个能用的东西出来,而我的板子确实是能用的。

说明: 00165.jpeg 

18-13

方形通孔板的底面,显示了用滑块开关连成的没有作弊检测功能的剪刀石头布电路

我用的是12VLED,内置串联电阻,这也是大家在接线上看不到任何电阻的原因。我很满意地发现可以直接将两个LED灯串联,结果LED灯的亮度也还可以,虽然说电流还是无可避免地经过了两个内置电阻和两个LED灯。

18-14展示的是同一个电路板的正面。我将LED灯的引脚留的很长,是想将这些LED灯推出外壳的盖子上钻的孔,而按键则可以通过外壳的侧边的孔来按到。在写这篇文章的时候,我还没有开始制作这个盒子。红色的LED灯指示的是哪一个开关被按下了,而看起来有点灰的LED灯亮起来其实是蓝色的,指示的是哪一位选手赢得了游戏。

我建议大家在这个项目中使用9V直流电源,因为这个电路只有在按下两个按钮的时候才会使用到电,而且即使是LED灯也不会消耗太多的电力。即使LED灯标称的是12V,实际上9V电池也是可以使用的。

说明: 00166.jpeg 

18-14

石头剪刀布电路的顶面。LED灯的引脚留的很长,是为了可以让它们从外壳的盖子的孔里面推出去

如果大家用的是通用的LED灯,需要外置串联电阻的话,可以为单独表示某一位选手获胜的LED灯配置470Ω的电阻,但是我不知道串联起来之后的LED灯用什么电阻合适。如果大家将串联电阻减小使得LED灯更加亮的话,请小心不要让电流超过数据手册中建议的最大正向电流。

18-15展示的是一个将两片通孔板安装盒子在对侧,而将LED灯装在顶上的游戏版本。这个配置将每个人的开关都隐藏起来了,对手是看不见的。盒子里面隐约可以看到一个9V的电池夹在一片塑料下面。换电池需要先将几颗螺钉拿掉,但是如果这个游戏机玩的不是太狠的话,一节电池可以用好几年的。

说明: 00167.jpeg 

18-15

一个完成版的只使用开关的石头剪刀布游戏机

18.0.6 防止作弊的布线

18-16展示的是增加了防作弊功能的开关连线图。其实加上这个功能并不会增加太多的焊接工作量,而且这个功能还是很好的。如果大家已经连接完了不带防作弊功能的版本,那么我们就只需要改变提供电源的红色和蓝色的电线。而其他的都是额外的。

说明: 00168.jpeg 

18-16

增强版的开关石头剪子布游戏连线图,包括了防作弊功能

如果还想加蜂鸣器,我就将这个任务作为课外作业了。

18-17中展示了带防作弊功能的通孔板的底面。

18.0.7 结论

开关看起来入手比逻辑门简单一些,但是到后来,开关会在另一个方面变得非常复杂。

说明: 00169.jpeg 

18-17

刚才同样的电路板,这回加入了防作弊功能

逻辑门可以按照一种逻辑的方式来组装。大家可以将自己想要的东西写下来,用与和或来表示,然后用对应的与门和或门来画图(如有必要可以加入其他的逻辑门)。最后我们来选择含有相应逻辑门的芯片并按照逻辑图中相同的方式来连接。这个事情没有太大的难度。

但是逻辑门的问题在于每一个逻辑门都不是很强大,我们需要的逻辑门的数量很大。因此电路需要很多的元器件,变得容易让人糊涂,而且也容易连线错误。

开关有一些优势。它很简单,也很容易理解,开关在断开的时候不会使用电力,而且开关闭合的时候可以传导较大的电流(相对而言)。我喜欢不需要用开关控制的电路,因为开关就是电路本身。

当需要多个功能的时候,问题就来了。这就无法避免地导致我们需要多刀开关,而连线要特别小心,否则可能会产生无可预测的结果。如果大家想去优化电路的时候,就更加要小心。

更容易出问题的是,我们如果要设计一个完全由开关组成的电路,就需要一种很奇特的直觉能力。目前还没有一种等同的逻辑系统,可以将与和或的逻辑描述转化为芯片电路的。真的,能只用开关来搭建可用电路还是太少见了。我在这里讲了这个电路,以便大家体会一下需要哪些东西。

我们除了逻辑门和开关还有别的选择吗?当然有!还有三种选择。

1.我们可以选择继电器。很多年前,整个电话系统都是基于继电器而搭建的。大家可能会认为使用继电器的逻辑电路和使用三极管的电路差不多,因为元器件本身的行为是差不多的。但是别忘了继电器是可以有多个节点的,那是和开关类似的,这样就能用一个输入来控制多个独立的输出了。

2.大家可以引入解码器,我在前面提到过。解码器内部包含很多已经连接完毕的逻辑门,这样我们就没有必要单独去处理它们了。我会在下面的两个项目中详细讲解解码器。

3.当然,我们还可以用微控制器。在石头剪刀布游戏和超感知觉测试游戏中,微控制器会让事情变得更加简单。但是和在超感知觉测试中一样,我们用了微控制器就学不到太多逻辑的东西了。

项目19:解码超感知觉

我们看一看图19-1,在这个图中,我用解码芯片将超感知觉测试的逻辑电路重新画了一下。尽管这个电路现在已经将我之前谈到的所有的功能都加了进来,也只需要三个芯片。电路一般可没有这么简单。

19.0 解码测试

那么到底是什么神奇的元器件将一切变得如此简单呢?大家搭建电路之前,我们先来测试一下解码器。我推荐使用的解码器的型号是74HC4514。我用的是HC系列的,因为每次我买芯片的时候,都想着去将这个芯片未来再做其他用途,也许可能要直接来驱动LED灯(至少在测试电路的时候)。请大家记住74HC00芯片系列可以吸取或者输出高达25mA的电流,而4000系列的芯片的驱动能力则要差很多。

不管怎么说,74HC4514是一个相对昂贵的元器件(单买的时候每个芯片价格会超过3美元),大家可能知道这个芯片有一个兄弟,老版本的CMOS芯片,型号就是直接的数字4514,用得更广而且价格更便宜。在这个项目里,由于解码器不会驱动LED灯,两个版本的解码器都可以使用。引脚分布也是一样的,参见图19-2

将芯片按照图19-3进行连接。在电路原理图的上部,我用开关而不是按键来测试电路,因为我们用按键的时候同时按下好几个可不太方便。而不管是开关还是按键,功能上都是没有问题的。面包板的版本参见图19-4

说明: 00170.jpeg 

19-1

用了解码器芯片后,超感知觉测试项目里面用的逻辑门数目就会急剧下降。实际芯片的引脚位置做了调整,目的是为了减少图中的交叉线

说明: 00171.jpeg 

19-2

适合在超感知觉测试项目中使用的解码器芯片的引脚图

说明: 00172.jpeg 

19-3

将解码器芯片设置好,用于项目室的测试。万用表的表笔可以搭接任何没有连接的引脚,参见文字中更加详细的描述

将万用表调节到直流电压挡,然后将负极表笔连接到电源地总线上,用一个两头都有鳄鱼夹或者小挂钩的连接线就可以。而万用表的另一个正极表笔则可以用来测试图中的输出引脚。

由于芯片完成的是简单的算术运算,各个引脚都有对应的值。输入的引脚分别对应的是1248。这些数字在对应的输入开关附近也有显示。而输出值则是015。大家会看到这些顺序不是按照数字大小排布的(这并不是图上画错了)。为了防止混淆,大家可以将数字写在黏性标签上,然后粘贴到电路板芯片旁边(如果大家要写得非常小的话,可以用一个细头的钢笔)。

说明: 00173.jpeg 

19-4

面包板版本的解码器测试电路。有些厂商生产的解码器芯片要比图片里面的这个芯片还要窄一些,但是功能是相同的

刚开始的时候所有的开关都是断开的。将万用表的表笔在芯片所有的输出引脚上扫一下,会发现数值0对应的输出引脚是高电平,而其他所有的输出引脚都是低电平。现在将开关1闭合,这个时候数值1对应的输出引脚为高电平,而其他所有的输出引脚为低电平。现在同时闭合开关1、开关2和开关4,并保持闭合,大家会发现现在数值7对应的输出引脚为高电平,而其他所有输出引脚为低电平。

解码器的功能就像一个小的加法机。将高电平的输入引脚的数值加在一起,然后芯片会将结果对应的输出引脚拉高。

下面是解码器芯片最重要的功能:

1248输入值是因为这样任意一个输出值只能由唯一一种输入组合来对应。

因此输出值可以告诉我们有哪一些开关被闭合了。

如果这还不够清楚的话,大家看一看图19-5,里面展示了四种随机选择的芯片可能的状态。我将图简化了,编码器上部按顺序放了输入,而编码器右侧按顺序排列了输出。红色的输入表示高电平,由开关闭合而产生。如果大家将顶上对应的高电平的数值加起来,就会得到输出为高电平的引脚对应的数值。

说明: 00174.jpeg 

19-5

解码器芯片的四个行为的样例,产生的高电平引脚输出(用红色表示)对应的数值等于所有高电平输入引脚对应值的加和。这个图里面的引脚都按照数字大小的顺序来排列了,以将过程显示得更加清晰。实际芯片上引脚的顺序不是按照次序排列的

19.0.1 回忆二进制

现在我们回到图19-1,这个图和图19-5几乎一样,只是我将输入引脚的数值进行了移动并分了组,以方便逻辑门操作。

在超感知觉测试里面,我们现在可以很清晰地看到Boris按下了哪一些按键,哪一些按键没有被按下,也可以看到 Annabel按下了哪一些按键,没有按下哪一些按键。比如说,如果解码器输出引脚1或者2为高电平的话,那就是开关A0或者A1(对应数值1或者2)是闭合的,而其他所有的开关都没有闭合。因此在超感知觉测试中,A做出了选择,而B还没有做出选择。

假设数值6对应的输出引脚为高电平,这就只能表示开关A1B0(对应的值为24)是闭合的,而其他的开关是断开的。同样的如果数值9对应的输出为高电平的话,也只能表示开关A0B1(对应的值为18)是闭合的而其他的开关是断开的。如果数值6或者9对应的输出引脚为高电平的话,表示每位选手都选择了一个开关,但是开关不是对应的,因此AB在这次超感知觉测试中失败了。

大家可以将所有的组合查一遍,并检查一下输出。

在图19-1中,大家可以看到我增加了一个额外的输出指示灯,含义是当所有的四个按键都被按下的时候,表明两位选手都作弊了。我还加了一个输出表明电路处于空闲状态,这个时候没有开关是闭合的。

解码器的输入被称为是二进制输入,因为它们对应的数值和二进制数里面对应的位置的数值是一样的。我在Make:Electronics中简单写过一些二进制的东西,因此我在图19-6里面简单地将二进制数字和解码器引脚值做一个对应关系的快速查找图。这个芯片叫做解码器是因为它将一个输入的二进制代码解码为某个十进制引脚上的高电平。

说明: 00175.jpeg 

19-6

解码器输入引脚的高低电平状态可以看成二进制数字的10。解码器的输出引脚对应的是十进制数字的值

因为一个二进制的一个数字通常被称为一个比特,而由于74HC4514(或者更老的兄弟4514)有四个二进制输入,这个芯片也常被称为四比特解码器。也可以被描述为4/16解码器,因为它有四个输入引脚和十六个输出引脚。

19.0.2 上电路板

现在的超感知觉测试电路很容易搭建。完整的电路图如图19-7所示。在这个电路中,我们可以用便宜的CMOS版本的解码器(4514)或者更加贵一些的HC版本(74HC4514,这个芯片开发的时候采用了和老式的4514相同的引脚输出)。请注意老式的CMOS芯片没有足够的驱动能力,不能直接驱动LED灯。这也是我为什么建议大家要在项目里面用万用表做一个初步测试的原因,而万用表是不会吸取多少电流的。

在这里展示的电路中,需要两个四门双输入或门芯片——74HC32,大家之前用过。这个芯片的引脚图如图15-7所示。需要的另一个逻辑芯片是三门三输入或门芯片——74HC4075,这个我们之前没有用到过。这个芯片的引脚图如图19-8所示。芯片内部连接和三门三输入与门芯片类似,对应的连接图如图16-11所示。这两个图不完全一样,大家应当根据电路原理图仔细地进行连接。

说明: 00176.jpeg 

19-7

使用解码器芯片和两个逻辑芯片搭成的超感知觉测试电路原理图

说明: 00177.jpeg 

19-8

74HC4075芯片内部的三个或门的内部连接图

如果大家参考图19-1的话,会发现几乎所有解码器的输出都经过了逻辑门才会去点亮对应的LED灯。如果我们用的是74HC00系列的逻辑门芯片的话,本身就能驱动LED灯。而如果大家选择的是便宜的4000系列解码器呢?数值015对应的输出在图中可是直接连接到指示灯的。

大家可以省略连接到数值0对应的输出的空闲指示灯。而将数值15对应的输出通过一个三门三输入或门芯片(在图19-1中未显示)再去驱动两个人都在作弊的指示灯。如果大家将一个三输入的或门芯片的两个输入接到地上,然后将信号接到第三个输入上,这个或门就直接将信号传递过去了。这个实际上是起到了缓冲的效果,输出的状态和其中的一个有效输入完全一致,如图19-7所示。

所有的LED灯共用了一个串联电阻。这是可以接受也是足够用的,因为这些LED灯在某一个时刻只会有一盏亮起。

在连接跳线的时候,我建议大家将图19-7中的电路图打印一份出来,在决定面包板上对应的连接之后,在各条线上涂上不同颜色的墨水。这样会减少接线错误的风险,毕竟这么多导线平行放在一块儿还靠得的这么近还是很容易出错的。

这个电路的面包板版本见图19-9。在这个图里面大家会看到我用的解码器芯片是一个特别宽的。有些版本的74HC4514芯片看着和这个类似,但是有一些则是普通的宽度,功能都是一样的。

说明: 00178.jpeg 

19-9

用解码器来减少芯片数量和电路的复杂度,搭建出的超感知觉测试电路

尽管4514芯片在这个电路里面应该是可用的,还是要小心以后不要将它在其他的电路中和HC芯片混用。

19.0.3 解码器输出引脚

我们回到4514以及74HC4514的引脚分布,如图19-2所示:里面有两套数字系统。黑色方框中的白色的数字是标准的引脚号,每个芯片上都有。而且总是从左上角的引脚开始,逆时针沿着芯片的边缘转。我总是将这些数字称为引脚1、引脚2等等。

我在芯片内部加的数字是这些引脚为高电平时对应的数值。比如说,当引脚22为高电平的时候,这表示有一个输入值为8,而当引脚20为高电平的时候,这表示输出为数值10

这个元器件的数据手册里面用其他的方法来确定这些引脚的功能,很不幸各家的方法都不一样,没有标准。比如说,输入引脚可能标着A0A1A2A3,也可能标着ABCD,或者是Data1Data2Data3Data4,由于没有标准,我觉得我自己的这套方法倒是能把引脚的功能说得更清楚一些。

在数据手册中,输出引脚可能用Y0Y15来表示,也可能是S0S15,类似这样的。我觉得用输出0到输出15来表示更清楚一些。我经常好奇为什么写数据手册的人会这么不愿意用三个字母,而是喜欢用一个字母。

我们回到引脚命名规则,芯片还有几个功能我还没有说到。引脚1是锁定使能引脚,低电平有效。换句话说,当这个引脚为低电平的时候,会将输出状态锁定并告诉芯片不用理会输入了,等到我告诉你去看输入再说。这个功能我们在超感知觉测试电路里面是用不到的,因此在我们的面包板原理图里面,引脚1是直接和电源的正极连在一起的。在数据手册中,锁定使能引脚常用LE来表示,但是有时候也用Strobe来表示,为什么呢?我也不知道。

引脚23是一个更通用的使能引脚,它也是低电平有效的。意味着当引脚23为低电平的时候,芯片的功能才会被使能。如果引脚23为高电平,芯片就不能使用了,由于我还是想用这个芯片,所以在面包板电路图中这个引脚是连接到电源地上的。在数据手册中,这个使能引脚常用E来表示,但是也有时候用InhIbit来表示。

解码器芯片当今用得没有以前那么多了,但是在小课题中还是很有用的。将一组开关设定位置的值,然后将开关过来的数值解码,这是一种获取用户输入的简单而强大的方法。

大家还能想到其他用解码器的应用吗?额,石头剪刀布游戏呢?这个游戏里面有六个开关,因此我们用一个六位解码器来连接会怎样呢?

这个想法会有两个问题。首先我们找不到六位解码器芯片。其次,如果这样的芯片存在的话,就会有64个输出。这太多了,特别是由于绝大部分的输出都没有相互关联的关系,它们是由于某一个选手按下多个按键的作弊形成的。我们需要将几十个输出或在一起,得到的结果才去点亮作弊灯。

不管怎样,还是有三位解码器的。也许我们可以为一组开关用一个三位解码器,另一组开关用另一个三位解码器。这样会有用吗?我的答案是也许吧。我会在下一个项目中来解释这个事情。

项目20:解码石头剪刀布

我请大家来看一看图20-1。这个电路是我能找到的搭出完整版本的石头剪刀布游戏中最简单的电路了,里面用了两个解码器,简化了逻辑,同时还保留了开关来给LED供电,还有一个蜂鸣器。因为这个电路用了逻辑门也用了开关,大家可以将其看成一个混合电路。

20.0 逻辑

我先来说一说逻辑。大家还记得在项目17的最后,我说逻辑门在检测是否有选手作弊的时候不方便,也过于复杂。那么,现在这种难点已经消失了。

在电路图中,每个开关现在有一个对应数值124的二进制码的位置,每一组三个开关会接到三位解码器的输入上。所有可能的开关组合现在可以用八个输出来表示,分别标为数字0到数字7。我将这些数字的顺序调换了,目的是为了减少电路图中的交叉线,而输出0目前没有连接。

我们现在只看一个解码器,毕竟这两个解码器的连接是非常相似的。解码器A的数值3对应的输出只有在选手A按下开关1和开关2的时候才会出现,而数值5则只有在开关1和开关4被按下的时候会出现。因此现在知道如果我们的解码器A有一个数值3或者数值5,或者数值6或者数值7的输出,选手A一定是作弊了。我们可以将这些输出通过一个四输入的与门接在一起,然后将结果发给作弊指示灯,任务就完成了。

剩下的逻辑和我之前用过的逻辑很相似,我用了对角线来连接逻辑门,是为了让这些连接能看得清楚一些。比如说,加入选手A按下了开关4(即剪刀),如果这时选手B按下了开关2(即布),剪刀剪断布,因此选手B获胜。这在图20-2中有显示,其中红色的线是电源正极。

大家可以这样来历便所有可能的组合。

但是如果两位选手同时选择了同样数字的开关,成为平手呢?这种组合不会使任意一个与门有效,因此某某获胜的指示灯是不会亮的。我选用了开关来解决这种可能性,是因为用开关连线很简单。在图20-1中,任意地将相关的线画成绿色,大家就能看见如果两个相对着的开关被按下的话,就会激活在电路图右上角的蜂鸣器。现在连线图已经变得简单了,一个蜂鸣器就足够了。

同时用来显示哪一个开关被按下的LED灯也会被开关激活。每个LED灯在电路图中为了节约空间只用了一个黄色的圆圈来表示,而且通过褐色的线来连接。LED灯是串联的,和以前一样,这样两个选手必须要同时按下开关才能让LED灯亮起来。如果平手的话,蜂鸣器会响起来,而选手们会看到对应着的两个LED灯也亮了起来。

说明: 00179.jpeg 

20-1

混合使用了解码器,逻辑门和多刀开关,这是模拟石头剪刀布游戏的最简单的方法

同时用来显示哪一个开关被按下的LED灯也会被开关激活。每个LED灯在电路图中为了节约空间只用了一个黄色的圆圈来表示,而且通过褐色的线来连接。LED灯是串联的,和以前一样,这样两个选手必须要同时按下开关才能让LED灯亮起来。如果平手的话,蜂鸣器会响起来,而选手们会看到对应着的两个LED灯也亮了起来。

我觉得这是最简单的游戏的电子化表达方式,虽然我也一直乐于接收其他的想法。

说明: 00180.jpeg 

20-2

在这个样例里面,选手A选择了石头,选手B选择了剪刀,用的是之前电路图中的开关阵列

20.0.1 要求

如果大家想出来一个不一样的系统,用的不管是逻辑门还是开关,我都乐于来看一看。只要这个系统满足以下条件:

有一个作弊指示灯,用于在某一位按下超过一个按键的时候亮起。

有两个其他的指示灯,在没有人作弊,而有一位选手获胜的时候亮起。注意我的电路是满足这个要求的,因为解码器A和解码器B的引脚1、引脚2和引脚4都只会在有单个开关被按下的时候输出高电平。有多个开关被按下则会产生不同的解码器输出。

如果出现平手,需要有一个蜂鸣器来发出声响。

每个开关都应点亮一个LED灯,表示这个开关被按下了,但是需要在两个选手都做出选择之后才能亮起来。

20.0.2 一个无法获得的或门

这个游戏在图20-1中的版本现在需要六个开关或者按键、两个解码器、两个四门双输入与门、一个三门三输入或门、和一个双门四输入或门。加在一起,芯片的数量比起我仅仅用逻辑芯片来完成的时候要少很多了。而且电路也比较容易去搭建和理解了。

如果大家想将这个电路搭起来,也应该是很简单的。

但是等一等,为什么我说应该呢?原因在于虽然应该很简单,但是其实并不简单!问题在于能不能找到对应的器件。

双门四输入或门在HC系列里面是没有的(双列直插DIP封装的)。只有老式的CMOS4000系列里面有,而它的驱动能力又不足以驱动LED灯。

这个是很烦的,但是也不是一个不寻常的事情。任何一个设计过电路的人都曾有过想要的元器件不存在或者咨询供应商,却被告知已经不生产了

这个电路里面其他的元器件呢?能找到吗?

74HC237是一个HC系列的三比特解码器,找到没有问题。

我们用过HC系列的三门三输入或门芯片,也用过同系列的双输入与门芯片,因此我们也知道这两个也是有的。

那就只有这个双门四输入或门芯片是个问题。

怎么办呢?大家可以用其他的逻辑门来模拟,用或门来模拟特别简单。图20-3展示了如何用三个双输入或门来组合并完成一个四输入或门相同的功能。因此我可以将四输入或门用这种方法来替代。

但是还是有点烦人,这需要两个四门双输入或门芯片,而不是一个双门四输入或门芯片了。我希望所有的芯片都能放到面包板上去。这会是个问题吗?

说明: 00181.jpeg 

20-3

三个双输入或门这么组合的时候和一个四输入或门有着完全一样的功能

20.0.3 或非门拯救了世界

这些(无法获得的)四输入或门都在说:如果解码器的引脚3、引脚5、引脚6或者引脚7为高电平的话,意味着两个或者更多个按键被按下了,这就是作弊。但是我们想一下这句话是什么意思。如果引脚3、引脚5、引脚6或者引脚7是高电平的话,这就意味着引脚0、引脚1、引脚2、引脚4都不是高电平,因为这几个就是剩下的可能的引脚了。换句话说,我们可以不用去看哪些输出引脚是高电平来决定是否有人在作弊,我们可以看其他引脚上没有高电平。这其实是同一件事情。

一个四输入的或非门,接上数值0、数值1、数值2、数值4对应输出得到的结果,与一个或门接上数值3、数值5、数值6、数值7对应输出得到的结果是一样的。而且知道吗:HC系列里面是有双门四输入或非门芯片的,它就是74HC4002

为什么有四输入或非门芯片,但是却没有四输入或门芯片呢?我不知道。而且我是怎么知道每个系列里面有哪些种芯片和逻辑门呢?因为维基百科有一页,专门列出来存在的各个逻辑芯片。只要搜索一下7400系列集成电路列表就有了。很方便!而且在确认这个芯片理论上存在之后,我就可以到类似www.mouser.com这样的供应点去看看事实上这个芯片是否还在生产并提供销售了。

20-4展示的是改进后的连线图,将或门改成了或非门。每个解码器的输出引脚中对应数值3、数值5、数值6和数值7的引脚没有被连接。

说明: 00182.jpeg 

20-4

改进的使用两个四输入或非门,而不是两个四输入或门的连线图,HC系列里面现在已经没有直插封装的四输入或门芯片了

20.0.4 将简化版的方案搭出电路来

现在逻辑已经确定了,是时候将搭建电路了。我们需要两个74HC08四门双输入与门芯片,这是我们之前用过的型号。内部的工作图见图15-7(这些芯片中的两个与门会闲置不用)。大家还需用一个74HC4075三门三输入或门芯片,这个我们在项目19里面遇到过(参见第19章),内部连接如图19-8所示(这个芯片里面的第三个或门芯片也闲置不用)。最后一个逻辑芯片是要用到74HC4002这个双门四输入或门芯片,引脚图如图20-5所示。

说明: 00183.jpeg 

20-5

74HC4002双门四输入或非门芯片的引脚图

当然我们还需要两个74HC237解码器芯片。图20-6展示了这个元器件的引脚图。注意这个芯片有两个输出使能引脚,其中的一个是高电平有效,另一个则是低电平有效。两个都得有效才能有输出。因此引脚5需要接到地上,而引脚6则要接到面包板的电源正极总线上。

说明: 00184.jpeg 

20-6

74HC237解码器芯片的引脚功能

引脚4可以锁定输出,使得芯片暂时不在关注输入的变化。由于引脚4是高电平有效的,我们应当将其接地,使得解码器能随时响应。

我用了和图19-2相同的引脚命名词汇。输出分别标为输出0到输出7。输入则用的是对应的二进制位置对应的数值来表示,分别是输入1、输入2和输入4

有了这个信息,现在来搭这个混合版本的石头剪刀布的面包板电路就相对简单了。再一次我将开关放在了单独的原理图里面。大家可以在图20-7中找到它,而开关的连接线见图20-8

真正的滑块开关被装在通孔板上,如图20-9所示。

开关的输出(标着A1A2等等)连接到有着相同标签的芯片的输入上,见图20-10

通常情况下,我想大家也知道,我画原理图的时候会将元器件画在面包板上应放置位置附近的地方。这一次我只能违背这个原则了,因为在这页纸上没有足够的空间不能在竖着一列里面放下所有的芯片。因此我只能将解码器芯片转一下。

说明: 00185.jpeg 

20-7

开关的输出被连接到面包板电路原理图中对应相同的标签上

说明: 00186.jpeg 

20-8

将之前电路图中的滑块开关连接起来。右侧的连接器可以用于连接这个电路和包括电源正负极的面包板主电路

说明: 00187.jpeg 

20-9

用于连接混合版石头剪刀布游戏的滑块开关。侧边的连接器用于将这个电路板和游戏的主面包板连接起来,主板在右方灰色区域的背景中

说明: 00188.jpeg 

20-10

混合版石头剪刀布面包板原理图

但是所有的元器件都能放在一个面包板上。电路如图20-11所示。为了测试方便,我用了六个很小的触动开关,每个可以放在面包板的一列上。大家可以在图片的顶部看到很小的黄色和红色的按键。因为这些是单刀单掷开关,没有办法连线形成一个平局或者是点亮一个LED灯。大家需要图20-9中的那种多刀开关才能完成这个功能。

说明: 00189.jpeg 

20-11

面包板版本的混合石头剪刀布原理图

20.0.5 制作更多内容

因为我从来不会拒绝去想一些小的额外功能来加到项目里面,我突然想到这个电路里面的开关可以有额外的功能。三刀滑动开关或者按键其实还是相对少见的。几乎肯定的是,我们需要用四刀按键开关,并将其中的一个刀空着不连接。我们能将这个空着的刀用来做一些有用且有趣的事情吗?

大家可以用它们来打开其他电路的电源。在全开关版本的石头剪刀布里面,我发现没有单独的开关让人很舒服。按键连接到电源上,同时也决定了每个游戏的结果。

大家也可以在混合版本的电路里面这么做。将选手A的开关限制触点并联连接到电源的正极侧。这样如果有开关被按下的话,就会将电源连接到一条独立的电源总线上,从而给解码器和逻辑芯片供电。选手B的开关也可以同样的连接。只要每个人都按下一个开关,逻辑芯片就能上电并准备好来解读开关输入了。只要开关被松开,系统就自动地掉电了。

我搭建了这个改进版了吗?没有,我没有着手去做。这也是为什么我在画提纲的原因,大家自己回去将这个功能加上吧。

20.0.6 逆解码

大家如果在网上查找解码器的话,可能也会看到其他三种芯片:编码器、复用器和解复用器。这个很让人困惑,因为一个同样的芯片可以被称为解码器,也可以被称为复用器,那么到底什么是复用器呢?

我在这里的工作就是消除疑惑(或者至少降低到可接受的水平),因此这就是我下面接着要讲的话题。

项目21:接电槽位游戏

之前,我提到过硬币是没有记忆性的,每次去抛的时候,结果是字还是花都是一样的概率(参见第17章)。而且一直是一样的概率。同样地,传统的幸运转轮也不会记得之前转的时候到底停在了哪里,只要每次都是随机地转动的话,每次停在某一个数字前的概率都不会变化。

并不是所有的游戏都是这样子的。举个例子,如果大家玩过战舰游戏,大家都知道在游戏中获胜的概率是变化的,特别是在你将很多空白的方块都清除掉之后,对手的战舰已经无处可藏的时候。

我决定去做一个两个人玩的硬币游戏,但是要让概率有变化。刚开始的时候赌注会比较低,获胜的概率也比较低——但是当每位选手添加上更多的硬币之后,赌注变大,同时赢钱的概率会逐渐变大。我觉着这会增加游戏的紧张程度和戏剧效果,即使我们只是用棋子玩而不是用钱来玩。

这就是接电槽位游戏的由来。

如果大家读过Moke的游戏,可能会记得有一个专栏讨论过一个游戏,用硬币来完成一个电路并获得奖励。这个接电槽位游戏用的是相同的基本想法,但是从另外的任何角度来看都是有很大区别的。

21.1 复用

这个游戏让我能信守承诺给大家介绍复用器。复用是一个口语的词汇,人们常它用来描述这个元器件。我们可以选很多种复用器,但是在这个项目中我选的是4067B,这是一个很传统的CMOS芯片,但是和很多那个年代的CMOS芯片不同,这个CMOS芯片的输出电流可不低。大家可以将其想象为电流流经的通道。

4067B插到面包板上,然后加上四个开关和下拉电阻(见图21-1)。这个和4514解码器的测试电路非常相似(见图19-3),只是现在不是十六个输出引脚,而是十六个通道,用作输入来使用的。

开关放在底部是因为和开关相连的引脚也在芯片的底部。这么摆放使得电路图尽可能地清爽。

大家不需要用万用表来测试复用器,因为这个复用器驱动LED是没有问题的。驱动引脚是引脚1,被称为共用输出/输入引脚,原因我会在后面说明。LED上串联了一个电阻用来限制LED灯的电流,还加了一个可调的变阻器,用来展示我们可以改变电流。

连接变阻器的电线是弯曲的,意思是这是一个灵活的跳线——这种跳线两头都有一个插头,是我们一般情况下不会去使用的。我将这种跳线称为移动跳线,因为我们需要这个跳线能移动位置。现在,跳线的头上标着J2,插在电源负极总线上。如果大家没有这种条件的话,可以使用一根24号的硬质单芯连接线,每一头的绝缘层剥去1/4英寸长就行了。

说明: 00190.jpeg 

21-1

测试模拟复用器的简单电路

在电路图的右侧,我们可以看到另外一根移动跳线。我希望大家可以用这个跳线标着J1的一头来搭接数值015对应的各个通道的引脚。

大家可以用9V直流的电池来给电路供电。这个电压是没有必要做稳压处理的,大家也不需要去耦电容。但是CMOS芯片对于静电是很敏感的,所以在上手之前给自己做好常规预防接地工作还是很重要的。

21.1.1 移动接线

现在,我们来看看如果将开关2和开关4闭合会发生什么。如果这些开关和在解码器中的开关的用法一样的话,就应该能激活数值6对应的通道,因为这个通道的数字就是将已经闭合的开关对应的数字加起来得到的。

果然是这样,当大家将跳线J1搭接到通道6上的时候,就能看到LED灯亮起来了。电源正极的电流流经正极总线,通过J1流到数值6对应的通道中。芯片的内部连接使得电流流到共用输出/输入口对应的引脚1,然后流经串联电阻,再流出J2流进电源负极总线。

调整1kΩ的变阻器,会发现LED灯的亮度会发生变化。注意大家可不只是在调整输出的电流,大家还需要调整给整个芯片供电的电流。我们可以加上一个万用表,设置为mA挡,串联在J1上,然后会发现输入侧的电流和输出侧的电流都变了。

我们为了完成这个目的确实也付出了一点点代价。这个芯片扣除了一部分的电压自己消耗了,大家可以将万用表设到电压挡,然后测量引脚6和共用输出/输入引脚之间的电压就能发现。

现在到了有意思的地方了:

J1和任何其他通道的引脚搭接,LED灯应当会是暗的。

如果大家改变开关的组合的话,会有不同的通道引脚有效。

将所有的开关都闭合,这些开关的对应数值总和(8+4+2+1)会让数值15对应的引脚有效。

大家现在学到了什么,还有什么需要知道的?

21.1.2 复用器基本知识

这个复用器和解码器一样,有四个二进制的控制引脚。

但是复用器看起来和解码器是相反的。编码器不是将电流输出到数值0到数值15对应的引脚上,而是接收从数值0到数值15对应的引脚进来的电流。这些引脚在芯片内部通过各个通道进行连接。

控制引脚的高低电平状态会选择一个通道。

这个被选中的通道会将输入的电流传到共用引脚。

没有被选中的通道不会有电流流通(事实上还是会有一点点的漏电流,但是可以忽略不计)。

最大的电流输入是25mA,但是这个值在电压提升的时候会降低。每个起传递作用的三极管的标称功率的最大限制是100mW

芯片使用的电源输入可以在320V之间。

大家在某一个通道上加的电压必须在芯片电源的正极电压以下,负极地以上。

想象复用器的一个比较好的方法是将其想象为一个旋转开关,如图21-2所示。在这个图中,对应数值2和数值8的控制引脚是任意选择的,这样使得内部的通道10和共用输出/输入引脚连接在了一起。

说明: 00191.jpeg 

21-2

复用器的工作方式和旋转开关类似。当二进制码加到控制输入时,紫色的连接就被建立起来了

21.1.3 复用器引脚

4067B的引脚图在图21-3中用更加正式的方式展示出来了,都标注了引脚编号。控制引脚还有标着1248,因为这些是它们对应的二进制位置对应的值(在数据手册中,这些引脚可能标着ABCD)。通道引脚上面标着通道0到通道15(数据手册上可能会用Y0Y15来表示,也可能用类似的其他符号)。

说明: 00192.jpeg 

21-3

4067B复用器引脚图

除了我已经描述过的引脚,还有一个禁止引脚,位置在引脚15。这个引脚是高电平有效的,含义是当这个引脚连接到电源正极的话,芯片就不会对控制引脚有反应了。我不希望这种事情发生,因此在测试电路里面,这个禁止引脚是连接到地上的。大家可以试试将这个引脚连接到电源的正极上,那个时候芯片会将内部的三极管都关断。

21.1.4 复用器应用

我将在我脑子里面的硬币游戏中使用这个复用器。但是这个复用器在通常情况下用在什么地方呢?

考虑下这个芯片的能力。根据芯片的控制输入,它可以选择多达十六个输入中的一个,并将信号通过公用引脚送出去——非常快。事实上,芯片速度是如此之快,可以将两个或者四个甚至更多个独立的电信号放在通道引脚上,然后按照顺序每次对一个通道进行采样,然后将其合并成一个单独的输出通道。因此,一根线上可以携带两个、四个甚至更多的信号。当然,在另一头我们就需要将输入的信息流还原成原始的通道了。为了达到这个目的,我们需要……一个解复用器。

而我在这里说的这个复用器4067B,同时也可以当作解复用器来用,因为这是一个双向芯片。这也是在引脚图上的通道引脚上标着输入或者输出,也是为什么共用引脚标着输出/输入。复用器不管到底电流是从哪个方向流经芯片的。

大家可以通过稍微更改测试电路来证明这一点,如图21-4所示。现在移动跳线J1插在电源负极上,而移动跳线J2插在电源正极上,LED被掉转了一个方向,以便对从正极流入的电流进行反应。

说明: 00193.jpeg 

21-4

当跳线J2插到电源正极总线上的时候,大家可以这样来展示复用器的双向能力。用J1来给电源负极总线注入电流。大家不要忘记将LED的方向反过来,这样正负极方向才能和电流的方向相同

大家可能会想为什么复用器不被称为复用器/解复用器,毕竟这个芯片这些功能都有。额,如果你去看看数据手册的话,会发现这个芯片确实通常被称为复用器/解复用器——但是这个名字太长了,大家都是简单的叫它复用器。

复用器在我们需要在多个输入之间做慢速切换的时候也会用到。比如说在计算机内部,复用器可以用来选择一路或者两路或者多路的视频输入。

在立体声系统里面,复用器也可以用来从CD机、DVD机、MP3播放器或者其他的音频信号来源之间选择一路。根据施加到控制引脚上的二维控制码的不同,复用器可以选择一个输入并将其连接到共用输出引脚上。这在以前都是通过机电旋转开关或者是按键开关来实现的,但是固态开关设备要更加可靠,而且不会带来开关触点常见的噪声。

立体声系统有两个音频通道(如果你有一个带杜比5.1的家庭影院系统的话,还会更多)。为了满足这个需求,大家可以去买带有两个或者更多开关的复用器,同时用同样的一组控制输入来控制。这些复用器可以用来和带多个转的旋转开关来对比,所有的转盘都是用同一组控制轴和旋钮来控制的。

21.1.5 模拟复用器与数字复用器

4067B是一个模拟复用器。意味着这个复用器可以通过并保持交流信号,这个信号在某个中间值上下波动。比如说,大家可以用复用器来连接简单的音频信号,然后将输出分不到家里不同的房间里面。

数字复用器也是有的,数字复用器的输入必须是在通常逻辑芯片的输入高低电平范围内。数字复用器然后会用控制引脚上的二进制码来选择一个通道(和模拟复用器一样),然后去看这个信号究竟是高电平还是低电平。但是芯片是产生自己的输出信号,保证输出与数字规范相符合。

数字复用器是不能反过来用的。通道能接受输入,而共用引脚提供的是输出,这就结束了,交流信号是没有办法使用的。

由于数字复用器是没有办法返回来用的——那么如果要在另一头将解码输出出来怎么办呢?唔,用解码器啊!解码器的控制输入可以和流入的数据包的速率同步,这样就能将数据流分成正确大小的数据段了。

解码器实际上和数字的解复用器是一回事,但是解复用器这个词很不常用。同时数字的复用器和编码器也是类似的。这也是为什么电子元器件提供商通常将编码器、解码器、复用器以及解复用器放在同一个类别里面的原因。供应商不会详细地把所有的不同种都分得一清二楚的。他们常做的就是将所有可选的都列出来,然后说你看着挑吧

为了帮助大家来选择,我们这里做了一个总结。

21.1.6 复用器各种变种的知识回顾

解码器可以有两个、三个或者四个的控制输入。这些引脚上的二进制码会从一系列对应数值0往上的输出引脚中选中一个。选中的输出引脚会呈现出高电平。其他的输出引脚则是低电平。解码器是一个数字设备,用的是高低电平。对应的输入和输出的方向是无法反过来的。

一个编码器是解码器的逆元器件。编码器有多个输入,每个输入都对应一个十进制的数值,从0往上排。在某一个时刻只有一个引脚为高电平输入。编码器将这个输入的值转化为两位、三位或者四位的二进制数字,并通过两个、三个或者四个输出引脚来输出。这是一个使用高低电平的数字元器件。其输入/输出方向是不可反向的。(我们这本书里面还没有讲到编码器,但是后面会讲到。)

数字复用器和编码器类似,接受的是来自一个序列的引脚的输入,每个引脚对应一个十进制的数值,从0往上排。但是只有一个共用的输出引脚。这个两位、三位或者四位的控制引脚的状态决定了哪一个输入引脚去和输出引脚相连。这是一个使用高低电平的数字元器件,对应的输入/输出方向不能反向。

模拟复用器和数字复用器相似,但是却不会自己去产生输出电压。这个元器件就是我们在上面的项目中测试的元器件。这个元器件只是将一个选中的通道的引脚的状态通过内部连接传递给共用引脚。这样,模拟复用器就是一个用数字控制的圆盘开关。交流信号和直流信号都可以使用,电压的允许幅度也比较宽,电流的方向也是可以反过来的。

模拟解复用器通常就是用模拟复用器,只是将共用引脚当作输入,而将选中的通道引脚用作输出。

数字解复用器通常是和解码器是一个器件。

21.2 游戏设计

我在开始搭建接电槽位游戏之前还得解释一大堆东西。但是我想象的游戏是这样的,我会有一个盒子,里面有十六个槽位,每个槽位都足够大,可以放一枚硬币。当一枚硬币被塞进这个槽位的时候,硬币就会将两个内部的触点导通。

这些槽位中的一个会被随机选来接电。这就是接电槽位。这个槽位会在游戏开始之前通过复用器来加电,而玩游戏的两个人是不知道哪一个槽位加着电的。

说明: 00194.jpeg 

21-5

系统选择一个随机数,然后通过复用器来翻译,最终选择十六个硬币槽位中的一个

每一位选手要做的事情包括将硬币按到某个槽位中,如果这个不是加电的槽位的话,那么不会有任何事情发生,然后轮到下一位选手来放硬币。选手们交替的投入硬币直到某一位选手选中了加电槽位,这个时候蜂鸣器会响起来。获胜的选手可以将目前槽位中所有的硬币取走。然后某一位选手按下一个按键来复位游戏,复用器会重新选择一个带电槽位,然后游戏重新开始。

在图21-5中,大家可以看到这个游戏过程的简单的流程图。555定时器运行在振荡模式,每秒钟产生大约50000个脉冲——就是50kHZ的频率。定时器会驱动一个计时器芯片,从0数到15,然后再重头开始数,并将这个作为一个四比特二进制数输出。这些四比特数字会连接到复用器的四位控制输入上。

选手按下一个按钮,就会允许计数器开始运行。然后在任意时刻停下计数器。这也是为什么槽位的编号会是随机选择的。我在Make:Electronics中用了相似的方法,大家如果读过那本书的话,这套方案应该会很熟悉。

21.2.1 槽位计数

我希望复用器来使用9V的直流电源,这样可以使得其内阻的影响降到最低。有没有计数器芯片也能用9V电源来供电呢?有的,确实有。4520B计数器就是另一个老式的CMOS元器件,现在还在大量生产。其对应的引脚图如图21-6所示。

说明: 00195.jpeg 

21-6

CMOS4520B芯片的引脚图,这个芯片重复地从十进制的0数到十进制的15,并将运行的总数用四位二进制输出来表示

4520B实际上里面有两个四比特的计数器,这两个计数器来能串接起来用作八比特计数器,可以从0数到255。我们这里只需要用四个比特,因此我不会用到另一半的芯片。在图21-6中,我随意地将其中的一个计数器命名为A,而将另一个计数器命名为B。生产商的数据手册可能也会是这样来表示,也可能有不同的标法。我还是将计数器的输出按照对应的在二进制数字中的位置对应的值来命名(1248)。数据手册中可能常常将其命名为Q1Q2Q3Q4,或者是用类似的某个命名方案。这个没有标准。

复位引脚(高电平有效)会将所有的输出复位到0,这个功能我们用不到,因为我们需要的是一个随机的任意输出,因此在接电槽位游戏里面,复位引脚需要永远接在电源负极侧,禁止这个功能。

使能引脚也是高电平有效的,意思是当正电源被连接在使能引脚上的时候,计数器会运行起来,当使能引脚接到地上的时候,就会保持结果停止运转。这个功能在接电槽位游戏里面被用来停止计数器,从而随机选择一个槽位。

时钟引脚在信号从低电平转化为高电平的时候,会使得计数器值增加(如果需要高电平向低电平转化的话,可以将时钟信号接到使能引脚上,而将时钟输入保持为低电平。这个功能在我们的接电槽位游戏中也不会用到)。

21.2.2 电路设计

大家现在可以来设计这个从015间数字随意选择的电路了。面包板的部分见图21-7所示。

计数器和复用器都是CMOS芯片,供电电压是一样的,因此可以直接对接没有问题。这两个芯片还可以和555定时器的输出兼容。唯一可能的问题来源是双极性的555定时器可能会产生一些电压的毛刺,而这些毛刺可能会被计数器捕捉到并误以为是时钟信号。在定时器的电源引脚和地之间放置一个100μF的电容会解决这个问题。大家要保证这个电容能越靠近电源引脚最好,同时电容的管腿要越短越好。

当左上角的电源开关被闭合的时候,LED灯会亮起,555定时器会立即开始通过耦合电容向4520B计数器发送时钟脉冲。但是计数器引脚2(使能引脚)上的10kΩ的下拉电阻会阻止计数器开始计数。

说明: 00196.jpeg 

21-7

接电槽位游戏电路的面包板部分

为了选择一个随机的数字,按键必须要按下。这样会使计数器的引脚2直接和电源的正极总线连接起来,从而盖过下拉电阻的影响并使能计数器。这时计数器会响应从定时器过来的脉冲流。当按键被松开的时候,计数器又被禁止工作了,并停在了一个随机选择的数字上。LED灯又亮起来了,表示游戏已经准备好了。

定时器停下来的数字被连接到了4067B复用器,并通过内部连接将选定的通道引脚和共用输出/输入引脚连接起来。共用输出/输入引脚是从电源正极总线来取电的,电源从电源正极总线流出,通过通道引脚(因此如果大家想要精确地描述的话,现在复用器已经被当作解复位器来用了)。

十六个通道引脚和十六个硬币的槽位相连,如图21-8所示。电路图中左侧的数字表示的是与复用器对应的同样数字的通道引脚相连。

说明: 00197.jpeg 

21-8

在这张电路图中,每一对触点都表示接电槽位游戏中的一个硬币槽位。一个硬币可以让两个触点之间形成电气连接

因为同一时刻只有一个通道会从复用器获得电源,所以同一时刻只有一个槽位是带电的。当硬币被插入到这个槽位中时,会导通电路使得电流流经蜂鸣器到达电源地。这个地必须是从面包板过来的负极地才能完成整个电路。如有必要,在蜂鸣器上可以串联一个电阻,来限制电源消耗在15mA左右,从而避免复用器过载。

当硬币被取走之后,蜂鸣器就会停止鸣叫,这个时候面包板上的按键需要再次被按下,这样就会重新选择一个随机数,否则,带电的槽位还是上一局游戏中的那个。

搭建带电槽位游戏的电路实际上是一个很简单的活儿,因为电路一共只有三个芯片。制作硬币槽位倒是更加有难度的。如果大家只是想去测试一下电路,不是真正去玩游戏的话,可以用两个八路双列直插的开关来代替硬币槽位,然后每次闭合一个开关来模拟增加硬币的过程。这在图21-9的面包板版本的电路中有展示。我用了柔性的连接线来连接复用器和双列直插开关,因为我将这些看成是暂时的连接。比较理想的是用一个17线的排线(第17根线是从开关到主电路的地的连接)。

说明: 00198.jpeg 

21-9

面包板版本的接电槽位游戏,使用了双列直插开关来代替硬币槽位

21.3 槽位设计

我在《爱上制作》系列书里面有关于硬币槽位的文章,我建议使用的槽位设计如图21-10所示,用的是我从一长段直角薄铝条截下来的小段,铝条是我从五金店买的。很自然的,要凑够十六个槽位,我们需要做四组这样的组件。

说明: 00199.jpeg 

21-10

简单版本的硬币槽位,用于接电槽位游戏,这个做起来相对简单,但是可以保证和硬币的可靠连接

大家可以用一小段木头来替代我用的ABS塑料,这些槽位可以安装在盒子里面,顶盖上对应的开个开口。如果大家能有一个更漂亮的设计,不用将硬币用夹在原地的话,我建议大家就用你自己的方案。最终我会将我的这个项目改成使用红外线传感器,来探测有没有硬币,但是那得到项目31才会谈到。

21.3.0 接电槽位测试

当我们在测试电路的时候,我建议大家开始的时候使用一个比较大的电容,比如47μF,用来当成555定时器的定时电容,这样可以让定时器走得慢一些。在定时器的输出和计数器的四个输出上加上LED灯(这些LED灯可以共用一个1kΩ的电阻,这样就不会影响到电路的电压)。大家可以在图21-9中看到我就是这么使用LED灯的。

当电路图中的双刀双掷按键开关没有被按下的时候,用万用表去测量一下现在复用器的哪一路通道加着电,并看看对应的数值是不是和二进制输入的数值一致。

一旦大家确定这个游戏在正常运转的话,就可以将正确的电容换进去,加快定时器的速度,并拆掉LED灯,这个时候就可以开始游戏了。

21.4 谁会获胜

假定电路按照预想的方式在运行,还是有一个非常重要的问题没有解决:当两个人在玩接电槽位游戏的时候,这两个人获胜的概率是不是相同?或者是不是某个先操作(或者后操作)的人会有优势?

弄明白这个过程和设计逻辑电路的过程是一样的。第一步是将游戏非常清楚地描述出来。

第一个将硬币投入的人有十六个槽位可以选择,因此只有十六分之一的概率赢得比赛。

因此在第一轮比赛结束的概率是1/16

换句话说,有15/16的概率,第一个选手会没有放准位置,这样,第二个选手会开始他的回合。这个时候有十五个槽位,因此第二个选手有1/15的机会赢取比赛。

那么比赛在第二轮结束的概率有多少呢?这需要满足两个条件。

第一位选手没有选对槽位。这个概率是15/16

第二个选手选对了带电槽位,这个概率是1/15

要想知道这些事件同时发生的概率,我们需要将这些概率乘起来。如果C是比赛在第二轮就结束的概率,那么

C=15/16×1/15

如果你还记得高中学的数学的话,那么两个15会抵消掉,因此

C=1/16

换句话说,游戏在第二轮结束的概率是1/16

我会再往前走一步。选手2在第二轮赢得比赛的概率是1/15,因此他没能赢得比赛的概率就是14/15。如果这就是事情的进程的话,那么又轮到选手1来尝试了,由于现在只有十四个槽位空闲了,所以他在第三轮结束比赛的概率是1/14。如果C是这个事情发生的概率的话,那么:

C=15/16×14/15×1/14

1514又抵消掉了,因此

C=1/16

事实上,这个游戏在第一轮结束的概率,在第二轮结束的概率或者在任意一轮直到第16轮结束的概率都一直是1/16

我并不是说在大家下赌注的时候,每次选对带电槽位的概率是一样的。事实上是反过来的,这个概率在游戏不断进行的时候是不断增大的,因为剩余的空闲槽位越来越少。我说的是如果大家来玩几十局甚至几百局这个游戏,会发现这些游戏有十六分之一会在第一轮结束,也会有十六分之一的机会在第二轮结束,以此类推。

从直觉上来想,这个结果我觉得有点奇怪,因此我写了一个小的BASIC程序来模拟1000次游戏,计算机语言中的随机数生成程序常常会得到值的不均匀分布,因此我模拟了好几次,并确定我的数学结果是正确的。

大家暂时先不管这个不太符合直觉的事实,让我想想每位选手会赢得多少的硬币。

21.4.1 胜利成果

第一位选手放下第一个硬币,假设他很幸运,第一次就直接选中了带电的槽位。他能赢的就是他自己的那枚必须塞进去的硬币。因此他只是将自己的硬币拿回去了。这种情况下他没有赚到任何钱!

如果第一个选手没有能成功,那么第二个选手会放进一个硬币,如果他赢了,他就会将自己的硬币拿回去,同时也将对手的硬币拿回去了,因此钱翻倍了。很明显地,第二轮获胜的奖励要比第一轮获胜的要大无穷倍。

但是假设最先的两轮都没有成功,那又轮到第一位选手了。如果他这次选对了带电的槽位,他就会将他刚放进去的和在第一轮放进去的硬币拿回来,同时还会拿到对手在第二轮放进去的硬币。因此他拿到了自己的两个硬币和对手的一个硬币。他的总赌注的利润率是50%

再来,如果前面三轮没有人获胜,而第二位选手赢得了第四轮,那么第二位选手就会拿走他的两枚硬币和第一位选手的两枚硬币。这样,他又将自己的钱翻番了。换句话说,他的利润率是100%

那么第二个选手肯定是占优势了!但是如果我们将这个情况长期地来进行一个平均,优势有多大呢?

说明: 00200.jpeg 

21-11

这张表展示了每位选手赢钱或者输钱的情况,对应游戏在第一轮直到第十六轮结束的情况,并平均计算。平均来算,第二个选手每场比赛会赢半个硬币

21-11展示的是每一种可能的比赛结果,比如说,如果游戏在第一轮结束,选手1放进去一个硬币,并选对了接电槽位,那么他将自己的硬币拿回去。他的总赢钱(扣除自己的硬币)是0。选手2还没有放硬币,因此他的总硬币是0,赢钱也是0

表中额外的最后两行是将每一列的数字加和起来并除以16,来看每位选手每局比赛的平均结果。记住,游戏在每一轮结束的概率是同样的,不管是第一轮,还是第十六轮还是中间的任何一轮。因此,平均结果告诉我们每局比赛里面每位选手预期的赢钱数和输钱数。

最后一行的数出来了,选手1每局比赛会输掉半个硬币,而选手2则会赢得半个硬币——平均而言。

21.4.2 理解概率

这个奇怪的结果背后的原因是选手1需要先放硬币,这是一种劣势:他在选手2放棋子之前就冒了失去一个棋子的风险了。这种劣势每次选手1操作的时候都会持续。他总是在对手冒风险之前自己去冒一个硬币风险了。因此,正如大家在表中看到的,当到了游戏结束的平均时间的时候,选手1平均已经放下去九个硬币,而选手2才放下去八个硬币。

由于选手2每用64个硬币会赢得八个硬币,他就可以将自己的投资利润率的期望值设定在8/64=0.125,或者说12.5%。这个概率和拉斯维加斯的硬币机赚钱的利润率差不多,但是比轮盘赌的赌场的利润率的高两倍还不止,轮盘赌会将36/38=95%的赌客们的钱返还,因此利润率在5%(事实上这个计算还要更复杂一些,因为绝大部分赌场在轮盘赌里面000出现的时候的概率是不一样的,但是概率还是相当接近的)。

我个人并没有去玩过概率的游戏,因为正如这个游戏展示的,玩家获胜的概率总是不高的。不管你觉得自己有多么的幸运,概率的数学总会在最后将你击倒。

假如你不懂任何接电槽位游戏的任何东西,而一个朋友邀请你来玩这个游戏。假如你的朋友说:既然你是个新手,我让你先来。多么好的朋友啊!他的话听起来他在让你,毕竟你会有先找到接电槽位的机会的。但是事实上先走是一个劣势,正如我们的推导。很明显,他不是一个多么好的朋友。

如果有个人靠玩接电槽位游戏来赚钱是不是值得呢?假如两个人在用便士来玩,每个人开始的时候都是100便士。由于选手2有着每局比赛半个便士的优势,他或者她会期望在200局内将选手1的所有便士都赢走。

这听起来挺耗时间的。加入每个人放一个硬币需要两秒钟,然后需要10s钟将槽位中的硬币都取出来并重启游戏准备下一局。由于比赛会平均在八局结束,每局比赛会耗时大约不到30s200局比赛就会花费一小时四十分钟。这可是花了很长的时间才赢了一个英镑。

但是,如果棋子一个是25美分,而不是便士的话,选手2就能期望每小时赚15美元。如果选手们用的是棋子,价值分别是,比如说1美元,选手2就能期望在每小时从对手身上赢得60美元。(当然,他得要说服对手每局比赛都先走。)

再一次地证明,这个信息很明确:在赌博之前,先算一下数学。

21.4.3 背景:不同的游戏阵列

如果选手2在有十六个硬币的游戏中的优势是12.5%,那么如果在游戏中硬币和槽位的数量少一些或者多一些,这个优势还是一样吗?

不是的,这个时候优势就不一样了。想知道为什么,我来举一个极端的例子。如果只有两个槽位。在这个比赛中,先走的人如果获胜就能将自己的硬币拿回去,否则就是第二个人赢走了。因此第一个选手赢不到任何东西!平均上他会赢得一半游戏,输掉另一半游戏,因此在平均的每一场游戏里面,他会输掉半个硬币,而选手2则会赢得半个硬币。

事实上,不管有多少个硬币或者槽位(只要是一个偶数),选手1总是会每场比赛输半个硬币,而选手2则平均每场比赛赢半个硬币。加更多的硬币和槽位只是让比赛持续时间更长,选手2必须付更多的棋子才能赢回那半个硬币。

硬币和槽位更多的话,会有助于掩饰选手2的优势。在两个槽位的比赛里面,这种优势变得尤其明显。在十六个槽位的比赛里面,这种优势就一点都不明显了。

21.5 那么用微控制器呢

是的,用微控制器也是可以来运行这个游戏的,但是我不认为会更简单。大家的微控制器可能会有少于16个的输出,来驱动接电槽位游戏。你可能需要四个输出来提供一个二进制码,从00001111,然后还会需要一个解码器和模拟复用器或者解复用器。

请大家记住微控制器的额外花销,还有写程序代码需要花的额外时间,我认为用分立元器件来做这个项目要简单一些。

项目22:穿过逻辑听到声音

在这个项目中,我想先暂时不去管逻辑问题和概率问题,我将给大家搭建一个好玩的、奇怪的而且简单(尽管到了本书的后面,我会找到方法将其变得更加复杂)的东西。我将给大家展示如何将音频信号穿过逻辑芯片。

22.1 背景:不在这里也不是特雷门

很久以前,在电子学的早期历史上,有一个东西叫做特雷门,可以产生诡异的噪声,用在恐怖电影的音轨上。这个特雷门(读作ther-a-min)演奏的时候,演奏者在两根柱子周围舞动他的或者她的双手,这两根柱子对特雷门和地之间的电容波动很敏感。一个有经验的操作者可以用特雷门来演奏可以识别的乐曲,尽管听起来有点像小提琴的弓在张紧的手锯上面来回拉。

大家到网上搜索一下就能找到特雷门工作原理的完整解释。大家还能找到特雷门演奏的MP3,还能找到一个元器件的套装,可以自己来做特雷门。

当大家在项目3中用光敏三极管来控制定时器频率的时候,产生的声音就有点像特雷门。现在大家对逻辑元器件已经比较熟悉了,可以利用这方面的知识来将两种(或者多种)声音频率混在一起,就像一个超级特雷门一样。

22.2 穿过逻辑听到声音

大家可能觉得逻辑芯片用在音频电路中是完全不合适的,但是大家要记住三点:

1.声音的频率是20Hz15kHz,在芯片的世界里是很慢的,芯片的设计使用时钟频率经常在1MHz以上。

2.定时器产生的方波听起来绝对不会像正弦波一样醇厚好听,但是这种声音是肯定能听到的。

3.传统的音乐现在已经都是数字化的了。大家能听到的几乎所有的音乐,从CDMP3,都是利用数字采样来产生和处理的。

22.2.1 通过异或门来听

在图22-1中,大家将会看到一个类似图5-1的电路。比较大的区别在于现在定时器的输出接到了一个异或门上,而异或门的输出则接到了三极管上然后再接到扬声器上。是的,这是一个非常不常见的布置,但是所有的元器件都在它们的指标范围内工作,而且我觉得结果非常有趣。

说明: 00201.jpeg 

22-1

用异或门接两个人耳频率内的声音的电路原理图

将这些元器件搭在一起应该用不了大家太多时间。图22-2展示了我的面包板版本。

如果大家没有什么接线上的错误的话,如果变化照在光敏三极管上的光强的同时再上下调整50kΩ变阻器的话,就能听到各种各样的声音了。

说明: 00202.jpeg 

22-2

之前电路原理图的面包板版本

22.2.2 将所有的都混在一起

大家要记住异或门的工作原理。异或门的输出只有在它的一个输入为高电平,另一个输入为低电平的时候才会为高电平。因此,当大家将两个音频信号接到异或门的时候,异或门的输出会在这两个信号不同步的时候为高电平,而当信号同步的时候又转换为低电平。

22-3用图形的方式展示了这些内容。它使用了一个异或门,同时还用了一个与门和一个或门。74HC08四门双输入与门芯片、74HC32四门双输入或门芯片和74HC86四门双输入异或门芯片的引脚都一样,大家在更换芯片听不同效果的时候不需要更改电路接线。

或门会在只要有一个定时器输出脉冲的时候给出的高电平输出,而与门则小气得多,只在两个定时器都给出高电平信号的时候才给出高电平。我相信异或门是最有意思的,这也是为什么我建议大家先试试异或门的原因。

大家可以想象一些更多的选项。比如说,可以用第二个50kΩ的变阻器来替代33kΩ的电阻——但是要将一个4.7kΩ的电阻与之串联,防止大家将定时器往下拧到头,将零电阻加到定时器的引脚6上。这会使得即使是那么稳健的555定时器都难以忍受的。

说明: 00203.jpeg 

22-3

当两个音频信号的高低电平重叠的时候,不同的逻辑门会产生相反的音频效果

大家可以在一个或者两个555定时器电路中相对R2增加R1的阻值,这样可以加长高电平时长与低电平时长的比例。这在用异或门的时候听起来不错,因为异或门是会将这些时长再分成小段的。比如说,如果大家将33kΩ的电阻换成470kΩ的电阻会怎样?如果将33kΩ的电阻换成1MΩ甚至是更大的电阻会怎样?

当第一个定时器在比第二个定时器运行的要慢很多的时候,我们真是可以听到这两种频率的相互作用。将1MΩ的电阻放上去,然后用0.1μF的电容来替换第一个定时器中的0.01μF电容,这样就能造成两种声调的波动效果。如果大家将两个555定时器的输出画出来,就能发现原因了。

大家还能想到这个电路的其他应用吗?也许可以用在机器人的声音上,当机器人移动的时候根据光敏三极管上不同的光照情况来变换语调。将光敏三极管对着不同的方向还能增强这种效果。或者大家可以不用光敏三极管,而是简单调节变阻器,来找到自己想要的最佳的声音,来用在任何的其他电子项目作为音频反应。

如果大家再搭出一个和这整个电路完全相同的电路,然后再将两个电路的异或门的输出再异或一下呢?我将让大家自己去研究这种的可能性。

在这个项目的背后有一种别有用心的动机。我将在项目26中用到这些想法,但是用在完全不同的目的上:那是为了产生随机的声音脉冲。

项目23:猜谜项目

这里是另一个相对简单的项目 ,用的是逻辑芯片,让两个选手来玩一个看起来特别容易的游戏——到真正自己玩的时候就会发现不简单了。和接电槽位游戏一样,我会在本书的后面再回到这个游戏上来。在项目32中,当我们开始研究传感器的时候,我会建议来升级用户输入部分的方法。而在目前,我们这个游戏还是用按键开关来玩。

23.1 背景:英国猜谜之王

在有电视之前——甚至在有广播之前——英国的报纸常常用一些小游戏和猜谜来娱乐读者。这些猜谜可比现在的填字猜谜要难得多了。

英国的猜谜制作的王者是 Henry Ernest Dudeney,他是一位问问题的艺术的大师,可以用一小段来问问题,但是人们都需要花上几天甚至几个星期来回答。

他的很多问题是集合问题或者是算术问题。比如说,他让他的读者们去找到数字11111111111111111的两个质数因子——而且是仅仅用铅笔和纸来做。Dudeney能够提供正确答案(即使是用计算机,这个问题也不是一个简单的问题,因为这些数非常大)。

他的风格有娱乐性,比如在这个狡猾的小猜谜里面:

一个顾客让建造者去做一个窗户,这个窗户要求是每一边都是2英尺。窗户需要分成八片,每一片都要是每一边都是1英尺。还不能有空的地方。这个听起来没有办法做,但是确实是可以做到的,问题是,怎么去做?

要想知道这个窗户问题的答案,可以看后面的猜谜答案”——但是首先,大家试着自己来解答。提示:秘密藏在问题的语言里面。

23.2 移动棋子游戏

Dudeney很喜欢自己成为移动棋子的问题。跳棋是一种很明显的移动棋子游戏,因为直到有人获胜,这些棋子都还在板子上移动。井字棋就不是移动棋子问题,因为所有的标记都固定在一张纸上——但是井字棋也是可以变成移动棋子的,而且变了之后要有趣的多。在这种模式下,Dudeney将其称为奥维德游戏,因为他声称这些在罗马诗人Ovid的作品里面提到过。这个说法可能是真的,也可能不是,但是不管怎么样,虽说整体策略有些微妙,但是规则还是相对简单的:

这个游戏是两个人玩的,每一个选手有三个棋子。每一位选手的这些棋子都和对手的棋子是不同颜色的。

游戏的棋盘有九个单元,和井字棋网格的一样。

选手们轮着摆自己的棋子,一次放一个,可以放在网格中任意的地方。

在每一位选手都将自己的三个棋子放完之后,可以开始走棋,就是将棋子移动到相邻空网格中去。对角线移动是不允许的。

当一个选手将自己的三个棋子摆成了一条横线或者一条竖线或者一条斜线,就获胜了。由于在这个游戏里面网格中心非常重要,因此第一个放棋子的人不允许在第一轮将棋子放在中心位置。

这个游戏的关键在于布置自己的棋子来阻断对手的棋子。要记住,尽管我们可以移动我们的棋子,但是不能将棋子越过对手的棋子翻过去,每次只能移动一个方格。

比如说在图23-1中,如果现在是白色一方来操作,应当将6号方格移到5号方格,来阻断两个黑色棋子。现在黑色一方就没有办法来阻值白色一方下一轮从方块3移到方块6,从而赢得比赛了。比赛就结束了!

说明: 00204.jpeg 

23-1

一个奥维德游戏的假设场景

但是我们假设现在是黑色一方来操作。在这种情况下,就应该将2号方块移到5号方块,来防止白色一方占领这个方块。而在此之后,游戏的输赢就难以预料了。

我不知道怎么样去搭建一个电路,能有足够的智能来玩这个游戏,但是我可以给大家展示一个电路来检测是否有人赢得了比赛。同样的电路也可以用在井字棋游戏里面来检测是否有人形成了三个一行,但是我假定井字棋过于简单,我们的大部分读者完全没有兴趣。

大家可能觉得,检测获胜组合的电路是没有必要的,因为大家都能看到有没有三个棋子在一行。唔,是的,当然!但是如果你赢了的话电路发出一个声响是不是更加有趣呢,而且做一个检测电路还能激发一些好奇心。只是电路怎么样才能工作呢?

23.2.1 逻辑网格

我们需要决定的第一个问题是如何来处理用户输入。换句话说就是电子电路如何检测到有人动了一步棋?最简单的答案是将两种颜色的棋子拿掉,换成在每一个网格里面放置两种开关(每一位选手一种)。在游戏开始的时候,用户轮流改变开关状态,直到每一位选手都激活了三个开关。在此之后,每一步移动就是将一个开关关掉,并将相邻空白网格中的开关闭合。当然不允许在已经被对手占领的网格里面翻转开关的。

自锁按键开关(这种开关按一次闭合,再按一次断开)用在这种任务上非常合适。如果在每个开关旁边还有彩色的LED灯(也许以为选手用红色的LED灯,另一位选手用蓝色的LED灯),就会比较容易地看出哪一位选手占据了哪一个网格。在图23-2中,我放了一张渲染图,来告诉大家我想的东西。

另一个选择是用闭合-断开-闭合开关——这是一种三个位置的开关,中间位置是断开。每一位选手通过将开关掰向自己来占领一个网格,而网格在开关处于中间位置的时候被释放出来。大家可以非常便宜地买到闭合-断开-闭合的单刀开关,因为每个开关都有两个闭合位置,因此我们需要九个自锁按键而不是十八个自锁按键。

说明: 00205.jpeg 

23-2

最简单的提供奥维德游戏的电子学输入的方法就是为每一位选手提供自锁开关和LED

23.2.2 使用逻辑芯片

假设我们用逻辑门来检测某一步获胜。在这种情况下,和往常一样,我会首先用语言来描述这个逻辑。如果方块1到方块9如图23-1所示,我可以如下描述这个逻辑:

获胜选手需要占据网格123,或456,或789,或147,或258,或369,或159,或357

如果大家是按照顺序来读这本书的话,就已经在将这类的语句转化为逻辑门方面有很多的实战经验了。大家可以看见总共有八种可能的获胜组合,之间用或来连接,而每种组合则有三个条件用与来连接。大家可以画一张逻辑图吗?基本概念如图23-3所示,而包括了所有开关的完整的图纸见图23-4

注意每张图底部的八输入或门。这种东西存在吗?是的,确实存在,所以这不是一个问题。同样地,三输入与门也很容易找到。需要多少个呢?我们有八种不同的方法来获胜,因此这就意味着我们需要八个三输入与门。每一个14引脚的芯片上有三个这种逻辑门,因此我们需要三个芯片来完成这个功能。

说明: 00206.jpeg 

23-3

奥维德游戏的逻辑图骨架。每个与门的输入上的数字对应的是一个3×3棋盘上的方块,而对应的方块上面可以放选手的棋子

说明: 00207.jpeg 

23-4

奥维德游戏的逻辑图,展示的是代表某位选手的棋子摆在棋盘上的开关

这只能检测到某一个人的输赢情况。为了检测到另一个人的情况,我们还需要另一组开关和另一组逻辑芯片——但是如果你想省点事情的话,你可以用一个主开关来判断是哪一位选手在操作,然后将同样的一组芯片通过这一位选手的开关来供电,而在另一位选手操作时则用一组开关来供电。

我不太喜欢这两种方案,因此让我想想有没有其他的办法。

23.2.3 用开关来实现奥维德游戏

奥维德游戏(或者井字棋)可以通过多刀开关完美的接线接出来,根本不需要任何的逻辑门。现在大家应该能自己相处这种电路了,但是我还是在图23-5里面给出了我想的电路(大家能有更简单的版本吗)。

说明: 00208.jpeg 

23-5

奥维德游戏可以用开关,不用逻辑门来搭出来

要想知道这个电路如何工作,可以想象一下某一个开关被闭合,然后正极的电流流到下面的开关最后流到电源地上。这个电路确实比之前的电路要简单多了。

黄色的小圆圈是小的LED灯,亮起来用于确认某个开关被按下了。很自然地这些开关会和地相连,但是我将这些连接都略去了,以保证电路简单。

正如大家所见,每个开关需要三个到四个刀,事实上我曾经用双刀开关模拟过这个游戏,但是那样就需要不用LED灯了。

大家可以买四刀双掷自锁按键开关,价格很便宜,能完成这个功能。电路底部的大号LED灯用来在选手按下三个在一行的开关的时候亮起来。

每一位选手需要一组九个开关,因此共需要十八个开关,如图23-2渲染图所示。

大家知道——在棋盘上移动棋子并用传感器来检测棋子的位置很明显是最好的方法。因此我真会在书的后面回来做这件事情,但是同时,我认为大家在搭建这个电路的时候也经历了足够的练习了。可以现在用开关接线,或者用逻辑门来实现,后面再用传感器来改进。

23.2.4 制作更多

我之前提到过,我不知道怎样去搭建一个电路能有足够的智能来玩这个游戏。但是我相信我可以用软件完成。一个常见的微控制器的内存相对很小,但是奥维德游戏每一步移动的可能性也只有很少几种,用软件是可能利用仅有是四条规则,按照优先级来处理的。这些规则会告诉微控制器如何去操作(大家可以在和别人对抗的时候跟着微处理器去操作来测试一下):

如果你能移动一个棋子,使得三个棋子在一条线上,那么就如此操作。否则——

如果你的对手可以移动一个棋子使得他的三个棋子连成一条线,那么尝试去阻止他。否则——

如果你能将自己的棋子移动到中间网格中,那么就如此操作。否则——

任意将某个棋子移动到一个空闲的网格中。不能移动,那么就是平局。

靠这个程序赢不了太多比赛,但是还是能使用。问题在于,需要在计算机程序里面表示棋盘和棋子,而这就得用整数阵列。在Arduino中,在C语言里面是没有错误检测来确保我们在阵列的范围内的,而且还有很多我不太喜欢的其他功能。

即使到现在,绝大多数的微控制器都不是很强大,对用户也不是很友好,笔记老式的IBM-PCjr也不能防错,我在20世纪80年代就在那些老控制器上写微软的BASIC程序了。这个情况可真是糟糕!

我的朋友Fredrik Jansson,一位来自芬兰的物理学家帮助我对这本书做了一些常识性检查。他给我建议是可以在桌面电脑上做一些早期的比较难的工作,然后再到微控制器上去实现。Fredrik计算得出在棋盘上三个黑色棋子和三个白色棋子的布置总共有1680种可能。因为如果黑色棋子和白色棋子交换位置,这些位置其实没有变过,所以事实上总共只有840种逻辑上不同的位置。这个数字已经小到可以让计算机来历便所有可能的游戏,并且在每一种情况下都走出最佳的一步来。

如果我们用计算机来编制出一张最佳操作的表来,就可以将这张表装在微处理器有限的内存里面。Fredrik得出的结论是我们每一步只需要四个比特。两个比特用来选择棋子,另外两个比特用来指示向上下左右移动。因此,指引840中逻辑位置的操作只需要420个字节。大家还需要一些额外的指令来做最开始的布局,放置不同颜色的三个棋子。但是这套方案看起来试试可以做的。每当有一位对手走了一步之后,微控制器会去查找之前由更强大的兄弟桌面计算机做出来的最佳反应。

如果大家决定了去尝试这个编程策略或者其他某种策略的话,请告知我们最终的效果如何。

23.2.5 猜谜的答案

Dudeney关于窗户的猜谜答案见图23-6。窗户的尺寸每一边都是2英尺,每一个三角形的片每一边都是1英尺。因此这种布局满足了问题的要求。但是——你没有假设窗户是方形的,而且每一片得要四边吧,对吧?

说明: 00209.jpeg 

23-6

在这一章最开始的时候的窗户猜谜的解决方案

如果你喜欢这种猜谜的话,不管是娱乐自己还是和让朋友们吃惊一下,给大家推荐Dudeney一生工作的两个汇编:The Canterbury PuzzlesPuzzles and Curions Problems。由于这些是很久之前出版的,可能现在已经没有版权问题了。大家可以到网上通过古腾堡项目来免费(而且合法)地去阅读。

大家还可以获取到奥维德游戏的安卓应用,如果想和计算机对手进行操练的话。但是我觉得自己来搭个电路来自己玩会更加有趣。

项目24:做加法

在我从逻辑门转到其他话题之前,我还得给大家展示一个最基础的逻辑应用:做加法,这样才能算是功德完满。大家现在已经有计算器了,这个可比我们要搭建的电路要强大无数倍;但是就我的经验而言,自己搭建一个小小的电路,可以进行一些基本的算术运算要稍微魔幻一些。

24.1 二进制的五个规则

由于逻辑芯片只有两个状态——低电平和高电平——用来代表二进制的01是再合适不过的了。因此要去做一个加法的电路,我们必须用二进制的加法。好消息是二进制的加法只有五条规则,其中的三条还非常明显。我先说这三条:

第一条规则:0+0=0

第二条规则:0+1=1

第三条规则:1+0=1

我想大家对这三条规则应该没有任何问题吧。现在我们看第四条,看起来有点奇怪:

第四条规则:1+1=10 二进制

如果大家把这个读成一加一等于十的话,是不对的。大家必须要摆脱固有的十进制思维习惯!这个第四条规则里面的二进制是告诉我们这个10和十没有任何关系,因为10是一个二进制数。

我们都知道1+1=2,那为什么我们不直接写2呢?因为在二进制里面,我们只有10。所以我们来看第五条规则:

第五条规则:当你的输出结果是十进制的2的话,就将和写成0,同时向左边的位置上面进位1,这就是数值2对应的位置。

大家现在遇到了本书前面提到过的数位的概念了,我在谈论芯片的二进制输入,比如解码器的输入的时候说过。在二进制的计数里面,数值1是在最右边的值是1。十进制的2是在次右边的位置上,十进制的4则是在再次的位置上,8则是在又次的位置上——等等。

因此1+1=10实际的意思是答案在最右边的位置上没有值,而在次右边的位置上的值为2

在做两个二进制数字的加法时的四种可能的组合见图24-1所示。

现在看一看图24-2,大家会发现我们现在做的是两位二进制数的加法了,规则还是相同的。这张图展示了两个二位二进制数的所有可能的组合。

说明: 00210.jpeg 

24-1

二进制加法中单一位数字的基本规则

说明: 00211.jpeg 

24-2

两位二进制数加法的基本规则

现在只有一个问题可能还不是太清楚。我们在二进制里面将1111相加到底发生了什么?

和以往一样,我们从正确的地方开始。我们将11相加,得到0和一个进位。但是在那个位置上,已经有了另一个1+1等着加呢,因此我们现在要处理的是1+1+1

我们知道1+1得到的是二进制的10。因此当我们在给这个值加一个1的时候,得到的是二进制的11,大家可以在图24-2中的最后一个例子中看到这个。

24.1.1 从比特到状态

我们关于二进制的算术规则就说到这里。大家现在已经具备了足够的知识去搭建二进制加法器了(如果二进制数字看着不是很顺眼的话,我会在下一个项目中讲解如何将其转换为十进制的数)。

我们来思考下怎样来用逻辑芯片来模拟这些二进制的规则,用逻辑门的高电平代表1,用低电平代表0。我可以将二进制加法的前面四条规则用语言来描述,而不是用数字,比如这样说:

低电平输入+低电平输入=低电平输出

低电平输入+高电平输入=高电平输出

高电平输入+低电平输入=高电平输出

高电平输入+高电平输入=低电平输出(并给高一位进位1

这是不是让你想起了什么?唔,当然,如果我们暂时不管这个进位操作的话,这就是一个异或逻辑门的输入输出的精确的描述!只要将两个数字用低电平和高电平来加到异或门的输入上,那么异或门的输出就是正确的结果。我们可以用一个LED灯来表示,当结果是0的时候LED灯灭着,当结果是1的时候LED灯亮起来。

现在我们再来看看向左边进位的1怎么处理?我可以这样描述:

高电平输入+高电平输入=高电平的进位

其他所有的输入组合=低电平的进位

这又让你想起了什么吗?当然是一个与门!如果与门的两个输入接着的话,输出可以用第二个LED灯来标示。

24-3展示了这些逻辑门是如何组合起来完成将两个一位的二进制数加起来的工作的,我将这两个数字起了个想象的名字AB。图24-4展示了四种可能的输入组合,已经对应的结果,红色代表1,黑色代表0

说明: 00212.jpeg 

24-3

这是用来将两个一位的二进制数加起来的最简单的逻辑门组合,如有需要还可以产生进位1,用的是一个异或门和一个与门

说明: 00213.jpeg 

24-4

一个半加法器可能的四种输入组合,以及得到的输出。红色代表1,黑色代表0

这个非常非常简单的电路被称为半加法器,只能用在二进制加法的最右边,因为这个半加法器没有办法处理从右边传过来的进位信号。

但是如果在右边还有其他的数位,而且也会产生进位呢?我们怎样来处理这种情况呢?

我们需要一个全加法器

这个有点难度,我们用异或门每次只能比较两个输入,但是我们现在要处理的是三个数:两个二进制的数是输入,还有一个进位的数(可能是0,也可能是1)来自计算中前一位的加法结果。我们可能会处理的是1+1+0或者0+1+1,也可能是任意的组合,一直到1+1+1

我们去做这件事的方法是将整个过程分成两步。图24-5展示了如何去做。大家会注意到里面其实有两个半加法器,每个半加法器有一个与门和一个以后门,还有一个或门用来在某一个半加法器需要的时候进位。

说明: 00214.jpeg 

24-5

全加法器可以从之前的阶段获取到一个进位的数字,然后将其和两个新的二进制数来相加

第一个异或门将两个二进制输入相加,这和之前是一样的。我们将这个异或门的一位的输出和输入的进位相加。这意味着在第一个异或门下面再放一个异或门。

会有两种情况使我们的全加法器需要输出一个新的进位:

1.如果我们的两个二进制输入是11,我们就需要用第一个与门来将进位输出——这和之前是一样的。

2.如果我们从第一个异或门过来的输出是1,而且我们过来的进位也是1,我们也需要将进位输出。

两个输入和一个进位总共有八种可能的组合。我在图24-6中展示了其中的四种作为样例。

说明: 00215.jpeg 

24-6

全加法器的三个输入总共有八种不同的组合。我们在这里列举了四种,展示了加法器如何操作

大家现在已经几乎可以去搭建自己的加法器了,但是首先还是来消化一下。

24.1.2 背景:另一种用与非门做的加法器

由于逻辑门可以通过不同的接线方式相互模拟,用异或门和与门的组合并不是制作半加法器的唯一方式。我在这里使用是因为这种方式最容易理解,但是与非门的方式用得更广。这种方式需要更多的逻辑门(需要五个逻辑门而不是两个,来制作一个半加法器,做全加法器则需要九个逻辑门而不是五个),但是最大的好处在于只要用与非门就能完成任务,不需要任何其他种类的逻辑门。而只用与非门的计算机在某种角度上更容易搭建。因此与非门常被看作计算领域实用的最基础的逻辑门。它们在一系列长长的74部件里面的部件号是7400

24-7展示的是如何用五个与非门来搭建一个半加法器,而图24-8则展示了如何用九个与非门来搭建一个全加法器。还是一样,全加法器是由两个半加法器堆叠而成的。

说明: 00216.jpeg 

24-7

半加法器可以只用与非门来搭建

如果大家比较有方法,也比较耐心的话,可以将这些电路图打印几份,然后用红色的墨水沿着穿过逻辑芯片的逻辑通道来验证所有的八种组合下输出都是正确的。个人而言,我是不会去做这件事情的。我用异或门和与门的组合就好,因为我看与非门非常头疼。

说明: 00217.jpeg 

24-8

一个全加法器也可以只用与非门来搭建

24.2 我们自己的小加法器

那么我们的动手环节在哪里,这里吗?通常我会建议大家现将所有的元器件都接好,然后去搞清楚它们完成功能的原因。这就是我称之为探索中学习的一个基础。

而在现在的情形下,我觉得我需要先解释一下理论,否则一切看起来糊里糊涂的。但是大家还是可以直接先去将计算器做出来,可以将两个三位的二进制数加起来输出一个四位的二进制输出。

这个电路会用到一个半加法器和两个全加法器。总共需要五个异或门、五个与门、还有两个或门。在一个四门双输入芯片中有四个双输入逻辑门,因此要闲置的逻辑门还真不少。事实上,我们在芯片上是有足够的逻辑门来做出一个将两个四位的二进制数加起来产生一个五位的二进制数的输出的加法器的。但是我不想那样去做,因为五位的二进制输出对于我脑子里面想的下一个内容来说有点太大了。也许大家还记得我给大家承诺的要在下一个项目中展示的东西——而且如果我们需要处理的只有四位二进制数字的话,会简单很多。

24.2.0 面包板加法器

我在图24-9中组装了一个半加法器和两个全加法器,做出了一个完整的三位加法器,可以得到四比特输出。

需要加和的两个二进制数通过逻辑图顶上的按键开关来输入。我用了暗蓝色的区域来表示输入第一个三位二进制数的开关和输入第二个三位二进制数的开关。每一个数字所在的位置用绿色来表示。

和之前的全加法器相比,这些逻辑门稍微移动了一些,但是所有的连接还是没有改变的。

举一个随机的例子,如果大家要做的算术在十进制里面是5+7,就需要将上面一行里面的开关4和开关1闭合(凑出5),而将下面一行里面的开关4、开关2和开关1都闭合(凑出7)。假定加法器能正常工作,就应该能立即看见LED8LED4亮起来,给出的结果就是十进制的12,而LED2LED1应该还是灭着的。

24-10中展示了下拉电阻,这些电阻在搭建电路的时候需要加上,这样防止有逻辑门的输入在开关断开的时候处于悬空状态。

说明: 00218.jpeg 

24-10

三比特加法器的输入开关,加上了下拉电阻

这些开关和它们的输出都做了标签,用来和主电路上的输入项匹配,主电路如图24-11所示。小的黄色圆圈代替了常用的LED符号,以节约空间。大家记住如果我们用的LED灯没有内置串联电阻的话,在LED灯和电源地之间要加串联电阻。

因为在电路图中有很多平行的导线,我用了红色和蓝色将两边的电源线区分开来,以减少混淆。

这个完整的项目的照片见图24-12。用双列直插开关(DIP开关)来提供输入,因为这种开关在电路板上占据的空间很小。

说明: 00219.jpeg 

24-9

加法器的逻辑图里面的逻辑门,这个加法器可以将两个三比特二进制数加和,得到四比特二进制输出

说明: 00220.jpeg 

24-11

在三比特加法器得到四比特输出的面包板电路图中使用到的元器件。顶上的标签用来和输入开关相连接,输入开关是单独展示的。在输入字符旁边的数字表示的是对应的二进制数位置的值

那么,现在我们就有了一个真实的加法器了——这是一个在20世纪30年代看起来还特别魔幻的东西。唯一的问题是,除了运算能力很有限之外,还不是很容易理解,因为我们需要先将十进制的数转换为二进制作为输入,然后还要将二进制的输出再转成十进制。还有,我们还没有一个数字输入板,更别说有个键盘了。

说明: 00221.jpeg 

24-12

三比特加法器完成后的面包板布局。双列直插开关在两个要加起来的二进制数(AB)的每一位上都标了124。底部的LED灯也有对应位置的值124、和8,顺序是从顶向底部读

事实上,这个世界上的第一台个人电脑(Altair88001975年以套件的方式面世)要求大家将所有的数据用开关来录入。这被称为按下程序。这个电脑没有键盘,因为那会需要更多的芯片来和计算机进行接口,而逻辑芯片非常贵。

我知道现在已经早就不是1975年了,因此我们可能可以将数据录入简化,并改进这个三比特加法器的显示。这是下一个项目的内容。

项目25:改进加法器

在加法器上面加上一个十进制的输出要比加上一个十进制的输入要简单的多,所以,我先来处理输出。

25.1 解码器的返回值

在加法器的输出上加上几个七段数码管显示效果会好很多,但是它们是需要驱动的,为了用到二进制编码的十进制数的输入(BCD)。换句话说,每个驱动的输入都必须在二进制00001001之间(十进制的09)。我的加法器的输出是二进制的00001110,将其转换出来并驱动两个七段数码管并不是一件简单的事情。

因此我假定大家对用单独的LED灯没有什么不满,每个LED灯用来代表一个十进制的值。

为了完成这个内容,我们可以用一个4-16解码器,这个解码器我们在项目19中用到过,只是这个时候我们必须要用HC版本的74HC4514,而不能用老式的CMOS版本的4514了。因为每一个输出引脚都必须能够驱动一个LED灯。芯片的二进制输入需用我们的加法器的输出来提供,这些输出的权重分别是1248。芯片的输出引脚将会驱动从十进制数值0到十进制数值14对应的LED灯(大家记住我的加法器得到的最大的加法和是111+111=1110二进制,对应的是十进制的14)。

这些额外的元器件是放不到布置三比特加法器的同一张面包板上了,但是大家可以很便宜地买到同样的面包板,特别是我推荐的类型,每个长边只有一个总线。我假定大家可能会愿意用两个面包板来完成这个项目。

输出的电路原理图如图25-1所示。大家将LED灯按照数字大小进行排布,但是74HC4514的输出引脚对应的值有点乱,如芯片内部的黑色数字所示。

处理这个最简单的方法是将LED灯安装到面包板最下面,如图25-1中所建议,其中每一个黄色的圆圈代表一个LED灯。如果我们的LED灯不自带串联电阻的话,其实总共只需要一个串联电阻,因为在同一时刻,只会有一盏LED灯亮起。假定大家的面包板上的总线分成了好几段,那么LED灯就可以共用中间的部分,并通过串联电阻和上一段的总线相连。

说明: 00222.jpeg 

25-1

在项目24中加法器输出的二进制码在这里成为74HC4514解码器芯片的输出。每一个解码的输出对应014,各自连接到一个LED灯上。由于每次只有一个输出是高电平状态,所有的LED都可以共用一个串联电阻

这个就讲到这里!下面要做难度更大的一些部分。

25.2 使用双列直插

要想得到十进制的数据输入,可以用简单的单刀单掷开关。我们可以用两行各八个开关,对应的数值分别是07。大家将第一行的一个开关和第二行的一个开关闭合,做出两个需要加起来的数值。

双列直插开关是完成这个目标的最简单、最便宜而且体积最小的选择。通常,在一组八个开关里面,命名是从18,但是我们需要将其重新命名,从07

从每一组开关过来的八根线连接到8-3编码器芯片的八个输入上,正如大家可能猜到的,这个编码器在功能上和解码器是相反的。编码器选择它的八个输入(对应数值07)中的一个,然后将其转换成二进制的值并输出到输出引脚(对应不同的位置124)上。从一个编码器过来的输出可以直接接到加法器电路上,对应的标着A1A2A4,而另一个编码器的输出则接到B1B2B4(参见图24-11)。

25-2展示了这两个编码器接线的电路原理图。如果大家仔细地照着这张图去做的话,应该是能用的。但是精确地回答电路为什么能工作是需要一些解释的——特别是如果大家没有注意到开关是连接到电源地,而不是连接到电源正极的。为什么呢?

25.2.1 编码器介绍

编码器现在越来越少了,而供应商还在销售的用的是低电平有效的。换句话说,一个低电平的输入或者输出代表1,而高电平的输入或者输出代表的是0。这是很烦人的,因为这个还得和加法电路一起用,而那个电路则是传统的高电平有效逻辑。我们不用去追究历史原因为什么编码器这么做,只要我将这部分处理好,我还是能使用最常见的芯片74HC148。这个编码器的引脚图见图25-3

说明: 00223.jpeg 

25-3

74HC148编码器芯片的引脚图。文字部分有关于输入和输出的细节描述

从这个编码器得到高电平输出有一个小窍门。大家可以将输入的顺序反过来。这个方案见引脚图中的绿色数字所示。

大家是不是糊涂了?让我总结一下。要想从74HC148芯片得到我们常用并偏好的高电平逻辑输出:

将数值7对应的输入引脚重新定义为数值0

将数值6对应的输入引脚重新定义为数值1

说明: 00224.jpeg 

25-2

两组双列直插开关的输出连接到了74HC148编码器芯片的输入上。注意这些输入是低电平的,而电阻是上拉的。这个和大多数的逻辑芯片是相反的

(如此下去,中间的数值类似处理)

将数值0对应的输入引脚重新定义为数值7

每个输入现在还是低电平有效。这个没有办法绕过去。而这种反向编号的窍门只能解决输出的问题,这样输出就是高电平有效了(电路的其他部分就能直接连接了)。因此如图25-2所示,所有的输入引脚需要使用上拉电阻(不是下拉电阻),来保证这些输入在通常情况下处于高电平(代表0)。双列直插开关连接到电源地上,就可以将开关闭合,从而得到了芯片需要的低电平有效的信号(代表的是1)。

25.2.2 其他的编码器功能

74HC148还有一些额外的让人很糊涂的功能,却让事情变得更加有趣。有一个组群选择的引脚,在绝大多数的数据手册上都是用GS来表示。这是一个输出引脚,在芯片处理某一个输入的时候会变成低电平。因为这是一个输出引脚,我们可以不理会这个引脚,可以不进行连接。

至于两个使能引脚,输入使能引脚(通常在数据手册上用EI来表示)是低电平有效的,因此我需要将其连接到电源地上。输出使能引脚是高电平有效的(至于为什么,我不知道),因此我需要将这个引脚连接到电源的正极上。

在这个时候,大家可能会好奇编码器有没有什么实际的应用。确实,编码器在工业控制流程中是有可能有用处的,比如说有一个物体在一系列传感器前面移动,这些传感器不是闭合就是断开。如果大家用微控制器来控制的话,由于微控制器的输入引脚比较少,我们就可以将这些传感器接到一个8-3编码器芯片上,这样就将输入引脚减少到3个了。这种方法的强大之处在我们的输入更多的时候会急剧增大,因为我们可以将编码器芯片级联起来。当我们的输入的数量增加一倍的时候,二进制输出线只会增加一根。这是因为二进制里面每一位的值是前面一位的两倍。因为这种位置的值的强大之处并不是所有人都喜欢,我这里会稍微多说两句。

25.2.3 背景:二进制的强大

这本书到这里我们已经处理过了二进制的输入和输出,对应的数值分别是1248。每个数字和之前的一位的差别都是两倍,这个差别看起来不是特别的巨大。因为我们人类默认的十进制比这要大的多,每一位的差别是10倍。但是,这个成倍增加的过程还是能造成意想不到的结果。

在一个八位的二进制数里面,最左方的一位的值是128,而整个八位的二进制数可以表示的数值是从0255。这些数值在计算领域里面是很常见的。计算机内存的一个字节通常是八个比特,通常一个JPEG图像有三个颜色(红色、绿色、蓝色),每个颜色都是用一个数值来表示,从0开始,表示完全黑,到255,表示最亮。也许256个色阶看起来不是很多,但是由于这三种颜色可以独立变化,因此总的组合种类是:

256×256×256=16777216

如果你听过一个计算机显卡可以产生一千六百万种颜色,你现在知道他们在说什么了。

如果我们增加二进制数字的位数的话,这种情况会变得更加有趣。

一个十六位的二进制数可以表达的数值是从065535

一个32位二进制数可以表达的数值大约是40亿——这就是为什么32位操作系统的计算机不能访问超过4GB内存的原因。

至于GB这个词,国际通用的giga的定义是10亿,但是在计算机内存里面,giga的意思是二进制数1后面带30个零。这个换成十进制是1073741824。这种情况的起源是一个kB被定义为二进制的1000000000,对应的十进制是10241MB则是1024个千字节,而一个GB则是1024MB。但是在硬盘里面一个GB只是十进制的十亿。这段只是为了给大家解释一下。

我们回到二进制数字的强大之处这个话题上来。

我有一个很小的计算器,只值10个美元,可以表示的十进制数高达999999999999,或者说大约一万亿。那么在计算器内部要处理这个数字需要多少位二进制数字呢?我想41位就足够了,其中的一位还是用来表示这是一个正数还是一个负数。

尽管二进制数只有10,还是能用来处理非常大的数字的。

25.2.4 背景:给自己编码

如果大家不喜欢使用74HC4514芯片的话,还可以自己做一个编码器,因为逻辑其实很简单。参见图25-4。大家顺着连接看,会发现当按下(比如说)数值6对应的开关的时候,数值2和数值4对应的二进制输出位会变成高电平。注意如果大家真的将这个电路做了出来,还需要在每个开关的输出上增加一个下拉电阻。

说明: 00225.jpeg 

25-4

我们只需要三个四输入或门就能模拟一个八输入三比特编码器芯片的行为了。需要在每个开关的输出上增加下拉电阻(图中没有画)

也许大家还记得我想用一个四输入或门,但是在HC系列里面没有四输入或门。(参见第20章)那么在这里这会是一个问题吗?不会的,因为在这个应用里面,或门的输出没有用来驱动LED灯,只是将这些输出连接到加法器电路中其他芯片的输入上,见图24-11。因此我们可以用更老的CMOS 4000B系列。两个4072B双门四输入或门芯片就能完成功能了。

我喜欢尽可能用数量少的芯片,因此我直接用了74HC148编码器芯片,而没有用两个含有或门的芯片。

25.3 制作更多:其他输入的选择

在数据输入上,如果大家不用双列直插开关的话,可以用一个八位旋转开关。这种开关可以防止在同一时刻选择多余一个数字——但是这个开关装不到面包板上,而且更加贵一些。

大家可以考虑按键输入板,特别是如果能找到两个不是阵列编码的输入板的话。阵列编码的键盘输入板设计是用微控制器来扫描的。而没有编码的键盘输入板则可以为每一个输入的数字都能给出一个独立的输出线,但是这种输入板很少见。(我在Make:Electronics的一个项目中用过。)

最后,大家还可以用带指轮的输入设备来选一个数字,通常是09,但是有些可以是015。有点让人困惑的是,这些也常被称为编码器。

25.3.0 我们是否可以用开关来完成

现在我已经将一个二进制加法器的输入输出换成十进制的了,大家可能会想这个项目是否已经走到了尽头——但是事实上我还有一个建议。毫无疑问大家还记得我在超感知觉测试机、石头剪刀布游戏以及奥维德游戏里面,我都用开关而不用逻辑芯片实现了电路。当然,我是没有想着用原始的机电开关来搭建二进制计算器?

事实上,我无法抗拒这个想法。我不会将这个作为一个独立的项目,因为这只是一个制作更多的娱乐内容,我加这个只是为了增加趣味性——至少我想象的是趣味性。我喜欢用不含电子学元器件(不算LED灯)的方式来搭建二进制加法器这个想法。

而且,这种事情其实没有实际的用途。只是能帮你站在计算机的角度上思考。而这种角度正是设计一个好的逻辑电路(或者好的软件)的前提条件。因此我觉得这还是有意义的。

25.4 制作更多:开关做的二进制加法器

我在图18-1中将与逻辑门功能相同的开关电路罗列出来了。由于一个半加法器可以用一个异或门和一个与门来搭建,因此大家也就可以只用两个开关来表示,如图25-5

说明: 00226.jpeg 

25-5

一个半加法器的功能可以用一对双刀双掷开关来模拟。还需要一个LED灯,串联一个电阻并连接到电源地上,这几个元器件是必需用来替代这个加和指示灯的

当我们用开关来替代逻辑门的时候,输入就得按下开关了。因此,为了输入二进制加法1+0,我们需要将左手的开关闭合,同时保持右手的开关断开。这样就正确地给出了答案1,并点亮了LED灯,且没有进位输出。如果大家同时按下了两个开关,输入了1+1,我们就会得到正确的答案10,进位有输出而LED灯灭着。

这个看起来很简单,但是一个全加法器问题就来了。大家回想一下全加法器的电路,可以看一看图24-5。顶上的部分其实和半加法器是相同的,我刚刚已经处理完了。没有问题,但是这个第一个异或门的输出还得接到另外一个异或门,在那里还需要和前一位过来的进位进行比较。

问题在于,我们现在用的是拿手指按开关进行输入。但是第二个异或门只有电气输入——我们不能通过按键给这个异或门提供输入。

还有另外一个问题,一个低电平的输出在逻辑门眼里和高电平输出是一样容易的。但是当我们用开关的时候,低电平的输出就是开关断开,这个是没有办法表示的,因为这个状态是不定态。

我对这两个问题的答案是从半加法器的输出获得无进位的输出,和一个进位输出。这样就能得到加法器下一步需要的电压了,加法器可以选择阻断或者导通了。

一个改进版的半加法器的电路原理图如图25-6所示,这个没有进位的输出在没有开关被按下的时候带电,只有一个开关被按下的时候也带电,两个开关同时按下的时候则不带电。而进位输出则只有在两个开关同时按下的时候才会带电。因此这个无进位的输出和进位输出总是反向的。

说明: 00227.jpeg 

25-6

之前用开关来做半加法器的电路原理图已经被改进了,增加了一个无进位输出,用来为下一步提供电压

25.4.1 做一张表

下一步就是确定下来我们的全加法器到底需要什么。为了这个目的,我做了一张不大的表,见图25-7。这张表展示了加法器可能产生的三个可能的输出和每个输出对应的可能所有的输入组合。

比如说,在这张表的第二行,上面当开关A断开(代表的是输入为0),开关B闭合(代表的是输入为1),而且从前面一位没有进位输入,那么加和=1。这张表的第11行则显示的是同样的输入条件,而结果无进位输出电压则有了。这是对的,因为我们有一个开关是闭合的,而且没有进位输入,因此就不会有进位输出。

说明: 00228.jpeg 

25-7

全加法器在所有可能的输入组合下的输出结果

25.4.2 开关性能

我可以想到(有点难度)一种开关可以满足这个表里面的要求,电路图如图25-8所示。

说明: 00229.jpeg 

25-8

用一个六刀开关和一个三刀开关搭出来的全加法器,产生的输出满足上表的要求

但是大家会看到,这需要一个六刀开关和一个三刀开关。这种开关在自锁按键开关中比较常见,但是还没有结束。我希望每个开关增加一个LED灯,来表示这个开关是否被按下了。

这个对于开关B来说很简单,因为现在它只有三组触点,我可以增加一组用来驱动LED灯。但是要给开关A增加一组额外的触点就有点问题了,因为这个开关已经是六刀的了,确实有一些八刀的开关,但是那会很贵,除非大家到eBay上到中国找一些来。

在思考这个问题一段时间之后,我想起来英国一位计算机程序员Graham Rogers,他和我一样对猜谜很感兴趣——而且因为Graham和我一样地沉迷,他在几年前自己用开关做了一个二进制加法器。我找不到对应的电路图了,因此我找到他,发现他和我独立地做出了一样的基本电路图。但是他将生成加和的开关的功能换了一下,用来接到左手的开关上的一个刀上,以驱动LED

这个更改版的电路如图25-9所示。这个和之前的版本相比要复杂一些,但是这个只需要六刀开关。

说明: 00230.jpeg 

25-9

用开关来搭建的全加法器的改进电路,每个开关多出了一个刀,可以用来接LED

大家可以将无数的这种开关加法器连在一起,这样就可以处理任意大小的二进制数了。这个Graham制作的加法器版本可以将两个八位的数字(两个字节)加起来,还能做减法。我不记得二进制里面减法的规则了,所以我将这个问题留给大家。

25.5 制作更多:其他的可能性

这个开关搭建的二进制加法器的接法可以进一步简化吗?开关触点的数量可以减少吗?我觉得应该不能了,但是我宁愿被证明是错的。如果大家有相应的方案,请让我知道。

现在我无法拒绝去问——我们能将图25-4中的或门去掉,然后用光开关来做一个编码器吗?这个应该是可能的。每次我们看到一组类似图25-4中的简单逻辑门,就能相当有把握用开关来模拟。

是的,这个非常简单。电路如图25-10所示。

说明: 00231.jpeg 

25-10

用开关搭建的模拟8输入三比特编码器芯片的电路

这个电路的输出可以用来给图24-11中的电子版的加法器提供输入,当然大家需要将双利直插开关去掉,换成一组的单刀单掷、双刀双掷、三刀三掷开关。

但是我觉得没有办法和这种开关做的加法器来交互。问题在于在用开关做成的加法器里面,输入的开关并不只是提供输入——他们还在做第二份工作,进行数学运算。我如果能看见一个只用开关做的十进制输入的加法器,只要刀数还算合理,一定会大吃一惊的。另一方面,我却没有办法证明这个事不可能的,人类的天才优势总会产生令人惊叹的结果。

请大家记住,在现代电子计算器的时代之前,加法器(还可以做乘加)都是机械的。当你看内部结果的时候,会发现里面有无比复杂的齿轮、传杆。而且当然这些设计都是用铅笔和纸完成的,这些都远远在计算机辅助设计出现之前。

我们再往回看,Charles Babbage差别引擎(其中的第一部分是1832年制作的)就是一个计算器。这使得Babbage开始计划他的分析引擎,这是一个通用的可编程机械计算机。视角和坚持结合在一起就能产生可敬的结果,当然我们还得有足够的时间和金钱进行投入来解决问题。

但是我到这里就要接着往前走了,下面介绍环形计数器和移位寄存器。这些会接着讲到随机性的探索,最后还会谈到各种各样的传感器,那将是这本书的最后一个主题。

项目26:环形计数器

环形计数器是一个有解码器输出的计数器。这意味着这个计数器每个时刻只有一个引脚为高电平,而且有效引脚的顺序是从0开始,一直增加到引脚数量所允许的最大值对应的数值。到这这个时候,整个循环重新开始。

作为对比,二进制的计数器输出的是编码后的输出。换句话说,就是输出的高低电平代表的是二进制的数。

我在这里使用的环形计数器是74HC4017,也被称为十进制计数器,意思是可以数十个数(实际上,是从0数到9)。我计划将这个计数器用在两个不同的反射测试游戏里面。一个是顺序地点LED灯,另一个则是随机地点LED灯。

26.1 环形计数器示例

要想示例一个环形计数器是很简单的。我们只要在对应的十个输出上面接上LED灯,然后用一个慢速的定时器来驱动就可以了。在我的测试里面,我发现经典的双极性555定时器的信号中噪声太大,环形计数器常常被误触发,把一个脉冲看成两个。我如果加上一个去耦电容的话,很有可能可以解决这个问题,但是我还是觉得用噪声更小的元器件:7555定时器更加让我放心一些。这个芯片和老式的555定时器的引脚一样,定时的功能也一样,但是输出要干净很多,而且和逻辑芯片完美兼容。

26.1.1 警告:定时器的不兼容

请大家要小心,将7555定时器和老式的555定时器要分开来放置。这两个芯片看起来一模一样,而且看起来功能是完全一样的,但是7555的输出电流的驱动能力要差很多。大家可以用7555来驱动其他的芯片或者单个的LED灯,但是驱动继电器是没有希望的。

另外,7555定时器的优点在于输出比较干净,但是输入要费事一些。比如,当我们通过耦合电容来驱动输入的时候,电容的容值就很重要了。电压信号上的毛刺可能导致定时器提前结束这个周期。大家在数据手册里面是看不到这个的,但是我是亲眼看到了的。

26.1.2 恼人的引脚顺序

示例的电路图见图26-1。和之前的项目一样,我用黄色的圆圈来代替LED灯,因为要用规范的符号的话,地方不够了。如果你用的LED灯没有内置电阻的话,还得加一个串联电阻,因为如果只有一个LED灯不加电阻的话,就会一直亮着。

请注意环形计数器的引脚8没有连接到LED灯,而是直接接到了电源地上,因为这是芯片的一个电源引脚。

说明: 00232.jpeg 

26-1

74HC4017十进制计数器的一个简单的示例,用的是慢速的脉冲接到时钟输入引脚上,同时使能引脚和复位引脚都保持低电平

如果大家将这个电路接起来然后上电,就会看见LED灯随着定时器的脉冲而每次亮起一盏来。不幸的是,74HC4017引脚的值是乱的,顺序比项目25中的74HC4514解码器芯片还要没有规则。图26-2展示的就是这个芯片中各个引脚对应的值。

大家还可以将LED灯移到面包板下方的远处,并用跳线将这些值的顺序理顺,参照我在项目25中对编码器芯片的建议。但是,为了实现我脑子中的应用,我还得把所有的面包板的空间省下来放其他的芯片,所以我们真得需要第二块面包板来安放这些LED灯。大家可以用跳线从计数器接到第二块板子上去,如图26-3所示。这种连接用了不同的颜色电线,这样大家可以看得更加清楚一些。

说明: 00233.jpeg 

26-2

74HC4017计数器的引脚图。这是一个环形计数器,意思是这个计数器的输出是解码后的——输出时每次有一个有效,而不是以二进制码的组合呈现。由于这个计数器有十个输出,这也常被称为十进制计数器

说明: 00234.jpeg 

26-3

74HC4017环形计数器的输出引脚顺序理顺,用了按照数字大小的顺序点亮LED灯。不同颜色的连接可以用跳线或者排线来完成

大家可以使用柔性的跳线,如图26-4中的测试电路所示。可以用尽量多不同颜色的线,这样从一个板子到另一个板子理线就会容易一些。

但是,就我的经验而言,跳线两头的这种很小的插头是没有办法形成牢固的连接的。好一些的方案是用排线焊接到排插上,如图26-5所示。

说明: 00235.jpeg 

26-4

可以用跳线来将环形计数器的输出理顺,从而来驱动一列LED灯,并按照数字大小的顺序点亮。照片中面包板顶部的元器件会进行计数器的示例,如下文所述

说明: 00236.jpeg 

26-5

一段排线,两头各焊接了排插。导线交换了顺序,以满足之前图中的连接方式

也许大家以前还没有遇到排插这个词。好的,我会停一下来解释一下,因为排插的用法有点让人困惑。

26.1.3 排插知识

排插这个词有点含混不清,通常指的是一长条薄塑料里面带了一列排插针,另一头则有小段的端子露在外面。这就是我们在图26-5中看到的。这个塑料可以拧断,这样想要几个端子的排插都可以,而且可以很牢固地插到面包板里面(前提是你得注意买的是0.1英寸间距的排插)。大家可以将排线的芯线分别焊接到这些端子上,同时重新排布顺序。

为了用通孔板来完成稳固的连接,我们必须要将板子上安装排插座。排插的针会插到插座里面。有点容易混淆的是,针和座在部件名录里面都被成为排插。

26-6展示了一条排插针和两条排插座。

说明: 00237.jpeg 

26-6

排插针和排插座都是以长条的方式售卖的,可以从中拧断,从而获得任意需要的长度排插针和排插座。排插针和排插座都可以被称为排插。它们有不同的种类,比如图右上角的就是一列直角的

26.1.4 环形计数器知识

在我谈论更多测试电路的内容之前,我想将环形计数器中最重要的知识总结一下:

●74HC4017是一个十进制计数器,有十个输出,可以按照次序来激活,一次激活一个。

这也被称为一个环形计数器。

环形计数器可以有八个输出、十个输出和十六个输出。

一个二进制码输出的计数器,当所有的输出都是低电平的时候代表的是0,而环形计数器则包括了代表0的输出,这个输出将会在计数器的值为0的时候为高电平。

在时钟输入不停止的情况下,一个环形计数器会不停地将输出序列重复下去。

●74HC4017通常在使用的时候复位引脚会保持低电平,使能引脚也是低电平。进位引脚是一个输出引脚,可以不接。时钟引脚使用的是低电平到高电平的变化时刻,这也被称为时钟的上升沿。

计数器的数值从9转化为0的时候,其进位会从低电平转变为高电平。因此一个计数器的进位引脚可以用来连接第二个计数器的时钟输入引脚,这样能显示的数值就能到99了。这种方法还可以增加更多个的计数器。

当复位引脚为高电平的时候,会强制计数器回到0的输出。

有些环形计数器不是十进制计数器,也有些十进制计数器不是环形计数器。环形计数器总是有着每次只有一个活动的解码器输出,但是可能少于十个,也可能多于十个。十进制计数器总是从0数到9,但是可以是二进制的输出,也可能是单个的解码后的输出。十进制计数器的二进制输出通常在数据手册中被称为二进制编码的十进制数,或者称为BCD

26.2 用来做游戏

在拉斯维加斯,大家可以玩一种游戏,里面的LED灯会沿着一个巨大的圆圈按次序闪烁,而我们需要在离我们最近的LED灯点亮的时候按下一个开关,我们花的钱只够按几下子开关,然后就得接着续钱。

我们想做一个这个游戏的简化版本,但是只要还是在面包板上搭建,要围成一圈LED灯就有点难办了。我的妥协是做了一个竖列的LED灯,选手需要在最底下的LED灯点亮的时候按下开关。大家如果有时间的话,可以自己重新搭一个带环形输出的电路。

为了防止选手简单地连续按下开关而获胜,我可以再增加一个单触发模式的定时器。定时器一般是在输入保持为低电平的时候重新出发,但是如果连接到定时器输入的按键是通过耦合电容连接的话,这个电容就会只将最初的高电平到低电平的变化传过去(就像第7章中的常年可用灯具开关里面的单触发定时器)。另外,如果电容的容值合适的话,就会忽略掉按键按下时由于触点回弹带来的变化毛刺。(我在Make:Electronics中讨论了一些触点回弹的细节内容)。

但是,按键需要用两个刀的(双刀单掷或者双刀双掷的),以便在按键没有被按下的时候,电容可以连接到电源的正极侧。否则的话,电容在按键被按下的时候就没有电荷去释放了。

26-7展示的就是这个游戏理念的框架图。

说明: 00238.jpeg 

26-7

这个框图展示了环形计数器游戏的简单逻辑

26.2.1 额外的功能

大家可以看到,在方框图中,当一个选手成功的时候,与门会检测到按键动作和环形计数器是同步的。与门会触发(猜一猜会发生什么)另一个环形计数器,而这个环形计数器会用自己的一套十个绿色LED灯来记录分数。

为了结束这个游戏,我使用了第三个环形计数器,使用的是十个红色的LED灯。这个环形计数器每次按键被按下的时候就会加1,不管选手有没有获胜。当这个环形计数器从0增长到9的时候,由于数值9对应的输出接到三个计数器的时钟使能引脚上了,就会将它们的使能状态从低电平转变为高电平了。

唯一开始再玩下一局游戏的方法是按下一个复位开关,如图26-7中的底部所示。这样会给三个计数器的复位引脚施加一个高电平信号,将所有三个计数器都设到0。复位引脚是优先于时钟使能引脚上的高电平状态的。

正如大家能看到的,我们需要30LED灯来完成这个游戏。幸运的是,LED灯现在很便宜(从中国买的话每个大概两分钱),而且由于环形计数器每次只会点亮一盏LED灯,所有每一列的LED灯都可以共用一个串联电阻。大家不用为了内置电阻的LED灯花更多的钱。

这个游戏的电路图见图26-8。因为电路图上没有足够的空间,我将LED灯完全省略掉了。每一个计数器上的黄色的、红色的和绿色的数字就是告诉我们这些引脚需要连接到对应颜色的LED灯,并且按照这些数字的顺序。这些颜色和我在图26-7中的颜色是一致的。

还是为了节约电路图中的空间,我将芯片斜着放了,在面包板上,很自然地我们会将芯片排列整齐,一个芯片放在另一个芯片上面。我相信大家都会觉得这样电路图看上更紧凑。

如果大家用之前的测试电路作为一个起点来搭建游戏电路的话,请记住要将第一个环形计数器的引脚13和引脚15从电源地上断开。我之前将这两个引脚连接到地上,是为了禁掉复位功能,从而保证芯片一直处于使能状态。在全电路里面,这些功能现在就得控制起来,用来开始一局新的游戏并在分别在每十次之后停止游戏。

说明: 00239.jpeg 

26-8

环形计数器游戏的电路图。三个计数器芯片内部的数字表示这些引脚需要连接到同样颜色的LED灯上,次序按照对应的数字顺序

双面包板电路的照片见图26-9和图26-10

说明: 00240.jpeg 

26-9

环形计数器游戏的左手部分

26.2.2 可玩性

大家可以用可调电阻来控制游戏的速度。当大家玩了这个游戏一段时间之后,就可以用两三个固定电阻加上双列直插开关来代替可调电阻了。这样可以预设游戏的难度等级。

说明: 00241.jpeg 

26-10

环形计数器游戏的右手部分,上面的跳线连接到另一部分

我用了三个不同的按键开关来测试这个游戏,发现在单触发定时器的输入上用0.033μF的电容效果最好。请大家记住,我说过7555定时器对于输入有点操心事。如果你发现有时候定时器不起反应,或者忽略了输出脉冲,可以用更大容值或者更小容值的电容来替换,或者试试不同的按键开关。

从单触发定时器过来的脉冲的宽度是至关重要的。如果脉冲过宽,选手就会在最底下的LED亮起来之前一些按下按键而获胜,因为这个脉冲的宽度会和LED灯的亮起状态重合。100kΩ的电阻和1μF的电容会产生一个大约十分之一秒的脉冲。为了让游戏更加难一些,我们可以用47kΩ或者22kΩ的电阻来替换,这样会分别产生大约二十分之一秒和四十分之一秒的脉冲。

26.3 制作更多

我在想如果这一列LED灯亮起的速度是不可预测的话,游戏会变得更加好玩。这个听起来很难做到,但是其实没有那么难。在项目22中,我已经给大家展示了如何将两个定时器的输出通过异或门,这样信号就会为反相,从而产生不可预测的声音效果。

我们需要做的就是将那个项目中的定时器的速度降下来,将速度降1000倍,然后将那个异或门的输出作为反应测试环形计数器的时钟输入,不需要用之前我用的振荡定时器了。

在一块面包板上把这些都完成是不可能的,但是大家可以将自己的伪随机周期生成器放在另一块板子上,并在几块板子之间走一根信号线(需要有额外的电源和地的连接)。调节两个变阻器,直到你对LED灯的闪烁开关的方式满意了为止。这些真的是随机的吗?不是的,但是看起来还是足够随机的,而这也是我们所需要的。迟早他们还是会重复同样的序列,但是如果我们的定时器只是稍微有一点相位不匹配,就会需要很长的时间才能有重复出现的。

这个电路的面包板版本如图26-11所示。这个电路是从图22-1中得来的,只是现在用异或门接着定时器,然后连接到十进制计数器上面。

说明: 00242.jpeg 

26-11

最初在项目22中提到的想法,用异或门将两个相位稍有差别的定时器的输出接起来,在这里应用了,产生了一个看起来随机的计数器的变化,从而控制十个LED

26.4 拿微控制器来做呢

用微处理器来复制这个游戏最主要的挑战在于需要三十个输出来驱动所有的LED灯。是吗?当然,我们只需要十个黄色的LED灯,游戏就可以玩了,得分和尝试次数可以用液晶屏来显示。而且如果这十个LED灯就超过了你能有的输出引脚数,我们还是可以用二进制转十进制的解码器芯片来驱动LED灯的,这次我们只要四个二进制输入就可以了。当然这就意味着我们需要给解码器芯片发送二进制码。

用微处理器来检查用户输入的按键可以用中断来完成。但是我们可能还需要在0对应的LED灯亮起来之前告诉微处理器不用理会按键。在这之前按下按键很可能是作弊。

绝大部分的微控制器用的都是高等语言,如C或者某个版本的BASIC,这些语言内部会有一个伪随机数生成器。这样我们就不需要用异或门来接两个定时器了。而且大家可以用在模数转换器的输入引脚上增加变阻器的方法来调节游戏速度。

因此,是的,用微控制器是可以完成的。而且大家肯定还能削减芯片数量。只是很奇怪,我觉得用微控制器来搞定这个电路会很难,因为我们需要写代码并调试程序,这个工作量可不小。原因在于我们这些不同芯片的功能都被压缩到你的一小段代码里面了。代码需要让LED灯以伪随机的方式闪烁,而当每一个LED灯点亮的时候,就得去检查用户输入的按键和复位按键——还得在尝试次数到达上限的时候停止游戏——还得适时更新LCD显示和游戏速度控制变阻器的输入,这些在代码里面都是变量,需要和内部时钟一起用。这些任务中的一部分可以用中断来处理,但是那样我们就有得写中断处理程序来处理中断。

有时候,直接将芯片堆在一起更简单。而且不管怎样,我还会喜欢各种颜色的三十个LED灯作为游戏显示的感觉。

项目27:移位寄存器

带解码输出的计数器可以用在游戏和闪灯显示的娱乐项目中,但是也许大家并不是什么事情都是想要LED灯按照大小次序来闪烁。也许大家是想做成一个自己想要的次序。

用来完成这个功能的元器件被称为移位寄存器。很有意思,但是为什么那么有意思呢?这个元器件用在什么地方呢?

我可以为这些问题提供一些实际的答案,但是我得先让大家来搭一个电路,大家以后还是会自己来触发移位寄存器并控制其他的项目的。移位寄存器可以提供固定宽度干净的脉冲,和之前项目中的单触发7555定时器差不多(见图26-8)。

27.1 不要回弹

我已经谈到过开关的回弹了,也在Make:Electronics中被称为触点回弹。这是机械开关触点的一个缺点,在闭合或者断开的时候,触点会震动一小段时间。由于数字芯片很敏感,并且响应速度很快,就会将触点的震动当作开关的多次按下来处理。

开关回弹在我们很多的项目中都不是一个问题,因为我不是用开关或者按键来给芯片发送脉冲的。比如在图26-1中,定时器运行在振荡模式,并由计数器来控制。

我们这个项目的主题就是移位寄存器,为了测试一个移位寄存器,我们需要用手动的方式来逐渐开展,而这个时候我们就必须需要没有回弹的开关了。

27.1.0 特别之处

在我的上一本书里面,我展示了当两个或非门或者两个与非门接成触发器的时候,就可以将输入上的回弹噪声去除。但是我希望用定时器来完成这个功能,因为定时器可以提供一个固定宽度的脉冲,而这本身就非常有用。

27-1展示了这个电路。我们必须用双掷开关,因为在正常的闭合位置上,电路会在0.033μF的耦合电容上聚集电荷。同时,定时器的输入引脚2也通过10kΩ的上拉电阻保持了高电平状态。只要输入引脚是高电平的,一切就不会有什么变化。

当按下按键的时候,耦合电容就接地了。这个事件传递到了定时器的输入引脚上,并将这个引脚拉低一定时间,接着触发了定时器的单稳态。100kΩ的定时器电阻和2.2μF的定时器电容使得定时器可以输出一个持续大约1/4s的脉冲。在这一段时间内,开关触点过来的任何的抖动都会被忽略。

说明: 00243.jpeg 

27-1

这是一个能输出干净固定脉宽的脉冲的电路,可以抑制按键产生的触点回弹噪声

定时器的输出必须维持比触点回弹的时间还要长一些。但是触点的抖动其实只会持续几个微秒。

当定时器的脉冲结束的时候,如果输入引脚还是低电平的话,那么定时器还是会被再次触发。但是在这个电路里面,即使按键还是被按着,耦合电容这个时候会阻断直流连接,同时上拉电阻会将定时器的输出保持为高电平。

当定时器的输出结束的时候,如果按键还是被按着的话,定时器会忽略按键的状态,完成之前的行为周期,输出脉冲结束。

现在假设按键在定时间隔结束之间被松开了,这个时候电容会立即被重新充电,而上拉电阻则保持定时器的输入为高电平。

如果按键在定时器输出结束之前被松开,定时器还能完成整个输出周期,直到输出脉冲结束。

唯一可能出错的情况是按键在和定时器脉冲结束的几乎同时被松开。在这种情况下,如果开关的触点在断开的时候发生抖动,就有可能重新触发定时器。

定时器的输出脉冲应控制在很短(1/4s或者更短)或者相对很长(1s或者更长),来避免开关触点在定时器脉冲结束的同时断开而造成抖动。

这个电路图中的定时器的输出接着一个LED灯,用于作展示。根据我们的应用场合不同,可能要在定时器的输出上安放另外一个耦合电容,将这个简短的脉冲发送到电路的下一级,同时阻断直流。

27.2 一个移位寄存器的示例

现在我们可以来谈移位寄存器了。图27-2中的电路设置和图26-1中的环形计数器测试电路有一些相似之处,只不过现在是用我刚才描述的去抖动电路来手动控制的。

说明: 00244.jpeg 

27-2

这个测试电路展示了移位寄存器是如何在时钟信号的驱动下将内容在内部的存储位置之间移动的。按键会将数据导入移位寄存器

请注意,现在还是用的7555定时器,而不是老式的555定时器。

这个电路的面包板版本的照片见图27-3

说明: 00245.jpeg 

27-3

面包板版本的移位寄存器测试电路

我们之前使用的环形计数器(以及之前的解码器)的引脚值并不是按照大小的顺序排列的,但是74HC164移位寄存器则方便很多,从引脚3开始逆时针绕着芯片排列。这样就使得芯片很容易连接到一列的LED灯上,从而按照次序来亮起,只是这个次序是从上向下的,而不是从底向上的。

和之前一样,图27-2中的黄色圆圈代表的是LED灯。如果大家用的LED灯内部不含串联电阻,就需要为电路中的每一个LED灯接一个串联电阻。解码器和环形计数器每次只会点亮一个LED灯,而移位寄存器可以按照任意组合去点亮LED灯,包括同时点亮所有的8LED灯。

我增加了一个时钟信号LED灯,目的是为了展示定时器的输出是有效的,因为当你给电路上电的时候,可能八个LED灯什么变化都没有。这是因为移位寄存器内部的存储位置上没有任何数据,需要我们输入数据。

按下数据输入按钮,当我们将这个按钮按下的同时,连续按下时钟脉冲按钮。数据输入按钮给移位寄存器的输入缓冲接上了高电平的状态,而每次按下时钟脉冲按钮,输入缓冲的状态就会被拷贝到移位寄存器的第一个存储位置(电路图中用A来表示),而其他存储位置的内容则被赶着向前以腾出空间来。

现在松开数据输入按钮,10kΩ的下拉电阻会在输入缓冲上接入低电平的状态。如果大家连续按下时钟脉冲输入的按钮的话,这个低电平的状态就会被时钟锁入到移位寄存器内部,和上一种情况一样,存储的内容被赶着向前来腾空间。那么最后一个位置,就是电路图中的H会发生什么呢?这里的内容被扔掉了。

27-4中描述了移位寄存器的一个移位周期。八个存储位置中的每一个都可以看成包含了一个二进制数,或者说比特。在这个图里面,最初的时候CH的位置上是高电平状态。首先,按键将高电平状态放到了输入缓冲上,然后时钟的上升沿会将移位寄存器中所有的比特都顺着移动,并将输入缓冲的高电平拷贝到位置A上。

说明: 00246.jpeg 

27-4

数据输入进移位寄存器并在寄存器内部移动

电路上的触点开关没有发生抖动,因为移位寄存器只会在时钟上升沿的时刻来检查信号状态,在其他的时间移位寄存器会忽略触点开关的动作——事实上,如果大家在时钟脉冲中间按下开关的话,移位寄存器是不会发现的。

27.2.1 移位寄存器知识总结

移位寄存器内部包含存储位置,每个存储位置保持着高电平或者是低电平。大家可以将这些位置想象为二进制的数字。

绝大多数的移位寄存器都是8比特的元器件,但是可以将几个这种移位寄存器串接起来。

移位寄存器时钟引脚上的信号会通知移位寄存器将最后一个存储位置的值扔掉,并将所有存储位置的值往后移动一位,同时在第一个存储位置上加载新的值。

这个新的值是由一个新的时钟周期开始的时候输入引脚的高电平或者低电平状态决定的。绝大多数移位寄存器都是在时钟脉冲的上升沿动作。

移位寄存器除非在时钟转换时刻被触发,其他时候就会忽略输入引脚的状态。

有些移位寄存器可以将并行的数据转化为串行的数据,也可以将串行的数据转化为并行的数据。

有一个部件号为TPIC6A595的移位寄存器,它有着功率逻辑输出,可以提供100mA甚至更多的电流。这在有些应用中会非常有用。

27.2.2 引脚分布

74HC164的引脚图如图27-5所示。其中八个引脚和内部的存储位置相连。我将其标示为AH,但是有些数据手册里面可能是用1A1H,或者QAQH,甚至用其他类似的东西来表示的。

清零输入引脚是低电平有效,会将所有存储位置的内容置为0。因此,这个引脚通常是放在高电平的状态。芯片有两个串行数据输入,分别是引脚1和引脚2。对于我们的应用来说,可以将一个输入保持为高电平,而另一个则接收数据。引脚1和引脚2的功能是可以互换的。

74HC164是一个相对简单的芯片,只有14个引脚。其他的移位寄存器有额外的功能,我在这里就不讨论这些芯片了。

说明: 00247.jpeg 

27-5

74HC164移位寄存器引脚图

27.3 背景:比特流

很久很久以前,计算装置之间的信息交互通常是用串行电缆来完成的,里面有三根线。其中一根是地,另一根用来给外置装置标示数据流的开始和停止,而第三根线上走的是数据。

当接收端的装置累积了七个二进制数的时候,就会将其组成一个二进制数,从00000001111111(对应十进制的0127),每一个这样的数值可以用来作为字母表中的一个字符的代码,这个字符可以是大写的,也可以是小写的。大家还能有空间放几个控制码,比如新一行位置的开始。(后来编码系统扩展了,开始使用8比特,但是新加的代码没有标准。)

这就是文字在很久以前是如何传输的。在这套非常基础的系统里面用的这个字符编码系统被称为ASCII码,是美国信息交换标准代码的缩写。

这种方式速度很慢,也很原始——但是我们现在还在使用串行数据传输,意思是数据的比特用一根电线,每次传送一个。USB设备和硬盘的SATA连接用的都是串行数据。传输速度已经完全天上地下了,但是基本的原理还是一样的。

ASCII码现在也还是一样的,但是现在已经是Unicode的一个子集了,Unicode允许每个字符使用32比特,这样就有助于包括外国语言的传输,比如日本语。

我在解释中跳过了里面的难点,就是串行数据流接收端设备如何来将数据恢复出来。早期的计算机每次能处理8个比特(1个字节)。因此,他们需要串行地收到8个比特,然后用移位移到8个存储位置上,然后沿着8个并行线同时输出,供后续处理。

我想大家已经猜出来了,完成这个功能的芯片就是移位寄存器。这是一个可以将比特顺次移位的寄存器,还可以用作串行并行转换器。

27.3.0 现代的应用场合

现在,大型芯片内部都集成了移位寄存器,同时还能完成其他功能。但是单独的老式芯片还是有其用处的。

比如说,假如我们需要用微控制器来控制八个设备的开关,但是又没有八个输出引脚可用。大家可以将这八个开关状态通过一根电缆快速地发送到移位寄存器,然后再用一根线来发送时钟,当每一个比特到达的时候将数据采集。这时移位寄存器的八个输出引脚的状态就可以控制这八个设备了。而且我们还可以很快地更新寄存器,结果看起来都是即刻生效的。

还有,大家可以将移位寄存器级联起来控制16个设备——或者24个,甚至32个设备——而且还是只需要用一根线来传输数据。这是一个非常强大的思路。

这里有个想法。假如我们用了移位寄存器里面的7个比特来代表一个二进制数,如果我们将所有的数字都向左移动一位,而将最右边的数字用0代替,那么我们就是将原来的值乘以了2。为什么呢?因为当我们将一个二进制数向左移了一位,那么每一个二进制的位置的值都是之前一位的两倍。

大家是不是觉得可以将二进制加法器改成乘加器了?这是一个很复杂的想法,但是我不会去做这件事情。我会在一个装置里面用移位寄存器(实际上是三个移位寄存器)来完成,后面会讲到这个事情。

项目28:八卦盒子

在这个项目中,我们会去制作一个装备,来显示电子版本易经中的卦象。我将它称为八卦盒子。

如果这些术语你看不懂,没有关系的,我会马上来讲解。

这个项目的超级缩水版曾经在《爱上制作》系列书中露过面。要将这个项目压缩到只有几页纸里面确实有点复杂,因此我在这里给大家带来一个新版本,包括了更多的图示和更详细的解释。

另外,我还在我的朋友Fredrik Jansson的帮助下简化了电路。他就是那个只用4000系列逻辑芯片设计了一个计算机的人。事实上,我和Fredrik的第一次联系是也因为他给我的杂志写邮件,指出我的电路中有一个或门是可以去掉的。我在这里提这件事情是说,我确实会阅读我收到的所有信息,而且我还会认真地处理的!

28.1 卦象

我们回到八卦。

易经(读作“ee-ching”)是一本古老的中国书籍,里面会对你的现实情形和未来前程给出神秘的建议。大家可以将其看成是预知未来。这种奇怪而声名显赫的建议概要书已经存在了超过两千年了,而其基础在三千多年前就已经成型。有些人认为这本书确实有预知未来的能力。我不知道他们说的对不对,但是从另一个角度讲,我也不能证明他们是错误的。

易经有很多的英文翻译版本。每个版本都包括了现在状态的64种基本描述,而每种描述则是用一个称为卦象的图形来表示。

28-1中有两个卦象来作为示例,还附带了对应卦象含义的简短解释。任何一个认真对待易经的人都会抱怨这些表述过于简单——确实是这样。问题是,我并不自称为易经专家,我在这里只是给大家来展示如何用电子的方法来模拟。

一个卦象中有六根线,这些线可以是实线也可以是虚线。换句话说,每根线有两个状态。总共有六根线,这也就是为什么不同的卦象总共有64种的原因了。

2×2×2×2×2×2=64

说明: 00248.jpeg 

28-1

两个示例的卦象,以及非常大略的表述

重要的是,左边的卦象和你现在的处境相关,而右边的卦象则告知的是你的未来。大家总是需要有两个卦象,才能知道你现在的处境和未来的情形。

28.1.1 显示

我在开始计划这个项目的时候,就决定用电子的方法通过灯光条——小的长方形的内含LED灯的元器件,来显示卦象。图28-2中展示了一个灯光条的特写,而八卦的渲染图和图28-3类似。

说明: 00249.jpeg 

28-2

LTL-2450Y灯光条(或者类似的灯光条)可以用来做出比较干净的显示效果

想要用这个八卦,我想象中大家需要按下按键,直到设备为我们产生了两个卦象。然后我们就可以到易经的某个版本的翻译中去查找这两个卦象的含义,从而获得关于我们命运的先机了。

这件事情的难点在于精确模拟传统方法来产生卦象。这就需要我来做一点研究了。

说明: 00250.jpeg 

28-3

八卦的三维渲染图,展示了两个卦象

28.1.2 直的蓍草的指引

在古代的时候,人们是通过扔蓍草来得到两个卦象对应的实线和虚线的。蓍草是一种野草,而蓍草秆就是蓍草干死之后的产物。扔蓍草秆需要一个复杂的准备过程,需要将这些草秆分成堆,并数数,但是内部的原则是很清楚的:你的运气是由蓍草随机落下的方式决定的。

扔蓍草秆本身也是一个复杂的过程,当已经在20世纪60年代迅速流行的时候,很多人都没有耐心去遵守正确的程序。毕竟几乎没有人知道蓍草秆是个什么东西,也没有地方去买,因为那个时候还没有互联网。这个事情现在听起来令人难以置信,但是在20世纪60年代,你是不能从亚马逊或者eBay上买东西的。

因此,人们开始使用一种简单的系统来产生卦象,就是通过掷硬币。不幸的是,这套系统得到的卦象的概率和用扔蓍草秆得到的卦象是不一样的。

当我开始计划做电子版的八卦模拟的时候,我决定要做到尽可能地像真的。我希望模仿最原始的扔蓍草秆的方式——但是我怎么样才能做到呢?没有问题!我到维基百科去查了查,里面有一个关于易经的很好的条目。

现在,请大家记住,我们需要两个卦象,其中左边的卦象是描述我们目前的状态,而右边的卦象则是和我们的未来相关。

当左边卦象的虚线转变为右边卦象的实线,或者左边的实线转化为右边的实线时,易经里面是有很多的细节描述的。这种被称为变化,这也是为什么易经的文字总是被称为变化之书的原因。事实上,我觉得这也是20世纪60年代常说的我的生活经历了很多的变化的来源,这是Buddy MilesJimi Hendrix录的一首歌里面的——但是我的理解是这样的。

因此,为了将事情做对,我们需要知道一条虚线变化为一条实线的概率,也要知道一条实线变化为一条虚线的概率,也得知道实线还是实线的概率和虚线还是虚线的概率。这就是卦象的组成,每次是两根线,而总共连续六次。为了方便,我将这一对线称为横跨两个卦象的切片。

28.1.3 数字

28-4展示了一个切片里面四种虚实线的组合情况。其中每一种组合出现的概率不尽相等,因为蓍草杆计数的方法很复杂。这些概率如图28-4所示。

说明: 00251.jpeg 

28-4

每一个切片里面包含一个左方卦象的一条线和右方卦象的一条线。图中列举了一个切片中各种组合的概率

如何用电子的方式来呈现这一切呢?嗯,数字16是很方便的,因为(我很肯定大家还记得)一个解码器有16个输出。假设一个定时器在以很快的速度运行,并控制一个二进制计数器,这个计数器的输出可以用来进行解码。现在假设计数器在任意一点停止,这样就可以用随机的方式的选择解码器的输出。而解码器的输出通过分组可以产生出1/168/16或者任意我们需要的概率。

28-5展示了总体的想法。解码器有16输出,对应数字015。我们可以认为如果底下的八个输出有一个为高电平,则切片里面左边的一条线为实线。也就是所有的光条都要被点亮。

说明: 00252.jpeg 

28-5

如何将解码器的输出组合起来,以得到随机选择的概率和两个卦象的线出现的概率一致

我们回去看图28-4:大家可以看到我们在左方出现实线的概率是8/16,右方出现虚线的概率是3/8,右方出现实线的概率是5/8。大家可以看到我在图28-5中已经将这些都满足了。

现在,如果解码器其他的8个输出中有一个为高电平,那么左边的线就应该是虚线——也就是说我们将会在两头点亮两个发光条。但是中间的灯是不会点亮的。在这其中的1/8的情况下,我们会在右方出现实线,这也和图28-4中的表现是一样的。

这些发光条的自然状态是不发光的,因此我们只需要去解决怎么点亮的问题。点亮的规则可以用解码器输出的数字来总结,如下:

规则1:如果输出8或输出9或输出10或输出11或输出12或输出13或输出14或输出15为高电平,那么切片中左边的线将切换为闭合。

规则2:如果输出1或输出11或输出12或输出13或输出14或输出15为高电平,那么切片中右边的线将会被切换为闭合。

听起来我们只需要几个大号的或门就可以了。但是——等一下,在规则1里面(正如Fredrk Jasson给我指出的),左方的线在数值为81510001111二进制数)的时候为实线,而其他的时候(00000111二进制数)是虚线。那么二进制数10001111有什么共同点呢?就是最左侧的一位是1吗。因此我重新写出如下规则。

规则1(修改后):如果二进制计数器中8对应的那一位为高电平,那么切片左侧的线会切换为闭合。

我们对规则1就不需要或门了。

至于规则2,我们还需要一个6输入的或门。这种或门存在吗?不存在,但是8输入的逻辑门,含有或门输出(同时也含有或非门输出,但是我无视了)。如果我将其中的两个输入接到地上,用剩下的6个输入就可以了。

这样就足够用来产生一对卦象中的一个切片了。总共有6个切片,因此我需要重复这个流程6次。

28.1.4 随机采样

我来选择一个随机数的方法是在一个任意的时刻采样并停止一个快速的计数器。这个方法是没有问题的,但是,怎么去做呢?

我希望这个过程能看起来是自动的。我不希望让用户去按一个按钮按6次。那么这个做法怎么样?我可以增加一个运行得很慢的震动模式的定时器(大约每秒一个脉冲)。如果这个定时器的速度随机变化的话,我可以用这个定时器来采样快速运行的计数器6次。

怎样才能让这个定时器变得不可预测呢?我有一个主意。如果你把你的手指变得潮湿,那么非常靠近的两点之间的皮肤电阻就会在500kΩ2MΩ之间。我可以用这种方式作为控制慢速定时器的脉冲速度的电阻。

现在我只需要这个自动系统来产生两个卦象最底下的一个切片,然后向上移一格,再生成一个切片,再重复这个过程直到我生成所有的六个切片。这里的移一格实在是在强烈建议我使用移位寄存器。

事实上,我需要两个移位寄存器,一个用来存储和显示左侧卦象的线,另一个用来存储和显示右侧的线。我将其称为寄存器1和寄存器2。大家可以在图28-6中看到这两个寄存器,图中还展示了第三个移位寄存器,但是我会过一会儿再来说它。

这个计数器是连续运行的,解码器也是连续运行的,而且会连接到移位寄存器的数据输入上(幸运的是,这些芯片在连续运行的时候,这样快速运行是没有任何损耗的)。但是大家可能还记得在项目27中说过,移位寄存器如果接收不到时钟信号是不会动的。这个时钟是告知移位寄存器去将存储位置中的内容移动,并采样进新的数据,然后显示结果。

慢速定时器将提供时钟脉冲。这些脉冲相对较长是没有关系的,因为移位寄存器只会在脉冲的上升沿做动作。

28.1.5 外观与感觉

因此,场景如下。大家将八卦闭合,用潮湿的手指按在触点上。根据皮肤潮湿的程度以及我们按下手指是否用力,慢速定时器将以不同的速度运转。这个定时器会以随机的间隔来采样通知定时器,而两个卦象将会在发光条显示上慢慢地往上滚动。

我特别喜欢这个计划,因为慢速定时器只有我们将手指按在触点上时才会运转。没有按上时两个触点之间的电阻近乎无穷大,这样慢速定时器的定式电容就不会充电。因此我们就不需要一个开始按键。大家给八卦上电,然后就等着你按手指了。

理想情况下,这个八卦应该能自己停止。也许当最上面一行的切片产生完毕的时候应该停止。我可以从那里获取电压信息然后接到慢速定时器的复位引脚上,这样就能停止这个定时器产生脉冲了。我需要将最顶上一行的切片的高电平转化为复位引脚的低电压,这只需要一个三极管就搞定了。

为了防止我哪里没有讲得特别清楚,我将电路中的命令序列用流程图在图28-7中展示出来了。

还有一个问题,为什么在图28-6中需要第三个移位寄存器?请注意这个寄存器的输出驱动的是每一个卦象的最外层的发光条。这些发光条会一直亮着,不管中间的发光条状态如何。我可以将所有的这些发光条直接连接到电源正极——但是如果每个切片是顺序亮起的话,所有的发光条亮起然后向上滚动,卦象显示会显得好看一些。因此,第三个移位寄存器用来让这个过程更好看一些。这个移位寄存器的输入是用线直接连接到了电源的正极侧,每次到来了时钟的脉冲,就会将高电平状态往里移动,并与其他的移位寄存器同步。

说明: 00253.jpeg 

28-6

产生两个卦象的数字逻辑元器件

说明: 00254.jpeg 

28-7

这个流程图中列出了八卦的基本原理的要点

28.1.6 细节

在这个电路中,我省略掉了一些细节。首先,我们可以增加一个复位按键,这样就可以用一个脉冲来接到三个移位寄存器的清零引脚上。由于74HC164移位寄存器需要低电平输入来复位,这个清零引脚可以用上拉电阻来保持高电平,而用按键来暂时连接到地上进行清零操作。

其次,74HC4078单门八输入或门芯片在有些供货商里面标着已经过期了。我看到网上还有卖的,价格是每片低于50美分,但是到将来肯定会越来越难买到。还好老式的4078B CMOS版本的芯片还在大量供应中,可以用来替换,毕竟我们对输出电流没有什么要求。大家在这个电路中可以用74HC4078,也可以用4078B

这两个芯片都包含一个或非门和一个反相器,因为或非门加上一个反相器就是和或门是一样的。这个或的输出和或非的输出是用了不同的引脚作为芯片输出的,如图28-8所示。

说明: 00255.jpeg 

28-8

74HC40784078B芯片的引脚图,这两个芯片都可以用在八卦电路中。这些芯片在输出上提供可选的或输出和或非输出

至于二进制计数器,我们可以用那个在项目21中使用到的4520B芯片,对应的引脚图如图21-6所示。

28.1.7 LED灯还是发光条

这些发光条需要的电流很大,直接用移位寄存器来驱动是不行的。图28-6右边的移位寄存器需要在每一行点亮4个发光条,当卦象完整的显示时一共要驱动24个发光条。每个发光条大概需要20mA,那么总共就大约是需要500mA

大家可以用TPIC6C596这个电源逻辑移位寄存器来解决这个问题,这种移位寄存器每一个输出为高电平时可以提供100mA的驱动电流。但是其操作模式和74HC系列的移位寄存器稍有不同,而我在这里也不想去讲这些不同点。大家可以去查对应的数据手册,然后再自行决定是否去用这个芯片试试。

我更喜欢用达林顿阵列来驱动这些发光条,比如用ULN2003。这个达林顿阵列包含了三极管,七个输出引脚上每一个都可以提供高达500mA的电流。ULN2003的引脚图如图28-9所示。请记住因为达林顿管的每个内部三极管对都有着集电极开路的输出,这个芯片不会从外部吸取电流,而是流出电流。

说明: 00256.jpeg 

28-9

ULN2003达林顿阵列的引脚图,芯片内部含有七个三极管对,每一对可以提供500mA的驱动能力

如果要让ULN2003来提供驱动电流,需要将引脚8连接到地。而引脚9上可选的地连接只有在负载为感性负载,可能产生反电动势的时候才需要。ULN2003中包含的二极管是用来给这些反电动势提供通路的,当然这个时候需要连接可选的地连接。对于一个只驱动发光条的电路来说,这个可选的地是不需要的。

大家可以稍微降低一些发光条的耗电,同时还不用去焊接串联电阻。大多数发光条里面还有一个LED阵列,而这些LED灯都是可以通过外部引脚独立连接的。我用LYL-2450Y发光条的时候,发现如果我将其引脚焊接起来串联在一起,如图28-2所示,就可以直接用9V来驱动,每个LED灯会需要16mA的电流,比起标称的20mA电流还是低一些的。这种连接需要9V直流电源。大家可以整个电路都用9V直流电源,达林顿阵列用这个电压也没有任何问题。但是要记住将这个电压用LM7805来进行稳压,从而产生逻辑芯片用的5V直流电压。

28-10中展示了三种用达林顿阵列来连接LED灯进行驱动的不同方法的电路图。

说明: 00257.jpeg 

28-10

三种使用达林顿阵列连接LED灯的不同选择

这些不同的选择形成不同方案:

第一种,对于完整的的电路

使用74HC164移位寄存器,这个寄存器我们在之前的项目中已经测试过了。

使用ULN2003达林顿阵列来放大每个移位寄存器的输出能力。

使用Lite-OnLTL-2450Y或者类似的发光条,四个LED灯内部串联起来。

用未经过稳压的9V直流电源来对发光条进行供电,剩下的电路需要5V直流,可以用9V经过LM7805这个5V稳压芯片来供电。

第二种,对于示范用的电路:

用一个低耗电的单独的LED灯来取代发光条。每个LED灯的耗电不能超过8mA

将每个卦象切片中的四个外围LED灯用串并联的方式连接起来,如图28-10中间的配置。

直接用74HC164移位寄存器来驱动所有的LED灯,当然要先验证一下每个移位寄存器的输出电流不超过8mA(整个移位寄存器芯片的总电流不应超过50mA)。我们就不需要用达林顿管了。

5V直流稳压电源来给整个电路供电。

不管用哪一种,请记住这个电路耗电比较大,用电池供电是不行的。

28.1.8 搭接八卦电路

整个电路规模比较大,没有办法放在一个面包板上,因此我将其分成了第一部分和第二部分。第一部分的电路图见图28-11,这一部分的电路可以用在示例上,也可以用在最终的电路中。我需要调整电路中每个芯片的位置,保证电路所有器件可以装在面包板上。

第二部分的电路图如图28-12所示。这是一个示例版本,其中三个移位寄存器直接用来驱动LED灯。为了将这部分电路升级为完整版本,需要在移位寄存器后面增加达林顿阵列,并用发光条来替代LED灯。还需要从外面额外引入一根9V直流的电源线来给发光条供电。

我很遗憾,由于空间的限制,我不得不将很多的导线安放得特别靠近,如图28-12所示。如果大家依次在每根导线旁边放一根尺子,就会发现它们是如何驱动LED的。这种排布每一行LED都要依次办理。

还是因为空间的限制,我用了黄色的圆圈来代表LED灯,并省去了可能需要用的串联电阻。请大家记住,所有的LED灯的正极(阳极)管腿都在顶上,而负极(阴极)管腿都在下面。

说明: 00258.jpeg 

28-11

八卦电路的第一部分,在示例电路和完整电路中都用到

每个卦象的左侧和右侧的LED灯是一直亮着的,用串并联方式进行连接,如果这些LED灯没有内部串联电阻的话,就需要一个串联电阻,而阻值可能和单独使用LED的时候不一样。不管是哪一种情况,大家都需要使用不同的串联电阻进行测试,并检查流经LED灯的电流。每一个LED灯都是独立供电的情况,以及每一组4LED灯都是串并联连接的情况下,电流都不能超过8mA

说明: 00259.jpeg 

28-12

八卦电路的第二部分(示例版本,用的是LED而不是发光条)

28-13中展示了需要串联电阻的LED灯是如何连接到面包板上,以获得使用空间最小的效果的。这里的六个LED灯代表了一对卦象中的一个切片。我们还对这些LED灯进行了编号,以标示哪一个LED灯由哪一个移位寄存器来驱动。中间的粗灰线代表的是面包板内部的导线。

说明: 00260.jpeg 

28-13

用移位寄存器1和移位寄存器2来独立驱动两个LED灯的连接方式,以及用移位寄存器3来驱动四个串并联连接的LED灯的连接方式。如果大家的LED灯没有内部电阻,可以调节串联电阻,保证每个LED灯消耗的电流不超过8mA

这种布局只需要五行插孔就可以了,这样六组LED灯也就只要在面包板上占据30行。这样就为移位寄存器在面包板的上部留下了足够的空间。

完整的示例电路如图28-14和图28-15所示。

说明: 00261.jpeg 

28-14

八卦电路的逻辑芯片部分

说明: 00262.jpeg 

28-15

八卦电路的第二部分

28.1.9 组装与测试

由于这是一个相对较庞大的项目,我们需要在搭建电路的时候就对每一部分进行测试。当我在搭建原理验证版本电路的时候,我是按照如下步骤进行的,首先是测试LED灯,然后按照往回走的顺序进行测试。

1.在第二个面包板上,将与LED相关的所有连接线和电阻都布上,然后安装LED灯,并给每一个LED灯都供电进行测试,保证这些里面没有不良的连接。

2.将三个移位寄存器安装上去并连接到LED灯。手动触发移动寄存器,通过输入B来作时钟,将输入CD(如电路图中所示)采集进来。大家要想在输入B获得干净的时钟信号会有一些问题。可以尝试用一个10kΩ的电阻将输入B接地,然后特别轻微地用电源正极的导线点上。

3.在旁边放上第二个面包板。将快速7555定时器安装在第一个面包板的顶部。大家可以用33μF的电容来替代10nF的电容,这样可以降低定时器的速度以便进行测试。这个电容可以一直放到第10步。大家还需要在定时器的输出引脚上放一个LED灯。

4.添加二进制计数器,用LED接在输出上进行测试,大家可以使用高阻值的串联电阻,这样就不会吸取超过2mA的电流了。

5.添加解码器,并用带高阻值串联电阻的LED灯来检查输出。

6.增加或门/或非门,并用高阻值串联电阻来检查输出。或门的输出应当在解码器二进制数值为 10111100110111001111 0000的时候输出高电平。

7.LED灯来测试慢速的7555定时器。这个LED灯应当在加电的时候就亮起来。这是没有问题的。将手指打湿,并按在传感器触点上(可以用两个剥了皮的电线来做)。这些触点之间的距离不应该超过0.01英寸。一两秒之后,LED灯就会灭掉,然后会再次亮起。

8.添加三极管和两个面包板之间的连接。

9.将所有的LED灯从计数器、解码器、以及或门/或非门逻辑芯片中去掉。这个很重要!如果这些芯片在高速驱动LED的话,就不能相互正常通信了。

10.0.001μF的电容替换7555快速定时器上的33μF电容。

11.不要忘记将两个面包板上的两个正极总线和两个负极总线分别连起来,这样当我们开始测试的时候,两个面包板就都有电了。虽然大家都很热切地要观察电路,但是要特别小心不要将电源接反了!

28.1.10 八卦的使用

这个100μF的电容(如图28-11左上角所示)可以抑制一开始上电时候的电压信号上的毛刺。如果电容正常工作,所有的LED灯应当都是灭的。如果有LED灯亮起的话,可以用第二个面包板上的复位按键。

将手指按在传感器触点上。为了能更快地反应,可以先一步将手指打湿。大家要耐心一点;电容充电需要一两秒的时间。定时器的输出会被拉低,然后再被拉高,这个时候显示的第一个切片就应该出来了。这个过程会重复六遍,然后停下来。如果显示还在往上滚动,可以用万用表来检查慢速定时器的复位引脚。这个引脚的电压应该在产生输出的时候高于4.5V直流,而应当在显示完成之后掉落到0.5V直流以下。

如果大家将电源断掉,然后再重新连上的话,很可能100μF的电容上还有残存的电压,还能重新生成显示。大家需要让电路断电超过一两分钟,让电容放电完毕。

连接两个面包板的时候,长导线是无法避免的。两头带插口的导线可能连接不是特别牢靠。如果大家的电路表现异常的话,首先要检查的就是连接线。

28.2 包装

28-3展示了最终完成了的八卦是如何显示两个卦象的,而图28-16则展示了盒子顶面需要的切割尺寸。

这个项目并不像看起来那么夸张,因为芯片的连接相对简单。绝大多数的连接都是连到卦象的显示上。当然,在使用达林顿阵列的时候,接线会变得复杂一些。还有一个是成本的问题:如果大家使用发光条的话,可能整个项目要花费40美元左右。

还有,就我所知,八卦盒子是解决上最古老的占卜系统的唯一的电子版本。

这个盒子能和扔蓍草秆相同的工作吗?这当然和扔蓍草秆并用手画出卦象稍有不同。但是如果大家相信命运在控制蓍草秆的位置的话,我觉得命运也一样在控制硅片内部的电子。

说明: 00263.jpeg 

28-16

这种切割尺寸可以用在八卦盒子的顶面上

这就让我得到这样的结论:希望你的运气正极加满!

项目29:常见的传感器

在这个项目以及接下来的5个项目中,我将讨论的是传感器。这是一个非常有意思的领域,因为这个领域目前还在飞速发展。我一直使用的逻辑芯片的基本设计和功能在很久之前就已经确立了,但是我们周边的平民传感器的进化现在还在不断进展中。

这里的关键词是平民。举个例子,在2000年的时候,如果我到处去找,也许我们就可以买到加速度传感器——只是我很可能找不到一个只卖给我一个传感器的经销商,而且会很贵。而且,我买到之后,还是不知道这个传感器到底怎么用。

而现在,在美国,我可以从中国香港定一个三轴加速度传感器,价格只有3美元,还免国际邮费,而且这个传感器能直接接在Arduino微控制器上用。

手持设备的更新换代使得传感器变得体积更加小、使用更简单,而且价格更便宜。现代的智能手机里面可能包含高达十个的传感器,包括话筒、触摸屏、无线天线、GPS、环境光传感器(调节屏幕亮度)、加速度传感器(可以知道你在怎样拿着手机)、温度传感器、高度传感器、湿度传感器——还有接近传感器,这样当你将手机举到耳朵旁边的时候,会感应到头部,并将显示关闭,以避免误触发同时节约电源。

传感器的领域非常宽广。我版面有限,只能描述几种。大家可以到http://www.jameco.comhttp://www.sparkfun.com这样的网站上去搜索传感器,估计看到搜索结果会大吃一惊的。

29.1 小小的磁力开关

可能所有的传感器中最古老的要算不起眼的磁簧开关了。我在Make:Electronics中提到过,但是只是提到了它在报警系统中的应用,用法也是包在小的塑料壳里面,用于感应窗户或者门是否开着。我在这里将讨论更多的细节内容。

我们先来看看这种很有用的小东西的样例。图29-1中展示了两个磁簧开关。

这种玻璃的胶囊里面有着惰性气体,用于保护触点免于氧化。这个功能很有用,但是玻璃很薄,也很易碎。引脚掰的狠一些可能就破了。大家在操作磁簧开关的时候一定要注意。如果我们需要一个更加坚固一些的包装的话,还有一些开关是用塑料封装的,如图29-2所示。

说明: 00264.jpeg 

29-1

磁簧开关,请注意背景的坐标纸的每一个方格的大小是0.1英寸×0.1英寸

说明: 00265.jpeg 

29-2

有些磁簧开关,如这一种,是用塑料封装的,能提供更好的保护。

29.1.1 磁簧管测试

下面的项目室是这本书里面最简单的一个项目——甚至比项目1中用胶来控制三极管还简单。

由于磁簧开关没有一个标准的电路符号,我们常用图29-3中的图示来表示。将其如图所示进行连接,然后在附近放上一个小的磁铁,其中品红和青色的色带表示的是磁铁的两极。

尽管叫做磁簧开关,但是行为和按键一样。只有暴露在磁场中的时候会闭合,而当没有磁场的时候,又会断开。

说明: 00266.jpeg 

29-3

测试磁簧开关

29.1.2 使用方法

磁簧开关里面的触点是安装在柔性的金属片(磁簧)上的,这些金属片虽然不是磁化的,但是可以导磁。大家记住,磁铁产生的磁场可以在其他物体内部感应出磁场来。事实上,当磁铁吸一个铁钉的时候,靠近铁钉的一极是在铁钉内部产生了一个短暂的相反的磁场极性。

如果磁铁和开关平行摆放的话,磁簧就会暂时被感生出相反的磁极。这样就产生了一个相互吸引的力量,导致磁簧相对弯曲,从而形成连接。当磁铁被取走之后,磁簧又会在弹力的作用下分开。

如图29-3所示,磁簧开关在磁铁摆在上面或者中间的时候几乎是一样的敏感,因为磁簧在每一种情况下都是产生相对的极性。即使磁场反向了,还是相互吸引的。

29.2 液位传感器

好几年前,我为一个研究项目室制作一个快速冷却设备的原型的时候,我需要一个液位传感器。最基本的液位传感器是一种只有开关状态的装置,被称为浮动开关,能够检测到液体是否到达最高或者最低位置。这是一个圆柱体,由填充了塑料泡沫制成,漂浮在液体表面。这个漂浮物的中间有一个孔,像甜甜圈一样,这样就能沿着带磁簧开关的塑料杆自由地上下滑动。漂浮物里面有一个磁体,这样开关就能因为这个磁体而闭合。图29-4展示了一种低成本的液位传感器。

说明: 00267.jpeg 

29-4

一个简单的低成本液位传感器,漂浮物中间有一个磁铁,可以用来闭合中间塑料杆里面的磁簧开关

也许大家可以想出来其他的应用。比如说,尽管经过了许多年的改进,抽水马桶水箱里面的止水阀还是不够可靠。在我住的地方,满是沙漠的蛮荒,水是非常重要的物资,如果抽水马桶坏了可不是一点点小问题就能说得过去的。也许我应该在马桶水箱里面装一个浮动开关,然后接上LED灯和9V电池。如果止水阀出现问题的话,水位就会上升并漫出来,这个时候LED灯就会给我警告。或者我还可以用一个小的蜂鸣器。

还有另一种可能。有些人住的房子地下室特别容易淹水。这也是能装一个浮动开关的场景。大家还能想到其他用液位传感器的地方吗?

29.2.1 油量表

在一些应用里面,如果液位传感器的输出随着液体体积成比例的变化,而不是只是给出一个开关量,这非常有用。通常可以用来作油量表。

这种需求的传统实现方法是在一个支臂上安装一个浮漂,用这个浮漂来转动变阻器的调节阀。几十年来,汽车的油箱里面一直在这么用——但是很笨重,也不精确,如果在非密封环境中用还容易受到灰尘和湿度的影响。

在寻找更好的测量液体位置的方法过程中,我在eBay上看到了油料位置传感器,包括了一个8英寸长的金属杆和一个可以顺着杆子上下滑动的浮漂。我不知道这个东西是怎么用的,因此我订购了一个。当我收到货的时候,我将一头锯了下来,发现这其实是一个空心管。在罐子里面有一个非常狭长的电路板,大概1/4英寸宽,在板子上等间隔的放着七个磁簧开关和六个电阻。

一开始我有点糊涂。磁簧开关装在钢管里面,怎么还能被磁场触发呢?然后我意识到了,这个钢管是不锈钢的,而不锈钢是没有磁性的。磁铁装在移动的浮漂里面,磁场可以很容易穿透到磁簧开关上。

当浮漂上下移动的时候,磁场会一个接一个地闭合磁簧开关,而由于电阻是串联的,功能就像分了6段的分压电路。这样就可以在这个组件的顶端引脚那里测到一个变化的总电阻。这个油料位置传感器的简化版本见图29-5,里面放了四个电阻和五个磁簧开关。

当然在这种传感器里面的电阻不是逐渐变化的,但是显然分成了7段对于汽车里面的油量表来说还是可以接受的。

我在这里是给大家一个概念,就算是像磁簧开关这么简单的传感器也有很多种灵活的用法。而且巧合的是,我相信很多汽车的油箱传感器也是使用相似的系统,只是现在用的是霍尔传感器,而不是磁簧开关了。我会在项目30中谈到霍尔传感器。

说明: 00268.jpeg 

29-5

一个液位传感器,其中使用的磁簧开关和电阻形成了多级的分压电路

29.2.2 磁簧开关知识总结

绝大多数的磁簧开关是单刀单掷的常开开关。有一些有常闭触点。不管是哪一种,磁簧开关的行为和按键一样,而且是用磁铁来实施这个按的动作。

单刀双掷和双刀双掷的磁簧开关也是存在的。图29-6中展示了一个单刀双掷的磁簧开关。开关的刀连接到了单根线的一头。另一头的两根线中长的一根线连接到常闭触点上。

磁簧开关不管磁场的极性如何,都能工作,因为不管是怎样的磁场都能在磁簧上面感生出不同的极性来。

有些非常小的继电器里面包含了非常小的磁簧开关,上面用一个线圈包住。当线圈上面有电流走过的时候,就形成电磁场,从而闭合这个磁簧开关。

磁簧开关通常会有一些迟滞效应。开始闭合触点的力量需要比保持触点闭合的力量还要大一些。因此闭合开关的磁铁可以在开关松开之前离得稍微远一些。

说明: 00269.jpeg 

29-6

单刀双掷磁簧开关

磁簧开关有如下明显的局限之处:

磁簧开关通常是用薄壁的玻璃胶囊来进行密封,这个胶囊很容易被打碎。

当磁簧开关上的电流过大时,里面的小触点会很快变质。

当磁簧开关经受过量的震动的时候,里面的触点会断掉。因此要避免摔磁簧开关,特别是不要摔在水泥地上。

尽管磁簧开关设计使用寿命很长,但是这个和固态开关的可靠性还是没有办法相比的(不管生产商如何声称都一样)。

磁簧开关可以被环境磁场误触发。

如果磁铁朝向不合适,磁簧开关可能不会被触发。

当磁簧开关的触点闭合的时候,这种冲击会形成簧片震动,也被称为触点回弹。这在大型开关中问题更加大,因为大型开关中簧片的动量更加大。触点的回弹会被数字元器件错误地理解为开关的多次闭合。

但是,磁簧开关相比较固态开关来说也有一些优点:

磁簧开关不需要额外的外置电源。

不管磁簧开关是闭合还是断开,都不耗电。

磁簧开关不需要接口元器件、放大器或者类似的电路。

当触点闭合的时候磁簧开关基本上没有漏电流。

当触点闭合的时候磁簧开关阻值基本上为零。有高压版本的磁簧开关。

有大电流版本的磁簧开关。

磁环开关可以用在交流电路上,也可以用在直流电路上。

磁簧开关对于静电放电不敏感。

磁簧开关不会受到环境温度太大影响。

29.2.3 简单的替换

基本上,在电路上能用单刀单掷开关的地方,都可以用磁簧开关。比如说,磁簧开关通常被用来替换限位开关,以在电机到达转动极限的时候停止电机。

大家可以用16个磁簧开关去替换项目21中带电槽位游戏中的16个硬币触点。剩余的电路一点也不需要改。当然,唯一的问题是大家就不能再用硬币来玩这个游戏了,现在需要的是16个圆形的磁铁了。

我相信还有更好的方法去在游戏中增加传感器,可以接着使用硬币。我会在项目31中讲到这些,在那个项目中我们会讨论光学传感器(见第31章)。

29.2.4 安装磁簧开关

磁簧开关有着不同的灵敏度。我用的样品可以用大约1/8英寸×1/4英寸×1/16英寸大小的钕磁体来闭合。只要磁体的轴和开关的轴是平行的,开关就能在磁铁距离半英寸的时候闭合。

小号的磁体和小号的磁簧开关让我们在使用方面上多出了很多的便利。比如说,开关可以用胶粘住,而磁铁可以藏在薄的塑料里面。

这本书里面的绝大部分项目中,我们都可以做一个小盒子,看起来像是打开盖子开关就自动闭合。注意,开关本身不会消耗电力,不管盖子是开着还是关着。

磁簧开关还可以用在汽车和家庭的安保上面。大家可以在你的钥匙圈上面安装一个小磁铁(但是要远离你的信用卡),然后用它来激活连在继电器上面的磁簧开关,从而在你进入之前将报警系统关闭。

还有一种可能是将磁铁安装在小的指针或者唱针上,用来作为游戏的输入设备。

29.3 背景知识:磁场极性

这里我要描述磁铁的一些特性,因为我们需要磁体来触发磁簧开关和霍尔传感器(马上会谈到)。

永磁铁总是有两个磁极,我们传统上称之为北极和南极。也许大家理解这就像地球的北极和南极——在这种情况下,我得提醒一下磁体的北极原来的意思是寻找北极的那一极。

大家有没有在某个地方发现,不同的磁极是相互吸引的?的确,如果大家有两个磁体的话,其中一个磁体的北极会和另一个磁铁的南极相互吸引。那么磁体的寻找北极的这一极怎么会指向地球的北极呢?答案是地球的所谓北极实际上在磁场里面是南极的极性。

如果在这个时候要重新命名北极和南极会产生很大的困扰,因此我们只好接受北极其实根本不是磁场的北极这个事实了。

29.3.1 磁体种类和供货渠道

钕磁体是在20世纪80年代开发出来的,比起之前的老式铁磁体要强大很多。在任意一个小号的现代直流电机中,大家十有八九都可以找到钕。事实上,钕磁体使得各种设备小型化变得可能,比如照相机,比如轻型的电动工具。

耍一耍强力磁体很有趣,但是绝大部分的磁簧开关灵敏度很高,用便宜的铁磁体就能实现了。大家可以再网上找到很多的供货渠道。eBay上也总是有一些不同品种的磁体在卖。

请大家记住,使用超过要求的强力磁体其实是不好的,因为它会影响到附近的开关或者元器件。

大家最熟悉的磁体的种类可能是长条形的,截面是方形的。通常来说,两极在长条的两头,但是也不完全绝对。

有些供应商(包括我最喜欢的供应商KJ磁体公司)会列出将磁极所在的方向列在尺寸的最后一个。因此如果磁体标着是1/4英寸×3/4英寸×1英寸,两极可能在长1英寸的这个方向的两边。但是如果磁铁标着3/4英寸×1英寸×1/4英寸,磁体的每个平面都可能有着和对面不同的磁极。大家在购买之前要仔细检查。

29.3.2 不同形状的磁体

经典的马蹄形磁体就是将长条磁体弯成了U形,像一个马蹄,这样两个磁极就是并排摆着了。这样可以增强磁体的吸力,因为当两极之间的距离最短的时候,吸力是最大的。

29-7展示了一些磁体的样品。图中的暗灰色的是一块铁磁体,而其他的是钕磁体。所有的磁体都吸在一块儿,想分开来进行照相还得费点劲。小的圆形磁体分成了两块,因为被大号磁体吸过去的时候摔坏了。大家要记住,钕磁体比较脆。

圆形的、圆柱形的、环形的磁体基本上是按照轴向分极性的。圆柱体磁体的轴是一根想象中的穿过中心的线,如图29-8所示。大家可以将圆柱体想象为绕着这根线对称旋转形成的。如果是按照轴向分极性的话,这个轴的两头就会有着不同的极性。圆柱体的一头的平面是北极,而另一头则是南极——如图29-9渲染图所示,其中红色和蓝色分别不同的极性。

说明: 00270.jpeg 

29-7

几种不同的磁体(其中一个磁体在被另一个磁体吸过去的时候摔坏了)。暗灰色的磁体是铁磁体,其他的是钕磁体

说明: 00271.jpeg 

29-8

这根想象中的穿过圆柱体中心的线是轴线

说明: 00272.jpeg 

29-9

沿着轴线分极性的圆锥台磁体在轴线的两头有着不同的极性

大部分圆形的磁铁都是按照轴线分磁极的,包括环形的磁体。图29-10中展示了经典的示例,其中间隔一个将磁体反向放置,北极对北极,南极对南极,这样就相互排斥。这张图中的磁体没有粘在中间的杆上面;是可以自由滑动的。

说明: 00273.jpeg 

29-10

大部分磁体是沿着轴线分磁极的。大家可以将其堆在非磁性的杆子上(这张图中的杆子是不锈钢的),将相同的极相对放置,这样就能用磁力将大家都分开

环形磁体的累计重量使得在杆子的底部的位置,环形磁体之间的距离更加近一些。如果大家用手指来施加一个额外的力的话,可以将环形磁铁按到一起,但是一旦松手就会弹回来。事实上,在这个小示例里面,最上面的磁体可以从杆子顶上跳出来。

我做这种磁力的基础展示从来不感到厌烦。让磁体如此表现的力量是从哪里来的呢?答案毫无疑问,是从你哪里来的,是当你将其按下去的时候储存的。磁体不会产生能量,而是会存储能量。

有些圆形的磁体是沿着径向分磁极的,但是很少。图29-11中就展示了这个概念。圆柱体的一个弧形侧和对面有着不同的极性。

说明: 00274.jpeg 

29-11

一个径向分极性的圆柱体磁体,磁极在对着的曲面上

为了能找到磁体的磁极,我们需要有两个这样的磁体。观察这两个磁体相互吸引和相互排斥的方向。如果两个圆形的磁体是轴向分极性的,这两个磁体面对面放置,并将其中一个磁体绕着轴相对旋转的时候,磁体之间力的方向是不会发生变化的。

29.3.3 制作更多:涡流

磁体的最让人惊讶的特性之一是磁体可以与非磁性的金属,比如铝相互影响。如果你将一个球形的钕磁体扔到竖直的铝管里面,要求铝管的内径要比磁体稍微大一些,这个磁体会慢慢地往下掉,就像在糖蜜中间往下掉一样。铝管越厚,球的下落速度就越慢。因此,壁厚1/8英寸的铝管比起壁厚1/16英寸的管子效果要好得多。同样的影响在铜管也同样能展示出来。

29-12里面是一个管子里面放了一个球形的磁体,管子还开了一个槽,以便观察内部的球。从12英寸长的管子从一头跌落到另一头需要大约1s。这是磁体和金属之间交互关系的图形展示。

这个奇怪的表现是因为运动的磁体在附近的电导体,比如铝或者铜中感生出来了涡流。事实上,这是世界上绝大部分电力的产生方式:通过移动的铜线切割磁场(太阳能电池是这个规则的例外)。

说明: 00275.jpeg 

29-12

球形的钕磁体已经有足够的磁场,在移动到靠近非磁性的导电体的时候会产生涡流,比如靠近铝或者铜。产生涡流是需要能量的,这就导致磁性球很慢地掉落

如果大家想知道产生的涡流会产生什么后果,答案是会产生少量的热量——这是电流流过导体时总是会发生的情况。这样,这个项目就展示了能量守恒定律。

这个示例可以来进行一些改进,在管子背面安装一系列的磁簧开关,并串联一些电阻,就像在我之前提到的油量表里面一样。如果这些电阻还接到了555定时器的放电和阈值引脚之间,而555定时器的运行在振荡模式,频率处于音频频率范围内,那么掉落的磁球就可以在通过开关的时候产生音调逐渐降低的效果。

这个示例中如果大家使用横截面为三角形或者管道形状的铝管的话,可能起到效果的,只是磁球会掉的快一些。

29.4 警告:磁场的危害

我如果没有加上警告的提示的话就太不负责任了。大家可能很难相信会被磁体伤害,但是钕磁体确实是有能力对我们造成伤害的,因为我自己就悲催过。

一个N52级别的圆柱体钕磁体,直径3/4英寸,高也是3/4英寸在标称指标里面可以举起大概40磅的重量。这是五加仑水的重量。如果我们拿了两个这样的磁体,极性相反放置,磁体之间的力量就会加倍,这样如果这两个磁体将你的手指夹在中间,至少你得被夹出淤血来。

大家在之后将这两个磁体分开还得有另一种风险。你可能会掰折指甲,也会很恼怒。大家可能可以在网上找到一些很好的视频,里面展示的就是如何处理强磁的磁体。

钕磁体很脆,而且尽管磁体表明是镀镍的,还是可能因为磁体的相互吸引造成撞击而破碎。金属片很尖锐,可能会以相当高的速度溅射。大家在玩耍这些强力磁体的时候需要带防护镜。

可能很明显的一件事情(但是我还是要再说一次)就是大家需要将磁体和硬盘或者其他的磁性存储介质包括信用卡分开来放。事实上,磁体应当和所有的电子设备保持一个安全距离以存放。

最后,起搏器也会受到强磁场的影响。大家在用强磁体的时候一定要加以一定的防范。

项目30:隐藏的探测器

霍尔效应传感器在我们的周边到处都是。当你将笔记本的盖子盖上的时候,可能机壳的塑料皮下面的霍尔传感器就已经检测到了这个动作,并将计算机转换到了睡眠模式。当你将便携相机打开的时候,霍尔传感器会检测镜头是否完全伸展开了。霍尔传感器在我们的硬盘里面也有,用来检测电机的旋转并控制其转速。汽车里面的电子打火——还有汽车的门锁里面,当点火成功后将车内的灯关掉。你的现代的洗衣机也用了霍尔传感器来检测洗衣机的门是否关上了。类似地,还有我们的微波炉。

每个传感器会根据磁场的激励产生一个很小的电流。霍尔传感器可以向磁簧开关一样来使用,但是内部是纯固态的。这种特性是在1879年发现的,但是这种效应非常微弱,直到后来集成电路大发展,将放大器应用到传感器上之后,才开始有了大规模的应用。

霍尔传感器的最大的优点是价格便宜、稳定可靠以及体积很小——这和磁簧开关不一样,霍尔传感器可以用很小的表贴封装。这些传感器的响应时间很快,难以损毁,而且有四种不同的类型分别有不同的行为以满足大家的特别应用。将这些传感器集成到电路上会需要额外的一些小麻烦,但是总体上还是磁簧开关的非常灵活多用的替代品。

一部分的霍尔传感器如图30-1所示。

说明: 00276.jpeg 

30-1

不同的霍尔效应传感器

30.1 霍尔测试

这个测试会使用最常见而且最便宜的霍尔传感器,它是双极型的,这意味着磁性的一极可以将其闭合,而另一个则将其断开(在这种用法里面,双极型和双极型三极管里面的双极型完全不是一个概念)。双极型的霍尔传感器也被称为自锁传感器,因为它会保持状态,直到我们将其改变到另一个状态。

30-2展示了ATS177传感器的简化视图,这个传感器由Diodes有限公司制造。绝大部分霍尔传感器的引脚分布是一样的。部件号下面的码通常是用来指示制造的时间,我们这里用不到。

说明: 00277.jpeg 

30-2

ATS177双极型霍尔传感器的引脚图,该元器件由Diodes有限公司制造。其他的霍尔传感器通常也有同样的引脚功能

在数据手册中,这个电源正极的引脚是用VCC或者Vdd来表示的(在这种情形下,两者是一个意思)。地通常用Gnd表示,而输出则用Out表示,但是在传感器要连接逻辑芯片的情况下,可能会用DO来表示,意思是数字输出。

要测霍尔传感器,最简单的方法是使用在项目28中用来测试磁簧开关用的长条方形磁体。但是,和磁簧开关不一样的是,霍尔传感器的设计是当磁体的一极比另外一极要靠近很多的时候才会被激活。

参照图30-3中的电路原理图组装电路。记住,这个传感器的输出为集电极开路输出,和大家之前遇到的光敏三极管、驻极体话筒、比较器一样。如果你还要想一下这个输出怎么用,可以看前面的输出章节。

我建议大家使用一个9V直流的电源,这样我们就能用9V电池了。这个电源不需要稳压处理,因为这种传感器并不是数字装置。绝大部分的霍尔传感器可以用20V直流供电不出问题,但是也有一些是专门设计在低电压场合使用的。大家需要查阅下数据手册以备万全。

如图30-4所示将磁体靠近。由于长条磁体的磁极通常是不会有标注的,大家需要试一试来找到哪一极可以将LED灯点亮。一旦LED灯亮起之后,可以用磁铁的另一极来将LED关掉。

说明: 00278.jpeg 

30-3

一个非常简单的用于测试霍尔传感器的电路图

说明: 00279.jpeg 

30-4

将磁体的一极靠近双极型霍尔传感器的弯折面,而将另一极远离霍尔传感器。将磁体倒过来可以将传感器编导相反的状态

LED灯将会被非常干净地闭合和断开,不会有任何的变暗和闪烁的现象。这是因为电路里面传感器上加了我们称为施密特触发器的东西。

通常一个霍尔传感器可以输出20mA的电流,但是这是一个绝对的最大值。我们使用1kΩ的上拉电阻和9V直流电源,会发现传感器的输出电流大概是这个值的一半。用万用表来检查电路是个好主意。通常标称20mALED灯在电流为10mA的时候是不会特别亮的,但是也肯定足够亮到可以分辨出现在是有明确的开关转换的。

30.1.0 应用

大家可能觉得双极型的霍尔传感器比起磁簧开关来说不太方便,需要额外的电源是一条,更重要的是大家需要使用磁体的一极,然后再用另一极,才能将传感器闭合和关断。但是如果有一系列磁极经过传感器的时候,或者传感器经过一系列磁极的时候,这种传感器就方便了,而这也是传感器设计之初考虑的工作场景。

从霍尔传感器过来的脉冲可以用来精确控制电机的速度。图30-5中的简化渲染图展示了这个概念,里面的旋转物体的磁化齿有着交替变化的磁极。

说明: 00280.jpeg 

30-5

霍尔传感器可以用来测试带交替变化磁极的齿轮的旋转速度

在大家的测试项目中,可以试着将磁体转90°,然后和传感器平行摆放并滑动,这样大家就会看到传感器先被磁体的一极影响到,然后被另外一极影响到。大家会再一次地看到LED灯有着明确的闭合和断开的转换——而且会表现出一定的迟滞效果,因为这个传感器会倾向于保持原有的闭合或者断开的状态。

迟滞效应可以用图30-6中的图表示。将这个图和图6-8相比较,那是一个比较器的行为图。区别在于比较器是根据电压的变化而变化,而霍尔传感器则是根据磁场的变化而变化。

说明: 00281.jpeg 

30-6

双极型霍尔传感器的迟滞效果

大家可以做一个里程表或者速度表,用在自行车上。只需要在自行车的前叉或者后叉上装一个霍尔传感器,并在对应的轮子的两根辐条上装一个磁铁。传感器的输出可以接到微控制器上,从而将每次车轮的转动转化为一个距离的值。微控制器然后可以通过距离除以时间来计算速度。

30.2 霍尔传感器知识

直插版本的霍尔传感器通常是封装在很小的黑色塑料中的,大约0.1英寸×0.1英寸× 0.05英寸,有三个引脚。这和三极管的TO-92封装类似,但是还要小一些。

当数据手册中提到霍尔传感器的前面或者顶面的时候,这是在说标着元器件号的那一面,而如果说霍尔传感器的后面则是没有元器件号的那一面。通常,霍尔传感器是对朝着其前面靠近的磁极而进行动作的,也就是有斜面的那一面。

霍尔传感器的部件号通常简写为三个数字。在这三个数字的下面的附加码则通常用来指代生产日期。

霍尔传感器可用的电源通常为320V直流,这样我们就可以用9V电池来供电。但是,有些传感器只能用35.5V直流。大家一定要仔细查看数据手册!

和光敏三极管一样,霍尔传感器经常和带集电极开路输出的NPN三极管封装在一起。这个输出的最大电流可以到2025mA

30-3中,当在霍尔传感器的集电极开路输出和电源正极之间安放一个上拉电阻的话,输出就会在传感器活动时表现出低电平,而在没有活动时表现出高电平。

很多霍尔传感器里面还有一个施密特触发器,这是一个能产生干净的闭合与断开动作,并带一些迟滞效应的电路。

不同的霍尔传感器可以由磁极的南极或者北极来激活,数据手册里面应该能提供这个信息。

霍尔传感器没有磁簧开关里的哪种触点回弹的问题。这使得他们可以用在直接给逻辑门提供输入上。

30.2.1 霍尔传感器类别

通常来说有四种霍尔传感器。

双极型霍尔传感器就是我们刚描述的,需要不同的磁极来分别将其闭合与断开。

单极型的霍尔传感器会在一个磁极靠近时闭合,当这个磁体拿走的时候就会关断。这种霍尔传感器不需要另一磁极来关断。

单极型的霍尔传感器还分为对磁极北极起反应的和对磁极南极起反应的两种。和双极型霍尔传感器一样,它们内部也用了施密特触发器来获得干净的闭合-关断响应。

请大家记住在关断状态下,霍尔传感器的集电极开路输出和地之间是高阻态,这样只要输出电压通过上拉电阻接上的话,就表现出高电平。当传感器为闭合状态时,输出电压则表现为低电平。这个和我们在光敏三极管中看到的是一样的行为。

还有一种被称为线性霍尔传感器的,内部没有施密特触发器,产生的电压(通过内部的三极管进行了放大)会和外部的磁场强度成正比。当外部没有磁场的时候,传感器的输出为供电电压的一半。当有一个磁极靠近时,传感器的输出会掉到几乎0V,而另一个磁极靠近时,输出电压上升到几乎供电电压的极限。

线性霍尔传感器也被称为模拟霍尔传感器,其输出引脚通常连在内部的NPN三极管的发射极上,而不是连在集电极上。传感器的输出引脚和地之间必须要放一个阻值不小于2.2kΩ的电阻,以限制电流大小。

这种可变的输出可以用来测量传感器和磁体之间的距离。当磁体与传感器之间的距离增加时,磁场强度会减弱,这样传感器在这个距离变得很大的时候就不会有响应了(绝大部分情况下需要大于10mm)。

全极型霍尔传感器和磁簧开关非常像,可以响应任意一个磁极而闭合,当磁场撤离的时候断开。这个传感器通常含有两个霍尔探测器,以及一个逻辑部件来检测这两个霍尔传感器之间的电压差。由于有额外的内部电路,而且用的比较少,因此这种霍尔传感器的价格要贵一些(我在写这一部分的时候,价格比1美元稍微多一些,而其他三种霍尔传感器则不到1美元)。

30.2.2 传感器想法

霍尔传感器和逻辑电路接口是非常容易的。只要加一个上拉电阻就可以了,如图30-7所示。电阻阻值高一些是没有问题的,因为逻辑芯片输入的阻抗相比较而言要高得多,而且几乎不需要什么电流。当然,需要检查电压,保证在合适的范围之内。

在这个电路中,当两个霍尔传感器同时或者有一个被激活的时候,与非门的输出才会为高电平。请记住,通过上拉电阻和霍尔传感器连接得到的输出在传感器闭合的时候为低电平,而与非门则在两个输入都为高电平的时候输出为低电平,有一个输入为低电平或者两个都是低电平的时候输出为高电平。单极型的霍尔传感器可能用在这种场合更加合适。

说明: 00282.jpeg 

30-7

这个电路中与非门的输出是常低的,只有当两个霍尔传感器之一被激活的时候才会变成高电平

如果霍尔传感器用来感应手持磁体,而这个磁体的极性还不清楚的话,用全极型的霍尔传感器更加合适一些。

如果有一个偏置磁体装在元器件后面的话,双极型的霍尔传感器就可以表现得像一个单极型的霍尔传感器了。换句话说,如果传感器通常是由前面的磁极北极激活而闭合,由前面的磁极南极关断,我们就可以将一个小磁体装在后面来保证传感器可以回到关断状态。当一个磁体的北极放到传感器前面的时候,磁场就会超过另一个磁体的较弱的磁场,导致传感器闭合。

当磁体这么使用的时候,必须要有很高的矫顽力,意思是要不能被改变极性。就是说,第一个磁体必须不能被第二个磁体的另一个磁极重新磁化。由于钕磁体有很强的矫顽力,他们通常可以用在这种应用中。

30.3 制作更多:小型滚球游戏

在传统的狂欢节或者集会上,大家可能会看到某种版本的滚球游戏。大家可以坐在斜坡的一头,在斜坡的另一头有几个孔,大家的目标是将球沿着斜坡滚下去,并尽可能快地装进孔里面,记住,进入离得远的那个孔会得到更高的分数。

如果你哪个孔都没有进,球就会消失在斜坡尽头的一个槽里面了,而且没有得分。基本的布局如图30-8所示。

说明: 00283.jpeg 

30-8

传统的狂欢节滚球游戏

通常情况下,会有很多人在临近的斜坡上相互比赛,而首先获得高分的人会获得某种奖品。

大家可以做一个小型化的这种游戏,用球形磁体和全极型的霍尔传感器来完成。我们假设你是想做一个单人版的游戏,除了得分计数器之外,我们还需要一个限时器。

现在,我们怎样来控制得一分、得两分或者得三分的情况下给总分加分呢?我觉得最简单的办法是在高分孔的磁体回路上安放几个传感器。磁球会在从上面滚过去的时候触发这些传感器。

大家可以做小号的木头轨道来完成这个任务,但是我觉得最简单也是最好的方法是用塑料管子。

30.3.1 弯折塑料

PETG(聚对苯二甲酸乙二酯)做的管子网上到处都是,也不花几个钱。这种管子可以让回来的磁球完全受控,即使有人的球在游戏中是不规则弹跳也没有问题。唯一的难点在于这个管子需要平滑的弯折,不能有褶皱。要想完成这一点,我们需要将它插在弹簧里面然后用热风枪来加工它。

我这里要暂时不得不从制作电子电路歪楼一下,但是现在我是在处理传感器,我们需要考虑传感器如何与实际的世界交互。

30-9展示了一段PETG管子,通过插在弹簧中弯折完毕的效果。下一步是将弹簧拉出来,这会有点难度。大家可能需要旋转弹簧,可能会导致弹簧的直径稍微变小一些。

说明: 00284.jpeg 

30-9

一段聚乙烯管子通过插在弹簧中,然后加热形成的平滑的曲线

小的管子可以用同样的办法来塑形。在我们的滚球游戏里面,我们需要在管子里面使用3/8英寸的磁球,管子的直径是1/2英寸,壁厚1/16英寸。但是你哪里去找管子和长弹簧来塞进去呢?

我建议到McMaster-Carr看一看,这一家可能有着地球上种类最多的五金件。现在他们还在卖六英尺长的PETG管子,尺寸和我刚才说的一样,价格在每英尺1.5美元的样子。他们还提供切割好长度的弹簧,每一段3.5美元。这样就可以让他们去切到我们需要的任意长度。但是在弯折管子的时候,我们是不用切的。

当然,大家也可能会倾向于完全使用木头,或者大家会希望用其他的不需要太多机械工作的活儿。我发现没有人有着和我一样的恶趣味,比如喜欢弯折塑料管,并在里面滚磁球。但是我都到了这一步了,因此还是把这个项目讲完吧。

30.3.2 滚球电子电路

如果大家在得一分的孔对应回路的管子上面装一个传感器,在得两分的孔对应的回路上装两个传感器,在得三分的孔对应回路的管子上装三个传感器,总共就是8个传感器了。大家可以将这八个传感器通过八输入与非门接到计数器上,如图30-10所示。图里面还展示了磁球回路的管子,这些管子可以放在斜坡的下面。

说明: 00285.jpeg 

30-10

霍尔传感器(在这里用绿色的方块来表示)用来在滚球游戏中记得分

大家还记得在图30-7中,与非门用在霍尔传感器上是比较合适的,因为每次有一个传感器将与非门的一个输入拉低的时候,与非门的输出就会变成高电平。

全极型的霍尔传感器用在这里很合适,因为这种传感器可以被滚过去的磁球激活,而不管到底是哪个磁极激活的。我希望这些霍尔传感器可以给出没有噪声的信号,这也是用霍尔传感器,而没有用磁簧开关的首要原因。我们有不产生触点回弹的霍尔传感器,是没有理由去费劲地将磁簧开关的触点回弹消除的(参见我在Make:Electronics中提到的消除回弹的技术)。

与非门芯片的输出可以连接到4026B十进制计数器上。这个芯片是特别为驱动七段LED数码管而设计的。芯片的进位可以接到第二个4026B和第二个七段数码管上面,这样我们就可以计数到99分了。4026B是我在Make:Electronics中描述过的另一个元器件(用在反应计时器游戏上面的)。

我们还可以加上一个复位按钮,这样就可以将计数器清零,并启动一个555定时器的30s的脉冲,当这个脉冲结束的时候就会停止计数器的工作。就是这样!你自己的滚磁球街机游戏完工了,就像古老的原始弹球游戏一样。

等一等,你能用钕磁球来做完整的弹球游戏吗?

也许是可以的,但是除了复杂度增加以外,大家还得去确认这些球不能相互碰撞了。在滚球游戏里面,将粘在一起的磁体分开会在尝试得高分的时候增加紧张感。

项目31:光传感器

被光的变化触发的传感器有两种,一种是主动的,另一种是被动的。

在项目7全年可用灯具控制器里面,我们用到了光敏三极管,这是一种被动的传感器。这种传感器就是坐在那里等着,然后测量外部光源过来的光的强度,并相应改变自己的等效内阻。

另一种常见的被动光感元器件是被动红外运动传感器(PIR),其中P是被动passive的简写,而IR则是代表红外Infrared。有人在附近的时候会发出红外光,这种传感器常常被用来在感应到红外光之后,控制灯的开关或者触发报警系统。

PIR运动传感器很有用,但是在五金店能找到的完整传感器单元都没有什么好测试的。如果大家想探究一下这种传感器,最好是去买一个模块板,如图31-1所示。很多为手工电子电路服务的渠道都会有销售,如Sparkfun,当我在写这篇文章的时候,价格而在10美元以下。而且设计是直接可以连接微控制器的。大家可以到http://www.ladyada.net去看一看,那里有使用这种传感器的非常好的辅导材料。我这里不会去处理PIR运动传感器,因为我觉得主动传感器要有更加有意思的用途。

说明: 00286.jpeg 

31-1

被动红外传感器(PIR)装在模块板上,方便项目使用

31.1 主动光传感器

主动光传感器不会坐在那里等环境光变化的,它会自己发射出光来——通常是红外光,尽管也有一些紫外光传感器。主动传感器在复印机中常常用到,它们在那里会去检查纸盒;在工业自动化中也会用到,在那里是感知产品在生产过程中的进展情况;在机器人行业也用到,那里是去验证运动部件的位置。

通常主动光传感器是靠红外LED灯来产生光束,频段很窄,可以调制到和其他的光源有明显的差别。有些接近传感器后面的电路(通常是一个光敏三极管)则被调整为与这个传感器相同的频率。

光发射器和光传感器组合的通用名词是一个收发器组合,但是里面有两种不同的情况。

反射式光收发器:

这里面LED和光敏三极管是并排放置的,大约指向同一个方向。图31-2中展示了一个例子。

说明: 00287.jpeg 

31-2

这种反射式的光收发器里面有一个红外光敏三极管和一个红外发射器,两者并排安装在一起。从发射器过来的光经过不远处的反射物体的反射,回到光敏三极管上,而光敏三极管则捕捉到在有东西经过挡住光的时候造成的测量值差别

大家需要安装一个反射面,比如一片银色的聚酯薄膜或者改色的东西,来将LED过来的光反射回去给光敏三极管。

允许的距离是很有限的,很多反射传感器期望的反射面的位置是在大约半英寸远的地方。也有些反射传感器可以有比较远的反射距离,但是造价要高得多。

透射式的光收发器:

LED和光敏三极管是面对面安装,形成一个U形,如图31-3所示。

说明: 00288.jpeg 

31-3

在这个Everlight ITR9606-F透射式传感器中,光通过这个缺口传到对面元器件的另外一半中间的光敏三极管上。在元器件右边的塑料上面还有一个可以看得很清楚的二极管的符号印在上面

如果有东西阻挡了光束,光敏三极管就会改变输出。

在很多这个类型的元器件里面,之间的空气间隙大概是1/4英寸宽。

透射式的光收发器比起反射式的光收发器来灵活性不够,但是安装起来很简单也很方便。

这种传感器有时候被称为光敏开关或者光阻断器。

在下面的试验中,我会讲解如何使用透射式光传感器,比如EverlightITR9606-F。在大家测试过之后,我会建议去做一些应用。

31.1.0 警告:延长传感器的寿命

主动式的红外传感器是一直处于工作状态的装置。只要系统有电,红外LED就会一直在发射红外光。

这样会消耗一些电力(通常在10mA20mA的样子),但是这不是主要的问题。问题在于红外LED灯随着不断地使用会退化。有些LED的数据手册会告知你,这些LED可能在用了五年之后,光强将降到大约原来的50%。还有些其他的数据手册则不提这个东西,但是还是会发生的。这种退化可能是和发热相关的,也可能是和生产过程中的独特化学反应相关的。我在这个问题上的一些调研的结论是,这种退化的机制还没有完全搞明白,但是大家都同意这种情况是会发生的。

如果大家使用的是主动式的红外传感器,可以在电路上调整,以保证比较大的容差性,这样就能在LED随着时间的增加光强减弱的时候还能继续使用尽可能长的时间。大家还可以尝试去减小流经LED的电流。

31.2 数字

在光收发器里面的红外发射器是一个LED灯,这个LED灯需要一个相对较低的前向电压——通常在1.2V左右,但是不能超过1.5V。大家需要增加一个外置串联电阻来保护LED,因为这个元器件内部是没有电阻的。而电阻的阻值则需要根据使用的电源电压来确定。

检查红外LED灯的电流耗用以及前向电压。调节串联电阻,使得流经的电流接近数据手册中标称的常用值。大家不需要(也不希望)将电流调到接近绝对最大允许值

红外接收器通常是一个带集电极开路输出的光敏三极管——就像霍尔传感器开关一样。和之前一样,我们需要在集电极开路输出上接一个上拉电阻。唯一的问题是,上拉电阻用多少比较合适?数据手册上没有说,但是给出了一个集电极开路输出允许的最大电流值。最大值在20mA左右,但是常用值则要小得多。因此我们不要期望用这种传感器来直接驱动(常见的可见光)LED灯。

31.2.1 红外传感器测试

现在我们有了方向了,我们来测试下看!如果大家使用的是ITR9606-F,它的引脚图见图31-4。但是你怎么知道传感器哪一边是哪一边呢?Everlight ITR9606-F确定这一点很简单,它在塑料上刻了一个二极管的符号。大家可以看图31-3的右边部分,仔细看就能看见。

很多其他的传感器也有类似的功能,而对应的数据手册会标明每个引脚的功能。有些传感器和ITR9606-F是一样的,但是也有一些引脚顺序是相反的。

这里的项目应当可以用任何透射式的光传感器,只要大家方法正确,引脚功能没搞错,并避免流经元器件的电流超过限值就可以了。

说明: 00289.jpeg 

31-4

Everlight ITR9606-F的引脚功能定义。其他的传感器,如果功能类似,可能引脚功能也是一样的,也有可能某一对引脚顺序是反的。大家要查阅数据手册获取这些细节

在图31-5中,我建议大家用一个四门双输入或门芯片来测试传感器。这样做的原因在我们接着往下走的时候会变得很清楚。对应的面包板电路的照片见图31-6

说明: 00290.jpeg 

31-5

测试透射式光传感器的电路图,其中使用了或门逻辑芯片

说明: 00291.jpeg 

31-6

透射式光传感器测试电路的面包板版本。U形的传感器放在顶上,就在变阻器的上面

注意我们这里用的是5V直流稳压电源,因为或门芯片需要这个电源。

大家在连接电路的时候,可以先将芯片的电源正极暂时不连接,同时光敏三极管的继电器也不连接。首先我们要做的是给红外LED灯供电。

31.2.2 红外LED灯测试

大家还记得吗,我们是看不见传感器里面LED发出的光的,因为它发出的光已经不在可见光频段内了。大家需要依靠万用表来告诉你这个LED灯正在工作。

在图31-5中,调节1kΩ的变阻器,以达到最大的阻值(如果有担心的话,大家可以在将变阻器插进面包板之前用万用表量一下)。现在可以测量A点和B点之间的电压了。应该在1V直流到1.2V直流之间。

大家还需要测量红外LED灯消耗的电流。将连接电路中A点和电源正极总线的跳线拿掉,将万用表设定为mA挡,然后使用万用表来连接A点和电源正极总线。当大家调节变阻器的时候,会发现万用表的读数发生了变化。我们期望的读数是10mALED标称可以流过更大的电流,但是由于我脑中未来的应用需求,我不希望这个电路消耗过多的电流。

将变阻器从电路中拿出来,测量调节端和顶侧引脚之间的电阻。我测试的结果是大约350Ω。因此,红外LED灯需要的总串联电阻应该是450Ω。这对于一个使用5V直流电源的LED灯来说已经相当大了,但是我的电路确实需要用这个阻值。

大家可以将1kΩ的变阻器和100Ω的电阻都拿掉,用一个450Ω的电阻来代替,大家也可以在自己测到10mA的时候地总阻值的电阻来替代。

31.2.3 光敏三极管测试

现在LED灯已经放置好了,我们将光敏三极管的集电极连起来,并测量C点和地之间的电压。这个电压是通过1kΩ的电阻和2kΩ的变阻器来提供的,这两个加起来组成了开路集电极的上拉电阻。

当大家在测量这个电压的时候,可以在传感器中间插入一张卡片,来阻挡红外光束,然后再将这个卡片拿掉。通过调节变阻器,你可以在卡便拿掉的时候得到一个超过4.5V的高电平电压,而在卡片插入的时候得到一个小于0.5V的低电平电压。我敢打赌大约2kΩ的总电阻应该是比较合适的。

大家可以将2kΩ的变阻器和1kΩ的电阻拿掉,并用一个合适大小的上拉电阻来替代,只要能在电路中C点产生合适的电压范围就行。

31.2.4 逻辑测试

由于74HC00期望的高电平逻辑输入是高于3.5V的直流电压,而低电平逻辑输入则是低于1V,从传感器过来的输出应该是可以接受的。

我见过有些透射式的光传感器会推荐在光敏三极管上使用一个上拉电阻,电阻的阻值低到100Ω。如果大家恰巧用到了一个这样的光传感器,就需要验证一下流进传感器的电流大小。方法是将万用表设到mA挡,从电路中断掉三极管的发射极连接,然后将万用表插在发射极与地之间。大家应该测到的是一个低于4mA的电流。

现在将逻辑芯片中的左上角的或门与点C连接起来。这个或门的另一个输入是D点,暂时直接接到了地上。

当大家将卡片插到传感器里面的时候,就能看见LED灯立刻亮起来了,没有延迟,也没有闪烁。

由于74HC00系列逻辑芯片的输入阻抗非常高,大家会发现这个芯片不会显著降低集电极开路的电压。

当大家在测试电路的时候,可以尝试使用不同的物体来遮挡传感器中的红外LED灯。大家可能会发现,厚纸板的情况下集电极开路的电压比使用一张白纸得到的电压要高。大家如果要将传感器用在实际场合的时候要记住这一点。

31.2.5 选项

大家可以将这个项目进一步地扩展,可以加上另一个光传感器。将D点的或门的第二个输入从地上断开,并将这个输入接到第二个传感器的输出上。现在我们就可以在任意一个传感器的红外光束被挡住的时候得到或门的高电平输出了。当然我们很自然地可以用更多个输入的或门,这样就可以来检查一组传感器里面是否有被触发的。

大家可以用异或门来替代这里的或门。现在我们的结果是当只有一个传感器被触发的时候得到高电平。逻辑门可以让我们根据我们的需求来定制电路。

另外,透射式光传感器很适合用来驱动比较器,这个和我们在全年可用灯具开关(参见第7章)中将光敏三极管和比较器一起用是一个道理。比较器可以比逻辑芯片容忍更宽的电压范围,而且可以让我们来设定一个阈值电压,这样就可以有较大的容差裕量了。

当我们在用霍尔传感器进行试验的时候,我建议大家使用与非门来将多个传感器的输出耦合起来。这是因为霍尔传感器集电极开路的输出在传感器被激活的时候是低电平。而光传感器则完全相反,挡住红外光束将导致光敏三极管的等效内阻增加,从而使得集电极开路的输出在传感器被激活的时候表现为高电平。

如果大家的电路中需要将光传感器的行为反过来,我们可以将其改成发射极跟随输出:

1.将光敏三极管的集电极的上拉电阻断开。将光敏三极管发射极连接到地的线断开,并将刚才的电阻安装到发射极与地之间。

2.将光敏三极管的集电极直接连接到电源的正极侧。

3.将或门芯片的连接从C点改到光敏三极管的发射极上。

现在传感器的输出就是平常为高电平,而当红外光被挡住的时候变成低电平了。

31.2.6 透射式光传感器知识

通常的光传感器内部的红外LED灯需要一个不超过1.5V的电压(最好在1.2V左右)。这个LED灯会消耗大约10mA20mA的电流。

在集电极开路电路中,光敏三极管需要在集电极和电源正极之间放一个上拉电阻。这个上拉电阻的阻值根据光传感器的不同而有很大的不同。集电极的电压会在传感器没有被挡住的时候为低电平,而在传感器被挡住的时候为高电平。

发射极跟随电路可以将传感器的行为反过来。将电阻放在光敏三极管的发射极和电源的地之间。发射极连接点在传感器没有被挡住的时候应该是高电平,而在传感器被挡住的时候变成了低电平。

透射式光传感器的设计是不能驱动很大的负载的。输出应该接到高输入阻抗的元器件上,比如比较器或者逻辑门。

大家记住红外LED灯的输出会随着使用时间的增加而变弱。因此在设计电路的时候需要考虑当光强变弱的时候还能继续工作。比较器比逻辑门能忍受更加宽的输入电压范围。

由于红外光我们人眼是看不见的,元器件在工作的时候我们什么都看不到。因此不要误将元器件的开关闭合了!

31.3 更好的槽位

我们用这个传感器来干什么呢?唔,用在接电槽位游戏里面做硬币探测器如何?大家会需要十六个传感器,但是这些传感器很便宜,在大家阅读这篇文章的时候,价格可能还会更加便宜一些。

为了完成这个任务,我需要搞定两个事情:如何接传感器,以及如何将这些传感器装到盒子里面适合插硬币。我会先处理接线问题。

31.3.1 原理验证

大家还记得在最早的游戏版本里面,我们用了复用器,通过复用器的十六个输出之一来提供电力(参见第21章)。如果大家需要回忆一下,可以看一下图21-7和图21-8

光传感器需要的电流很小,我觉得复用器可以给红外LED灯和光敏三极管同时供电。这个安排很好,因为所有的其他传感器都在关断状态,不会消耗电力而且也保护了红外LED灯。

我喜欢这个安排的另一个原因是在某个人获胜的时候,不仅是只有一个灯亮起来,这个时候每个传感器都可以驱动自己获胜的提示LED灯(如果我加个放大器就可以了)。当有人选中了接电槽位的时候,这个槽位下面的LED灯就可以亮起了。

我唯一担心的问题是这些事件的确切顺序。这个有点麻烦,我给大家展示如果只有一个传感器的时候会发生什么。

在图31-7中,传感器现在什么都没有做,由于它是通过复用器接受电力的。它的红外LED灯是灭掉的,光敏三极管也没有电。

说明: 00292.jpeg 

31-7

给硬币传感器供电的第一步,参见文字中更详细的解释

放大器的电源是接着的,这是用来接提示LED灯。这个放大器是我们的老朋友,ULN2003达林顿管,可以通过将电流供给获胜提示LED灯来工作——但是得需要从硬币传感器过来的信号告诉它去做。现在还没有信号呢,因为传感器还没有电。因此获胜提示LED灯也是暗的。

现在我们看一看图31-8。这个复用器刚刚选择了这个传感器作为接电槽位。复用器会给这个传感器的红外LED灯和光敏三极管供电。这个红外LED灯会立即降低光敏三极管的等效内阻,从而通过上拉电阻获取电流。由于光敏三极管在吸取电流,几乎没有什么电流跑到放大器里面去,因此放大器的输入信号是低电平,而获胜提示LED灯还是暗的。

说明: 00293.jpeg 

31-8

给硬币传感器供电的第二步,参见文字中更详细的解释

最后在图31-9中,有人将硬币插入这个传感器中,光敏三极管再也看不到红外光了,因此三极管的等效内阻上升。现在放大器的输入信号电压抬升,因此放大器会闭合获胜提示LED的开关。

那么——大家相信这套想法能实现吗?我在刚开始画电路图的时候还不是完全确认的。我担心的是如果在复用器上电的时候,传感器会需要一点时间来反应,而在这个时间范围内,光敏三极管是不会吸取电流的,因此电会经过放大器。这个时候获胜提示LED会亮起来,把这个是带电槽位的信息给泄露了出去。

但是在我进行电路接线的时候,我发现传感器的响应很快,进入放大器的电流时间很短,获胜提示LED灯没有可见的响应。因此,没错,电路是可以工作的。但是有时候大家得去尝试过之后才能确定,至少我是这样。

说明: 00294.jpeg 

31-9

给硬币传感器供电的第三步,参见文字中更详细的解释

这是一个原理验证。现在就是选对合适大小的电阻并将所有的元器件装到面包板上了。

事实上,我没有办法将所有的东西都放到面包板上。但是我可以在一个面包板上装八个传感器,这反正也是达林顿阵列能处理的最大量了。我们可以在另一块面包板上复制一份布局,这样就完成了接电槽位游戏需要的所有16个槽位。

31.3.2 电路原理图

31-10展示了三个传感器和一个达林顿阵列。因为我的空间有限,而且所有的传感器的接线完全相同,在电路图中增加其他五个传感器的任务就交给大家了,连接方法完全一致。

右手边标着数字012的输入对应着原来的接电槽位电路图中复用器的输出。参见图21-7

每个传感器对比图31-5中的测试电路都旋转了180°。我将它们转了过来,是为了在驱动达林顿阵列时减少交叉线。大家记住要将传感器的红外LED灯装在右边,不要装在左边。

说明: 00295.jpeg 

31-10

图中是十六个传感器中的三个以及两个达林顿阵列中的一个,这些都是在接电槽位游戏中实现硬币光感探测需要的

我增加了每个红外LED灯的串联电阻,现在的阻值是680Ω,而集电极开路输出处的每个上拉电阻现在是3.3kΩ。这是因为电路会由复用器来驱动,而复用器用的是9V直流电源。我们现在用的不是74HC00系列的逻辑芯片,因此没有必要用5V直流——而且用了还可能不够,因为复用器有一些内阻,可能会稍微降低电压。

每个达林顿对输入阻抗比起之前测试里面用的或门要低一些。因此达林顿阵列会将活动的传感器的输出电压稍微拉下来一些。我试了不同阻值的上拉电阻配合传感器使用,发现3.3kΩ是最佳的办法。如果大家的获胜提示LED的行为不正确的话,大家可以将这个电阻往上调。

我建议为每一个获胜指示LED灯使用330Ω的串联电阻。我用的LED灯的前向电压在2V左右。如果大家用不同的LED灯,就可能需要调整串联电阻。大家需要检查LED在亮起的时候两侧的电压是多少,以及消耗了多少的电流。

每个达林顿对可以毫无压力地提供100mA的电流,因此我们不要考虑过载的问题。

31.3.3 面包板

31-11中展示了大家在每个传感器上可以使用的面包板布局,这种布局,包括获胜指示LED灯也只会占据四行,现在LED灯就放在传感器旁边。灰色的线条是面包板内部的导线。传感器的引脚用黑色的圆圈中间带白点来表示。

说明: 00296.jpeg 

31-11

一种可能的传感器的面包板布局,这种布局占据的行数是最低的

连接两个传感器引脚的斜线必须先布好,之后将传感器压着这根线插在面包板上。

由于所有的元器件都堆在一块儿,大家需要在放置这些元器件的时候特别小心。如果有一个电阻或者跳线防错了一位,就会将传感器的电压接反了,传感器就烧毁了。在我的电路里面,我在测试的时候就烧了两个传感器。

当然,耐心不够一直是问题的所在。

在图31-12中,我们可以发现装了8个传感器的面包板电路的照片。这个电路可以直接复制,来处理剩下的8个传感器。

说明: 00297.jpeg 

31-12

这个面包板电路里面有着接电槽位游戏里面16个硬币传感器中的8

在这张照片里面,从右边进来的白色跳线是接到接电槽位电路中复用器的输出上的,大家可以到图21-7中查看。由于我在这个电路中需要用比较亮的LED灯,选的是5mm直径的透明LED。大家可以看到这些LED排在左边。

大家觉得怎么样?是不是值得费点精力来做一个干净的用户界面,这样直接可以毫不费力地将硬币扔进去,而不是需要将硬币卡在两个紧紧的金属触点之间?我个人是这么觉得的,当大家看见我要做的特别漂亮的壳子的时候(马上谈到),也许你也会这么想的。

31.4 槽位盒子

要做一个永久的电路,最明显的方法是将所有的元器件都焊接在通孔板上,并将这个板子装在切好槽的盒子的盖子下面。我对于这个想法没有太高的热情,因为这不能很好地控制硬币。

我觉得比较好的是将传感器夹在纵向的木头层或者透明的塑料层之间,并将他们拿胶粘起来。

31-13中展示了这个过程的第一步,里面有四个传感器和一个四分之一英寸厚的木片或者塑料板,上面刻出了半圆的硬币位。

说明: 00298.jpeg 

31-13

组装传感器的外壳的第一步

说明: 00299.jpeg 

31-14

传感器安放在硬币槽位底部的开口上

31-14中展示了传感器是如何安放在这些半圆形槽位底部的开口上的。

现在在图31-15中,我们加进去了一个3/4英寸的隔板,LED灯装在这个隔板上从上到下垂直钻出的孔上面。

说明: 00300.jpeg 

31-15

隔板会将传感器固定在位置上,并防止红外光从一个传感器漏到另一个传感器上

在增加完四个隔板和四个硬币槽位单元之后,剩下的就是在前面再加个隔板,并将所有的组件装在盒子里面,为这些电子电路做一个底。如图3-16所示。

说明: 00301.jpeg 

31-16

需要在前面再加一个隔板,然后整个组件就可以装到盒子里面了

切割外壳的各个部件不是一个多难的事情。计划如图31-17所示。这里的颜色没有什么特别的含义,只是为了区分各个部件。

说明: 00302.jpeg 

31-17

如何来切割外壳的各个部分,用来装16个传感器、16个硬币槽位和16个获胜指示灯

这些隔板是木头的或者塑料的,厚度是3/4英寸。如果大家用木头的话,应该用硬木,因为在每个切口上面只有3/16英寸,软木的强度会不够。

接硬币的是通过在两片尺寸为6.5英寸×2英寸×1/4英寸的木头或者塑料上切出四个1英寸的圆形做成的。厚度需要是1/4英寸,这是为了与传感器中间切口的宽度一致。大家可能找这个厚度的木头有点困难,而这种情况下1/4英寸的复合板也可以。我用的是Forstner钻头来钻孔,但是如果你小心一些的话,圆锯就足够用了。如果你用类似ABS这样的塑料,就更好了。

在钻完孔之后,将每一片沿着长轴的中线一切两半。每个半圆底部的切口可以用平的带摩擦面的金属锉来完成。

不要忘了在隔板上钻垂直的孔,这些孔是在组装之前先装LED灯的。大家需要将LED灯的引脚用24号的线延长,这样可以将LED灯探出每个孔的底部。如果大家使用的是5mmLED灯底部没有法兰的话,需要正好能放的孔的直径就是13/64英寸。然后加一点点胶水来固定。

另外再用一点点胶水将每个传感器固定一下。但是不要将胶水遗留在传感器的引脚上。还有,所有的传感器都需要是同一个方向放置的,这个特别重要。大家可以自己画一张图,来提醒自己传感器哪边是哪边,因为这些都装在壳子里面之后,就不知道哪边是什么了。

这些槽位尺寸适合,放25美分、一分的、五分的、一角的都行,只要能挡住每个传感器的红外光就行。比25美分还大的硬币放不进去,因为25美分硬币的直径只比1英寸小一点点。如果你的国家中硬币更大,大家就得自己开合适尺寸的孔来适合这些硬币了。

如果你将这个组件倒过来的话,就会发现传感器的引脚还是可以触及的。因此大家可以先将整个槽位和隔板组件做好,然后接线。

电路中的芯片可以装在一个另外的开孔板上,然后通过排线和传感器相连。大家在四边增加薄复合板或者塑料板,这样做出一个盒子来装电路板和十六个槽位。

这个项目在我的必须搭建项目列表中优先级很高,我也很后悔没有照一张完成版本的照片。我想着现在就去重新搭建电路,但是我现在的主要目标是完成这本书的写作,这样大家就可以自己来搭建这个项目了。

从某种意义上来说,我没有自己做好的外壳给大家看也许是个好事情。这样,如果大家自己来做的话,就不会受到其他人的作品的影响(不管是好的影响还是坏的影响)。

项目32:改进奥维德游戏

大家应该还记得在项目23中,在奥维德游戏中,我希望能有一个更好的方法来区分两位选手的棋子。在那个时候,我能做的也就只是建议每一位选手应该通过按下按钮来标示他自己。

有了传感器之后,这些就没有必要了。

假设一位选手用了磁性棋子,而另一位选手则用非磁性棋子,所有的这些棋子都可以放进棋盘上的同样的孔内。如果每一个孔都装有霍尔传感器的话(霍尔传感器会对磁性棋子有反应,而对非磁性的棋子没有反应),如果每个孔还有透射式的红外传感器(对所有的棋子都有反应)的话,我们就应该能将一种棋子和另一种棋子分开来。

这个我听起来像是一个逻辑问题,因此我的第一步是用语言的方式来描述这个问题。

32.1 逻辑选项

如下是工作机制:

如果红外传感器被触发,且霍尔传感器没有被触发,我们这个孔里面一定是有一个非磁性的棋子。

如果红外传感器被触发,且霍尔传感器被触发了,我们这个孔里面一定是有一个磁性棋子。

这种情况可以用图32-1中的逻辑图来表示。注意倒三角,底部带一个小圈的是反相器,它会将高电平输入转化为低电平输出,或者将低电平输入转化为高电平输入。我在Make:Electronics中提到过反相器,但是直到这本书这里的时候才找到一个使用的理由。

右边的与门的输出会接到一个逻辑网络中,去检测这个使用了非磁性棋子的选手是否三个棋子在一条线上从而赢得了游戏。左手的与门的输出则连接到另一个逻辑网络,去检测使用磁性棋子的选手是否赢得了比赛。这样的逻辑网络在图23-4中展示了一个。那张图中的每一个开关可以用与门接着的传感器来替代,如这里的图32-1中所示。

有一点要说明的是这些传感器是不会同时被激活的。霍尔传感器可能会先闭合,因为磁性棋子在接近传感器的过程中,传感器就已经被触发了。

但是,我觉得这个没有影响,因为需要等到光传感器有输出之后才会有动作。与门的两个输入都有效才有输出。

我觉得有问题的地方在于这里的传感器系统过于复杂了。完整的游戏中棋盘有九个位置。将这套逻辑都实现需要五个四门双输入与门芯片和两个六反相器。接线太多了。有没有什么方法能更简单地实现这套逻辑呢?

说明: 00303.jpeg 

32-1

在奥维德游戏中,用两个与门和一个反相器可以激活对应的谁获胜逻辑网络。这需要看在棋盘上是否有磁性棋子(选手1的)或者非磁性棋子插入

32.1.1 用开关

和往常一样,要想去优化并没有什么成型的方法。我们需要的是创新的思维。第一步是重新考虑传感器的作用。的确,这里它们是担任了不同的角色。

光传感器开关在说:有没有棋子被插进来了?

霍尔传感器在说:这个棋子是磁性的还是非磁性的?

这其实是两级操作。第一步是一个是或者非的输出,听起来向一个逻辑门,但是第二步则是一个非此即彼的输出。听起来就不像是逻辑门了。听起来更加像是一个……双掷开关!因此也许霍尔传感器并不是完成这个任务最好的工具。如果我们用单刀双掷磁簧开关来替代呢?

我之前提到过确实有双掷磁簧开关。我还说磁簧开关跟逻辑门对接有问题,因为会有触点回弹噪声。但是,这些触点会很快稳定下来,而且在选手放进棋子的时候,如果磁簧开关是先被激活的话,触点就会有时间来稳定下来,这个稳定时间内,棋子则滑到地方并激活了光传感器开关。这个时候光传感器开关说:我看见了一个开关,而磁簧开关则会没有延迟地告诉你这是哪一种棋子了。

因此感知电路可以简化,将逻辑门完全去除。光传感器提供一个高电平或者低电平的输出,而磁簧开关则接到选手A或选手B的与门上。如图32-2所示。

唯一的问题在于开关可能会让电路处于开路状态,而逻辑门是不允许输入是一个开路的。因此我们需要增加下拉电阻。这些电阻必须是一个相对较大的阻值,才能保证从光传感器过来的信号能够抑制住它们从而改变输入电压。

32-2中,光传感器的上拉电阻在2kΩ左右。而逻辑网络的每个下拉电阻在10kΩ左右。

说明: 00304.jpeg 

32-2

使用一个单刀双掷磁簧开关,而不使用霍尔传感器可以将之前版本的棋子探测电路中的逻辑门去除

这个看起来很有希望。但是在奥维德游戏中,选手可以移动一个棋子,并放到另一个槽位中。那么我们在磁场消失的时候还会有开关回弹吗?

是的,但是在拿走棋子的时候,磁簧开关会弹回到原来的位置。光传感器开关的输出则会从高电平变为低电平。而光传感器内部的迟滞效应则会保证这个输出是一个很干净的输出。

32.1.2 磁性的问题

这里还有另一个问题需要解决,我们用磁体来和磁簧开关匹配使用,磁体就需要足够强才能保证开关可靠工作,但是又不能强到影响旁边的开关。我觉得这个棋盘上的孔需要至少间隔1英寸摆放,而磁簧开关则应该放在下面的一个安全的距离上,这样就不会因为有选手误将棋子掉在棋盘上被误触发了。

这个棋子可以做成楔形,顶端放一个磁体。假如大家用的是很小的方形磁体,大约尺寸是1/4英寸×1/2英寸×1/16英寸。我们就可以在楔形木头或者塑料的底部切一个槽,然后将磁体粘到槽里面。

我们还需要保证磁簧开关和磁体的朝向是合适的。单刀单掷的磁簧开关对于磁场的相对摆放是没有什么要求的,而双刀双掷的磁簧开关里面由于簧片是从一个触点推或者拉到另一触点的,这就有要求了。我觉得游戏的棋子需要做成特定的形状,方向错了就放不进去。可以截面做成T型,而棋盘上也做出T型的孔。

这让我想到另外一种可能性。如果这个楔形片足够宽的话,可以将磁体装在某一侧,另外一侧不装磁体。选手1可以使用左侧带磁体的楔形片,而选手2则使用右边带磁体的楔形片。这样我们就不需要光传感器了,只需要每个孔的两边各方一个磁簧开关就行了。一组磁簧开关是选手1用的楔形片来激活,另一组磁簧开关则是选手2用的楔形片来激活。图32-3中展示了这是怎么一回事。

说明: 00305.jpeg 

32-3

这是一个渲染图,在这个版本里面,一组磁簧开关由选手1棋子上的磁体激活,而第二组磁簧开关则由选手2的棋子上的磁体来激活。为了避免同时触发木隔板两侧的两个磁簧开关,实际使用的游戏版本中的隔板需要厚一些

这个配置的优势是我们可以用单刀单掷磁簧开关来替换原来奥维德游戏电路图中的手动按键。然后就完工了!

我们需要仔细地测试,保证这套系统能稳定工作。这是使用传感器的一个缺点:我们需要处理实际世界的机械问题。

32.2 制作更多:使用微控制器

奥维德游戏比较难用微控制器来做,因为棋盘上有九个位置,而且每一个位置有三种状态,空着的,被选手1占据了,或者是被选手2占据了。这意味着有很多的输入。

但是输入的数量可以通过矩阵编码来大大缩减——这是在键盘上检测是否有人按下键常用的系统。在一个三乘三的矩阵中,微控制器每次将一行拉高,同时检测每一列是否能连接到交叉点。基本想法如图32-4所示。用了这套系统,我们就不需要九个输入,微控制器只需要三个输入和三个输出。记住这里需要二极管,防止多个开关被闭合时电流流向错误的方向。

说明: 00306.jpeg 

32-4

矩阵编码的基本概念

在奥维德游戏中,如果这两个选手用两组磁簧开关,那么矩阵编码就可以改成图32-5中的样子。图中暗红色和暗蓝色的两组开关表示的是,一组开关受一位选手棋子的控制,而另一组开关受另一位选手的棋子控制。

说明: 00307.jpeg 

32-5

奥维德游戏中的矩阵编码。这里两个选手各自控制不同的两组磁簧开关,分别用暗红色和暗蓝色表示

或者,我们能用光敏三极管,利用可见光来识别两位选手的棋子吗,如果一个选手用亚光黑的棋子,另一位选手用光滑的白色?

或者可以用光敏三极管来区分两种颜色的棋子——比如说,红色和绿色——如果这两种棋子用不同颜色的LED灯来点亮?绿色的棋子在绿光中显得比较亮,而在红光中则比较暗,而红色的棋子在红光中比较亮,在绿光中比较暗。大家可以用比较器来判断槽位里面是绿色棋子还是红色棋子。

也许大家可以想出其他当方法来区别棋子。最好的方法一定是稳定可靠、价格便宜、易于使用、美观大方还得相对容易搭建。我很希望能看到大家想出来的方法。

但是现在我已经实现了我的许诺,给出了改进奥维德游戏的用户输入的几种方法。现在我要接着介绍其他的传感器了。

项目33:读取旋转信息

每个人都熟悉老式的我们最喜欢用的变阻器。在这本书里面,我就已经用了大概二十个变阻器了,它们分布在不同的电路中。

在消费类电子中,事情有一些不一样。大家车上的立体声应该是有一个音量控制旋钮,它可以转一个整360°,而且还能接着转。这意味着里面藏着一个不同于变阻器的东西。

那么里面用的是什么元器件呢?答案是一个旋转编码器,也被称为旋式编码器或者增量式编码器,也叫机电编码器(因为里面是机械触点)。图33-1中展示了几种这样的编码器。这些编码器的外观让人联想起变阻器——确实如此,绝大多数的编码器有三个引脚,但是行为却完全不一样。

说明: 00308.jpeg 

33-1

一些常用的价格低廉的旋转编码器

33.1 定义一个旋转编码器

首先我们需要将不同种的编码器严格区分开来。很显然,我现在说的不是那种固态的编码器芯片。我们已经很详尽地研究过那些芯片了,大家很清楚,那些芯片上面是没有旋钮的。

旋转编码器有一个轴,还有至少两个引脚,并能够在轴旋转的时候通过内部的触点产生一个脉冲序列。另外有一个元器件(通常是微控制器)会将这个脉冲序列翻译出来并决定如何响应。可以在音频系统中来调节声音,或者在屏幕上的几个选项中来回转动,还可以根据程序执行任何其他的任务。

在最早的时候,旋转编码器是一个很高端的元器件,通常使用光学的方法来非常精确地测量旋转的幅度(通常在360 °内要分成100多份)。现在旋转编码器已经不是这样的了,任何含有触点,并可以在旋转旋钮的时候产生一个脉冲序列的元器件现在都可以被称为旋转编码器了。

33.1.1 规格

在这个项目中,我们需要一个具有如下属性的旋转编码器:

正交输出(我会在后面解释这是什么意思)。

分辨率要求每个360°至少能分出24次变化。这也可以用每次公转的脉冲数或者PPR来描述。

和分辨率一样多的棘爪数目。棘爪是在轴转动的时候产生暂时阻力的小机构。

Bourns ECW1J-B24-BC0024L就是这样一个旋转编码器,但是拥有24PPR24个棘爪的旋转编码器还有其他一百多种选择。因为这个领域目前发展很快,我今天说的型号很可能明天就被一个稍微有点区别的其他型号取代了。大家不用怕这种型号更替,我们只要仔细地看清楚规格就可以了。

33.1.2 脉冲序列

示范编码器的行为是很简单的一件事情。尽管编码器内部的触点没有办法通过太多的电流,但是还是可以通过几个mA的,点亮LED灯没有任何问题。

将你的旋转编码器按照图33-2所示搭建电路。很多编码器的引脚间距是0.1英寸,可以直接插到面包板上,如图33-3所示。

说明: 00309.jpeg 

33-2

当旋转编码器如图所示进行连线的时候,两个输出引脚就会产生如图所示的脉冲输出

慢慢地转动转轴,大家会发现LED灯会按照图33-2的输出序列亮灭。现在反方向转动转轴,就会发现亮灭的方式反了过来。这就是我之前提到过的脉冲序列。

说明: 00310.jpeg 

33-3

很多编码器,比如这个,可以直接插在面包板上做测试

注意这张图里面的黑点不是代表低电平,编码器输出要么是高电平,要么是关断,因为内部是很小的开关。当处于关断状态的时候,编码器是开路的,没有任何连接。

我是将电源的正极接到了编码器的中间引脚,但是大家可以将这个中间引脚接到地上。这种情况下,输出的就是一个负脉冲和关断脉冲的序列,而不是正脉冲和关断脉冲了。

33.1.3 警告:表现平庸的编码器

如果你的编码器的输出序列和图33-2中的黑红点的序列不太一致的话,或者你能看到有延迟或者闪烁,那么这可能是因为你用的编码器太过于便宜了。稍微多花一点钱就可以得到更干净、更规矩的输出。而这是我们下面的试验中所需要的。

33.2 编码器内部结构

大家看到的序列是由编码器内部的两对触点产生的,这两对触点的安装相对稍微有点错位(就是不同步)。图33-4展示的就是这个概念。

说明: 00311.jpeg 

33-4

在这张图中,按键代表的是正交编码器内部的一对触点

编码器输出的图形表示见图33-5,每一段白色的虚线代表了一个棘爪,而AB的输出组合则随着每个棘爪转化为下一个而变化。

说明: 00312.jpeg 

33-5

编码器的输出,其中棘爪的数目和分辨率一样

描述编码器的方法很容易把人搞糊涂。规则如下:

我现在描述的这种编码器有两个输出引脚,总共有四种闭合-关断的组合,这种被称为正交编码器。

分辨率是指在一个360°的完整旋转范围内,每个引脚包括抬升和下降的变化的次数,乘以总引脚的数目(正交编码器里面的管教数为两个)。

因此分辨率是和一次公转里面状态的变化数是一样的。

名词PPR是从两个引脚那里计算的关断脉冲加上闭合脉冲。因此PPR也和分辨率是一个意思。

33.2.0 编码器的应用

编码器是一个非常简单的没有智能的元器件。能做的就只是单击内部的小开关,让其他的元器件完成处理序列的有一定智能的工作。

这里的其他元器件也可以用逻辑芯片——但是如果你准备将旋转编码器连接到某种数字逻辑芯片的话,还得记住很重要的一点:

大家必须在编码器输出上加上上拉电阻或者下拉电阻,以保证编码器内部开关在断开的时候输出上有一个确定的电压值。

这条规则在我们将编码器输出接到微控制器的输入上的时候也适用,而且接微控制器也是编码器最常见的应用。

假如大家的编码器是用在音量调节上。当我们拧动旋钮的时候,微控制器会通过比较两个引脚输出的脉冲序列来判断我们的转动方向。比如说,如果开关A在开关B之前一些闭合,就表示旋转的方向是顺时针,如果开关B在开关A之前一点闭合,那么旋转方向就是逆时针的。

这个事情确定了之后,微控制器就会来数脉冲数,来决定大家到底想把音量调高或者调低多少。

为微控制器编制程序,用这样的方式来响应比看起来要复杂很多。除了其他需要处理的问题,这个程序还需要能忽略掉旋转编码器产生的触点回弹。幸运的是我不需要去处理这些事情,因为我不是用微处理器来接口编码器。我有我自己独特的计划。

也许,大家可能会想,旋转编码器在这个讲传感器的章节出现是为了什么。它只是一个输入设备,并不是一个传感器吧?

没错。旋转编码器不是一个传感器,而只是一个输入设备——但是这是一个需要了解的非常有用的元器件,而且我会将它当作传感器来用。

33.3 编码器可以是随机的

如果编码器是对称设计的,那么如果有人将旋钮拧到一个随机的位置,我们的输出在AB同时为低电平,或者A为高电平B为低电平,或者A为低电平B为高电平,或者AB同时为高电平四种情况的概率是完全等同的。

这些组合听起来像是二进制的两位数的可能组合——而且确实也可以这样来使用。

我在Make系列书里面的一个专栏中简单讨论了一下这个想法,制作的是一个幸运8号球,功能和老式的幸运8号球相类似。我的想法是将一个铅的配重装在编码器转轴上,如图33-6所示。

说明: 00313.jpeg 

33-6

一个铅沉子的配重,通常是用在钓鱼上的,现在装在了编码器上面一根坚硬的镀锌线上面

我在编码器的塑料轴上面钻了一个孔,然后在小的铅沉子上面也钻了一个孔,用一根14号的镀锌线穿过这两个孔,并用环氧胶将其固定。

这个电线是五金店的标准件,而我在沃尔玛则买了一包一盎司的铅配重。这些沉子是大家在钓鱼的时候用作的沉子。我自己是不钓鱼的,因此我对这些沉子的实际使用方法是有些小阴谋的,但是想用一样东西,是不需要知道这些东西设计之初是用来干什么的。大家可以到运动用品部门的钓鱼部分找到这些东西。

现在,假设旋转编码器已经牢固地固定在盒子内部了,里面还有一个我们已经做好的电路。假设有人将盒子转动到任意的随机方向上。为什么人们要这么做呢?也许大家可以在盒子底下给电路装一个开关,这样谁想用就可以掉过头来找这个开关。编码器轴上的铅沉子的惯性就会使得轴开始转动——而停在哪里,就没有人知道了。

我们还可以让事情变得更加有趣,假设我们在盒子的内壁装有第二个旋转编码器,与第一个呈90°。在这种情况下,盒子的运动将会在两个轴向上都被感知到。由于每个编码器有两个输出,并可以看成生成了两位的二进制数,范围是00011011,我们可以将两个编码器的输出组合起来得到一个四位的二进制数,范围则是从00001111,这样就完全无法预计了。这个数可以接到解码器芯片的输入或者复用器的控制引脚上,来随机选取一个015的数。

还有其他的可能的想法——但是确实,我这里就是这个想法。

33.3.1 旋转决断者

大家可以将四位的编码器输出减小为一位的只有高或者低的输出,这就是一个决断者的游戏,就像一个非常简易版本的八卦盒子一样。思考一个问题,然后拿起盒子,摇一摇,放下来,按一个按键,然后就会点亮LED灯或者不是LED灯。

这个游戏中一个吸引人的地方在于,在盒子移动的时候,大家会感觉到编码器棘爪的单击声和配重转动的声音。感觉上是有个非常复杂而神秘的事情在里面发生着。(如果有人问你到底什么原理,你就可以告诉他们实在太复杂太神秘了,没办法解释。)

也许大家想知道我们为什么需要两个编码器,每个编码器可以产生四种可能的状态,而我们只需要一个是或者不是的答案。原因在于我们需要让这个装置的随机性尽可能地强,而我们的输入越多,结果的随机性就越强。

但是我们怎样才能将四个输出变成一个呢?我们可以用异或门,如图33-7所示。注意里面的四个下拉电阻,这是为了保证编码器的输出上能始终有一个确定的电压。

大家看一下这个电路中的逻辑流,就会发现电路底部的异或门的输出为高电平和低电平的概率是一样的——当然要求旋转编码器是均匀的。

说明: 00314.jpeg 

33-7

这个电路会通过两个加了配重的旋转编码器来产生一个随机的或者不是的答案

这个简单的电路有一个很好的地方是不需要上电的开关。编码器本身不需要耗电,因此我们可以将编码器摇到合适的位置上,放到盒子里,然后再去按按键。根据最下面的异或门的输出到底是高电平还是低电平,按键会给这个LED灯供电,或者从不是这个LED灯供电。请记住,74HC00系列的逻辑门可以输出的电流和可以吸取的电流是一样大的。

大家在这个电路中必须使用HC系列的芯片。其他的老式芯片没有足够的电流输出能力,也没有足够的吸取电流的能力。

这个电路的原理图如图33-8所示。

说明: 00315.jpeg 

33-8

使用编码器来输出是或者不是的决断者玩具的电路图

33.3.2 旋转含混器

含糊就是你不想做决定的事情。选举出来的立法者都是这么干的。比如说,如果我是一个立法者,有人问我,我们能不能用旋转决断者来做旋转含混器?我就会说:额,这个问题有两个方面的考虑;我觉得两者都有一些未知的地方,我们还要继续研究这个话题。

但是我不是一个立法者,我也不会这么说。我在这里会说是的,当然我们可以做一个旋转含混器。

逻辑图如图33-9所示。如果左侧的异或门的输出为高电平,而右侧的异或门的输出为低电平,那么就会将可能是LED灯亮起来。如果这逻辑的状态都是反过来的,那么就会点亮可能不是LED灯。

但是如果两个异或门都有着同样的输出呢——两个都是低电平或者都是高电平呢?在这种情况下,第三个异或门会输出低电平,并将电流通过第三个LED灯,这表示我不确定

这个电路图见图33-10,对应的电路的照片则见图33-11。在这张照片里面,用的LED灯含有内部电阻,而旋转编码器则分得比较远,这样对应的铅沉子转起来的时候不会碰到。

说明: 00316.jpeg 

33-9

之前的是或者不是的电路现在被改成给出含混的结果了

说明: 00317.jpeg 

33-10

旋转含混器原理图只需要在之前的旋转决断者原理图上稍微改一点点就可以了

说明: 00318.jpeg 

33-11

旋转含混器的面包板版本。LED灯上不需要外接串联电阻,因为它们内部已经内置了电阻

如果大家按照图33-9的逻辑来做,就会发现我不确定的输出是其他输出的两倍概率。这就会保证这个玩具实际上是一点用都没有的。

如果你有一个朋友是玩政治的,也许你可以给他一个这玩意儿,算是赞助他选举。

33.4 严格的随机结果

我在旋转编码器章节加上这么一小段,是因为我希望将一个简单的项目加到复杂得多的项目中去,而且我喜欢将元器件用在非预期的用途上。另外,我还喜欢做只需要一个逻辑芯片,几个LED灯和一个按键的玩具。如果大家还有5V直流的稳压芯片的话,就可以用9V电池来供电,并用上好几年的了。

其他种类的传感器可能更加适合用在产生随机结果上。我会在下一章给出一些选项,再后面我会解释如何取得完美的随机结果,而且我会讨论这个结果的实际意义。

项目34:感知环境

在这个章节中,我会回到我之前提过的一个基本概念上,通过在随机的时刻停止一个快速的定时器,以选择一个随机数。

这是在项目28八卦盒子里面用到的技术,同时也在项目21接电槽位游戏中用到了。但是这两个游戏都要求选手做一件事件来停止这个定时器。我这里描述的是一种用传感器来在没有任何用户输入的情况下输出随机性的方法。

首先我得先回顾一下慢速单稳态定时器的基本连接方法,这个定时器是用来启动和停止快速振荡定时器的,从而驱动计数器。我在下面的基于传感器的随机输出应用上还是会这么用。

然后我会稍微停一下,给大家展示如何用定时器来限制随机数序列。这个时候我们就不是从0数到15或者从0数到9,而是数到任意的一个数了。大家可以选择让它从0数到1

最后,我会将传感器放进去。

34.1 用一个定时器来控制另一个定时器

在图34-1的电路中,上部的定时器的接法和图27-1中的接法是一样的,它会在双刀双掷按键开关被按下的时候产生一个干净的脉冲输出。

第一个定时器的输出会点亮LED灯(小的黄色圆圈),以表示定时器在工作中。然后这个输出会连接到第二个定时器的引脚4,它是复位引脚上。当复位引脚为高电平时,定时器就可以运行。因此第一个定时器的高电平输出将会使得第二个定时器解锁(但是只能解锁一小段时间)。

第二个定时器将向环形计数器发送脉冲序列,大家会看到标着09LED灯按顺序点亮。

当第一个定时器的这个周期结束的时候,会将第二个定时器的复位引脚拉低,从而锁住了这个定时器,这样就只有一个LED灯还亮着了。

按下计数器复位按钮,然后按下重新运行按钮——这个由于测试的原因,现在还没有去回弹处理。我希望大家在慢速计数器过来的脉冲结束之前松开这个按钮。

大家会发现,在每个周期结束的时候,每次都是同一个LED灯亮着。这就不是随机的了——这些元器件都是按照我们的预期在工作,而且是每次都保持着一致。

说明: 00319.jpeg 

34-1

这个基本电路展示了用慢速定时器来使能快速定时器一小段时间的想法。环形计数器通过快速定时器来控制。只要每次我们都按下计数器复位按钮然后再运行,每次都停会在同一个状态上

34.1.1 温度控制

现在我们用热敏电阻来做一点更有意思的事情,热敏电阻和电阻类似,就是会随着温度的变化而改变阻值。图34-2中展示了一个热敏电阻的照片。热敏电阻很小,这是因为体积越小,响应温度变化的速度就越快。热敏电阻的引脚也很长,这是因为引脚越长,从热敏电阻上面带走或者传导过去的热量就越少。同样的原因,热敏电阻的引脚还很薄。

说明: 00320.jpeg 

34-2

一个高质量的热敏电阻。体积很小,使得它可以随着温度的变化而迅速响应

我希望大家用的热敏电阻是标称为100kΩ的,这是在25℃的时候的基准阻值。热敏电阻没有极性,因此不用担心从哪个方向去接的问题。

要将热敏电阻加到电路里面,只需要将第一个定时器上100kΩ电阻拿走,然后换上这个电阻就可以了。

重复这个过程,只要热敏电阻周边的温度恒定,每次结束的时候还是会停在同样的LED灯上,因为第一个定时器给第二个定时器的工作时长窗口还是一样的。

这个测试做几遍,每两次测试中间别忘了按下计数器复位按键。现在用食指和大拇指抓住热敏电阻,来将其升温。这个时候再做测试,结果会发生变化吗?

34.1.2 随机因素

除了热敏电阻的阻值变化之外,还有其他的一些因素可能导致结果有变化:

定时器自身在使用过程中温度升高,会稍微改变性能。

重新运行的按键可能每次运行并不是完全相同的。

大家的电源可能有波动。

面包板的连接有一定的阻值,在碰到任何的电线或者元器件的时候阻值会发生变化。

可能还有一些其他的我没有想到的环境因素。

34.1.3 自动运行随机生成电路

我们可以通过去除用户输入来加速电路的测试过程。

第一步是将第一个定时器从单稳态运行模式改成振荡运行模式。这个定时器可以运行一秒钟,然后停一秒钟,然后再运行一秒钟,如此下去。这样,大家就可以坐着观看结果,而不是总得去按重复运行的按钮了。图34-3展示了重新接线的电路。

说明: 00321.jpeg 

34-3

之前版本的随机生成电路经过重新改动之后,现在可以自动运行了,不需要用户输入

第二步是将计数器复位按钮去除,并更改计数器,使得它可以自动重启。74HC4017计数器的复位按键是在从低电平到高电平转换的上升沿起作用的。嗯,第一个定时器的输出从低电平到高电平的转化发生在每个周期的起始时刻,因此我们将这个输出连接到计数器的复位引脚上就可以了,但是需要经过一个电容,这样复位引脚就只会短暂地变为高电平。

我在图34-3中加入了这个改动,大家可以看图34-4中的面包板版本的电路。

说明: 00322.jpeg 

34-4

文字中描述的原始的热敏电阻测试电路已经更改过了,现在可以不需要用户输入自动运行了

现在系统可以自动运行了。

34.1.4 背景知识:计数到较低值

我会在结束讨论环形计数器之前再讨论这个重要的细节问题。

大家可以很简单地在绝大多数的计数器上做一点变动,这样就可以计数到一个较小的值。环形计数器也不例外。

74HC4017定时器的引脚1通常需要接高电平,然后点亮5LED灯。大家觉得如果把引脚1和引脚15复位引脚用线连起来,会发生什么?

计数器会和往常一样点亮LED0LED1LED2 LED3LED4。然后轮到引脚1,这个管脚通常是来点亮LED5的,但是这个高电平输出又给到了复位引脚。在几分之一秒的时间内,计数器就复位到了0,然后引脚1上就没有高电平输出了。因此,LED5是没有机会发出任何的可见光的。

只要有时钟脉冲过来,计数器然后还会继续从0往上计数,会永远重复从04的序列,这样就从十进制计数器变成了五进制计数器了。

将一个输出引脚连接到复位引脚,是改变计数器周期的长度的标准做法。

这在带解码输出的计数器上是特别简单的事情,因为我们可以选择任意需要切断的计数周期的点。当我们用的是带二进制输出的计数器的时候,我们选择就少了一些。比如说,假如我们将第三个二进制位的输出连接到了复位引脚,这第三位的值是4,因此计数器会从0数到3之后重新开始计数。如果我们希望计数器从6开始重新计数呢?那就会有点困难了。

大家要想解决这个问题,可以选择各个与周期长度相匹配的引脚的组合,用逻辑门来的方式搞定。第二个引脚和第三个引脚加一个与门就会在计数器达到二进制110的时候输出高电平,这也就是十进制的6。将与门的输出接到复位引脚上,然后我们的二进制计数器就可以从000计数到101(十进制的05),如此重复。

限制计数器是一个非常有用的技术,比如说在游戏中我们需要计数器来选择通常范围内的一个随机数的时候就用上了。

要让74HC4017计数器变得只计数01,然后就重复,只需要在引脚4(对应数值为2的引脚)和复位引脚之间加一根跳线。

现在我们回到传感器和随机性上面来。

34.1.5 速度调节

如果大家的自动随机计数器输出没有什么变化的话,就应该增加第二个定时器的运行速度了。50Hz是非常慢的,我这么选只是为了让大家能看到LED灯闪烁的序列。将定时器2上的1μF的定时电容拿掉,换上0.1μF,这样速度就是500Hz了,要是用0.01μF,那就是5000Hz了。

第二个定时器走得越快,被打断时的状态就越可能因为这些细微的变化而发生变化,参见图34-5中的解释。

说明: 00323.jpeg 

34-5

当慢变定时器控制着快变定时器的时候,如果第二个定时器的运行速度越快,慢变定时器的速度的变化(如图中暗蓝色方块中所示)会将第二个定时器在一个更宽的周期范围内停住

在这张图的上半部分里面,慢变定时器的脉冲长度(紫色)可以在暗蓝色区域的范围内变动,这是由于定时电路中传感器的变化造成的。由于第二个定时器(黄色)的速度不够快,因此慢变定时器的变化范围的前沿和后沿都在这个脉冲上。

在这张图的下半部分里面,第二个定时器的速度要快一些,因此,慢变定时器的变化范围的前沿和后沿落在不同的脉冲上。

如果大家使用的0.001μF的电容来产生50000Hz的脉冲,我敢打赌第二个定时器每次都会落在不同的地方——至少,从现在看起来就是这样。

因此,我们现在是否已经解决了自动产生游戏的随机性的全部问题,使得游戏看起来无法预测了呢?

也许吧。

首先我要再深入谈一下热敏电阻的问题。

34.2 热敏电阻知识

热敏电阻会随着温度的变化而变化它们的阻值。NTC型号的热敏电阻的阻值会随着温度的上升而下降,而且会在相当宽的范围内有着比较线性的响应(通常是在-40125℃之间)。而PTC型的热敏电阻则会在温度上升的时候阻值突然变高。

NTC的意思是负温度系数,而PTC的意思是正温度系数。PTC的热敏电阻通常用来替代熔丝,防止电源电流超过一个最大允许值的应用场合上。

而我们这里用的是NTC类型的热敏电阻。

热敏电阻很便宜,很多的热敏电阻都不超过50美分,而且基础阻值的可选范围也很大。基础阻值通常都是在25℃上测量的。

要想测试一个热敏电阻,我们可以将万用表设在测量挡,然后将表笔搭在元器件的引脚上。不要让引脚碰到手,因为这种接触会使得热敏电阻的温度受到影响,还会改变我们测量的阻值。用表笔将热敏电阻按在一个牢固的绝缘表层,然后等到万用表读数稳定。

现在,大家将另一只手移动到靠近热敏电阻的位置,但是还不要接触,因为那样会影响到万用表表笔的接触效果。大家会看到热敏电阻的阻值逐渐变化,因为它现在感受到了从皮肤辐射过去的热量。物理上来讲,体积小的热敏电阻能比体积大的热敏电阻响应更快一些,因为它们需要加热或者制冷的热量会更少一些。

34.2.0 让热敏电阻随机性更强

很多因素会影响电路的温度,但是电路本身也会发热。大家可以将一个热敏电阻和电路都放在一个盒子里面。要想使热敏电阻响应更好,可以使用220Ω的电阻,并直接接在电源上方。这个电阻会在5V直流电压下消耗100mW左右的功率,这是在通常的四分之一瓦的限值内的,但是已经足够产生一定的热量了。很自然地,这对于使用电池的设备来说不是一个多好的主意。大家还需要小心别把热敏电阻推到使用范围的极端上,在那个情况下,热敏电阻就不一定随着温度的变化而变化了——尽管这种情况概率是在是太小了。

另外,大家也可以将热敏电阻装在盒子的后面,暴露在空气中,这个时候热敏电阻就会响应这里的温度波动。还有更好的办法是用两个热敏电阻,串联或者并联放置,一个放在盒子里面,一个放在盒子外面。

如果这个在大家看来还不够随机,也许大家可以来点更加怪异的。

34.3 湿度传感器

房间里面的湿度通常是非常缓慢地变化的,除非是在浴室或者厨房旁边。但是大家也可以将这些缓慢的变化放到定时器控制电路中去。

Humirel HS1011 湿度传感器大家可以在Parallax(以及其他的供应商)那里买到,价格不会超过10美元。这个传感器有两个引脚,这两个引脚之间的电容会随着湿度的变化而变化。

是的,是电容。这是一个新的概念。如何在我们的定时器控制电路中用到这个东西呢?

很简单!只需要用湿度传感器来替换图34-4中的第一个定时器的定时电容就可以了。Humirel的数据手册中标明这个传感器的电容会在177183pF之间变化。这些都是非常小的数字,因此我们需要使用阻值很小的定时电阻。

34.3.0 湿度控制

湿度传感器可以用来控制加湿器的开关,这个可以用在一个需要湿度控制的环境中。书籍,纸张,老式唱片以及人们的鼻窦都会在湿度可控的环境中得到更好的保护。

一种实现湿度控制的方法是用可变的电容来调节快变真的那个定时器的运行速度,而第二个定时器则可以很短暂的来激活这个定时器。这个震荡输出连接到一个四位的二进制计数器上,计数器再连接到四位的复用器上,复用器的十六个输入/输出引脚则串联起来做成一个长长的分压电路。复用器选择的电压就变成了比较器的变化的电压输入。比较器的参考电压输入可以通过变阻器来调节,这样就弯成了湿度控制。比较器的输出连接到固态的继电器上,从而开关加湿器。

这套方案是不是太复杂了?听起来是得花上一整天才能调试好的。也许大家可以直接买一个商用的湿度表,用起来和温度表没有什么区别。但是那又太没有意思了!大家是不是宁愿自己埋头来做自己的电路,等到最终调试完毕而欢欣鼓舞,再看着你的朋友们迷惑的表情,虽说他们会不理解做这些没有必要的小玩意儿的乐趣所在?

只要有时间,我肯定是宁愿自己去走这条苦干-欢欣-迷惑的过程。但是现在我要讲一讲另一个传感器了。

34.4 加速度传感器

我在Make系列书的一个专栏里面讲过加速度传感器。这些传感器现在已经变得好便宜了。由于它们能够响应任意方向的力,就可以用来通过测量重力来知道它们的摆放位置。如果大家有一个手持设备,里面的加速度传感器就会在稍微变化设备的握法的时候改变输出电阻。这样,我们就有了另一个随机阻值的来源了。

实际的加速度传感器应该是一个很小的标贴元器件,但是也可以是装在小的模块板上的,如图34-6所示。这样就容易使用得多了。

说明: 00324.jpeg 

34-6

表贴的加速度传感器装在模块板上,加速度传感器可以测量所有的力,包括重力。因此,加速度传感器的输出会随着我们拿传感器的方式不同而发生变化。这个输出可以转变为板卡上引脚之间的简单的电阻变化。图中的小方格的大小是0.1英寸×0.1英寸

34.5 触觉传感器

触觉传感器是我觉得最有前途的一种传感器。这是一层薄薄的柔性塑料,中间放置了压力感应的电阻。大家可以在图34-7中看到传感器的一张图片。我不太确定这个传感器的工作原理,但是看起来很可靠,而且有着很宽泛的电阻阻值范围。当大家完全不按的时候,电阻几乎是无穷大,而当用力按的时候,电阻就会掉落到大概1kΩ的样子。

说明: 00325.jpeg 

34-7

触觉感应的平板,会随着指尖按下的时候改变阻值

大家可以用这个传感器来替代控制定时器运行的开始按钮。换句话说,触觉传感器有两个作用,一个是高科技的开关,一个是随机数产生器。这种传感器有着很大的阻值范围,可以提供同等范围的随机数的范围。

但是我必须承认,我这儿只是走马观花,我没有时间来全面地研究传感器,并没有走上上千个周期来看这些值的变化。即使我有这个时间,我去触摸传感器的方式可能比其他人会增加更多的阻值。即使传感器工作都很正常,也可能会有人触摸的方式很一致,导致结果并不随机。

看起来我会一直在质疑这些元器件的性能,一直会在说如果这样如何,如果那样如何。

我承认,我是一个很多疑的人,但是真正的问题在于我是以一种经验的方式在做这些项目。

34.6 经验问题

经验研究意思是说结果是基于观察或者经验值来得到结果。

——那这种方法有什么问题呢?肯定这种方式会比坐在那里空想会出现什么要好吧。

这当然是对的。我们自己动手去研究总比去猜测会发生什么会好(确实是这样,这也是本书的一贯思想)。很多研究都是使用观察的方法来得到结论。但是还有一种研究的方法,通常这种方法有着理论基础。

比如说,当宇航员在仔细地测量水星在太阳的一侧消失,再到另一侧出现的具体位置的时候,并不是说他们一直有时间观察这测量仪器。Einstein的相对论预测说太阳的引力会使得光线向着水星的反向弯曲。科学家们来做观察是为了确定Einstein到底说的对不对(确实,Einstein说的是对的)。

但是,如果大家没有理论基础,又希望今天的观测能在明天有着同样的结果,那就没有办法保证了——特别是如果大家有很多无法控制的因素,比如不同的人用不同的方法来按这个传感器。

大家可能觉得,热敏电阻或者湿度传感器或者加速度传感器或者压力传感器应该在不同的人使用的时候能有类似的表现,而且应该能产生相当好的随机数分布,但是这个是没有办法保证的。如果有人问你的话,你可以用如下的方式正确回答。

输出现在看起来是随机的,而且我也看不出来有明天它会变得不随机的理由,但是我没有办法来证明。

唔,如果我告诉你有一种办法可以让你将一些元器件连接起来,然后会产生无法预测的数字流,完全靠电路本身,没有任何外界干扰呢?如果你可以从数学上保证数字流每次都是一样的呢?如果这个序列非常长,以至于当这个序列重复的时候,没有人能预测下一个数字是什么呢?

这个听起来像是一个完美的伪随机数产生器,只要我们开始的时候不是从完全一样的位置开始就行。但是这个听起来有些复杂,而且大家可能会质疑是否有这个必要。

这其实并不是很复杂。至于是否必要则看大家用在什么场合了。

34.6.0 要多随机才算随机

在一个典型的电子游戏中,我们需要一个看起来是完全随机的输入,如果我们产生的是015中的任意一个数字,而几百次游戏运行下来,数字13则比起其他数字出来的更多一些——估计这也不是个大问题。

但是在有些项目中,我们需要各个数字的概率精确一致。如果我们产生的是一个非常长时间的01随机数组成的序列,我们需要特别肯定这个序列里面包含50%050%1,而不是50.1%49.9%

也许大家会觉得我们是不可能需要这么高的精度的,但是我们回去想想项目15中的超感知觉测试。假设我们从一个双人的项目改成了单人的项目会怎样。

困难在于如果有人用超能力(如果这种能力存在的话)来猜测LED灯到底是开着还是关着。电路会用看起来随机的序列来开关LED灯,但是在254次测试中,我们必须肯定LED灯开了127次,关了127次。否则,如果有人猜中了略微超过一半的次数,我们就不知道怎样去评判他的表现了。

在任何的超自然现象的研究中,即使一个很小的偏离均值的变化都可能影响巨大,因此如果有一个数字比起另一个数字产生的更多确实会有很大的影响。

我们能重新制作单人版本的超感知觉测试,从而产生真正的真实的结果吗?事实上我觉得这个问题不难,也想试一试。

我将会分两步来处理这个问题,首先,我会给大家讲解如何做出一个完美的伪随机数产生器,然后我会将其加到测试电路中来。

项目35:线性反馈移位寄存器

假设我们有一个黑盒子,里面有某种电路,可以产生一个序列的数字,不受环境的影响。我们如何去确定这个数字的序列是随机的呢?我觉得需要满足两个需求:

这个数字流相对来讲需要是不重复的。我说的是相对来讲,因为所有的封闭的数字生成器都会重复的,只是时间长短的问题。我们的目标是产生一个足够长足够复杂的序列,超过人类的记忆或者注意范围就行(这里我假设数字生成器物理上足够大,量子效应可以不加以考虑)。

如果我们能定义出一个数值的范围,对应的数值都是同等的概率,那么这些值的权重就应该是一样的,在这个序列里面出现的机会也就应该是相等的,不会有数值被省略掉。

有一种电路能几乎满足这两条要求。它的名字叫作线性反馈移位寄存器,或者称为LFSR。这个寄存器的输出序列可以是任何长度的(几乎是),而且输出是绝对等权重的(几乎是)。当我们搭建完这个线性反馈移位寄存器之后,我会给大家展示这几个几乎是多么的小,应该是可以忽略不计的。

35.1 了解线性反馈移位寄存器

我们先从图35-1中的简单测试电路开始。这个电路和图27-2中的移位寄存器的电路非常相似。但是,数据输入开关这里没有,因为这个电路会自己来产生数据,并形成循环。

35-1

用来展示线性反馈移位寄存器的最简单的电路

说明: 00326.jpeg
 

存储位置EFGH的输出是没有连接的,因为这个电路的功能如果只用ABCD的话更加容易理解。如果大家将LED灯(电路左下部小的黄色圆圈)如我所示的放在一条线上,就更加容易理解了。当然,这些输入引脚不能放在面包板的同一行上,因为它们需要独立的驱动。但是大家可以将电线弯一弯,这样LED灯就可以比较漂亮的排在一起了。

面包板电路的照片如图35-2所示。

说明: 00327.jpeg 

35-2

测试线性反馈移位寄存器

现在我们不用手动输入数据,而是使用了异或门来接到存储位置CD上,并将异或门的输出接到串行数据输入上。我用一个波浪线来表示了这个连接,它表示的是一个柔性的连接线——这是那种两头都是插头的线。在一开始,这根线两头都要连接着。

CD的存储位置的状态会再次循环。唯一的问题在于,如果我们给移位寄存器刚开始上电的时候没有任何波动,所有的这些存储位置都是低电平的状态,而且当异或门的输入是两个低电平的时候,其输出还是低电平。这样,反馈也就没有起到任何的变化。这个低电平状态会不停地流转流转,LED灯一直是灭着的。

经常我们给电路上电的时候,开始有一个电流冲击或者是电源的噪声会导致移位寄存器中会载入一些随机数。电路图中的100μF电容就是为了防止这种情况的发生而设置的,尽管这个措施可能不会彻底奏效。

如果你确实载入了一些初始的随机数的话,某些LED灯确实会被点亮。

其实不管这种情况是否发生,我都希望移位寄存器全部能载入高电平。要想完成这个目标,可以将异或芯片底部跳线的下端拿掉,并将这个点接到电源正极上,这样移位寄存器的串行输入就一直是高电平了。现在按四次按键,将存储位置ABCD载入高电平。

当这四个LED灯都亮起来了以后,重新将异或门芯片的引脚3连接到跳线上,这时大家就会看到和图35-3一样的序列。这个序列会在十五步之后重复,而且如果大家将定时器从单稳态模式转变为振荡模式的话,这个序列将能够一直持续下去。

35.1.1 线性反馈移位寄存器知识

总结一下我们刚学到的内容:

如果LED显示的低电平对应着二进制的0000的话,那么它们就会一直保持着这个状态,因为线性反馈移位寄存器会一直在0中重复循环。

如果LED显示的不是0000的数值,就能够历遍一个十五个不同的模式,然后序列再重复。所有的从00011111的数值都会出现,但是顺序并不是按照大小顺序排列。在整个序列重复之前,不会有任何的数值会被略掉(除了0000),也不会有哪一个值会被重复。

问题在于这个序列过于简短了,人类的眼睛和大脑会很快认出来这个序列在不断重复。

也许如果我们用了移位寄存器里面所有的八个存储位置,同时将LED的数目从四个增加到八个,我们就能获得更多的种类的组合,而且重复也得要更长时间才会发生。这种方案看起来是可行的,但是在我尝试这个方案之前,我想先给大家展示一下里面到底发生了什么。

35.1.2 内部的比特位移

在图35-3中,顶上的红色盒子代表的是移位寄存器内部的存储位置。这张图中的移位是从右向左,大家从ABCD的标号也能看出这一点来。如果大家在别的地方来研究这个课题的话,可能会发现它们的排序是从左向右,我不喜欢这么排,因为我需要将移位寄存器的输出来代表一个二进制的数。从右向左移位会使得这样的结果更加符合这个目标上的直觉。

说明: 00328.jpeg 

35-3

四比特线性反馈移位寄存器的行为

大家应该还记得移位寄存器的工作方式,数据输入存储在输入缓冲中,当有时钟脉冲来到的时候,就会将所有的数值移动一位,来空出位置来。因此当我们将目前位置C和位置D的当前状态经过异或门之后再反馈回到输入,这个结果就会存在输出缓存中,等待下一个时钟来载入。在那个时候,CD的两个新状态的异或的结果又会拷贝到输入缓存中,等待下一个时钟周期——如此一直下去。

如果这些存储位置对应通常的二进制位的值8421(从左向右的顺序),那么最初的十进制的数值就应该是8+4+2+1=15。但是从异或门回来的反馈将会把最右边的比特改为0,因为异或门的两个输入为高电平的话,结果就是低电平输出。因此在第二条线上,存储位置加起来就是8+4+2=14。在这张图的每一条线里面,总的二进制数对应的十进制的值在白色盒子里面用黑色的数字表示了出来。

35.1.3 关于0的问题

线性反馈移位寄存器在上电的时候所有的存储位置都是0,为了解决这个问题,教科书里面常常会建议预先载入一个其他的数值。这个可以通过其他的元器件来解决,可以短暂地在保持数据输入为高电平的同时驱动移位寄存器的时钟。但是我想尽量去避免增加这个需求。

还有一种更简单的方法:将电路用同或门来代替异或门。同或门不太常用,但是74HC00系列和4000B系列里面都有(还有一个选项是将异或门的输出反向,但是这就要再加上反相器,这又是另一个逻辑门了)。

我们回到图15-5,在项目15中,我展示了同或门的输出其实是异或门输出的反相。同或门会在两个低电平输入的时候输出高电平——因此在线性反馈移位寄存器上面是非常适用的,即使移位寄存器是从0000开始也没有关系的。

这个是用同或门而不是使用异或门得到的序列如图35-4所示。这个序列包括了从二进制数00001110(十进制014)。稍微思考一下,大家就会发现1111或使得使用同或门的电路被锁住了,就像0000会锁住使用异或门的电路一样。同或门是扔掉了1111,而不是0000。但是,这个电路还是能在电路最开始上电的时候自动开启。

说明: 00329.jpeg 

35-4

使用了同或门的线性反馈移位寄存器输出序列,这样可以处理开始是0000的四比特值

35.1.4 需要不重复

在我们用四门双输入同或门芯片重新搭建测试电路之前,我需要回到序列重复的问题上来。我们确实需要在序列重复之前不能只有十五步。

额,如果我们把所有的八个存储位置都用上的话,输出值就会从二进制 00000000 11111110(相当于十进制的0254),这样就会在重复值前走255步。

这个办法听起来有希望,但是我们应该将同或门放在什么地方来提供反馈,以实现这一切呢?如果我们将同或门放在GH的位置上,然后反馈到输入缓冲行不行呢?

不行,如果你这么试的话,会发现这是行不通的。现在我们再移位八个比特,我们会需要三输入的同或门,见图35-5(我们使用异或门或者同或门的时候,接的位置是一样的。唯一的差别是移位寄存器不能从全零的值开始而已)。

说明: 00330.jpeg 

35-5

在使用八位线性反馈移位寄存器的时候,需要用三个同或门

我们为什么现在需要三个同或门呢,而且为什么要选择这三个位置呢?

额,如果我们选的少了,或者选的多了,或者位置不一样,电路就不能产生出包含所有的0254,不重复也不省略的序列了。

但是我是怎么知道这个的呢?

这个事情是可以用数学的方法来证明的。虽然证明并不简单。这个过程会把我们带进类似本原多项式