Grove-机械键帽

Grove-机械键帽是一款带有内置 LED 的机械开关。255 全彩 RGB LED 让你可以简单直观地显示开关的状态。该键帽非常可靠,按压寿命可达 20,000,000 次。
你会发现这是一个有趣且稳定的模块,可以用来制作一些非常有趣的项目或产品。实际上,你甚至可以使用多个 Grove-机械键帽制作一把机械键盘。
在无负载条件下,以每分钟 300 次的频率连续操作 20,000,000 个循环。
特性
- 可编程 LED
- 可靠的机械结构
- 极长的工作寿命
规格
| 项目 | 数值 |
|---|---|
| 工作电压 | 3v-5v |
| 绝缘电阻 | 100MΩ 最小 |
| 接触电阻 | 200 mΩ 最大 |
| 无负载工作寿命 | 20,000,000 |
应用
- 汽车设备
- 可视化设备
- 家用电器
- 信息设备
硬件
引脚图

原理图

K1 连接到按键,当按键断开时,SIG1 会被电阻 R2 下拉,此时 SIG1 的输出应为低电平。 一旦按键被按下,K1 闭合,SIG1 将连接到 VCC,此时 SIG1 的输出变为高电平。
在本节中我们只向你展示部分原理图,完整文档请参考 Resources
支持的平台
| Arduino | Raspberry Pi | |||
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
上面提到的受支持平台仅表示该模块在软件或理论上的兼容性。在大多数情况下,我们只为 Arduino 平台提供软件库或代码示例。不可能为所有可能的 MCU 平台提供软件库或演示代码,因此用户需要自行编写软件库。
入门指南
如果这是你第一次使用 Arduino,我们强烈建议你在开始之前先阅读 Getting Started with Arduino。
使用 PlatformIO 体验
硬件
| XIAO nRF52840 Sense | Seeed Studio Grove Base for XIAO | Grove-Mech keycap |
|---|---|---|
![]() | ![]() | |
| 立即获取 | 立即获取 | 立即获取 |
- 步骤 1. 连接 Grove-机械键帽信号引脚:
S1->D1,S2->D2,连接到 Seeed Studio Grove Base for XIAO。(VCC/GND 照常连接) - 步骤 2. 将 Grove Base 插入 XIAO nRF52840 Sense。
- 步骤 3. 通过 USB 将 XIAO 连接到你的电脑。
软件
- 步骤 1. 在 PlatformIO 中安装
Adafruit_NeoPixel库。 - 步骤 2. 创建一个新的草稿/项目,并粘贴下面的代码。
- 步骤 3. 上传到 XIAO,并打开串口监视器(波特率 115200)查看状态。
功能说明
- 每按下一次 Grove-机械键帽,内置 RGB LED 会在一组颜色中循环切换。
代码
/*
Grove-Mech Keycap demo for XIAO (nRF52840 Sense)
Wiring: S1 -> D1 (button), S2 -> D2 (pixel data)
*/
#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN 1 // D1
#define PIXEL_PIN 2 // D2
#define PIXEL_COUNT 1
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
uint8_t colorPos = 0;
bool lastState = LOW;
unsigned long lastDebounce = 0;
const unsigned long debounceDelay = 50;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin();
strip.show();
Serial.begin(115200);
Serial.println("Grove-Mech Keycap: ready");
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void cycleColor() {
colorPos += 32; // step size
strip.setPixelColor(0, Wheel(colorPos));
strip.show();
Serial.print("Color pos: "); Serial.println(colorPos);
}
void loop() {
bool reading = digitalRead(BUTTON_PIN) == LOW ? true : false; // pressed = LOW for INPUT_PULLUP
if (reading != lastState) {
lastDebounce = millis();
}
if ((millis() - lastDebounce) > debounceDelay) {
// stable state
static bool pressed = false;
if (reading && !pressed) {
// button pressed (edge)
cycleColor();
pressed = true;
} else if (!reading) {
pressed = false;
}
}
lastState = reading;
}

