CAD鼠标推荐(自制一个低成本六自由度的)
图片来自SpaceMouse官网
传统鼠标是所有2D/3D CAD画图工作站的重要组成部分。它重量轻,而且易于操作。然而从人机工程学的角度来看,它却有一个很明显的缺点——你总是需要用同一只手操作它来完成所有的任务。当大量使用鼠标进行重复性的操作时,这可能导致疼痛和鼠标手,也称为RSI(重复性劳损)。
使用3D鼠标可以防止这些症状,同时使你的CAD工作流程更加高效和健康。
以上内容来自SpaceMouse官网。
图片来自SpaceMouse官网
一个重度的CAD工作者当然需要一款好用的3D鼠标,我们今天就来介绍自己DIY一个!
一个同时支持6个自由度的3D打印软件专用鼠标,而且非常容易组装。
相关按键的绑定可以在源代码中更改,支持在Linux、Windows和macOS上使用。
作者提供了两种类型的底座(倾斜型和水平型)
▼ 演示效果
材料
- 三个模拟操纵杆传感器(带电路板)
- Pro Micro(基于ATmega 32U4的微控制器,兼容Arduino Leonardo)
- 各种长度的2毫米自攻螺丝
- 打印三份 ball-joint.stl
- 打印 knob.stl需要支撑,如果倒放的话可以不需要支撑。
ball-joint.stl
shaft.stl
knob.stl
所有的stl文件可以在文末打包下载。
组装并测试
- 选择足够长度的螺丝。对ball-joint.stl,建议用最短的螺钉(M2 x 4mm)
- 使用Arduino IDE将程序 mouse.ino 烧录到 Pro Micro 微控制器上
- 连接模拟操纵杆传感器和Pro Micro
- 修改代码好让与你的CAD软件一起使用(目前的代码是适合Blender的)
- 把控制器安装在三脚架上并进行测试
#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的代码(不需要频繁地按下/释放按钮)。可以通过修改代码来配置对应的程序,目前虽然暂时不支持在多个应用程序之间切换,但是至少可以在这边很容易地修改。
安装底座
- 提供了两种类型的底座(倾斜式和水平式)(作者个人更喜欢倾斜式)
- 可以使用2毫米的自攻螺丝将旋钮安装到底座上
- 该打印模型是120度旋转对称的。示例中的代码假定(传感器1=在2点钟方向,传感器2=在10点钟方向和传感器3=在6点钟方向)。你可以每30度改变旋钮的角度
- 对于倾斜式的版本,Pro Micro是由内部结构和盖子的孔固定的。
- 对于水平式的版本,Pro Micro与Micro USB的连接器一起放在外壳空槽里
- 可以在底部四个角贴上橡胶片来增加摩擦力。
tilted-base.stl
tilted-rear-cover.stl
horizontal-base.stl
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
转发请注明出处与原作者信息
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com