Digispark ATtiny85 入门:安装开发板包与驱动、“提示时再插上”的上传方式、闪灯和 USB 宏按键

Cartoon of a tiny black Digispark ATtiny85 board with a gold PCB-edge USB plug and a loose black header strip, approaching a laptop USB port

要让 Digispark ATtiny85 跑起来:从 ArminJo 的 GitHub 开发板网址安装 Digistump AVR Boards(旧的 digistump.com 链接已经失效),选择 Digispark 并把时钟设为 16.5 MHz,先在板子没插上的情况下点 Upload,等 IDE 提示时才插上。整个过程都不会出现 COM 口,这是正常的。你放弃了引脚和内存——只有 6 个 I/O 引脚、约 6KB 闪存——换来一样 Arduino Nano 做不到的本事:当一个真正的 USB 键盘。

我们的 Digispark ATtiny85 开发板只有拇指指甲大小,USB 插头直接用 PCB 板边做成。本文先装好环境、让 LED 闪起来,再做这块板子天生就适合的作品:给电脑用的单键宏按键。开始前先留一点时间焊接——附带的公排针是散装的,还没焊上。

Digispark 能做什么 Arduino Nano 做不到的事?

和 Arduino Nano V3 相比,Digispark 在引脚、内存和调试方便程度上都输,赢的是体积,外加一项真本事。这项本事来自两块板子跟 USB 打交道的方式:Nano 上的 CH340 芯片是功能固定的 USB 转串口桥,电脑永远只看到一个串口。ATtiny85 本身完全没有 USB 硬件——Digispark 是在其中两个引脚上用软件逐位模拟(bit-bang)USB 协议,也就是 V-USB 技术,所以要向电脑自称什么设备,由芯片自己决定。让它自称键盘,它就能在任何电脑上打字,电脑那边什么都不用装。

Digispark ATtiny85 Arduino Nano V3
I/O 引脚 6 个(放心用的只有 3 个——见下文引脚分配) 14 个数字 + 8 个模拟
程序可用闪存 约 6KB 32KB 中约 30KB
SRAM 512 字节 2KB
串口监视器 USB 插头不提供 有,经由 CH340
当 USB 键盘 可以(软件 USB) 不行(固定的串口桥)
上传方式 提示时再插上,没有 COM 口 正常的 COM 口上传
板子尺寸 约 25 × 19mm 约 45 × 18mm

Arduino IDE 怎样安装 Digispark 开发板包?

旧的 Digispark 教程第一步就会卡住:它们让 IDE 去 digistump.com 找开发板包网址,而这个域名已经失效了。这个包以 ArminJo 的 DigistumpArduino 分支延续下来:它的 README 从 2023 年起就标明不再维护,但在新版 Arduino IDE(2.x)上照样能用,还附带更新过的上传工具和 Windows 驱动。

打开 File → Preferences → Additional boards manager URLs,粘贴:

https://raw.githubusercontent.com/ArminJo/DigistumpArduino/master/package_digistump_index.json

在 Tools → Board → Boards Manager 里搜索 Digistump,安装 Digistump AVR Boards(1.7.5 版可以顺利安装)。选择 Tools → Board → Digistump AVR Boards → Digispark,再把 Tools → Clock 从默认的 16 MHz – No USB 改成 16.5 MHz – For V-USB。低速 USB 每秒传送 150 万个位,16.5 MHz 正好让每个位对应 11 个时钟周期——V-USB 那段逐个周期手工算好的代码,就是建立在这个时序上的。时钟选 No USB 也照样能上传,因为 bootloader 总是以它自己的 16.5 MHz 运行;但这样编译出来的键盘程序虽然编译毫无报错,却永远不会以键盘的身份出现。

Windows 需要装一次驱动,因为 bootloader 向电脑报的是厂商自定义的 USB 设备,而不是 Windows 本来就会驱动的键盘或串口这类标准设备。驱动就在开发板包里:到 %LOCALAPPDATA%\Arduino15\packages\digistump\tools\micronucleus\2.6\ 下的 Digistump_Drivers 文件夹(把这个路径粘贴到文件资源管理器的地址栏),运行 post_install.bat(它会启动附带的 DPinst64.exe 驱动安装程序,32 位 Windows 则是 DPinst.exe)。macOS 什么都不用装;Linux 则要加上 micronucleus 的 udev 规则,上传时才不用 sudo。

