像我们这款 12V 柜门电磁锁(solenoid lock)是断电上锁(fail-secure)型:不通电时,弹簧把锁舌顶出来,门就是锁着的;要给线圈通上几秒 12V,锁舌才会被吸回去。它需要独立的 12V 电源,用继电器模块或 MOSFET 来开关,绝不能直接接 Arduino 引脚,线圈两端还要并一颗续流二极管。
这种锁在店里也叫电控锁(electric latch lock)、柜门锁或电磁锁扣(solenoid latch),马来文叫 kunci solenoid。谁能开门,可以交给 AS608 指纹模块、RFID 卡或键盘密码来决定,但真正会动的是这把锁,所以本文只讲锁这一半:断电时它是什么状态、怎么供电和开关,以及怎样安装才能每次都顺利开锁。
12V 电磁锁的「断电上锁」到底是什么意思?
12V 电磁锁里面,其实是一根弹簧和一个电磁铁在争夺同一根钢锁舌。什么都不接时,壳内的弹簧把锁舌推出去,这就是上锁状态,我们产品照片里那把没接电的锁就是这个样子。电流流过铜线圈会产生磁场,而没有固定住的钢件总会被吸向磁场最强的地方,于是铁芯被拉进线圈中心,压缩弹簧,把锁舌收回去。一断电,磁场消失,弹簧又占了上风。
所以停电时柜子是锁上的,而不是打开的,这和很多人的直觉正好相反。「Solenoid」指的只是那个线圈;锁的行为取决于弹簧往哪个方向推。断电开锁(fail-safe)型电磁锁只是弹簧反过来装,必须靠通电才能把锁舌顶在外面。这两个名字说的是断电时保护的是什么:fail-secure 保护柜里的东西,fail-safe 保护人,因为门打得开。锁舌上 45 度的斜面让你不通电也能关门:锁扣的边缘顺着斜面滑上去,把锁舌压回弹簧里,到位后弹簧再把锁舌弹进锁扣。

