3D мышь своими руками


Многие типы специализированного программного обеспечения, особенно CAD (автоматизированное проектирование), CAM (автоматизированное производство) или EDA (автоматизация электронного проектирования), могут работать со специальными 3D манипуляторами для облегчения работы. Такие «3D-мыши» позволяют, например, манипулировать виртуальными объектами в разработке дизайна.

Многие наборы инструментов для проектирования устройств и других программ, использующих виртуальное трехмерное пространство, часто можно использовать с помощью обычной мыши и клавиатуры. Но гораздо удобнее работать со специальными устройствами ввода, которые имеют больше степеней свободы и кнопки для часто используемых ярлыков или инструментов. На фото показано устройство 3Dconnexion – SpaceNavigator, которое оснащено аж шестью степенями свободы передвижения манипулятора, что позволяет легко ориентироваться в трехмерной рабочей среде.

Такие устройства значительно ускоряют и облегчают работу над 3D-конструкциями. Правда у них есть и недостатки. Одно из них – высокая цена. Хотя можно сделать такой манипулятор своими руками. Благодаря использованию готовых модулей и 3D-печати, создание такого манипулятора не требует больших затрат, а с платформой Arduino его можно адаптировать для работы практически с любым 3D-пакетом.


Устройство оснащено механическим джойстиком, обеспечивающим три оси свободы, тремя дополнительными программируемыми кнопками и дополнительной кнопкой, запускаемой при нажатии на джойстик. Описанный проект был успешно протестирован в таких программах, как Fusion 360 или Inventor от Autodesk. Также его можно легко адаптировать к потребностям других программ и даже расширить дополнительными кнопками и другими входами в соответствии с потребностями.

Конструкция 3D манипулятора

Для сборки устройства потребуются:

  • Arduino Leonardo / Pro Micro,
  • Модуль джойстика с двумя осями движения и кнопкой,
  • Три кнопки,
  • Винты M2,5 х 6 с головкой с внутренним шестигранником,
  • Резьбовые вставки М2,5 для пластмасс,
  • Болты M1,5 и соответствующие шайбы,
  • Провод для соединения всех элементов между собой.
  • Также понадобится паяльник и 3D-принтер.

Механическая система и корпус

Механическая конструкция 3Д манипулятора проста. Корпус состоит из двух частей – основания, на котором расположены все элементы, и крышки, закрывающей конструкцию. Кроме того, необходимы небольшие внутренние элементы, их форма будет зависеть от кнопок, выбранных для проекта.

На рисунке показана 3D-визуализация печатных элементов. В процессе печати разрешение слоя было установлено на 0,12 мм для всех частей, кроме верхней крышки, которая имеет разрешение печати 0,06 мм для получения гладкой поверхности непосредственно на принтере. Чтобы процесс был более точным скорость экструдера не должна превышать 40 мм / с.

Первым этапом сборки является установка модуля Arduino. На подставке подготовлено место для размещения штифтов, что упрощает установку модуля. Чтобы прикрепить его, можно приплавить штыри, но делать это нужно быстро, чтобы не расплавить пластмассу в этом месте.

Интересное на схемафоруме:
Как повысить напряжение БП с 12 до 14v

Затем подключите кнопки и модуль джойстика. Используя тонкий кабель, последовательно подключите кнопки к общей линии заземления (GND) и проведите три одиночных провода к цифровым входам Arduino под номерами 7, 8 и 9. Чтобы избежать внешних резисторов подключение этих входов к линии питания выполняется внутренне, в микроконтроллере.

На плате кнопок есть небольшие отверстия для их сборки. Чтобы вставить в них микровыключатели, достаточно аккуратно согреть их контакты и, пока они теплые, вставить в коннектор. Благодаря этому материал станет мягким, и кнопки будут навсегда встроены в печатную плату. Когда кнопки готовы, поместите весь модуль в основание и закрепите двумя винтами 1,5 мм.

Теперь можно подключить модуль джойстика к Arduino (VCC к VCC, GND к GND, X к A0, Y к A1 и кнопка к цифровому входу 10). После джойстик прикрепим к основанию винтами 1,5 мм и небольшими шайбами. Основа имеет несколько отверстий для установки модуля джойстика для размещения различных модулей, доступных на рынке. Они не отличаются электрически, но часто имеют разные расстояния между монтажными отверстиями.

Последний шаг – установка в стойку резьбовых вставок, которые будут использоваться для прикручивания крышки. Эти элементы следует вставлять на место горячим паяльником – теплые вставки локально расплавят основной материал и плавно встанут на место. После застывания пластика все будет жестким и прочным. Вставив вставки, можно надеть крышку и прикрутить ее четырьмя винтами M2,5 х 6. Корпус можно покрасить.

Программное обеспечение

Space Mouse работает как эмулятор мыши и клавиатуры, подключенной к компьютеру через USB. При этом он отправляет на компьютер команды, например сочетания клавиш. Возможно, потребуется адаптировать программу мыши к требованиям используемых инструментов.

Фрагмент программы, показанный в листинге, подробно определяет отдельные параметры и функции кнопок.

Listing 1.
#include <Mouse.h>
#include <Keyboard.h>

