手動ハンドパルスジェネレータを作る
手パが欲しい |
Candleの画面 |
bCNCの導入
Keys
<Right> pan +X
<Left> pan -X
<Up> pan +Y
<Down> pan -Y
<PgUp> pan +Z
<PgDn> pan -Z
<Comma> rotate -A
<Period> rotate +A
<+> or <=> Increase step by one unit (=current decade)
<-> or <_> Decrease step by one unit (=current decade)
<1> Set as step the step1 (default 0.1) value from the configuration
<2> Set as step the step2 (default 1) value from the configuration
<3> Set as step the step3 (default 10) value from the configuration
<*> Multiply step by x10
</> Divide step by /10
手パを作る
キーで操作できるのであれば、ArduinoやSTM32でHIDキーボードを作成してしまえば手パ専用ハードを実現できます。
作成した手パ(後にボタンの色を変更しました) |
必要なもの
STM32F401 |
STM32F401はAliexpressで購入した開発ボードタイプのものを使用しています。401にしたのは、USB-Cを使用したかったためだけです。コネクタ形状にこだわりがなければ、安いSTM32F103でも問題ありません。
回路図
プログラム
STM32CubeMXの設定
ピン設定
TIM4設定
エンコーダモードにします。PB6,7はPULL_UPしておきます。I2C-1
OLED用のI2Cは、I2Cを選択し、Fast modeにします。USB-HID
MiddlewareよりUSB_DEVICEを選択し、HIDを選択します。
クロック
クロック設定はデフォルトにしています。速度が必要であれば変更してください。
以上でSTM32CubeMXでの設定は完了です。プロジェクトマネージャページで保存ディレクトリと開発環境を選択してコードを出力してください。
コーディング
STM32CubeMXのテンプレートではキーボード用に変更する必要があります。こちらを参照してください。
テンプレート部分を修正していますので、STM32CubeMXよりコードを生成すると下記修正は全て消えてしまうことに注意してください。
HID_EPIN_SIZEを5に、HID_MOUSE_REPORT_DESC_SIZEを78に。
HID_MOUSE_ReportDescをキーボード向けに書き換えます。
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
// 78 bytes
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID (1)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x19, 0xE0, // Usage Minimum (0xE0)
0x29, 0xE7, // Usage Maximum (0xE7)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x03, // Report Count (3)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x64, // Logical Maximum (100)
0x05, 0x07, // Usage Page (Kbrd/Keypad)
0x19, 0x00, // Usage Minimum (0x00)
0x29, 0x65, // Usage Maximum (0x65)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x02, // Report ID (2)
0x05, 0x0C, // Usage Page (Consumer)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x09, 0xB5, // Usage (Scan Next Track)
0x09, 0xB6, // Usage (Scan Previous Track)
0x09, 0xB7, // Usage (Stop)
0x09, 0xB8, // Usage (Eject)
0x09, 0xCD, // Usage (Play/Pause)
0x09, 0xE2, // Usage (Mute)
0x09, 0xE9, // Usage (Volume Increment)
0x09, 0xEA, // Usage (Volume Decrement)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
};
0 件のコメント:
コメントを投稿