устранение проблемы дрейфа для модуля распознавания голоса elechouse v3.1 и датчика MPU6050 для головной мыши даже после калибровки датчика?

Для моего проекта с головной мышью, который основан на модуле распознавания голоса V3.1 для операций левого, двойного и правого щелчка, акселерометре MPU 6050 и гироскопе для движения курсора, я столкнулся с проблемой. Когда я просто использую акселерометр MPU 6050 и датчик гироскопа для движения курсора, курсор мыши движется плавно (проведена калибровка). Но когда я интегрирую его с модулем распознавания голоса, курсор начинает дрейфовать. Мой код также указан в этом посте.

Для этого проекта я использовал Arduino Pro Micro. Пожалуйста помоги. Я откалибровал свой MPU6050, чтобы он не дрейфовал при работе в одиночку. Но после интеграции с модулем распознавания голоса (включая калибровку) проблема дрейфа возвращается. Я запитываю установку с помощью USB-кабеля, подключенного от ноутбука к Arduino.

Примечание. Это проект клиента. По требованиям мне нужно сделать головную мышь беспроводной. Мне тоже нужны предложения по этому поводу.

Подключение цепи

#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include <Mouse.h>
#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050.h>

VR myVR(8,9);    // 9:RX 8:TX

uint8_t records[7]; // сохранить запись
uint8_t buf[64];

MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz, oax, oay, oaz, ogx, ogy, ogz;
int vx, vy;

#define leftRecord    (0)
#define rightRecord   (1) 
#define doubleRecord  (2)

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf     --> command length
           len     --> number of parameters
*/
void printSignature(uint8_t *buf, int len)
{
  int i;
  for(i=0; i<len; i++){
    if(buf[i]>0x19 && buf[i]<0x7F){
      Serial.write(buf[i]);
    }
    else{
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]aurav");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized. 
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");
  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if(buf[0] == 0xFF){
    Serial.print("NONE");
  }
  else if(buf[0]&0x80){
    Serial.print("UG ");
    Serial.print(buf[0]&(~0x80), DEC);
  }
  else{
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if(buf[3]>0){
    printSignature(buf+4, buf[3]);
  }
  else{
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  Wire.begin();
  if (!mpu.testConnection()) {
    while (1);
    }

  myVR.begin(9600);
  Serial.begin(115200);
  Serial.println("Elechouse Voice Recognition V3 Module\r\nControl LED sample");


  if(myVR.clear() == 0){
    Serial.println("Recognizer cleared.");
  }else{
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while(1);
  }

  if(myVR.load((uint8_t)leftRecord) >= 0){
    Serial.println("leftRecord loaded");
  }

  if(myVR.load((uint8_t)rightRecord) >= 0){
    Serial.println("rightRecord loaded");
  }

  if(myVR.load((uint8_t)doubleRecord) >= 0){
    Serial.println("doubleRecord loaded");
  }

}

void loop()
{
  int ret;
  ret = myVR.recognize(buf, 50);

  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  oax = ax-265;
  oay = ay+387;
  oaz = az+474; 
  ogx = gx-109;
  ogy = gy+35;
  ogz = gz+150;

  vx = gx/120;  
  vy = -gz/120; 

  Mouse.move(vx, vy);

  if(ret>0){

  switch(buf[1]){

    case leftRecord:
    Mouse.click(MOUSE_LEFT);
    delay(100);
    break;

    case rightRecord:
    Mouse.click(MOUSE_RIGHT);
    delay(100);
    break;

    case doubleRecord:
    Mouse.click(MOUSE_LEFT);
    Mouse.click(MOUSE_LEFT);
    delay(100);
    break;

    default:
    Serial.println("Record function undefined");
    break;
    }
    /** voice recognized */
    printVR(buf);
  }
}

, 👍0


1 ответ


1

Ваша проблема, скорее всего, связана с использованием SoftwareSerial для связи вашего модуля VR. SoftwareSerial печально известен тем, что ломает вещи. Он отключает прерывания и загружает ЦП.

Вместо этого следует использовать аппаратный последовательный порт, который на Pro Mini полностью отделен от связи USB.

,