⌨️

オリジナルDIYキーボードキット組み立て方法 - DIY kit 01 - Keyboard XIAO RP2040

2023/10/10に公開

これは何?

ボクが作ったDIYキーボードキット DIY kit 01 - Keyboardの組み立て方法を説明しているよ。DIYキーボードキットはBOOTHで発売中なので、是非、お手元に用意して自分だけのキーボードを作ってみてね。

BOOTHの商品ページ
DIY kit 01 - Keyboard XIAO RP2040

このページでは、以下の内容について説明しているよ。

  • Arduino IDE環境の構築方法
  • DIY kit 01 - Keyboard の組み立て手順
  • キーボード組み立て後の動作確認方法

DIYキーボードキットの学習用コンテンツは以下のリンクを参照してね:
準備ができたものから順次公開していくよ。

番外編:

対象読者

  • DIYキーボードキットをお買い上げ頂いたみんな
  • DIYキーボードキットに興味があるけど、どんな感じかイメージしてみたいみんな

準備するもの

DIYキーボードキットを組み立てて使用するには以下の工具や環境が必要だよ。ここから先に進む前に準備してね。

組み立てに必要な工具類

  • はんだごて
  • はんだ
  • ニッパー
  • ピンセット
  • マスキングテープ
  • ハサミ

プログラム作成に必要な環境

  • Seeed XIAO RP2040
  • Arduino IDE
  • Arduino IDEが動作するPC

Arduino IDE 環境構築

DIYキーボードキットではSeeed StudioさんのXIAO RP2040というワンボードマイコンを使用するよ。XIAO RP2040をArduino IDEで使用するための環境構築について説明するよ。既にXIAO RP2040を使っている場合、ライブラリのインストールのみ確認してみてね。

Arduino IDEのインストール

Arduino IDEは元々はArduinoボードシリーズ用の開発環境だったけど、現在では色々なマイコンの開発環境として普及しているよ。Arduino IDEの開発は非営利団体である Arduino Foundationさんによって行われていて、無料で公開されているよ。

以下のリンク先から最新のArduino IDEを入手してインストールしてね。

https://www.arduino.cc/en/software

Arduino IDEの設定

Arduino IDEでXIAO RP2040用のプログラムを開発するために必要な設定を行うよ。

ボードの追加

Arduino IDEでXIAO RP2040を扱えるようにBoards ManagerでRP2040を追加するよ。

どうしてこの作業が必要?

Arduino IDEは、元々Arduinoボードシリーズの開発環境で、Arduinoが使っているAVRマイコン用のプログラムを作成したり通信したりプログラムを書き込んだりができるんだけど、RP2040を使ったXIAO RP2040はそのままでは使うことができないよ。そこで、RP2040にはどのようなバリエーションがあって、どのようにRP2040上で動くプログラムを作成したり通信したりするのかをAruduino IDEに設定しておく必要があるよ。

Arduino IDEのメニューからPreferences→Settingsと選択して、Additional boards manager URLsという設定を開いて以下のURLを追加してね。

https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

URLの追加ができたら、Arduino IDEのメニューからTools→Boards:→Boards manager…を開くよ。下図のようにArduino IDEの左側にBOARDS MANAGERが表示されるよ。BOARDS MANAGERの検索バーからRP2040を検索して、RaspberryPie Pico/RP2040のINSTALLをクリックしてね。しばらく時間がかかるので、完了まで待ってね。


Arduino IDE BOARDS MANAGER

ボードの選択

Arduino IDEにどのワンボードマイコン用のプログラムを作成するのかを教えてあげる必要があるよ。XIAO RP2040用に作成したい!と教えてあげることで、Arduino IDEはXIAO RP2040用にプログラムを作成して書き込むことができるようになるよ。

Arduino IDEのメニューからTools→Board:→Raspberry Pie Pico/RP2040→Seeed XIAO RP2040を選択するよ。


Arduino IDE Board選択

ライブラリの追加

Arduino IDEの設定はこれで最後だよ。Arduino IDEにDIYキーボードキットで使用するライブラリを追加するよ。追加するライブラリは以下の通りだよ。

  • Adafruit_NeoPixel
