自作CNCペンダント:Arduino LeonardoをHID化し23ボタン×6機能の低コスト制御器
必要な部品と材料
- Arduino Leonardo(またはMicro、32u4搭載ボード) ×1
- モーメンタリプッシュボタン(LED内蔵・ラベル貼付可) ×23
- 電子ハンドホイール(100PPR、6端子) ×1
- マホガニー材等(ケース自作用)
- 1kΩ抵抗 ×23(LED用)
プロジェクト概要
市販のCNCペンダントは高価(約100ユーロ)でボタンも少ないため、Arduino LeonardoのHID(キーボードエミュレーション)機能を活用し、23個のボタンそれぞれにシングル/ダブル/トリプルクリック、長押し(シングル/ダブル/トリプル)の最大6機能を割り当てた自作ペンダントを製作。ハンドホイールも装備し、Eding CNCソフトウェアをショートカットキーで完全制御します。
仕組み:LeonardoのHID機能とClickButtonライブラリ
Leonardo(32u4チップ)はUSB接続時にPCからキーボード/マウスとして認識されます。ClickButtonライブラリを使うと、1つのボタンで以下の6イベントを検出可能(デバウンス内蔵)。
- シングルクリック(≥250ms)
- ダブルクリック
- トリプルクリック
- シングルクリック長押し(≥1000ms)
- ダブルクリック長押し
- トリプルクリック長押し
これにより23ボタン×6機能=138機能を実装可能。実際には主要ボタンで3〜4機能を使い分けています。
コード例:X軸ボタン(ボタン13)の機能割り当て
if (button[13].clicks != 0) {
switch (button[13].clicks) {
case 1: shortcut_HANDWHEEL_X(); break; // ハンドホイール→X軸
case 2: shortcut_ZERO_X(); break; // X原点セット
case 3: break;
case -1: // 長押し:ユーザーマクロ18(Xワークゼロ移動)
press_ESC(); goto_MAIN_MENU(); user_MACRO_18(); break;
case -2: case -3: break;
}
}
ケース製作
マホガニー材をVectric Cut2Dで設計し、CNCで加工。表裏二面加工でボタン穴、ハンドホイール穴、配線溝を精密に切削。厚み21mmの材を表裏で削り、総厚36.5mmの堅牢な筐体に。複数回クリア塗装で仕上げ。

スイッチとラベル
LED内蔵モーメンタリスイッチを採用。透明キャップの下にレーザープリンター用透明ステッカーでラベル貼付(Eding CNCのアイコンを流用)。スイッチは内部プルアップ使用で配線簡素化:全スイッチの片側をGND、もう片側を各入力ピンへ。
ハンドホイール
標準的な60mm 100PPR 6端子エンコーダーを使用。CNCソフト側でパルス数設定可能。
電子回路
Leonardoの入力ピン(デジタル0〜13、A0〜A5)をフル活用。全ボタンに1kΩ抵抗でLED駆動(5V/2mA)。総消費電流約150mA(LED点灯時)。

プログラミング方法
ペンダントをCNC電源に接続したまま、USBでPCにつないでArduino IDEから書き込み。別PCで書き込む場合もペンダントはCNC電源に繋いだままUSBだけ差し替えればOK。
完全スケッチ(主要部)
ClickButtonライブラリとKeyboardライブラリを使用。各ボタンのイベントハンドラでKeyboard.press()/release()によりショートカットキー送信。
#include "ClickButton.h"
#include "Keyboard.h"
const int buttons = 20; // 実際は20ボタン+ダミー
ClickButton button[21] = { /* ピン割り当て配列 */ };
void setup() {
for (int i=1; i<=buttons; i++) {
button[i].debounceTime = 20;
button[i].multiclickTime = 250;
button[i].longClickTime = 1000;
}
}
void loop() {
for (int i=1; i<=buttons; i++) button[i].Update();
// 各ボタンの clicks 値に応じた switch-case で Keyboard 操作
// 例:press_RESET(), press_ESC(), shortcut_HANDWHEEL_X() 等
}
// キーボードショートカット関数群
void press_RESET() { Keyboard.begin(); Keyboard.press(KEY_F1); delay(100); Keyboard.releaseAll(); }
void press_ESC() { Keyboard.begin(); Keyboard.press(KEY_ESC); delay(100); Keyboard.releaseAll(); }
void shortcut_HANDWHEEL_X() { Keyboard.begin(); Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_LEFT_SHIFT); Keyboard.press('x'); delay(100); Keyboard.releaseAll(); }
// ... 以下、F1-F12、Alt+F1-F12、Ctrl+文字等のヘルパー関数多数
設計ファイル・ライブラリ
- ClickButtonライブラリ(必須):
clickbutton_hq5qeT4toX.zip - ケースCADデータ:
cnc_pendant_SenmxC8UCj.zip
回路図

製造プロセス
- ボタン:古代の留め具から現代イノベーションへ
- Arduino MegaでPWM制御:プッシュボタン付きLEDフェード制御チュートリアル
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoで作るパンチングキーボードボタン:ストレス解消カスタムキー
- Arduinoプロジェクトのための最適化電源ソリューション
- CNCオペレータパネルのリセットボタン理解:機能と使用法
- Osai USAのOPENwiTP:効率的なCNC制御のためのワイヤレスティーチペンダント