如果你的接线或引脚映射不同,请相应地修改 BUTTON_PIN 和 PIXEL_PIN。
使用 Arduino 体验
硬件
所需材料
| Seeeduino V4.2 | Base Shield | Grove-Mech keycap |
|---|---|---|
![]() | ![]() | |
| 立即获取 | 立即获取 | 立即获取 |
-
步骤 1. 将 Grove-机械键帽连接到 Grove-Base Shield 的 D2 端口。
-
步骤 2. 将 Grove - Base Shield 插入 Seeeduino。
-
步骤 3. 通过 USB 线将 Seeeduino 连接到电脑。

如果我们没有 Grove Base Shield,也可以像下面这样将 Grove-机械键帽直接连接到 Seeeduino。
| Seeeduino | Grove-Mech keycap |
|---|---|
| 5V | Red |
| GND | Black |
| D3 | White |
| D2 | Yellow |
软件
-
步骤 1. 从 Github 下载 Adafruit_NeoPixel-master 库。
-
步骤 2. 参考 How to install library 为 Arduino 安装库。
-
步骤 3. 打开 Arduino IDE 并创建一个新文件,然后将以下代码复制到该新文件中。
/**
* This is an exmaple of the Grove - Mech Keycap.
* Every press of the key will change the color the SK6805 RGB LED. The SK6805 is a NeoPixel compatible chip.
*
* Credit:
* Adafruit_NeoPixel - https://github.com/adafruit/Adafruit_NeoPixel/blob/master/COPYING
*/
#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN 2 // Digital IO pin connected to the button. This will be
// driven with a pull-up resistor so the switch should
// pull the pin to ground momentarily. On a high -> low
// transition the button press logic will execute.
#define PIXEL_PIN 3 // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 60
// Parameter 1 = number of pixels in strip, neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_RGB Pixels are wired for RGB bitstream
// NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick
// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels)
// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
bool oldState = LOW;
uint8_t color_pos = 0;
int i=0;
int longpress=2000;
long timecheck;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin();
strip.clear();
strip.show(); // Initialize all pixels to 'off'
Serial.begin(9600);
}
void loop()
{
// Get current button state.
bool newState = digitalRead(BUTTON_PIN);
// Check if state changed from low to high (button press).
if (newState == HIGH && oldState == LOW) {
timecheck = millis();
// Short delay to debounce button.
delay(20);
// Check if button is still low after debounce.
newState = digitalRead(BUTTON_PIN);
if (newState == HIGH){
color_pos+=8;
strip.setPixelColor(0, Wheel(color_pos));
strip.show();
}
}
if( millis()-timecheck > 300)
{
if (digitalRead(BUTTON_PIN)==HIGH)
{
if(millis()-timecheck > longpress)
{
while(digitalRead(BUTTON_PIN) == HIGH)
{
strip.setPixelColor(0,Wheel(color_pos));
strip.show();
delay(300);
strip.setPixelColor(0,0,0,0);
strip.show();
delay(300);
bool newState = digitalRead(BUTTON_PIN);
}
strip.setPixelColor(0,0,0,0);
strip.show();
timecheck = millis();
}
}
}
// Set the last button state to the old state.
oldState = newState;
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
-
步骤 4. 上传示例程序。如果你不知道如何上传代码,请查看 如何上传代码。
-
步骤 5. 每次按下 Grove-Mech Keycap,你都会看到 LED 颜色发生变化。如果按住按钮大约 2 秒,你会看到呼吸灯效果。
使用 Raspberry Pi 玩转
硬件
- 步骤 1. 本项目中使用的物品:
| Raspberry pi | Grove Base Hat for RasPi | Grove - Mech Keycap |
|---|---|---|
![]() | ||
| Get ONE Now | Get ONE Now | Get ONE Now |
- 步骤 2. 将 Grove Base Hat 插到 Raspberry 上。
- 步骤 3. 将 Grove - Mech Keycap 连接到 Base Hat 的 PWM 端口(端口 12)。
引脚可以是下表中用于 PWM 功能的任意一个值,并将设备连接到对应的插槽。
| Pin | Slot |
|---|---|
| 18 | D18 |
| 12 | PWM |
- 步骤 4. 通过 USB 线将 Raspberry Pi 连接到电脑。

软件
- 步骤 1. 按照 Setting Software 配置开发环境。
- 步骤 2. 通过克隆 grove.py 库来下载源文件。
cd ~
git clone https://github.com/Seeed-Studio/grove.py
- 步骤 3. 执行下面的命令来运行代码。
cd grove.py/grove
sudo python grove_mech_keycap.py 12
Unix 有一个“安全模型”。作为普通用户,你可以做一些事情,但你不应该能够访问同一台电脑上其他人的文件。并且作为用户,你不应该能够导致电脑停止工作。而“/dev/mem”允许你做的“恶作剧”远远不止修改一个 GPIO。这就是为什么必须保护 /dev/mem 不被普通用户访问。因此,为了运行这段代码,你需要在命令行中输入 sudo python grove_mech_keycap.py
下面是 grove_mech_keycap.py 代码。
import time
from grove.button import Button
from grove.factory import Factory
class GroveKeycap(object):
def __init__(self, pin):
# High = pressed
self.__btn = Factory.getButton("GPIO-HIGH", pin)
# single WS2812 LED
self.__led = Factory.getOneLed("WS2812-PWM", pin + 1)
self.__on_event = None
self.__btn.on_event(self, GroveKeycap.__handle_event)
@property
def on_event(self):
return self.__on_event
@on_event.setter
def on_event(self, callback):
if not callable(callback):
return
self.__on_event = callback
def __handle_event(self, evt):
# print("event index:{} event:{} pressed:{}".format(evt['index'], evt['code'], evt['presesed']))
if callable(self.__on_event):
self.__on_event(evt['index'], evt['code'], evt['time'])
return
self.__led.brightness = self.__led.MAX_BRIGHT
event = evt['code']
if event & Button.EV_SINGLE_CLICK:
self.__led.light(True)
print("turn on LED")
elif event & Button.EV_DOUBLE_CLICK:
self.__led.blink()
print("blink LED")
elif event & Button.EV_LONG_PRESS:
self.__led.light(False)
print("turn off LED")
Grove = GroveKeycap
def main():
from grove.helper import SlotHelper
sh = SlotHelper(SlotHelper.PWM)
pin = sh.argv2pin()
ledbtn = GroveKeycap(pin)
# remove ''' pairs below to begin your experiment
'''
# define a customized event handle your self
def cust_on_event(index, event, tm):
print("event with code {}, time {}".format(event, tm))
ledbtn.on_event = cust_on_event
'''
while True:
time.sleep(1)
if __name__ == '__main__':
main()
如果一切顺利,你将能够看到如下结果。如果你单击键帽,你会看到“turn on LED”,如果你双击键帽,你会看到“blink LED”。长按键帽会得到“turn off LED”。
pi@raspberrypi:~/grove.py/grove $ sudo python grove_mech_keycap.py 12
Hat Name = 'Grove Base Hat RPi'
turn on LED
turn on LED
blink LED
turn on LED
turn off LED
^CTraceback (most recent call last):
File "grove_mech_keycap.py", line 98, in <module>
main()
File "grove_mech_keycap.py", line 94, in main
time.sleep(1)
KeyboardInterrupt
你可以通过简单地按下 ++ctrl+c++ 来退出该程序。
原理图在线查看器
资源
- [Zip] Grove-Mech Keycap eagle 文件
- [Zip] Adafruit_NeoPixel-master
- [PDF] 开关产品简介
项目
这是该产品的介绍视频,包含简单的演示,你可以试一试。
技术支持与产品讨论
感谢你选择我们的产品!我们将为你提供多种支持,以确保你在使用我们产品的过程中尽可能顺利。我们提供多种沟通渠道,以满足不同的偏好和需求。