どうしてこの作業が必要?

さっき、ボードの追加をしたけど、ボードの追加でインストールされるライブラリは、XIAOを動かすために最低限必要なライブラリだけがインストールされるよ。NeoPixelのような追加の機能を動かすためには、追加した機能に応じて必要なライブラリをインストールする必要があるよ。

Arduino IDEのメニューからTools→Manage libraries…を開いてね。下図のようにArduino IDEの左側にLIBRARY MANAGERが表示されるよ。 LIBRARY MANAGERの検索バーからAdafruit_NeoPixelを検索して、INSTALLをクリックするよ。しばらく時間がかかるから完了するまで待ってね。


Arduino IDE LIBRARY MANAGER

DIY kit 01 - Keyboard 組み立て前の準備

ここでは、DIYキーボードキットの組み立てに必要なもの、回路図、部品表、組み立て手順について説明するよ。キットの組み立てには、はんだ付けが伴うので火傷や怪我には十分注意してね。

組み立て前の注意事項

ものを作ることはとっても楽しいんだけど、キットの組み立てでは使い方を間違うと危険な工具も使用するよ。キットを組み立てる際に注意しておきたいことを説明しているので、事故防止、健康維持のためによく読んでね。

はんだごてのこて先は300度近いよ
火傷をしないように注意してね。十分な作業スペースを確保して、はんだごてのケーブルに引っかかったり、不意にはんだごてに手を触れないようにしてね。

はんだが溶けた時の煙を吸い込むと喉が痛くなるよ
はんだにははんだ付けを容易にするために、フラックスというものが混ぜられていて、はんだが溶けると、このフラックスが蒸発して煙が発生するよ。この煙を吸い込むと喉が痛くなったりするので、十分に換気を行って、長時間の作業を避けて、煙を直接吸い込まないように注意してね。

鉛は毒性があるよ
はんだには有鉛はんだと無鉛はんだがあって、有鉛はんだには鉛(Pb)が含まれているよ。有鉛はんだは溶ける温度が低いからはんだ付けがしやすいというメリットがあるけど、鉛は人体に蓄積されて悪影響を及ぼす可能性が高いから、間違ってもはんだを口に入れたりせず、はんだ付けの後は手をよく洗ってね。

組み立てに必要な工具類

一番最初の準備でも記載しているけど、改めて組み立てに必要な工具類の説明をするよ。

  • はんだごて
  • ニッパー
  • ピンセット
  • マスキングテープ
  • ハサミ

はんだごて
部品を基板上にはんだ付けするために使用するよ。ホームセンターに売っているようなものでも何でも良いよ。ボクはHAKKOさんの30Wのはんだごてをいつも使っているよ。

ニッパー
部品をはんだ付けした後に余ったリード線を切断するために使用するよ。

ピンセット
NeoPixelの位置調整に使用するよ。NeoPixelの大きさは3mm四方ほどしかないから、ピンセットがあると楽に扱えるよ。

マスキングテープ
はんだ付けするときに部品や基板が動かないように固定するために使用するよ。

ハサミ
マスキングテープを切るために使用するよ。

回路図

ここでは、DIYキーボードキットで使用する基板の回路図を記載しているよ。組み立て時に回路図を意識する必要は無いけど、キーボードのプログラムを作成するときに、どのGPIOに何が繋がっているか知りたいときは、この回路図を参照してね。

キーボード基板回路図
キーボード基板回路図

部品表

ここでは、DIYキーボードキットの組み立てで使用する部品の一覧と取り付け箇所を記載しているよ。

部品 取り付け位置
NeoPixel (SK6812MINI-E) D1,D2,D3,D4
0.1μF積層セラミックコンデンサ C1,C2,C3,C4
10kΩ抵抗 R1
5.1kΩ抵抗 R2
470Ω抵抗 R3
NchMOSFET (BS170) T1
XIAO RP2040 U1
キースイッチ Key1,Key2,Key3,Key4
ロータリーエンコーダ Enc1,Enc2

