Помогите разобраться с программой, могу заплатить

Тема в разделе "Arduino & Shields", создана пользователем KBSH, 21 янв 2016.

  1. KBSH

    KBSH Нерд

    В языке ориентируюсь слабо, поэтому нужны небольшие комментарии, что делается в каждом конкретном блоке программы. Программа имитирует компьютерную мышь.
    В идеале хотелось бы получить комментарии к каждой строке кода и если возможно, сделать копию программы в 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);
    }
     
    Последнее редактирование: 22 янв 2016
  2. cthulhu

    cthulhu Нерд

    Код (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);
    }
     
  3. KBSH

    KBSH Нерд

    Огромное вам спасибо!

    Блок (// Преобразование угла в расстояние) это, как я понимаю, функция(подпрограмма) которая вызывается в этой строке: Mouse.move(angleToDistance(vx), angleToDistance(vy))
    Верно?
     
  4. cthulhu

    cthulhu Нерд

    Да, все верно
     
  5. KBSH

    KBSH Нерд

    Тогда проясните мне следующее.
    Когда мы расписывает функцию "int angleToDistance(int a)", мы берем каждый раз значение переменой "а" для каждой оси и переназначаем его в соответствии с условием (к примеру, если значение меньше -80, то назначаем -40). Для чего это нужно?
    И что тогда происходит с подпрограммой дальше, когда используются переменные "vx, vy"?
     
  6. cthulhu

    cthulhu Нерд

    Вроде бы это нужно чтобы получить x / y координаты для мыши

    ax и ay переносятся в нужный диапазон значений и сохраняются в vx, vy. Далее vx и vy используются только для Mouse.move(angleToDistance(vx), angleToDistance(vy));


    Если я правильно понял, то это работает так:
    1. Получить значение ускорения по осям x / y
    2. Преобразовать в нужный формат
    3. Отправить на эмулятор мыши
     
  7. KBSH

    KBSH Нерд

    Более менее понятно. В данной программе курсор двигается если есть наклон по одной из осей (т.е. работает как джойстик). А что нужно изменить, чтобы перемещение вызывалось изменением наклона осей (наклон больше, перемещение тоже больше)?
    У меня есть блок-схема для программы, возьметесь написать ее и за сколько?
     
  8. cthulhu

    cthulhu Нерд

    Сбросьте схему в личные сообщения, посмотрю что предстоит сделать