CAD鼠标推荐(自制一个低成本六自由度的)(1)

CAD鼠标推荐(自制一个低成本六自由度的)(2)

图片来自SpaceMouse官网

传统鼠标是所有2D/3D CAD画图工作站的重要组成部分。它重量轻,而且易于操作。然而从人机工程学的角度来看,它却有一个很明显的缺点——你总是需要用同一只手操作它来完成所有的任务。当大量使用鼠标进行重复性的操作时,这可能导致疼痛和鼠标手,也称为RSI(重复性劳损)。

使用3D鼠标可以防止这些症状,同时使你的CAD工作流程更加高效和健康。

以上内容来自SpaceMouse官网。

CAD鼠标推荐(自制一个低成本六自由度的)(3)

图片来自SpaceMouse官网

一个重度的CAD工作者当然需要一款好用的3D鼠标,我们今天就来介绍自己DIY一个!

CAD鼠标推荐(自制一个低成本六自由度的)(4)

一个同时支持6个自由度的3D打印软件专用鼠标,而且非常容易组装。

相关按键的绑定可以在源代码中更改,支持在Linux、Windows和macOS上使用。

作者提供了两种类型的底座(倾斜型和水平型)

CAD鼠标推荐(自制一个低成本六自由度的)(5)

▼ 演示效果

材料

CAD鼠标推荐(自制一个低成本六自由度的)(6)

打印材料

CAD鼠标推荐(自制一个低成本六自由度的)(7)

CAD鼠标推荐(自制一个低成本六自由度的)(8)

ball-joint.stl

CAD鼠标推荐(自制一个低成本六自由度的)(9)

shaft.stl

CAD鼠标推荐(自制一个低成本六自由度的)(10)

knob.stl

所有的stl文件可以在文末打包下载。

组装并测试

CAD鼠标推荐(自制一个低成本六自由度的)(11)

CAD鼠标推荐(自制一个低成本六自由度的)(12)

CAD鼠标推荐(自制一个低成本六自由度的)(13)

#include "Mouse.h" #include "Keyboard.h" #define DELAY 15 // motion sending cycle #define DEAD_THRES 0 // threshold to ignore small motion #define SPEED_PARAM 400 // larger is slower #define DOF 6 #define TX 0 // translation X #define TY 1 // translation Y #define TZ 2 // translation Z #define RX 3 // rotation X #define RY 4 // rotation Y #define RZ 5 // rotation Z // ports of analog input for joysticks int port[DOF] = {A0, A2, A6, A1, A3, A7}; // conversion matrix from sensor input to rigid motion int coeff[DOF][DOF] = { { 0, 0, 0,-10,-10, 20}, // TX { 0, 0, 0,-17, 17, 0}, // TY {-3, -3, -3, 0, 0, 0}, // TZ {-6, 6, 0, 0, 0, 0}, // RY { 3, 3, -6, 0, 0, 0}, // RX { 0, 0, 0, 3, 3, 3}, // RZ }; int origin[DOF]; // initial sensor values void setup() { Mouse.begin(); Keyboard.begin(); DELAY(300); for(int i = 0; i < DOF; i ) { origin[i] = analogRead(port[i]); } } int sx, sy, sw; void move(int x, int y, int w) { if(x > DEAD_THRES) x -= DEAD_THRES; else if(x < -DEAD_THRES) x = DEAD_THRES; else x = 0; if(y > DEAD_THRES) y -= DEAD_THRES; else if(y < -DEAD_THRES) y = DEAD_THRES; else y = 0; if(w > DEAD_THRES) w -= DEAD_THRES; else if(w < -DEAD_THRES) w = DEAD_THRES; else w = 0; Mouse.move(x, y, w); sx = x; sy = y; sw = w; } // return mouse pointer to the original position void resetMove(void) { Mouse.move(-sx, -sy, -sw); sx = 0; sy = 0; sw = 0; } void loop() { int sv[DOF]; // sensor value int mv[DOF]; // motion vector int moveFlag = false; for(int i = 0; i < DOF; i ) { sv[i] = analogRead(port[i]) - origin[i]; } for(int i = 0; i < DOF; i ) { mv[i] = 0; for(int j = 0; j < DOF; j ) { mv[i] = coeff[i][j] * sv[j]; } mv[i] /= SPEED_PARAM; if(mv[i] > 127) { mv[i] = 127; } else if(mv[i] < -128) { mv[i] = -128; } } if(abs(mv[RX]) > DEAD_THRES || abs(mv[RY]) > DEAD_THRES) { Mouse.press(MOUSE_MIDDLE); move(mv[RX], mv[RY], 0); Mouse.release(MOUSE_MIDDLE); } if(abs(mv[TX]) > DEAD_THRES || abs(mv[TY]) > DEAD_THRES) { Keyboard.press(KEY_LEFT_SHIFT); Mouse.press(MOUSE_MIDDLE); move(mv[TX], mv[TY], 0); Keyboard.releaseAll(); Mouse.release(MOUSE_MIDDLE); } if(abs(mv[TZ]) > DEAD_THRES) { Keyboard.press(KEY_LEFT_CTRL); Mouse.press(MOUSE_MIDDLE); move(0, mv[TZ], 0); Keyboard.releaseAll(); Mouse.release(MOUSE_MIDDLE); } resetMove(); delay(DELAY); }

注意(2023年1月1日): 增加了一个mouse-conservative.ino的代码(不需要频繁地按下/释放按钮)。可以通过修改代码来配置对应的程序,目前虽然暂时不支持在多个应用程序之间切换,但是至少可以在这边很容易地修改。

安装底座

CAD鼠标推荐(自制一个低成本六自由度的)(14)

CAD鼠标推荐(自制一个低成本六自由度的)(15)

tilted-base.stl

CAD鼠标推荐(自制一个低成本六自由度的)(16)

tilted-rear-cover.stl

CAD鼠标推荐(自制一个低成本六自由度的)(17)

horizontal-base.stl

CAD鼠标推荐(自制一个低成本六自由度的)(18)

horizontal-bottom-cover.stl

底座的所有的stl文件可以在原文DF创客社区文末打包下载。

原文链接:https://www.instructables.com/Space-Mushroom-Full-6-DOFs-Controller-for-CAD-Appl/

原文作者:shiura

译文首发于:DF创客社区 https://mc.dfrobot.com.cn/thread-315193-1-1.html

转发请注明出处与原作者信息

,