В языке ориентируюсь слабо, поэтому нужны небольшие комментарии, что делается в каждом конкретном блоке программы. Программа имитирует компьютерную мышь. В идеале хотелось бы получить комментарии к каждой строке кода и если возможно, сделать копию программы в ArduBlock или Minibloq Код (C++): #include <Wire.h> #include <I2Cdev.h> #include <MPU6050.h> #define LBUT 4 #define RBUT 5 MPU6050 mpu; int16_t ax, ay, az, gx, gy, gz; int angleToDistance(int a) { if (a < -80) { return -40; } else if (a < -65) { return -20; } else if (a < -50) { return -10; } else if (a < -15) { return -5; } else if (a < -5) { return -1; } else if (a > 80) { return 40; } else if (a > 65) { return 20; } else if (a > 15) { return 10; } else if (a > 5) { return 1; } else { return 0; } } void setup() { pinMode(LBUT, INPUT); digitalWrite(LBUT, HIGH); pinMode(RBUT, INPUT); digitalWrite(RBUT, HIGH); Wire.begin(); mpu.initialize(); if (!mpu.testConnection()) { while (1); } } void loop() { mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); int vx = map(ax, -16000, 16000, 90, -90); int vy = map(ay, -16000, 16000, 90, -90); Mouse.move(angleToDistance(vx), angleToDistance(vy)); if (digitalRead(LBUT) == LOW) { if (!Mouse.isPressed(MOUSE_LEFT)) { Mouse.press(MOUSE_LEFT); } } else { if (Mouse.isPressed(MOUSE_LEFT)) { Mouse.release(MOUSE_LEFT); } } if (digitalRead(RBUT) == LOW) { if (!Mouse.isPressed(MOUSE_RIGHT)) { Mouse.press(MOUSE_RIGHT); } } else { if (Mouse.isPressed(MOUSE_RIGHT)) { Mouse.release(MOUSE_RIGHT); } } delay(20); }
Код (C++): // Подключение библиотек #include <Wire.h> #include <I2Cdev.h> #include <MPU6050.h> //Пины левой и правой кнопок #define LBUT 4 #define RBUT 5 // Создание класса mpu MPU6050 mpu; // Переменные координат int16_t ax, ay, az, gx, gy, gz; // Преобразование угла в расстояние int angleToDistance(int a) { if (a < -80) { return -40; } else if (a < -65) { return -20; } else if (a < -50) { return -10; } else if (a < -15) { return -5; } else if (a < -5) { return -1; } else if (a > 80) { return 40; } else if (a > 65) { return 20; } else if (a > 15) { return 10; } else if (a > 5) { return 1; } else { return 0; } } void setup() { // Инициализация левой кнопки pinMode(LBUT, INPUT); // Включение подтягивающенго резистора digitalWrite(LBUT, HIGH); // Инициализация правой кнопки pinMode(RBUT, INPUT); // Включение подтягивающенго резистора digitalWrite(RBUT, HIGH); // Инициализация библиотек Wire.begin(); mpu.initialize(); // Ожидание подключения устройства if (!mpu.testConnection()) { while (1); } } void loop() { // Считывание данных из устройства mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // Пропорционально переносит значение из текущего диапазона значений в новый диапазон int vx = map(ax, -16000, 16000, 90, -90); int vy = map(ay, -16000, 16000, 90, -90); // Судя по всему - это эмуляция мыши на координаты полученные с устройства и преобразованные в подходящий дипазон Mouse.move(angleToDistance(vx), angleToDistance(vy)); // Если нажата левая кнопка - эмулировать нажатие if (digitalRead(LBUT) == LOW) { if (!Mouse.isPressed(MOUSE_LEFT)) { Mouse.press(MOUSE_LEFT); } } // Если отпущена левая кнопка - эмулировать действие else { if (Mouse.isPressed(MOUSE_LEFT)) { Mouse.release(MOUSE_LEFT); } } // Если нажата правая кнопка - эмулировать нажатие if (digitalRead(RBUT) == LOW) { if (!Mouse.isPressed(MOUSE_RIGHT)) { Mouse.press(MOUSE_RIGHT); } } // Если отпущена правая кнопка - эмулировать действие else { if (Mouse.isPressed(MOUSE_RIGHT)) { Mouse.release(MOUSE_RIGHT); } } delay(20); }
Огромное вам спасибо! Блок (// Преобразование угла в расстояние) это, как я понимаю, функция(подпрограмма) которая вызывается в этой строке: Mouse.move(angleToDistance(vx), angleToDistance(vy)) Верно?
Тогда проясните мне следующее. Когда мы расписывает функцию "int angleToDistance(int a)", мы берем каждый раз значение переменой "а" для каждой оси и переназначаем его в соответствии с условием (к примеру, если значение меньше -80, то назначаем -40). Для чего это нужно? И что тогда происходит с подпрограммой дальше, когда используются переменные "vx, vy"?
Вроде бы это нужно чтобы получить x / y координаты для мыши ax и ay переносятся в нужный диапазон значений и сохраняются в vx, vy. Далее vx и vy используются только для Mouse.move(angleToDistance(vx), angleToDistance(vy)); Если я правильно понял, то это работает так: 1. Получить значение ускорения по осям x / y 2. Преобразовать в нужный формат 3. Отправить на эмулятор мыши
Более менее понятно. В данной программе курсор двигается если есть наклон по одной из осей (т.е. работает как джойстик). А что нужно изменить, чтобы перемещение вызывалось изменением наклона осей (наклон больше, перемещение тоже больше)? У меня есть блок-схема для программы, возьметесь написать ее и за сколько?