Skip to main content

Grove-机械键帽

Grove-机械键帽是一款带有内置 LED 的机械开关。255 全彩 RGB LED 让你可以简单直观地显示开关的状态。该键帽非常可靠,按压寿命可达 20,000,000 次。

你会发现这是一个有趣且稳定的模块,可以用来制作一些非常有趣的项目或产品。实际上,你甚至可以使用多个 Grove-机械键帽制作一把机械键盘。

tip

在无负载条件下,以每分钟 300 次的频率连续操作 20,000,000 个循环。

立即获取

特性​

  • 可编程 LED
  • 可靠的机械结构
  • 极长的工作寿命

规格​

项目数值
工作电压3v-5v
绝缘电阻100MΩ 最小
接触电阻200 mΩ 最大
无负载工作寿命20,000,000

应用​

  • 汽车设备
  • 可视化设备
  • 家用电器
  • 信息设备

硬件​

引脚图​

原理图​

K1 连接到按键,当按键断开时,SIG1 会被电阻 R2 下拉,此时 SIG1 的输出应为低电平。 一旦按键被按下,K1 闭合,SIG1 将连接到 VCC,此时 SIG1 的输出变为高电平。

note

在本节中我们只向你展示部分原理图,完整文档请参考 Resources

支持的平台​

ArduinoRaspberry Pi
caution

上面提到的受支持平台仅表示该模块在软件或理论上的兼容性。在大多数情况下,我们只为 Arduino 平台提供软件库或代码示例。不可能为所有可能的 MCU 平台提供软件库或演示代码,因此用户需要自行编写软件库。

入门指南​

note

如果这是你第一次使用 Arduino,我们强烈建议你在开始之前先阅读 Getting Started with Arduino。

使用 PlatformIO 体验​

硬件

XIAO nRF52840 SenseSeeed Studio Grove Base for XIAOGrove-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;
}
note

如果你的接线或引脚映射不同,请相应地修改 BUTTON_PIN 和 PIXEL_PIN。

使用 Arduino 体验​

硬件​

所需材料

Seeeduino V4.2Base ShieldGrove-Mech keycap
enter image description hereenter image description hereenter image description here
立即获取立即获取立即获取
note

1 请轻轻插拔 USB 线,否则可能会损坏接口。请使用内部有 4 根线的 USB 线,只有 2 根线的线缆无法传输数据。如果你不确定自己手上的线缆类型,可以点击这里购买。

2 每个 Grove 模块在购买时都会附带一根 Grove 线缆。如果你丢失了 Grove 线缆,可以点击这里购买。

  • 步骤 1. 将 Grove-机械键帽连接到 Grove-Base Shield 的 D2 端口。

  • 步骤 2. 将 Grove - Base Shield 插入 Seeeduino。

  • 步骤 3. 通过 USB 线将 Seeeduino 连接到电脑。

note

如果我们没有 Grove Base Shield,也可以像下面这样将 Grove-机械键帽直接连接到 Seeeduino。

SeeeduinoGrove-Mech keycap
5VRed
GNDBlack
D3White
D2Yellow

软件​

  • 步骤 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 piGrove Base Hat for RasPiGrove - Mech Keycap
enter image description hereenter image description hereenter image description here
Get ONE NowGet ONE NowGet ONE Now
  • 步骤 2. 将 Grove Base Hat 插到 Raspberry 上。
  • 步骤 3. 将 Grove - Mech Keycap 连接到 Base Hat 的 PWM 端口(端口 12)。
note

引脚可以是下表中用于 PWM 功能的任意一个值,并将设备连接到对应的插槽。

PinSlot
18D18
12PWM
  • 步骤 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

caution

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()


tip

如果一切顺利,你将能够看到如下结果。如果你单击键帽,你会看到“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++ 来退出该程序。

原理图在线查看器​

资源​

项目​

这是该产品的介绍视频,包含简单的演示,你可以试一试。

技术支持与产品讨论​

感谢你选择我们的产品!我们将为你提供多种支持,以确保你在使用我们产品的过程中尽可能顺利。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...