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 -> D1S2 -> 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_PINPIXEL_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...