устранение проблемы дрейфа для модуля распознавания голоса 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);
}
}
@Nahian Rifaat, 👍0
1 ответ
Ваша проблема, скорее всего, связана с использованием SoftwareSerial для связи вашего модуля VR. SoftwareSerial печально известен тем, что ломает вещи. Он отключает прерывания и загружает ЦП.
Вместо этого следует использовать аппаратный последовательный порт, который на Pro Mini полностью отделен от связи USB.
- Как исправить горение HC05 даже после использования регулятора напряжения?
- Установка беспроводной связи. между ПК и arduino pro micro для обмена речью и данными гироскопа
- Arduino Pro Micro, получить данные с контакта Tx?
- Как подключить вывод INT MPU 6050?
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- MPU6050 не работает