电子生产


小组作业

个人作业

学习成果:

你是否:


小组作业

前往 小组作业页面

个人作业


本周我要做一个 ISP (在线编程),也就是在线编程器。

我选择了 Brian 的 ISP。选它是因为简单又便宜,元件已经精简到最低限度。

Brian 的 ISP 图片 1 图片来自 Brian 的 ISP 页面

Brian 的 ISP 图片 2 图片来自 Brian 的 ISP 页面

整个过程分成几个阶段:铣削、贴装元件、调试、编程:

铣削

这个阶段我会用到:

Fab Modules

- 我先从 Brian 的教程里下载了电路的 Traces(1000 dpi)和 Outline Cutout(1000 dpi)。

Brian 的 ISP 走线(1000 dpi) 图片来自 Brian 的 ISP 页面

Brian 的 ISP 外框切割(1000 dpi) 图片来自 Brian 的 ISP 页面

- 在 Fab Modules 里

我选择了 “image (.png)” 选项

Fab Modules 输入格式 我的电脑屏幕截图

我选择了图片文件

选择图片文件 我的电脑屏幕截图

图片载入后,我选择 “output format”,然后选 “G-codes (.nc)”

Fab Modules 输出格式 我的电脑屏幕截图

在 Process 里,我选择 “PCB traces (1/64)”

Fab Modules 工艺选择 我的电脑屏幕截图

计算之前,我把切割深度改成 0.05,是默认值的一半,因为我有点谨慎。

切割深度设置 我的电脑屏幕截图

然后我按了 calculate

计算刀路 我的电脑屏幕截图

计算完成后,我检查了一遍刀路,确认所有走线都被覆盖。按住鼠标左键可以移动图片,用滚轮可以放大,方便更好地检查刀路。

检查刀路 我的电脑屏幕截图

按住鼠标右键,我甚至能从另一个视角看它。

透视图里的刀路 我的电脑屏幕截图

最后,我保存了用于铣削的文件。

保存刀路文件 我的电脑屏幕截图

已保存的刀路文件 我的电脑屏幕截图

外框我照着同样的步骤做,只是把走线换成了 “PCB outline (1/32)”。

PCB 外框刀路 我的电脑屏幕截图

2- Mach3

我开始准备 CNC,先铣一个和空白 PCB 一样大的凹槽(76x50x1.5 mm)。

为空白 PCB 铣的 Mach3 凹槽 我的电脑屏幕截图

铣削凹槽

CNC 正在铣凹槽 我的 CNC 正在为空白 PCB 铣凹槽的照片

凹槽铣好了

铣好的凹槽 我的 CNC 铣完凹槽的照片

在 FR1 板上贴双面胶

空白 PCB 背面的双面胶 空白 PCB 的背面

最后的结果是这样。

铣削 ISP 完成 ISP 的外形

铣其中一个 ISP 的轮廓

铣削轮廓 我的 CNC 正在铣轮廓的照片

把 PCB 从凹槽里取出来。

把 PCB 从凹槽里取出来 PCB 正在从凹槽里取出来的照片

我用刀片和砂纸去掉铣削留下的碎屑。

清理干净的 PCB 清理干净的 PCB 照片

我把 PCB 背面的双面胶撕掉了。

带双面胶的 PCB 背面 PCB 背面的照片

3- 贴装元件

根据 Brian 的 ISP 页面上的教程,我先做了一张表格,列出元件和它们的位置。

ISP 原理图 我的电脑屏幕截图

ISP 电路板布局 图片来自 Brian 的 ISP 页面

物料清单(BOM)

元件

位置

Digikey 或 Mouser

料号

制造商料号

- ATtiny45 或 ATtiny85

U1

ATTINY45V-10SU-ND

ATTINY45V-10SUR

- 2 个 1kΩ 电阻

R1, R6

311-1.00KFRCT-ND

RC1206FR-071KL

- 2 个 499Ω 电阻

