本节介绍输入设备的设计与实现,重点是传感器集成和微控制器编程,属于 Lucio Pentagna 的 Fab Academy 2020 项目。
学习 Neil 的输入板 → 决定输入类型 → 设计原理图/电路板 → 铣削电路板 → 焊接元件 → 调试 → 编辑并发布网站
查看小组作业页面了解更多详情。
本周我专注于测试热敏电阻,这对我的孵化器项目来说必不可少,用来测量和控制温度。
我选择的热敏电阻是 B57560G0104。根据数据手册,它在 25 摄氏度时电阻为 100K。
热敏电阻的阻值随温度升高而下降。由于芯片的 ADC 引脚读取的是电压而不是电阻,所以需要分压电路来推算它的阻值。
我把热敏电阻与一个电阻串联后接到 VCC。热敏电阻的一端接地,另一端接在串联电路里。
就像我在第 6 周做的那样,我先回顾了 Neil 的电路板。我重新设计的是可见光输入板。
这个实验的目的是理解和测试热敏电阻与代码。虽然能工作,但温度读数不太准确。没有精确的校准仪器,我就烧开水,确保温度大约在 100 摄氏度。
ATtiny45 上的 USBasp 编程器
下面的视频展示了编程过程。
因为我通常用 Arduino IDE 编程,所以不仅要有数据手册,还要有一张把引脚从一个编程平台对应到另一个平台的图,这很有用。
快速看一眼就能发现,Arduino 有 4 个模拟引脚。它们都有模数转换器(ADC0、ADC1、ADC2、ADC3),所以也可以和引脚 1、0、2 一起当作数字引脚使用。
这次作业我需要 1 个模拟引脚和 2 个数字引脚。模拟引脚用来接热敏电阻,数字引脚用于串口通信。
板上会有一个 ISP 编程器排针,两侧各有 2 个排针,方便按需使用和测试所有引脚,还会有一个 LED,用来显示已经通电。
Autodesk Eagle 是我的首选工具,但我会用 pcb-gcode 插件生成 G-code。
为了计算电阻值,我查看了下面的数据手册,以下是我做的计算和观察:
下面是我设计的原理图:
在我的热敏电阻板上,我用了:
NTC 热敏电阻的阻值随温度升高而下降,反之亦然。为了计算阻值,用一个已知电阻来测量电压降。ATtiny45 不直接测量电阻,所以程序里用的公式是:RT = ((VCC*R-R*VRT)/VRT)
这次作业我用了三组代码:
因为 ATtiny 不能用普通的硬件串口,所以我加入了一个库来实现这个功能:
#include "SoftwareSerial.h"
SoftwareSerial Monitor(1, 0);
void setup()
{
Monitor.begin(9600);
pinMode(0, OUTPUT);
pinMode(1, INPUT);
}
打印要用另一种方式:
Monitor.println(whatever you want to print here);
Arduino 实验中使用的代码来自 Arduino Project Hub:How Easy Is It to Use a Thermistor?!,作者 Marcazzan_M:
//Thermometer with thermistor
/*thermistor parameters:
* RT0: 10 000 Ω
* B: 3977 K +- 0.75%
* T0: 25 C
* +- 5%
*/
//These values are in the datasheet
#define RT0 10000 // Ω
#define B 3977 // K
//--------------------------------------
#define VCC 5 //Supply voltage
#define R 10000 //R=10KΩ
//Variables
float RT, VR, ln, TX, T0, VRT;
void setup() {
Serial.begin(9600);
T0 = 25 + 273.15; //Temperature T0 from datasheet, conversion from Celsius to kelvin
}
void loop() {
VRT = analogRead(A0); //Acquisition analog value of VRT
VRT = (5.00 / 1023.00) * VRT; //Conversion to voltage
VR = VCC - VRT;
RT = VRT / (VR / R); //Resistance of RT
ln = log(RT / RT0);
TX = (1 / ((ln / B) + (1 / T0))); //Temperature from thermistor
TX = TX - 273.15; //Conversion to Celsius
Serial.print("Temperature:");
Serial.print("\t");
Serial.print(TX);
Serial.print("C\t\t");
Serial.print(TX + 273.15); //Conversion to Kelvin
Serial.print("K\t\t");
Serial.print((TX * 1.8) + 32); //Conversion to Fahrenheit
Serial.println("F");
delay(500);
}
代码在这里
#include "SoftwareSerial.h"
#define VCC 5 //Supply voltage
#define R 100000 //R=100KΩ
float RT,VRT,VR;
SoftwareSerial Monitor(1, 0);
void setup() {
Monitor.begin(9600);
pinMode(0, OUTPUT);
pinMode(1, INPUT);
}
void loop() {
VRT = analogRead(3); //Acquisition analog value of VRT
VRT = (5.00 / 1023.00) * VRT; //Conversion to voltage
VR = VCC - VRT;
RT = ((VCC*R-R*VRT)/VRT); //Resistance of RT
// Monitor.println("Voltage Read:");
// Monitor.print(VRT,10);
// Monitor.println("Voltage drop:");
// Monitor.print(VR,10);
Monitor.print("Resistance:");
Monitor.println(RT);
delay(1000);
}
原来用来求阻值的公式对我不适用,因为在我的板上热敏电阻和电阻的位置是互换的:热敏电阻接 VCC,100k 电阻接地。我把公式改成了:
RT = ((VCC*R-R*VRT)/VRT); //Resistance of RT
改进了工作流程后,我把它更新为使用 PCB-Gcode ULP 和 Autoleveller 软件。
原理图准备好后,按以下步骤操作:

元件会放在代表电路板的正方形旁边;电路板稍后会调整尺寸。

输入“move”并按回车,然后点击每个元件,把它拖到电路板里面。

这里我开始把 ATtiny45 拖进电路板的边界内。逐个点击元件时不需要再次输入“move”,除非按了“esc”或用了别的命令。

所有元件都拖好了,上边界也用“move”命令拖动并调整了尺寸。移动元件的另一种方法是输入“info”,然后用左键点击元件,这样可以直接输入元件的坐标,而不用拖动。

“rotate”命令可以把元件转到便于高效布线的理想方向。黄线表示原理图中创建的连接。

这里我用“polygon”命令创建一个轮廓。轮廓闭合时会弹出一个对话框。

多边形画完后,对话框会打开。输入“GND”会把多边形连到地。

输入“ratsnest”或点击它的图标,会用接地层填满整个电路板区域。现在,输入“autoroute”或使用“route”命令,就可以连接各个元件。

在给元件布线之前,进入 edit → design rules 设置各元素之间的间距。

在“sizes”选项卡中设置走线的最小宽度。根据我的经验,0.2mm 效果很好。

“clearance”选项卡设置 PCB 各元素之间的距离。我现在所有信号都用 0.3mm。

所有设计规则设好后,输入“autorouter”或点击它的图标,就会开始连接各个元件。

一个重要的设置是点击名为“bottom”的框,如果你不想要双面板就选择 N/A。然后按下去就会开始处理。

然后选择其中一个选项,点击“evaluate”或“end job”返回电路板布局。
我用黄色圈出了电路板的底层,它是蓝色的。我不想要这个,所以下一步会重做电路板。

这里可以看到“ratsnest”命令的效果。这个命令会用接地层填满所有没有被过孔占用的空间。

因为我希望自动布线器重新做一遍,所以我输入了“ripup”并全选,这样所有布线都被撤销。

然后重新做自动布线。

这里布线完成了,但还没应用“ratsnest”。

这里已经应用了“ratsnest”。

这一步我挪动元件,把电路板缩小了一点。这是用“move”命令完成的。如果你想移动多个元件,先选中它们并输入“group”,然后输入“move”,再用右键点击它们来移动整组。

下面可以看到一块有“ratsnest”和一块没有“ratsnest”的板。
第一块板应用了“ratsnest”,看起来会乱一些。一个优点是散热:更大的铜面积有助于电路板冷却,也能提高导电性,尤其是在双面板上,一面可以是地,另一面是 VCC,几乎整个表面都能用于传输电能。第二块板看起来更干净。

现在我喜欢做没有“ratsnest”的板,因为手工焊接可能不精确,短路很容易发生,而“ratsnest”会增加这种风险。
在“milling”层画出的粗浅蓝色轮廓会被 pcb-gcode ULP 用来生成 G-code 铣削轮廓。软件用它来创建边界,这个切割可以用来把电路板从覆铜板上分离下来。多边形的厚度决定铣刀尺寸。