基板にはR4を取り付ける箇所があるけど、これはXIAO ESP32S3を取り付けたときに正しくBoot modeに入るために必要なプルアップ抵抗を取り付ける箇所だよ。XIAO RP2040以外にも対応したかったから、将来のために取り付けられるようにしているよ。XIAO RP2040では関係ないのでR4は無視してね。

DIY kit 01 - Keyboard 組み立て手順

ここでは、DIYキーボードキットの組み立て手順について説明するよ。

以下の順番で部品の取り付けと動作確認を行うよ。

  1. NeoPixel取り付け
  2. コンデンサ取り付け
  3. Nch MOSFET取り付け
  4. 抵抗取り付け
  5. XIAO RP2040(ピンソケット)取り付け
  6. NeoPixelの点灯確認
  7. キースイッチ、ロータリーエンコーダ取り付け

各部品の取り付け方法と気をつける点などを説明していくよ。

1. NeoPixel (D1,D2,D3,D4)

NeoPixel
NeoPixel外観

NeoPixelはマイコンを内蔵したRGB LEDだよ。DIYキーボードキットの部品の中で一番取り付け難易度が高い部品だよ。一番最初に終わらせてしまえば、残りの部品はそれほど難しくないよ!NeoPixelは基板の表側に取り付けるよ。各キースイッチの中央下にある四角い穴がNeoPixelの取り付け箇所で、合計4箇所あるよ。

NeoPixelは取り付けの方向が決まっているよ NeoPixelのピンをよく見ると1つだけ足が欠けているピンがあって。このピンがGNDピンだよ。基板上のシルクに+とーの印があるから、NeoPixelのGNDピンがーの印の位置になるように配置するよ。NeoPixelの発光面は基板の底面方向になるよ。


NeoPixel取り付け位置

NeoPixelを正しく配置できたら、NeoPixelのピンに被らないように、マスキングテープを使用してNeoPixelが動かないように固定することをオススメするよ。

はんだ付けのやり方(参考)

  1. はんだごてのこて先をNeoPixelのピンとパッドの間ぐらいに当てて加熱するよ。
  2. こて先とピンの間にはんだを少しずつ流し込んでね。
  3. 十分な量のはんだを流し込めたら、1〜2秒ほどこて先を当て続けてから、こて先をピンから離すよ。

2番で一気にはんだを流し込まずに、少しづつはんだを追加していくことがポイントだよ。

2. 積層セラミックコンデンサ (C1,C2,C3,C4)


積層セラミックコンデンサ外観

NeoPixelの取り付けが終わったら次は積層セラミックコンデンサを取り付けるよ。この4つのコンデンサはパスコンという役割で、NeoPixelに内蔵されたマイコンを安定して動かすために使用しているよ。積層セラミックコンデンサはどちらの向きでもOKだよ。基板上のC1,C2,C3,C4にコンデンサをはんだ付けして取り付けてね。

3. Nch MOSFET (T1)


Nch MOSFET外観

Nch MOSFETはXIAO RP2040のGPIO電圧3.3Vのロジックレベルを5Vに変換するためのロジックレベルシフト回路に使用しているよ。NeoPixelのロジックレベルが5Vだから、この回路を使用してロジックレベルの変換を行なっているよ。

Nch MOSFETにはソース、ゲート、ドレインという3本の足があって、それぞれ挿入箇所が決まっているよ。基板上のシルクがMOSFETの形になっているから、MOSFETの向きを合わせて挿入するよ。

MOSFETは基板の面に対して90°足を曲げた状態で挿入するよ。基板の面に対して垂直方向にそのまま挿入してはんだ付けすると、MOSFETの高さがスペーサとほぼ同じだから、机に置いたときにMOSFETが机に接触する可能性があるよ。


Nch MOSFET取り付け例

4. 抵抗 (R1, R2, R3)


抵抗器外観

抵抗R1,R2はロジックレベルシフト回路の入力と出力をプルアップするために使用しているよ。抵抗R3はNeoPixelのDINの手前に置くことで信号を安定させる役割があるよ。抵抗はどちらの方向でもOKだよ。抵抗値と基板上のシルクを確認して、それぞれはんだ付けしてね。


R1:10kΩ


R2:5.1kΩ


R3:470Ω

DigiKey, Band Resistor Color Code Calculator