void setup(){
// Ustawia piny analogowe jako wejscia
pinMode(horzPin, INPUT);
pinMode(vertPin, INPUT);
// Ustawia pin przycisku joysticka jako wejscie
pinMode(selPin, INPUT);
// Ustawia pin przycisku 1 jako wejscie
pinMode(b1Pin, INPUT);
// Ustawia pin przycisku 2 jako wejscie
pinMode(b2Pin, INPUT);
// Ustawia pin przycisku 3 jako wejscie
pinMode(b3Pin, INPUT);
// Podciaganie przyciskow do gory
digitalWrite(selPin, HIGH);
digitalWrite(b1Pin, HIGH);
digitalWrite(b2Pin, HIGH);
digitalWrite(b3Pin, HIGH);
// Krotkie opoznienie na ustabilizowanie sie ukladu
delay(1000);
// Zebranie wartosci bazowych joystic
vertZero = analogRead(vertPin);ka
horzZero = analogRead(horzPin);
// Inicjalizacja emulacji myszy
Mouse.begin();
// Inicjalizacja emulacji klawiatury
Keyboard.begin();
}
void loop(){
unsigned long currentMillis = millis();
// Odczyt pozycji pionowej
vertValue = analogRead(vertPin) – vertZero;
// Odczyt pozycji poziomej
horzValue = analogRead(horzPin) – horzZero;
// Jezeli nacisnieto przycisk 1
if ((digitalRead(b1Pin) == 0) && (!b1flag)){
b1flag = 1;
used = 1;
if (used != lastused){
Keyboard.write(f8key);
} else {
Keyboard.write(f9key);
used = 0;
}
} else if (digitalRead(b1Pin) && (b1flag)){
b1flag = 0;
}
lastused = used;
// Jezeli nacisnieto przycisk 2

// Jezeli nacisnieto przycisk 3

// Jezeli nacisnieto przycisk joysticka
if ((digitalRead(selPin) == 0) && (!mouseClickFlag)){
presstime = currentMillis;
registertime = 1;
mouseClickFlag = 1;
pressed = 1;
mode = 1;
// Jezeli nie nacisnieto
} else if ((digitalRead(selPin))
&& (mouseClickFlag)
&& (registertime)){
releasetime = currentMillis;
registertime = 0;
mouseClickFlag = 0;
pressed = 0;
mode = 0;
// Sprawdza dlugosc czasu nacisniecia
diff = (releasetime – presstime);
// Wybor trybu w zaleznosci od czasu nacisniecia
if(diff < interval){
Keyboard.write(f6key);
}
}
switch(mode){ // Wybor trybu
case 0:
// Powrot do bazowej orientacji myszy
invertMouse = -1;
// Pozycja 2, zamiast 0, redukuje fluktuacje pomiedzy odczytami
if ( (vertValue > 2)||(vertValue < (-2)) ){
Keyboard.press(f4key);
Mouse.press(MOUSE_LEFT);
// Ruch mysza w osi Y z wcisnietym F4
Mouse.move(0, (invertMouse * (vertValue / sensitivity)), 0);
moved=1;
}
if ( (horzValue > 2)||(horzValue < (-2)) ){
Keyboard.press(f4key);
Mouse.press(MOUSE_LEFT);
// Ruch mysza w osi X z wcisnietym F4
Mouse.move((invertMouse * (horzValue / sensitivity)), 0, 0);
moved=1;
}
if ( (vertValue <= 2)
&&(vertValue >= (-2))
&&(horzValue <= 2)
&&(horzValue >= (-2))){
// Jezeli joystick jest w bazowej pozycji,
// puszczamy klawisze i naciskamy ESC, by powrocic
Keyboard.releaseAll();
Mouse.release(MOUSE_LEFT);
if(moved==1){
Keyboard.write(esc);
moved=0;
}
}
break;
case 1:
// Mysz odwrocona do przyblizania
invertMouse = 1;
if ( (vertValue > 2)||(vertValue < (-2)) ){
Keyboard.press(f3key);
Mouse.press(MOUSE_LEFT);
// Ruch mysza w osi Y z wcisnietym F3
Mouse.move(0, (invertMouse * (vertValue / sensitivity)), 0);
moved=1;
}
if ( (vertValue <= 2)
&&(vertValue >= (-2))
&&(horzValue <= 2)
&&(horzValue >= (-2))){
Keyboard.releaseAll();
Mouse.release(MOUSE_LEFT);
if(moved==1){
Keyboard.write(esc);
moved=0;
}
}
break;
}
// Opoznienie, ktore reguluje czas pomiedzy komunikatami do komputera, by system
// dzialal wolniej
delay(10);
}

Здесь можно легко адаптировать софт к своим потребностям, например, путем изменения функций и ярлыков отдельных элементов устройства.

Интересное на схемафоруме:
Полноценный IB металлодетектор на ARDUINO

В пакетах Autodesk Mechanical программа из листинга 1 выполняет следующие функции: движение джойстика = вращение камеры, быстрое нажатие джойстика = возврат в базовое положение камеры, нажатие и перемещение джойстика = масштабирование камеры, кнопка 1 = поперечное сечение включено, кнопка 2 = показать / скрыть ограничения, кнопка 3 = сброс.