руччная мышка на nano

kagoyashi

✩✩✩✩✩✩✩
12 Июл 2020
2
1
Приветствую.
Попал ко мне в руки модуль 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;
   }

}
FSh4EAnp9WM.jpg
4dtwZ8qVzV0.jpg
проекту нужна доработка, например вместо кнопок использовать датчики изгиба, тогда комбинацией двух пальцев можно управлять колесиком мыши. данных датчиков нет и не придвидится, потому любые улучшения откладываются на неопределенный срок. Так же есть идея использовать плату поменьше чем нано, но как я понял микро умеет с юсб сама работать, потому все это может стать неактуальным. можно еще прикрутить блютуз модуль, чтобы не обвязываться проводами.

Если кто то решит сделать и доделать буду рад увидеть результат))
ВНИМАНИЕ спасибо за внимание, удачи))
 
  • Лойс +1
Реакции: Arhat109