5. XIAO RP2040 (U1)

Seeed XIAO RP2040はSeeed Studioさんのワンボードマイコンで、スイッチの状態を検出したり、キーボードとしての動作を制御したりするために使用するよ。XIAOの取り付けは、以下の3種類の取り付け方が可能だから好みの取り付け方を選んでね。

  1. ピンソケット+ピンヘッダ
  2. ピンヘッダのみ
  3. 端面スルーホール(表面実装)

2番、3番はXIAOが基板に完全に固定されてしまうから、XIAOを取り外して別に使いたいなら、1番の方法がオススメだよ。

6. NeoPixelの動作確認

XIAOの取り付けまでが終わったら、この時点でNeoPixelが正しく点灯するかどうかを確認するよ。
この後はキースイッチを取り付けるんだけど、キースイッチを取り付けた後にNeoPixelのはんだ付けをやり直すのは結構難しいから、先にNeoPixelの動作確認をしておくよ。

XIAOに電源を接続する前に部品が正しい位置に取り付けられているか、はんだ付けに問題がないかどうかを確認してみてね。部品の取り付けに問題が無いことを確認できたら、XIAOとPCをUSBケーブルで接続してね。

以下のNeoPixelテスト用のスケッチをArduino IDEにコピペしてXIAO RP2040に書き込んでみてね。D1からD4のNeoPixelが赤、緑、青・・と順番に光ることを確認してね。

XIAO RP2040に書き込めない?

XIAO RP2040上でBootボタンを押しながらResetボタンを押してみてね。それぞれB, Rという印があるよ。

#include <Adafruit_NeoPixel.h>

// For RGB LED
#define PIN_NEO_LED D6
#define NUM_LEDS    4
Adafruit_NeoPixel pixels(NUM_LEDS, PIN_NEO_LED, NEO_GRB + NEO_KHZ800); 

void setup() {
  // open the serial port:
  Serial.begin(9600);
  Serial.println("XIAO Keyboard");

  // Initialize NeoPixel
  pixels.setPixelColor(0, pixels.Color(0, 0, 0));
  pixels.setPixelColor(1, pixels.Color(0, 0, 0));
  pixels.setPixelColor(2, pixels.Color(0, 0, 0));
  pixels.setPixelColor(3, pixels.Color(0, 0, 0));
  pixels.show();   // Apply colors to the NeoPixel LEDs
}

void RGBtest(){
  // Turn on R
  pixels.setPixelColor(0, pixels.Color(255, 0, 0));
  pixels.show();
  delay(200);
  pixels.setPixelColor(1, pixels.Color(255, 0, 0));
  pixels.show();
  delay(200);
  pixels.setPixelColor(2, pixels.Color(255, 0, 0));
  pixels.show();
  delay(200);
  pixels.setPixelColor(3, pixels.Color(255, 0, 0));
  pixels.show();
  delay(200);

  // Turn on G
  pixels.setPixelColor(0, pixels.Color(0, 255, 0));
  pixels.show();
  delay(200);
  pixels.setPixelColor(1, pixels.Color(0, 255, 0));
  pixels.show();
  delay(200);
  pixels.setPixelColor(2, pixels.Color(0, 255, 0));
  pixels.show();
  delay(200);
  pixels.setPixelColor(3, pixels.Color(0, 255, 0));
  pixels.show();
  delay(200);

  // Turn on B
  pixels.setPixelColor(0, pixels.Color(0, 0, 255));
  pixels.show();
  delay(200);
  pixels.setPixelColor(1, pixels.Color(0, 0, 255));
  pixels.show();
  delay(200);
  pixels.setPixelColor(2, pixels.Color(0, 0, 255));
  pixels.show();
  delay(200);
  pixels.setPixelColor(3, pixels.Color(0, 0, 255));
  pixels.show();
  delay(200);
}

void loop() {
  RGBtest();
}

7. キースイッチ (Key1,Key2,Key3,Key4) 、ロータリーエンコーダ (Enc1,Enc2)

NeoPixelは正しく点灯できたかな? NeoPixelの動作に問題が無かったら最後にキースイッチとロータリーエンコーダを取り付けるよ。