为什么没有 COM 口?

Digispark 所有奇怪的地方,都源自一个事实:只有芯片上的代码正在用软件模拟 USB 时,USB 才存在;而在上电那一刻——也就是每次上传发生的时候——跑的那段代码是 bootloader。这个 bootloader 叫 micronucleus,上电后只运行大约头五到六秒,期间把板子报成一个小小的 USB 设备——不是串口——然后把芯片交给你的程序。除非你的程序自己带 USB 库,否则之后就再也没有代码回应电脑;可板上 1–1.5kΩ 的上拉电阻仍在向电脑宣告“这里有设备”,所以 Windows 可能会弹出 USB device not recognized(无法识别的 USB 设备)——跑闪灯程序时这是意料之中的,完全无害。

上传工具就是围绕这段时间窗设计的,所以顺序是反过来的:先不插板子,点 Upload;IDE 编译完后会显示 “Please plug in the device (will time out in 60 seconds) …”(请插入设备,60 秒后超时);这时才插上;bootloader 接收程序、写进闪存,然后跳过去运行。

卡通图:一块黑色 Digispark 板正移向笔记本电脑的 USB 口,笔记本屏幕上显示一条进度条,两者之间浮着一个秒表
反过来的上传顺序:IDE 先编译并开始倒数,等提示出现才插上板子——bootloader 在上电后的头几秒里接住这次上传。

有三件事,第一次遇到时看起来都像故障。Tools → Port 一直是灰色的——根本没有端口可选,以后也永远不会有。USB 插头也给不了普通的串口监视器:ATtiny85 没有硬件 UART,插头只承载当前运行的代码所模拟的那个 USB 设备,而开发板包附带的 USB 虚拟串口库(DigiCDC)自己就警告,在 XP 之后的 Windows 和较新的 Linux 内核上很可能用不了。还有,每次上电,你的程序都会晚大约五秒才开始,因为 bootloader 总是先占用它那段时间窗。

怎样让板载 LED 闪起来?

Digispark 的第一个测试不需要任何零件。板上两颗小 LED 中,一颗是常亮的电源灯;另一颗在 rev3 “model A” 款(就是这一款)上接在 P1——开发板包本身就把 LED_BUILTIN 定义为 P1。其他来源的仿制板还有第二种版本,LED 接在 P0,所以程序把引脚号放在一个常量里;如果只有电源灯亮,第一个标准检查就是把它改成 0。

// Digispark 第一个闪灯程序 - 板载 LED 在 P1(rev3 "model A" 款)。
// 如果没有闪,把 LED_PIN 改成 0:少数仿制板把 LED 接到 P0。
const uint8_t LED_PIN = 1;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(500);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}

先不插板子点 Upload,提示时插上,上传一结束 LED 就开始闪,因为新程序会立刻启动。在 16.5 MHz 下它编译出来只有 582 字节,不到可用空间的十分之一。

六个引脚里真正能用的是哪几个?

Digispark 有“六个 I/O 引脚”没错,但其中三个都有本职工作。P3 和 P4 是 USB 数据线,接在上面的东西会和 USB 通信打架——即使 USB 闲着,1–1.5kΩ 的上拉电阻也会把 P3 往 5V 拉,而起保护作用的齐纳二极管会把两条线都钳在 USB 3.3V 信号电平附近。P5 在大多数板子上被熔丝设成复位脚:一拉低,芯片就重启。剩下的 P0、P1 和 P2,才是放心用的主力:

引脚 好用程度 说明
P0 随便用 PWM;以后加传感器时可做 I2C SDA
P1 随便用 PWM;接着板载 LED,最适合做输出
P2 随便用 模拟输入(ADC1);I2C SCL
P3 避免使用 USB D−,板上带 1–1.5kΩ 上拉电阻
P4 避免使用 USB D+;只有完全不用 USB 的项目才能当模拟 ADC2
P5 当作不可用 大多数板子上是复位脚