做一个 12V 电磁锁项目需要哪些零件?
零件清单:用 Uno 通过继电器控制 12V 电磁锁
Parts list
想要没有咔哒声的方案,就用 MOSFET 代替继电器(它的排针是公头,所以要用公对母杜邦线);万用表用来检查适配器的极性,并测量锁的线圈电阻。走 MOSFET 方案还需要一颗 1N4007 一类的整流二极管并在锁的两端,需另外准备。
12V 电磁锁出厂已接好一对红黑引线,末端是一个白色的 2pin 小插头。螺丝接线端子要接裸线,所以把插头剪掉,每根线剥出约 5 mm。5V 一路继电器模块两边都是螺丝接线端子,控制端也一样,所以和 Uno 之间用公对公杜邦线:一头插进 Uno 的排母,另一头的针脚夹进接线端子。
12V 2A 适配器的输出是 5.5×2.1 mm 圆头插头,母头 DC 插座转接线把它转成红黑两根线。如果它显示缺货,任何带引线或螺丝端子的 5.5×2.1 mm 母头 DC 插座都能代替,或者用一台调到 12V 的实验室电源。
有两样东西不在零件清单里。一是 1N4007 一类的整流二极管(1N4001 到 1N4007 都可以),并在锁的线圈两端:用 MOSFET 时必须装,用继电器时也值得装,续流二极管那一节会解释原因。二是让锁舌落进去的锁扣,因为锁是单独出货的;安装那一节会讲到。
为什么电磁锁不能用 Arduino 的 5V 引脚或充电宝供电?
电磁锁就是一圈铜线,所以它的电流由欧姆定律决定:I = V ÷ R。我们这把锁是标准柜门锁的尺寸,线圈约 15–20 Ω,所以在 12V 下电流约为 12 ÷ 20 = 0.6 A 到 12 ÷ 15 = 0.8 A;同款设计的锁标称 12V 时 650 mA。你自己十秒钟就能确认:把万用表拨到电阻档,量锁两根线之间的读数,再用 12 除以它。
| 电源 | 能提供多少 | 锁需要多少 |
|---|---|---|
| Uno 输出引脚 | 5V 下约 20 mA | 12V 下 0.6–0.8 A:是它的 30–40 倍 |
| Uno 5V 引脚(USB 供电) | 和板子一起分 USB 口的 500 mA × 5V = 2.5 W | 7–10 W |
| 充电宝直接接 | 5V | 12V;在 5V 下只有约 17% 的吸力 |
| 12V 2A 适配器 | 12V 下最高 2 A | 覆盖最坏情况,还有 2.5 倍余量 |
功率等于电压乘电流:12V × 0.6–0.8 A 约为 7–10 W。用笔记本电脑供电时,Uno 的 5V 引脚上,板子和这个引脚上的所有东西共用一个标准 USB 2.0 口的 500 mA,也就是 2.5 W,所以就算在那里接一个完美的 5V 升 12V 升压模块,也带不动这把锁。充电宝的瓦数够(2.1 A 的口约 10 W),但只有 5V,而 12V 线圈接 5V 会以另一种方式失败:电流降到正常值的 5/12,而电磁铁的吸力大致与电流的平方成正比,所以 (5/12)² ≈ 0.17,只剩约六分之一。这点力气拉不动顶着弹簧的锁舌。充电宝只有通过 12V USB-PD 诱骗模块或升压模块才能用,而且很多充电宝会在两次开锁之间自动断电,因为待机负载太小,不足以让它保持唤醒。
电磁锁怎么通过继电器接到 Arduino?
5V 继电器模块让 Uno 去拨动一个它在电气上从不接触的开关:Uno 驱动模块的控制端子,继电器的触点再接通通往锁的 12V 回路。
| 从 | 到 | 说明 |
|---|---|---|
Uno 5V |
继电器 DC+ |
给继电器自身的线圈和光耦供电 |
Uno GND |
继电器 DC- |
|
Uno D7 |
继电器 IN |
触发跳线帽设在 H:HIGH = 开锁 |
| 插座红线(+12V) | 继电器 COM |
先用万用表确认极性 |
继电器 NO |
锁红线 | 平时断开,所以锁不通电 |
| 锁黑线 | 插座黑线(−) | 锁两端并二极管:色环朝红线 |
| Uno USB-B | 笔记本电脑或 5V USB 充电器 | 绝不接 12V 适配器 |
接锁之前,先用万用表确认插座的红线读数约为 +12V。锁本身不在乎电流往哪个方向流,因为无论磁场朝哪个方向,钢铁芯都会被吸引,但并在它两端的二极管就在乎了。
锁的黑线和插座的黑线直接相连,中间没有经过任何继电器端子,所以要把它们接进一个小螺丝接线座或按压式快速接线器,不要只是把裸线拧在一起,拧接的线在柜子里久了可能会松脱。然后二极管跨接在锁的两端:带色环的那只脚和锁的红线一起夹进继电器的 NO 端子,没色环的那只脚接到黑线的那个接头上。
继电器的触点是一个由继电器自身线圈带动的金属开关,和控制端之间没有任何电气连接。走继电器路线时,12V 回路和 Uno 之间没有一根共用的线。把触发跳线帽设在 H,让 HIGH 表示开锁,与程序一致;Uno 复位期间,它的引脚处于悬空状态,不会向光耦送电流,所以继电器保持断开,锁保持上锁。
改用 IRF520 MOSFET 怎么开关电磁锁?
IRF520 MOSFET 模块开关电磁锁时完全没有声音,不会咔哒响。它的栅极被拉到 HIGH 时,会把锁的负极线接到地。
| 模块端子 | 接到 | 说明 |
|---|---|---|
SIG |
Uno D7 |
HIGH = 开锁 |
VCC |
Uno 5V |
这块板上没有接通(LED 由 SIG 点亮),可接可不接 |
GND(排针) |
Uno GND |
必须共地 |
VIN / GND |
插座红线 / 黑线 | 12V 电源 |
V+ / V- |
锁红线 / 黑线 | 两端并 1N4007 一类二极管,色环朝 V+ |
用 MOSFET 时,共地是必须的。MOSFET 是否导通,取决于栅极和源极之间的电压,而在这块模块上,源极就是 12V 电源的负极。Uno 的 5V HIGH 是相对 Uno 的 GND 高出 5V;除非这个 GND 接到了模块的 GND,否则栅源电压是不确定的,开关就会时好时坏。
IRF520 是标准栅极器件,要到 10V 才能完全导通。在 Uno 的 5V 栅压下它只是部分导通,但对这个负载来说没问题:就算导通电阻有半欧姆,在最坏的 0.8 A 下也只浪费 0.8² × 0.5 ≈ 0.3 W,而且只持续两秒。换成 3.3V 的板子,它几乎不导通;我们的 IRF520 教程解释了这个栅极陷阱。
为什么电磁锁上的续流二极管不能省?
电磁锁的线圈在通电时把能量储存在磁场里,而电感会抗拒电流的任何变化。它两端的电压是 V = L ×(电流的变化率)。继电器触点或 MOSFET 在几微秒内断开时,电流被迫几乎瞬间降到零,于是线圈会产生不管多高的电压也要让电流继续流,轻易就是几百伏。这个尖峰会在正在断开的继电器触点之间拉弧,每次烧掉一点金属;或者超过 IRF520 的 100V 漏极额定值,让晶体管击穿,把尖峰的能量变成热量吸收在自己体内。反复冲击可能把它弄坏,而坏掉的 MOSFET 通常是短路失效:锁会一直通电、一直开着,而且过热。
线圈两端并一颗二极管,就给这股电流一条回路。断开瞬间,电流继续在线圈和二极管之间循环,几毫秒内就在线圈自身的电阻里衰减掉,所以开关承受的电压不会比 12V 加上二极管约 1V 的压降高多少。1N4007 额定 1 A、1000V,而回路电流永远不会超过原本流过线圈的电流,这里最多 0.8 A。
安装时,色环(阴极)朝锁的红色正极线。装反的话,开关一闭合它就导通,等于把 12V 电源直接短路。继电器模块上那颗二极管保护的是驱动继电器自身线圈的三极管;锁的线圈是触点另一侧的另一个电感。IRF520 模块上根本没有二极管,只有 MOSFET、一颗 LED 和两个电阻,所以在那里它是必须的;用继电器时,它保护的是触点,详见我们的继电器安全教程。