キースイッチ外観

キースイッチは方向が決まっているので、基板上の穴とキースイッチのピンを合わせて正しく挿入してね。はんだ付けの際にキースイッチが動かないようにマスキングテープで固定することをオススメするよ。


ロータリーエンコーダ外観

ロータリーエンコーダも方向が決まっているので、基板上の穴とロータリーエンコーダのピンを合わせて正しく挿入してね。はんだ付けの際にロータリーエンコーダが動かないようにマスキングテープで固定することをオススメするよ。

8. スペーサ取り付け


スペーサとナット外観

全てのはんだ付けが完了したら、基板の5箇所の穴にスペーサを取り付けるよ。以下の丸の箇所に取り付けてね。スペーサは基板の底面側から穴に挿入して、基板の表側からナットで固定してね。


スペーサ取り付け位置

これで全ての部品の取り付けが完了したよ!

9. アクリルパネル取り付け

アクリルパネルもある場合は、この手順を参考にして基板とアクリルパネルを固定してね。基板用のスペーサとナット、アクリルパネルに付属のネジとナットを使用するよ。固定の手順は以下の通りだよ。

  1. 上側のアクリルパネルにネジとナットを取り付け

  2. 基板を上側のアクリルパネルに取り付け、スペーサーで固定

  3. 下側のアクリルパネルをスペーサーに取り付け、ナットで固定

以上でアクリルパネルと基板の固定が完了だよ!

キーボードの動作確認

キーボードはうまく組み立てられたかな?電源を入れる前に、もう一度組み立て済みのキーボード全体を見渡してみてね。はんだが不足していないか、はんだが隣のピンまで流れ込んでいないか、取り付けている部品が正しいかどうかをチェックしてみてね。問題なければ各部品の動作確認を行うよ。

キーボード動作確認用スケッチ

ここでは、キーボードの基板に実装した全ての部品が正常に動作しているかどうかを確認するよ。もちろん、自分で確認用のプログラムを作成して確認してもOKだよ。手っ取り早く確認したい場合は以下のスケッチをArduino IDEにコピペしてXIAO RP2040に書き込んでみてね。

/*
 Keyboard factory test for XIAO RP2040
*/

#include <Adafruit_NeoPixel.h>

// For RGB LED
#define PIN_NEO_LED D6
#define NUM_LEDS 4
Adafruit_NeoPixel pixels(NUM_LEDS, PIN_NEO_LED, NEO_GRB + NEO_KHZ800);  //800kHzでNeoPixelを駆動
volatile int led_mode = 0; // 0: RGB demo
unsigned int rgb_demo_led = 0; // 0:NeoPixel#1~3:NeoPixel#4
unsigned int rgb_demo_color = 0; // 0:R, 1:G, 2:B

// For Keyboard
#define PIN_KEY_1 D0
#define PIN_KEY_2 D1
#define PIN_KEY_3 D2
#define PIN_KEY_4 D3
#define PIN_ENC_1_A D9
#define PIN_ENC_1_B D10
#define PIN_ENC_1_SW D4
#define PIN_ENC_2_A D7
#define PIN_ENC_2_B D8
#define PIN_ENC_2_SW D5

// For all Encoders
#define ENCODER_DELAY 100 // us
#define ENCODER_DIRECTION_GURAD_DELTA 500 // ms

// For encoder 1
volatile bool enc1_locked = false;
volatile int enc1_direction = 0; // Positive if clockwise, Negative if unti-clockwise.
volatile int enc1_count = 0;

volatile bool enc1_cw_wait = false;
volatile bool enc1_ucw_wait = false;

// For encoder 2
volatile bool enc2_locked = false;
volatile int enc2_direction = 0; // Positive if clockwise, Negative if unti-clockwise.
volatile int enc2_count = 0;

volatile bool enc2_cw_wait = false;
volatile bool enc2_ucw_wait = false;

/**
 * CORE0
 */