R2, R5

311-499FRCT-ND

RC1206FR-07499RL

- 2 个 49.9Ω 电阻

R3, R4

311-49.9FRCT-ND

RC1206FR-0749R9L

- 2 个 3.3V Zener 二极管

D1, D2

BZT52C3V3-FDICT-ND

BZT52C3V3-7-F

- 1 个红色 LED

D4

160-1167-1-ND

LTST-C150CKT

- 1 个绿色 LED

D3

160-1889-1-ND

LTST-C230TBKT

- 1 个 100nF/0.1uF 电容

C1

399-4674-1-ND

C1206C104KARACTU

- 1 个 2x3 排针

ISP

649-95278-101A06LF

71600-006LF

之后,我把所有元件都焊了上去。

4- 调试前检查

我先做了一次目视检查。

半成品的 ISP 我半成品 ISP 的照片

好吧,我还得再清理一下。

我用万用表找短路,尤其是 Vcc 和 GND 之间,结果什么都没发现。

整体来看板子没问题,所以我就继续编程了。


5- 编程

为了给这个自己做出来的编程器编程,我用了一个叫 USBasp。在他的网站上,Thomas Fischl 是这样描述的:

“USBasp 是用于 Atmel AVR 控制器的 USB 在线编程器。它只由一个 ATMega88 或 ATMega8 和几个无源元件组成。这个编程器使用纯固件的 USB 驱动,不需要专门的 USB 控制器。”

我的 USBasp 编程器 我那块又老又可靠的 USBasp

用法和 USBtiny 一样。

从透明塑料壳里伸出来的排针是 “slow SCK” 跳线:它把编程时钟降低,这样 USBasp 才能和运行在慢时钟(大约低于 1.5 MHz)的芯片通信。我这块 USBasp 不会自动检测速度,所以要改变速度模式,直接插上跳线就行。比如给还在出厂 1 MHz 时钟下运行的 ATtiny44 或 45 编程时,这就很有必要;而像 AT90USB1286 这种更快的芯片,可以用正常速度编程。这些编程器上的新固件通常能自动检测芯片速度,就像今天在 AliExpress 上卖不到 2 美元的那些一样。

那么回到软件,在 Windows 10 的 Ubuntu(Windows Subsystem for Linux)下,我先用这条命令安装编程环境 sudo apt-get install avrdude gcc-avr avr-libc make

安装 avrdude、gcc-avr、avr-libc 和 make 我的电脑屏幕截图

用上面这条命令,程序就下载好了。

软件包已下载 我的电脑屏幕截图

然后我把固件源码下载到一个目录里。接着,我运行了命令 make

运行 make 我的电脑屏幕截图

我用 Sublime Text,编辑了 Makefile,把 “PROGRAMMER ?= usbtiny” 这一项换成 “PROGRAMMER ?= usbasp”。

就像前面解释的,因为我做的是 USBtiny,除了 USBasp 我没有别的编程器,所以我把代码换成了和我的设备兼容的那个。

编辑 Makefile 我的电脑屏幕截图

然后我运行了

make flash

make flash 报错 我的电脑屏幕截图

但是没有成功。于是我运行了 lsusb 来获取可用的 USB 设备列表。

结果我得到一条消息 "unable to initialize libusb: -99"

lsusb 的 libusb 错误 我的电脑屏幕截图

在 Stack Overflow 上快速搜了一下,我发现 Windows 10 的 Ubuntu 子系统还不支持 USB!哎!

注意:我还没确认过,但据说 2020 年 Windows Subsystem for Linux 已经支持 USB 了,只是我做这些练习的时候还不支持。

Stack Overflow 上关于 WSL 里 USB 的问答 我的电脑屏幕截图,来自 Stack Overflow

然后我放弃了 Windows 10 上的 Ubuntu Bash,在 VMware Player 里跑了一个 Ubuntu 副本。在 Ubuntu 里,我运行了:

sudo apt install avrdude gcc-avr avr-libc make

在 VMware 里的 Ubuntu 上安装工具链 我的电脑屏幕截图

这一次,运行 lsusb 之后,我能看到设备已经在了。

我运行了

make

来编译固件。

编译固件 我的电脑屏幕截图

然后我运行了

make flash

但又收到了错误消息。

我意识到 Brian 的 ISP 必须装上跳线才能给 ATtiny45 编程,没错,我忘了焊跳线。

需要焊接的跳线 编程的时候编程器要焊上跳线,编完之后再把它拿掉。

于是我把我之前装的热缩管拆了。

拆掉热缩管的半成品 ISP 我半成品 ISP 的照片

所以我焊上了!

然后它就能用了!

make flash 成功 我的电脑屏幕截图

接着,我运行了

make fuses

烧录 fuses 我的电脑屏幕截图

固件上传、fuses 烧好之后,我的新 ISP 还是认不出来。

所以又回到调试……

我最后把每个电阻的值都量了一遍,还把 ATtiny 换成了新的。用万用表一测,发现 R1 那个 1K 电阻坏了。我换掉它,哇!板子被检测到了!!!对了,我还决定装一个从旧线缆上剪下来的 USB 接口,洗了一下之后,就是现在这个样子。

没盖子的迷你 ISP 我没盖子的迷你 ISP 照片

盖上盖子、正在编程的迷你 ISP 我盖上盖子、正在编程的迷你 ISP 照片

最后的命令 make rstdisbl

make rstdisbl 我的电脑屏幕截图

成功了!现在我把跳线拿掉!

lsusb 检测到 USBtiny 我的电脑屏幕截图

它真的能用!Linux 命令 lsusb 检测到 USBtiny 就证明了这一点,如上图所示,下面再放大看:

放大看 USBtiny 的检测结果 我的电脑屏幕截图

6- 最终测试

我不怕换平台,又决定测一下 Windows。下面这张截图是我怎么给我的 USBasp 装驱动。我用了这个很有用的软件,它让 Windows 10 上装驱动没那么痛苦。

在 Windows 上装驱动,我用这个工具 “Zadig_2.2.exe”。

驱动安装界面 我的电脑屏幕截图

下面是我最近的一张截图,证明 USBtiny 在 Windows 下能被检测到。因为这个练习是几年前做的,我没有留下 Windows 上装驱动的步骤,但我在 Linux 上展示过它能被检测到,现在在 Windows 上也一样。

Windows 设备管理器里的 USBtiny 我电脑屏幕的近期截图

装好驱动之后,我在 Windows 下试着烧录我 3D 打印机主板的固件。刚说的固件,是我几年前用开源方案做的 Printrboard 的固件。

在下面这段糟糕的视频里,你能看到它用这条命令跑起来:avrdude -c usbtiny -p at90usb1286 -U flash:w:BootloaderHID.hex:i -U lfuse:w:0xDE:m -U hfuse:w:0xdb:m -U efuse:w:0xF0:m

为了消除“做出来的 USBtiny 到底能不能烧录”的疑惑,我们来拆解一下上面的命令:

  1. 第一部分 avrdude 是程序名。
  2. 然后 -c usbtiny 定义编程器的名字;“usbtiny” 就是我做出来的编程器的名字。
  3. 接着 -p at90usb1286 是要编程的目标芯片,这里是装在我 Printrboard 上的 AT90USB1286。
  4. -U flash:w:BootloaderHID.hex:i 定义了要加载的固件的名字/位置,这里是 “BootloaderHID.hex”。
  5. -U lfuse:w:0xDE:m -U hfuse:w:0xdb:m -U efuse:w:0xF0:m 是命令里烧录 fuses 的部分。

上面这些都在下面这段糟糕的视频里展示 ;-)。

一切正常!

← (2月19日) 计算机控制切割 · 所有周 · 3D扫描与打印 (3月4日) →