想外接一颗 LED:用一颗 5mm 红色 LED,长脚朝 P0,经过电阻包里的一颗 330Ω 电阻接到 GND,闪灯程序的引脚改成 0。LED 压降约 2V,所以 3V ÷ 330Ω ≈ 9mA,够亮,也远在引脚的电流上限之内;这种蓝色五环电阻的 330Ω 色环是橙-橙-黑-黑-棕。电源来自 USB 口的 5V;离开电脑使用时,从 VIN 输入 7–12V,由那颗银色、带散热片的 78M05 稳压器产生 5V——如果两边同时接上,板上 USB 供电线路里的一颗二极管会挡住稳压器的 5V,不让它倒灌进你的电脑。

怎样做单键宏按键?

现在来做 Nano 模仿不了的作品:一个会打字的按键。按一下,就把你每天都要重打一遍的一句话——客服回复、邮件落款、会议链接——打进你自己电脑上当前激活的窗口,因为电脑看到的只是一个普通键盘。

先到焊台:把散装排针掰成一段六针和一段三针,分别焊进 P5–P0 那一列和 5V/GND/VIN 那一排(工具是烙铁和焊锡丝,技巧见我们的排针焊接教程)。先把还没焊的板子插进 USB 口试一下,记住哪一面朝上,然后让排针从那一面朝上焊:笔记本 USB 口下方只剩大约一厘米空间,排针朝下再加上杜邦线的胶壳,根本放不下。每焊完一个点,就把烫手的烙铁放回烙铁架。

分解图风格的卡通:几条散装的黑色排针浮在一块黑色 Digispark 板的金色焊盘旁边,旁边有一支黑色烙铁和一卷白色焊锡丝
只需焊一次:散装排针掰成六针和三针两段,焊进板子的金色焊盘;板子插在 USB 口上时,排针朝上。

Digispark 在布局上有个特别之处:它运行时从不放在面包板上,因为整块板子就住在 USB 口里。只有按键放在 170 孔迷你面包板上,中间靠两条公对母杜邦线连接——母头套在板子新焊好的排针上,公头插进面包板。把 6×6mm 轻触按键跨插在面包板中间的凹槽上,接对角的两只脚:四只脚在开关内部两两相连,而对角的两只脚一定分属不同的两对,所以只有按下时才会接通(两对脚的更多说明见我们的按键开关教程):

从 到 杜邦线
按键的一只脚(一个角) Digispark P2 公对母杜邦线,母头套在 P2 的排针上
按键对角的那只脚 Digispark GND 公对母杜邦线,母头套在 GND 排针上

不需要电阻:程序会打开 ATtiny85 的内部上拉电阻——芯片内建、阻值几十 kΩ 的电阻,把 P2 保持在 5V——所以引脚平时读到 HIGH,直到按键把它短接到 GND。键盘这一边用的是 DigiKeyboard 库,开发板包里已经自带:

// Digispark 单键宏按键:按一下,就把预存的一句话打进当前窗口。
// 按键接在 P2 和 GND 之间。P2 用芯片的内部上拉,所以不用电阻。
#include "DigiKeyboard.h"

const uint8_t BUTTON_PIN = 2;      // P2 - 避开 USB 引脚 P3/P4
bool wasPressed = false;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // 平时读 HIGH,按下读 LOW
}

void loop() {
  bool isPressed = (digitalRead(BUTTON_PIN) == LOW);
  if (isPressed && !wasPressed) {        // 每按一次只触发一次,不是每轮 loop 都触发
    DigiKeyboard.sendKeyStroke(0);       // 空白报告:有些旧电脑会漏掉第一个字符
    // 只能打出键盘上有的英文字母、数字和符号,打不出中文
    DigiKeyboard.print(F("Thank you for your order. We will share the tracking number shortly."));
  }
  wasPressed = isPressed;
  DigiKeyboard.delay(20);  // 既是消抖,也让程序继续回应电脑的 USB 轮询
}

关键机制就在三行代码里。边沿检测(isPressed && !wasPressed)让每按一次只触发一次,而不是每跑一轮 loop 就触发一次——否则按住不放时,这句话会一直重复打下去,直到你松手。sendKeyStroke(0) 先送出一个不含任何按键的空白报告;库自带的示例提到,有些旧电脑在闲置一段时间后会漏掉第一个字符。最后,loop 结尾用的是 DigiKeyboard.delay(20) 而不是普通的 delay(),因为 V-USB 必须在大约 50ms 内处理电脑发来的每个请求,否则电脑就会放弃这个键盘——库里的 delay 在等待期间会继续回应,这 20ms 同时也起到消抖作用。整个程序在 16.5 MHz 下编译出来是 2,860 字节,占可用空间的 43%。