// Setup for core 0
void setup() {
  // open the serial port:
  Serial.begin(115200);
  Serial.println("XIAO Keyboard");

  // Initialize keyboard
  pinMode(PIN_KEY_1, INPUT_PULLUP);
  pinMode(PIN_KEY_2, INPUT_PULLUP);
  pinMode(PIN_KEY_3, INPUT_PULLUP);
  pinMode(PIN_KEY_4, INPUT_PULLUP);
  pinMode(PIN_ENC_1_SW, INPUT_PULLUP);
  pinMode(PIN_ENC_2_SW, INPUT_PULLUP);

  // Initialize encoders
  pinMode(PIN_ENC_1_A, INPUT_PULLUP);
  pinMode(PIN_ENC_1_B, INPUT_PULLUP);
  pinMode(PIN_ENC_2_A, INPUT_PULLUP);
  pinMode(PIN_ENC_2_B, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(PIN_ENC_1_A), pulse_counter_enc1_a, FALLING);
  attachInterrupt(digitalPinToInterrupt(PIN_ENC_1_B), pulse_counter_enc1_b, FALLING);
  attachInterrupt(digitalPinToInterrupt(PIN_ENC_2_A), pulse_counter_enc2_a, FALLING);
  attachInterrupt(digitalPinToInterrupt(PIN_ENC_2_B), pulse_counter_enc2_b, FALLING);

}

void pulse_counter_enc1_a(){
  if(!enc1_locked && enc1_ucw_wait && !enc1_cw_wait){
    enc1_count--;
    enc1_locked = true;
  }else{
    enc1_cw_wait = true;
  }
}

void pulse_counter_enc1_b(){
  if(!enc1_locked && enc1_cw_wait && !enc1_ucw_wait){
    enc1_count++;
    enc1_locked = true;
  }else{
    enc1_ucw_wait = true;
  }
}

/** ENCODER2 **/
void pulse_counter_enc2_a(){
  if(!enc2_locked && enc2_ucw_wait && !enc2_cw_wait){
    enc2_count--;
    enc2_locked = true;
  }else{
    enc2_cw_wait = true;
  }
}

void pulse_counter_enc2_b(){
  if(!enc2_locked && enc2_cw_wait && !enc2_ucw_wait){
    enc2_count++;
    enc2_locked = true;
  }else{
    enc2_ucw_wait = true;
  }
}

// Loop for core 0
void loop() {
  // Get key status
  int key1 = digitalRead(PIN_KEY_1);
  int key2 = digitalRead(PIN_KEY_2);
  int key3 = digitalRead(PIN_KEY_3);
  int key4 = digitalRead(PIN_KEY_4);
  int sw1 = digitalRead(PIN_ENC_1_SW);
  int sw2 = digitalRead(PIN_ENC_2_SW);

  if(key1 == LOW){
    led_mode = 1; // Turn on NeoPixel under the key1
  }else if(key2 == LOW){
    led_mode = 2; // Turn on NeoPixel under the key2
  }else if(key3 == LOW){
    led_mode = 3; // Turn on NeoPixel under the key3
  }else if(key4 == LOW){
    led_mode = 4; // Turn on NeoPixel under the key4
  }else if(sw1 == LOW){
    led_mode = 5; // Turn on all blue NeoPixel LEDs
  }else if(sw2 == LOW){
    led_mode = 6; // Turn on all red NeoPizel LEDs
  }else{
    led_mode = 0; // RGB demo
  }

  if(enc1_count > 0){
    // Enc1 rotated clockwise
    led_mode = 7;
    enc1_count = 0;
    enc1_locked = enc1_cw_wait = enc1_ucw_wait = false;
  }else if(enc1_count < 0){
    // Enc1 rotated unti-clockwise
    led_mode = 8;
    enc1_count = 0;
    enc1_locked = enc1_cw_wait = enc1_ucw_wait = false;
  }

  if(enc2_count > 0){
    // Enc2 rotated clockwise
    led_mode = 9;
    enc2_count = 0;
    enc2_locked = enc2_cw_wait = enc2_ucw_wait = false;
  }else if(enc2_count < 0){
    // Enc2 rotated unti-clockwise
    led_mode = 10;
    enc2_count = 0;
    enc2_locked = enc2_cw_wait = enc2_ucw_wait = false;
  }

  delay(100);
}