电路板物料清单(BOM)
| 数量 | 位置 | Digikey 或 Mouser 编号 | 制造商编号 | 说明 |
|---|---|---|---|---|
| 1 | U1 | ATTINY45V-10SU-ND | ATTINY45V-10SUR | 8 位 MCU 集成电路,4KB Flash,8SOIC 封装 |
| 2 | R1 | 311-10.0KFRCT-ND | RC1206FR-0710KL | 贴片电阻 10K 欧姆 1% 1/4W 1206 |
| 1 | R2 | 311-100FRCT-ND | RC1206FR-07100RL | 贴片电阻 100 欧姆 1% 1/4W 1206 |
| 1 | D3 | 160-1169-1-ND | LTST-C150GKT | 绿色透明贴片 LED 1206 |
| 1 | C1 | 445-1423-1-ND | C3216X7R1H105K160AB | 陶瓷电容 1UF 50V X7R 1206 |
| 1 | FTDI | 6 针排针 | ||
| 2 | 1X4P 排针 |
前一段时间,我开始使用一个叫 PCB-Gcode 的 User Language Program(ULP)。它是一个很棒的程序,有很多设置,我一部分通过阅读文档、一部分通过反复尝试才弄明白。
下面展示我如何设置它,以便顺利生成 G-code。

我自定义的设置是:

在 Machine 选项卡中选择切深、单位、进给速度和刀具直径等设置。

G-code style 选项卡用来选择后处理器。我用的是 Mach3。

这是 ULP 生成的 G-code 可视化。可以用方向键在图像中移动,也可以用加号和减号。

会生成四个文件:

下面是热敏电阻板隔离路径的可视化。

Autoleveller 是一款很棒的软件。它先探测空白 PCB,然后用生成的文件调整 G-code 的切割深度,确保铣床能跟随空白 PCB 的起伏。我通过运行可执行文件启动 Autoleveller;在 Linux 上不需要安装。接着点击 File,再点击 Original GCode File(OGF):这样就可以在程序里加载原始 G-code。

点击原始 G-code。

点击 yes,让设置基于已加载的文件。

接着点击窗口右下角的 Generate PFG。这会生成一个包含一系列指令的 G-code。它会:-先探测 Z 0;-再探测电路板区域内的多个点;-然后询问保存原始文件的位置,之后会用这个文件生成自动调平的 G-code。

这里正在保存 PFG 文件。然后把这个 G-code 加载到 CNC,并按照 G-code 区域的说明操作。

现在该把空白 PCB 固定到 CNC 工作台上了。我不再使用双面胶,因为它不如夹具有效,而且之后还得清理残留的胶带。

我在 CNC 上事先铣了一个凹槽,让电路板有固定位置,这有助于固定空白板。

在 CNC 上加载 PFG 后,按照屏幕上的说明连接探针。

这里我把探针接到电路板表面,把鳄鱼夹接到铣刀上。

这个视频展示了探测过程。
探测完成后,保存原始文件,拿到 Autoleveller 里加载。

把探测得到的原始文件重新加载到 Autoleveller。

最后,点击屏幕右下角的 Autolevel 保存调整后的 G-code。保存文件,拿到 CNC 上开始铣削。

最终结果在这里。有时我会用 1000 目砂纸让它表面更好。

现在我来展示电路板边缘的切割。
avrdude -Cavrdude.conf -v -pattiny45 -cusbasp -Pusb -e -Uefuse:w:0xff:m -Uhfuse:w:0xdf:m -Ulfuse:w:0xe2:m
串口监视器:YouTube 视频
ATtiny 风扇控制器项目:Robot Room
用 Arduino 和 NTC 热敏电阻读取温度:Circuit Digest
配置 Arduino 022:High-Low Tech
回流焊炉项目:Pleasant Software
上拉电阻(RES SMD 10K OHM 1% 1/4W 1206),从 RST 到 VCC
去耦电容(CAP CER 1UF 50V X7R 1206),从 VCC 到 GND,用于降低噪声