电磁锁的程序长什么样?
下面这个电磁锁程序收到指令后,通过 D7 给线圈通电两秒,然后强制休息一段时间才允许下一次通电,所以就算重复发送指令,线圈也不会一直通电。
// 12V 电磁锁:从串口监视器发指令,短暂开锁
// 两种开关都适用:继电器模块(跳线帽设在 H)或 IRF520 模块的 SIG
// D7 HIGH = 线圈通电 = 锁舌收回(开锁)
const int LOCK_PIN = 7;
const unsigned long UNLOCK_MS = 2000; // 锁舌保持收回的时间
const unsigned long COOLDOWN_MS = 10000; // 下一次通电前的休息时间:线圈通电时会发热
bool unlocked = false;
unsigned long unlockedAt = 0;
unsigned long lockedAt = 0;
bool firstPulse = true;
void setup() {
digitalWrite(LOCK_PIN, LOW); // 先设定电平,再把引脚设为输出
pinMode(LOCK_PIN, OUTPUT); // 一开始就是 LOW:线圈断电,锁舌伸出,柜子上锁
Serial.begin(9600);
Serial.println(F("Type u and press Enter to unlock"));
}
void unlockPulse() {
if (unlocked) return;
if (!firstPulse && millis() - lockedAt < COOLDOWN_MS) {
Serial.println(F("Coil cooling down, try again shortly"));
return;
}
digitalWrite(LOCK_PIN, HIGH); // 给线圈通电:锁舌收回
unlocked = true;
firstPulse = false;
unlockedAt = millis();
Serial.println(F("Unlocked"));
}
void loop() {
if (Serial.available()) {
char c = Serial.read();
if (c == 'u' || c == 'U') unlockPulse();
}
// UNLOCK_MS 之后断电:弹簧把锁舌推回去
if (unlocked && millis() - unlockedAt >= UNLOCK_MS) {
digitalWrite(LOCK_PIN, LOW);
unlocked = false;
lockedAt = millis();
Serial.println(F("Locked"));
}
}
以 9600 波特率打开串口监视器,发送 u。通电时间之所以短,是因为通电的线圈会把全部 7–10 W 变成热量,闷在一个小小的钢壳里;铜线变热后电阻上升,吸力下降,绝缘层也会老化。通两秒、停十秒,平均发热不到持续通电的五分之一。由于计时用的是 millis(),loop 不会被卡住:把串口检查换成 AS608 指纹门锁的指纹匹配、RFID RC522 门禁的刷卡,或 4×4 键盘密码锁的密码就行。
这把锁只负责放开门,不会把门推开。装一个拉手,趁锁舌收回时拉开,或者把 UNLOCK_MS 加长一两秒。用弹簧把门顶开听起来很方便,但它会把锁舌从侧面压在锁扣上,下一节会说明,这正是卡住的原因。
电磁锁要怎么安装,锁舌才不会卡住?
电磁锁的吸力不大,摩擦力就可能胜过它。要收回锁舌,线圈必须克服弹簧力,再加上锁舌受到的摩擦力,而摩擦力等于摩擦系数乘以从侧面压住锁舌的那股力。门自然垂挂时,这个侧向力几乎为零。可是门板变形、橡胶密封条往外顶,或者有人靠在门上,都会把锁舌死死压在锁扣上,线圈一直通电也拉不动它,只会越来越热。
所以要把锁装在柜子里面,让它的线永远不会被反复弯折,锁舌朝向门,斜面朝着关门的方向,好让锁扣顺着斜面滑上去。锁是单独出货的,锁扣得自己装:最常见的做法是去五金店买一个小钢制 L 形角码,用螺丝固定在门上(在 3D 打印外壳上开一个槽也行),它的边缘必须光滑,斜面才能顺利滑过。锁舌在锁扣里四周要留一两毫米的间隙。锁座上的两个腰形孔让你可以沿锁舌方向前后调整:关上门,确认锁舌完全落进锁扣,再拧紧螺丝。薄门板一拉就弯,会压住锁舌;要么把门加固,要么把锁装在靠近门角、几乎不会变形的位置。