/**
 * CORE1
 */
// Setup for core 1
void setup1(){
// Initialize NeoPixel
  pixels.clear();
  pixels.show();   // Apply colors to the NeoPixel LEDs
}

void RGBtest(){
  switch(rgb_demo_color%3){
    case 0:
      pixels.setPixelColor(rgb_demo_led, pixels.Color(255, 0, 0));
      pixels.show();
      break;
    case 1:
      pixels.setPixelColor(rgb_demo_led, pixels.Color(0, 255, 0));
      pixels.show();
      break;
    case 2:
      pixels.setPixelColor(rgb_demo_led, pixels.Color(0, 0, 255));
      pixels.show();
      break;
  }
  rgb_demo_led++;
  if(rgb_demo_led > 3){
    rgb_demo_led = 0;
    rgb_demo_color++;
  }
}

void TurnLEDAt(int num){
  pixels.clear();
  pixels.setPixelColor(num, pixels.Color(0, 255, 0));
  pixels.show();
}

void TurnAllLEDs(uint32_t color){
  pixels.setPixelColor(0, color);
  pixels.setPixelColor(1, color);
  pixels.setPixelColor(2, color);
  pixels.setPixelColor(3, color);
  pixels.show();
}

void FlashLED(int direction, uint32_t color){
  pixels.clear();
  if(direction>0){
    pixels.setPixelColor(0, color);
    pixels.show();
    delay(50);
    pixels.setPixelColor(1, color);
    pixels.show();
    delay(50);
    pixels.setPixelColor(2, color);
    pixels.show();
    delay(50);
    pixels.setPixelColor(3, color);
    pixels.show();
  }else if(direction<0){
    pixels.setPixelColor(3, color);
    pixels.show();
    delay(50);
    pixels.setPixelColor(2, color);
    pixels.show();
    delay(50);
    pixels.setPixelColor(1, color);
    pixels.show();
    delay(50);
    pixels.setPixelColor(0, color);
    pixels.show();
  }
}

// Loop for core 1
void loop1(){
  switch(led_mode){
    case 0:
      RGBtest();
      break;
    case 1:
      TurnLEDAt(0);
      break;
    case 2:
      TurnLEDAt(1);
      break;
    case 3:
      TurnLEDAt(2);
      break;
    case 4:
      TurnLEDAt(3);
      break;
    case 5:
      TurnAllLEDs(pixels.Color(0,0,255));
      break;
    case 6:
      TurnAllLEDs(pixels.Color(255,0,0));
      break;
    case 7:
      FlashLED(1,pixels.Color(0,0,255));
      break;
    case 8:
      FlashLED(-1,pixels.Color(0,0,255));
      break;
    case 9:
      FlashLED(1,pixels.Color(255,0,0));
      break;
    case 10:
      FlashLED(-1,pixels.Color(255,0,0));
      break;
  }
  delay(200);
}

動作確認用スケッチは、各キーの下に配置されたNeoPixelを点灯させることで、キーボード基板上の各部品の動作が分かるようになっているよ。全て部品を触って動作しているかどうか確認してみてね。

  • 何もしていない時: NeoPixelのデモ点灯
  • キースイッチ押下: キー下のNeoPixel点灯(緑)
  • エンコーダ1回転: 右に回すとKey1から順に点灯(青)、左に回すと逆順で点灯。
  • エンコーダ2回転: 右に回すとKey1から順に点灯(赤)、左に回すと逆順で点灯。
  • エンコーダ1プッシュスイッチ押下: 全てのNeoPixelが青色で点灯
  • エンコーダ2プッシュスイッチ押下: 全てのNeoPixelが赤色で点灯

まとめ

このページではDIYキーボードキットの組み立てと動作確認方法について説明したよ。このページでは、キーボードを制御するための方法やサンプルコードについては説明していないので、ここからは自分なりのプログラムを作成してみてね。サンプルコードを含むDIYキーボードキットの学習用コンテンツは別途準備中なので、準備が出来次第お知らせするよ。

DIYキーボードキットを組み立てる時に分からないこと、気になることがあればXで気軽に質問してね。キーボード作りを楽しんでね!またね!

Discussion