手動ハンドパルスジェネレータを作る プロクソンMF70をCNC化しましたが、加工原点出しで手動ハンドルパルスジェネレータ(以下、手パとします)があると便利だよなという印象です。
手パが欲しい
Candleの画面
CandleではX, Y, Zのボタンをマウスでクリックすることで、手動で軸を移動することができます。このマウスというのがとてもやっかいで、軸を変更する場合や方向を変更する場合ワークから目を離す必要が出てきます。また、マウスも移動してしまうと移動が止ったり、前に移動させた軸のボタン上にあるか、移動の度に確認が必要です。また、1パルスでの移動距離の設定切替はプルダウンメニューであり、画面の確認が必要です。PCとフライスの位置関係によってはとても不便です。
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
OLEDモジュール(I2C)
ロータリーエンコーダ
タクトスイッチ
PCBと配線材
STM32F401
STM32F401はAliexpressで購入した開発ボードタイプのものを使用しています。401にしたのは、USB-Cを使用したかったためだけです。コネクタ形状にこだわりがなければ、安いSTM32F103でも問題ありません。
回路図 回路図です。OLEDはI2Cの1に接続(PB8, 9)、エンコーダはTIM4(PB6, 7)に接続しています。
プログラム STM32CubeMXでテンプレ作成、Atollic TrueSTUDIOにてコード作成しています。
STM32CubeMXの設定
ピン設定 ピンアサインと設定です。
ボタン用とエンコーダ用IOはPULL_UPしておきます 。
TIM4設定
エンコーダモードにします。
PB6,7はPULL_UP しておきます。
I2C-1 OLED用のI2Cは、
I2Cを選択し、Fast mode にします。
USB-HID MiddlewareよりUSB_DEVICEを選択し、HIDを選択 します。
クロック
クロック設定はデフォルトにしています。速度が必要であれば変更してください。
以上でSTM32CubeMXでの設定は完了です。プロジェクトマネージャページで保存ディレクトリと開発環境を選択してコードを出力してください。
コーディング ソースはGitHubにアップロートしています 。
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
};
動作 VIDEO