断电上锁还是断电开锁:你的项目该用哪一种?
断电上锁的 12V 电磁锁适合柜子、抽屉、包裹箱或 FYP 展示盒,这些场合停电时就该让里面的东西继续锁好。凡是人要走过、或可能需要从里面出来的地方,它就是错误的选择。那种场合需要断电开锁的硬件,停电时会自动打开。磁力锁只有在电磁铁通电时才吸得住,断电开锁型电锁扣(electric strike)也要靠电流才能保持锁扣关闭,所以一停电两者都会松开。
如果一个断电上锁的柜子在停电时仍然必须能打开,就要事先规划:给 12V 电源加一个备用电池,或者装一个只有你够得到的机械应急开锁装置。这是一把给项目用、只起威慑作用的锁,不是安防产品。它的弱点在接线:任何能从外面碰到线圈的接线都能让它通电,所以电源、继电器或 MOSFET 以及每一根线都要放在上锁的那一侧。
我们常见的错误
用 Uno 给锁供电。接在 5V 电源轨上,12V 线圈只得到 5/12 的电流、约六分之一的吸力,锁舌几乎不动;直接接在引脚上,引脚会超载好多倍。给锁配一个独立的 12V 电源。
让锁一直开着。线圈一直通电会被烤坏。用短脉冲开锁,让弹簧去上锁。
把锁接在 NC 而不是 NO。继电器断开时 NC 是闭合的,所以只要 Uno 空闲或没插电,线圈就一直通电:柜子一直开着,线圈也被烤坏。锁要接在 NO。
二极管装反。第一次通电就会把电源短路。色环朝正极。
只在桌上测试。在桌上咔哒响得好好的锁,装好后可能会卡住。要装进柜子、关上门再测试。
常见问题
电磁锁不通电时是锁着还是开着?
锁着。弹簧把锁舌顶在外面,直到 12V 把它吸回去,所以停电时柜子是关着的。
可以改用 5V 电磁锁配 Arduino 吗?
可以,但并不更简单。做同样功的 5V 锁需要差不多的功率,所以在 5V 下电流更大,通常是 0.8–1.5 A:远远超过引脚的 20 mA,也超过 Uno 整个 USB 供电的预算。它同样需要继电器或 MOSFET,以及独立电源。这把 12V 锁接 5V,只有约六分之一的吸力。
12V 电磁锁可以通电多久?
几秒,而不是几分钟。通电的线圈会把全部功率变成热量,所以要用短脉冲开锁,中间留出休息时间。
Arduino 可以和锁共用同一个 12V 适配器吗?
不能经由这块 Uno 的 DC 插座接,它的规格最高只到 9V:稳压器会把超过 5V 的每一伏都变成热量烧掉。Uno 用 USB 供电,或者用降压模块把 12V 降到 5V。
如果停电时门必须能打开怎么办?
用断电开锁的锁,例如磁力锁或断电开锁型电锁扣。任何人要经过的门,都绝不能靠通电才能打开。
最后更新:2026年10月。有问题?WhatsApp 联系我们。



12V SOLENOID LOCK ELECTRIC LATCH FAIL-SECURE FOR CABINET DOOR DIY ROBOTICS JST CONNECTOR
Arduino Uno Compatible SMD UNO R3 with Type B Cable - ATMEGA328P with CH340G-Microcontroller Project
Relay Module 3.3V 5V 12V 1/2/4/8 Ways Optocoupler Trigger Relay Module 1 2 4 8 Channel Relay Module - 5V RELAY MODULE(1WAY)
Power Supply Adapter DC Universal AC to DC Converter PSU 5V2A 5V3A 9V2A 12V2A - P.S. ADAPTOR (12V2A)
5.5x2.1mm DC Power Male Connector Plug Jack Adapter for Arduino DIY Electronics Projects - 5.5x2.1 DC CONNECTOR (F)
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-M 20CM
IRF520 MOSFET Driver Module PWM Output Power Control for Arduino Raspberry Pi DC Motor Control
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 30CM
XL830L Digital Multimeter with backlight Portable Multimeter Electronics Project