Приветствую.
Попал ко мне в руки модуль gy-521 на микросхеме MPU6050. и решил я на нем сделать контроллер мыши, да нано с USB не работает, потому пришлось использовать другой язык программирования, а копаюсь я в питоне. с библиотекой pySerial можно работать с последовательным портом, а с Xlib можно управлять окнами и мышкой, по крайней мере на linux, работает ли она на винде не знаю, люди разное говорят.
на ардуине я снимал данные с гироскопа датчика, переводил в градусы, а затем делил на 60. таким образом я получал коэффициент, который в большинстве случаев был до 1. Выбрал 60 из за физических ограничений рук, вверх кисть поднимается до 50 градусов, а вниз опускается до 30, вправо влево не мерял, но там и до 90 не сложно. Таким образом в порт передавались данные в виде "коэффициент по х, коэффициент по у, левая кнопка мыши, правая кнопка мыши".
при поднятии кисти вверх курсор идет вверх, вниз - вниз. при повороте кисти влево - влево, вправо - вправо, надеюсь описание движений хоть немного понятны))
описывать подклчение компонентов к плате не буду, все подключается стандартно.
Далее прилагаются фотки и коды. Мышка получилась забавной, но требуется привыкнуть.
проекту нужна доработка, например вместо кнопок использовать датчики изгиба, тогда комбинацией двух пальцев можно управлять колесиком мыши. данных датчиков нет и не придвидится, потому любые улучшения откладываются на неопределенный срок. Так же есть идея использовать плату поменьше чем нано, но как я понял микро умеет с юсб сама работать, потому все это может стать неактуальным. можно еще прикрутить блютуз модуль, чтобы не обвязываться проводами.
Если кто то решит сделать и доделать буду рад увидеть результат))
ВНИМАНИЕ спасибо за внимание, удачи))
Попал ко мне в руки модуль gy-521 на микросхеме MPU6050. и решил я на нем сделать контроллер мыши, да нано с USB не работает, потому пришлось использовать другой язык программирования, а копаюсь я в питоне. с библиотекой pySerial можно работать с последовательным портом, а с Xlib можно управлять окнами и мышкой, по крайней мере на linux, работает ли она на винде не знаю, люди разное говорят.
на ардуине я снимал данные с гироскопа датчика, переводил в градусы, а затем делил на 60. таким образом я получал коэффициент, который в большинстве случаев был до 1. Выбрал 60 из за физических ограничений рук, вверх кисть поднимается до 50 градусов, а вниз опускается до 30, вправо влево не мерял, но там и до 90 не сложно. Таким образом в порт передавались данные в виде "коэффициент по х, коэффициент по у, левая кнопка мыши, правая кнопка мыши".
при поднятии кисти вверх курсор идет вверх, вниз - вниз. при повороте кисти влево - влево, вправо - вправо, надеюсь описание движений хоть немного понятны))
описывать подклчение компонентов к плате не буду, все подключается стандартно.
Далее прилагаются фотки и коды. Мышка получилась забавной, но требуется привыкнуть.
Python:
from serial import Serial
from Xlib import X, display
from Xlib.ext.xtest import fake_input
try:
ser = Serial('/dev/ttyUSB1', 9600)
except:
ser = Serial('/dev/ttyUSB0', 9600)
MOVE_KOEF = 5
d = display.Display()
s = d.screen()
root = s.root
root.warp_pointer(300 ,300)
d.sync()
x = 300
y = 300
lb = 0
sc_x = s.width_in_pixels
sc_y = s.height_in_pixels
while True:
data = str(ser.readline())
data = data[2:data.find('\\')]
print(data)
xm, ym, lb, rb = data.split(' ')
xt = int(float(xm) * MOVE_KOEF)
yt = int(float(ym) * MOVE_KOEF)
if 0 <= x + xt <= sc_x:
x += xt
if 0 <= y + yt <= sc_y:
y += yt
root.warp_pointer(x, y)
if lb == '1':
fake_input(d, X.ButtonPress, 1)
else:
fake_input(d, X.ButtonRelease, 1)
if rb == '1':
fake_input(d, X.ButtonPress, 3)
else:
fake_input(d, X.ButtonRelease, 3)
d.sync()
C++:
#include "I2Cdev.h"
#include "math.h"
#include "MPU6050.h"
#define TIME_OUT 10
#define DEVIA 10
MPU6050 accgyro;
unsigned long int t1;
unsigned long int sum = 0;
int i = 0;
double aax = 0, aay = 0, aaz = 0;
void setup() {
// put your setup code here, to run once:
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
accgyro.initialize();
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
unsigned long int t = millis();
int16_t ax, ay, az, gx, gy, gz;
accgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
aax += ax;
aay += ay;
aaz += az;
i ++;
if( t1 <= t ) {
aax /= i;
aay /= i;
aaz /= i;
i = 0;
t1 = t + TIME_OUT;
aax = (double)aax/16384;
aaz = (double)aaz/16384;
aay = (double)aay/16384;
if (aax ==0)
aax = 0.00000000000001;
if (aay ==0)
aay = 0.00000000000001;
if (aaz ==0)
aaz = 0.00000000000001;
double angx, angy;
int lb = 0, rb =0;
angy = (atan2(aax, aay) * 180 / 3.14);
if (angy < DEVIA && angy > DEVIA)
angy = 0;
angx = (atan2(aaz, aay) * 180 / 3.14);
if (angx < DEVIA && angx > -DEVIA)
angx = 0;
if (digitalRead(2) == HIGH)
lb = 0;
else
lb = 1;
if (digitalRead(3) == HIGH)
rb = 0;
else
rb = 1;
angx /= (double)-30;
angy /= (double)-30;
Serial.print(angx);
Serial.print(" ");
Serial.print(angy);
Serial.print(" ");
Serial.print(lb);
Serial.print(" ");
Serial.println(rb);
aax = 0;
aay = 0;
aaz = 0;
}
}
Если кто то решит сделать и доделать буду рад увидеть результат))
ВНИМАНИЕ спасибо за внимание, удачи))