关于字符集,有一点要说明:USB 键盘送出的是按键位置,不是字母,每个位置打出什么字,由电脑的键盘布局设置决定。DigiKeyboard 库默认假设是美式(US)布局,所以设成其他布局的电脑会打出错误的符号。马来西亚的电脑大多用 US 布局;如果你的不是,在 include 那一行上方加上对应的 #define LAYOUT_...——库里自带二十几种布局。

反过来说:这个按键之所以管用,是因为电脑完全信任键盘,所以任何被识别成键盘的设备,都能以你的完整用户权限打字。这正是为什么要给自己做的小装置贴上标签,也绝不要把来历不明的 USB 设备插进自己的电脑——这不是一种可以拿去对付别人电脑的技巧。

卡通图:一块黑色 Digispark 板插在笔记本电脑的 USB 口上,用两条杜邦线连到一块白色迷你面包板上的黑色轻触按键,笔记本上方飘起几个空白键帽
做好的宏按键:Digispark 就住在 USB 口里,只有两条杜邦线引出来——按键一按,电脑就打字。

我们常见的错误

点 Upload 时板子已经插着。Digispark 的 bootloader 只在上电后的头几秒里自报身份,所以一块早就插在 USB 口上的板子对电脑来说是隐形的,IDE 只会一路倒数到超时。拔掉,点 Upload,提示时再插上——用机箱前面板的 USB 口或 USB 延长线,这套动作就轻松多了。

时钟保留默认值。闪灯程序在 16 MHz – No USB 下也能跑,但宏按键就永远不会以键盘身份出现。改选 16.5 MHz,重新上传。

按提示插上了,还是超时。在 Windows 上,先确认附带的驱动已经装好。然后换一个 USB 口试试:V-USB 用软件产生的信号贴着 USB 时序要求的边缘,有些 USB 3 口不认它,换成 USB 2.0 口或经过 USB 集线器反而能用。

把项目接在 P3、P4 或 P5 上。症状让人摸不着头脑——上传失败、键盘消失、输入一变化芯片就重启——因为这几个引脚是 USB 数据线和复位脚。按键和传感器都接在 P0–P2。

常见问题

为什么 Arduino IDE 的端口列表里找不到我的 Digispark?

因为它不是串口设备。插上后大约五秒内,bootloader 用软件模拟 USB,把自己报成一个小小的非串口设备——上传工具等的就是这段时间窗。没有 COM 口、Port 菜单是灰色的,都很正常。

Digispark 能取代 Arduino Nano 吗?

做一件小事的话,可以——一个按键、一种 LED 效果、一个传感器、一个 USB 键盘小装置。要靠串口打印调试、需要三个以上放心用的引脚,或要用比较大的库,就该用 Nano V3;要做 Wi-Fi 项目,则从我们的 ESP32-C3 Super Mini 入门教程开始。

没有串口监视器,怎么调试?

粗略的状态,用 P1 LED 的闪烁模式来表示;另外还有这块板子独有的办法——先打开一个文本编辑器并让它处于焦点,再用 DigiKeyboard.print() 把变量打出来,让板子自己打出调试记录。需要持续串口输出的逻辑,先在 Nano 上开发好再移植过来,会容易得多。

Digispark 的程序实际能用多少闪存?

ATtiny85 的 8,192 字节闪存要和 bootloader 共用,所以程序能用的是 micronucleus 剩下的部分:用当前开发板包的 bootloader 是 6,650 字节,仍带着旧版出厂 bootloader 的板子约 6,012 字节——这就是为什么偶尔会出现 IDE 接受了的程序,上传时却被报“太大”的情况。

宏按键需要在电脑上安装软件吗?

不需要——这正是 USB HID 的意义。每个桌面操作系统都自带通用键盘支持,所以 Digispark 一完成枚举,电脑就把它当作标准键盘接受;前面的驱动步骤只是为了在你自己的 Windows 开发电脑上上传程序。插上后大约五秒,bootloader 交出控制权,按键就开始工作。

最后更新:2026年11月。有问题?WhatsApp 联系我们。

Leave a Reply

Your email address will not be published. Required fields are marked *