Как исправить перегрузку питания при подключении nRF24L01 для голосовой+гироскопической головной мыши?

Для моего проекта head mouse, основанного на модуле распознавания голоса V3.1 для операций левого щелчка, двойного щелчка, правого щелчка, я столкнулся с проблемой. Я использую односторонний радиочастотный трансивер 433 МГц для передачи данных. Когда я использую акселерометр InvenSense MPU 6050 и датчик IMU гироскопа для перемещения курсора мыши и модуль распознавания голоса вместе только на одной плате Arduino, курсор мыши перемещается плавно, а голосовые команды работают плавно. Но когда я использую радиочастотный односторонний передатчик 433 МГц для одной платы Arduino, чтобы вычислить движение мыши и получить голосовую команду, чтобы отправить ее беспроводным способом и получить значения и голосовые команды с помощью приемного модуля rf433 МГц, курсор мыши начинает отставать. Он не движется гладко. Итак, тогда мне пришла в голову мысль, что, поскольку последовательный монитор показывал только 5 отправленных экземпляров объектов в секунду, возможно, RF 433 Мгц вызывает засорение данных на стороне пользователя. Поэтому я решил переключиться на беспроводной приемопередатчик nRF24L01 для беспроводной среды. Но после подключения моего Arduino Leonardo и Arduino Micro оба выходят из строя на конце передатчика, выключаясь через секунду после включения. Я не могу найти решение этой проблемы. Пожалуйста, помогите. Обе схемы до и после переключения на nRF приведены ниже с кодом.

Transmitter circuit nRF24L01 version

Transmitter_nRF.ino

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
//измените значения CE и CSN acording на conn. измените тип данных struct contents на байт и проверьте если он не работает
  /*Демонстрация передатчика радиочастотного модуля 433 МГц 1
  RF-Xmit-Demo-1.ino
  Демонстрирует модуль радиочастотного передатчика 433 МГц
  Использование с демонстрацией приемника 1
 
  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/

// Включить зависимую библиотеку SPI
#include <SPI.h>
#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;
int16_t vx, vy;

const uint64_t pipeOut = 0xE8E8F0F0E1LL;
RF24 radio(6, 7); // CE: 9/6, CSN: 10/7
//
#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");
}

struct dataStruct{
  int16_t moveX;  //change to byte data type if not working
  int16_t moveY;
  int flag;
  }myData;
 
//struct dataStruct{
//  byte moveX,moveY,flag;;  //change to byte data type if not working
//  }myData;

int flag = 15;
 
void setup()
{


   /** initialize */
 
  Wire.begin();
  mpu.initialize();
  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");
  }
 
 
  radio.begin();
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipeOut);
 
   
}
 
void loop()
{
  delay(1000);
  int ret;

  ret = myVR.recognize(buf, 50);
    const char *msg = "Welcome to the Workshop!";

  if(ret>0){
 
  switch(buf[1]){
   
    case leftRecord:
    flag = 0;
    break;
   
    case rightRecord:
    flag = 1;
    break;

    case doubleRecord:
    flag = 2;
    break;
           
    default:
    flag=3;
    Serial.println("Record function undefined");
    break;
    }
    /** voice recognized */
    printVR(buf);
  }
 
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
   
  oax = ax+72;
  oay = ay-382;
  oaz = az-505;
  ogx = gx+99;
  ogy = gy-29;
  ogz = gz-50;

  vx = gx/200; 
  vy = -gz/200;
  myData.moveX = vx;
  myData.moveY = vy;
  myData.flag = flag;
 
//  memcpy(tx_buf, &myData, sizeof(myData));
//  byte bufSize = sizeof(myData);
  Serial.println("movX\tmovY\tflag\toax\toay\toaz\togx\togy\togz\tvx\tvy:");
  Serial.print(myData.moveX, HEX);
  Serial.print("\t");
  Serial.print(myData.moveY, HEX);
  Serial.print("\t");
  Serial.print(myData.flag, HEX);
  Serial.print("\t");
  Serial.print(oax, DEC);
  Serial.print("\t");
  Serial.print(oay, DEC);
  Serial.print("\t");
  Serial.print(oaz, DEC);
  Serial.print("\t");
  Serial.print(ogx, DEC);
  Serial.print("\t");
  Serial.print(ogy, DEC);
  Serial.print("\t");
  Serial.print(ogz, DEC);
  Serial.print("\t");
  Serial.print(vx, HEX);
  Serial.print("\t");
  Serial.println(vy, HEX);

  radio.write(&myData, sizeof(dataStruct));

    flag = 15;
    delay(1);
   
}

Receiver_nRF.ino

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
//измените значения CE и CSN acording на conn. измените тип данных struct contents на байт и проверьте если он не работает
  /*Демонстрация передатчика радиочастотного модуля 433 МГц 1
  RF-Xmit-Demo-1.ino
  Демонстрирует модуль радиочастотного передатчика 433 МГц
  Использование с демонстрацией приемника 1
 
  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/

// Include dependant SPI Library
#include <SPI.h>
#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]; // save record
uint8_t buf[64];

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

const uint64_t pipeOut = 0xE8E8F0F0E1LL;
RF24 radio(6, 7); // CE: 9/6, CSN: 10/7
//
#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, если символ невидим,
           вместо него выведите шестнадцатеричное значение.
  @param   buf  -->  VR модуль возвращает значение при распознавании голоса.
             buf[0] --> Групповой режим(FF: None Group, 0x8n: User, 0x0n:System
             buf[1] --> номер распознанной записи.
             buf[2] --> Значение индекса распознавателя(position) распознанной записи.
             buf[3] --> Длина подписи
             buf[4]~buf[n] --> Подпись
*/
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");
}

struct dataStruct{
  int16_t moveX;  //изменить на байтовый тип данных, если не работает
  int16_t moveY;
  int flag;
  }myData;
 
//struct dataStruct{
//  byte moveX,moveY,flag;;  //изменить на байтовый тип данных, если не работает
//  }myData;

int flag = 15;
 
void setup()
{


   /** initialize */
 
  Wire.begin();
  mpu.initialize();
  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");
  }
 
 
  radio.begin();
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipeOut);
 
   
}
 
void loop()
{
  delay(1000);
  int ret;

  ret = myVR.recognize(buf, 50);
    const char *msg = "Welcome to the Workshop!";

  if(ret>0){
 
  switch(buf[1]){
   
    case leftRecord:
    flag = 0;
    break;
   
    case rightRecord:
    flag = 1;
    break;

    case doubleRecord:
    flag = 2;
    break;
           
    default:
    flag=3;
    Serial.println("Record function undefined");
    break;
    }
    /** voice recognized */
    printVR(buf);
  }
 
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
   
  oax = ax+72;
  oay = ay-382;
  oaz = az-505;
  ogx = gx+99;
  ogy = gy-29;
  ogz = gz-50;

  vx = gx/200; 
  vy = -gz/200;
  myData.moveX = vx;
  myData.moveY = vy;
  myData.flag = flag;
 
//  memcpy(tx_buf, &myData, sizeof(myData));
//  byte bufSize = sizeof(myData);
  Serial.println("movX\tmovY\tflag\toax\toay\toaz\togx\togy\togz\tvx\tvy:");
  Serial.print(myData.moveX, HEX);
  Serial.print("\t");
  Serial.print(myData.moveY, HEX);
  Serial.print("\t");
  Serial.print(myData.flag, HEX);
  Serial.print("\t");
  Serial.print(oax, DEC);
  Serial.print("\t");
  Serial.print(oay, DEC);
  Serial.print("\t");
  Serial.print(oaz, DEC);
  Serial.print("\t");
  Serial.print(ogx, DEC);
  Serial.print("\t");
  Serial.print(ogy, DEC);
  Serial.print("\t");
  Serial.print(ogz, DEC);
  Serial.print("\t");
  Serial.print(vx, HEX);
  Serial.print("\t");
  Serial.println(vy, HEX);

  radio.write(&myData, sizeof(dataStruct));

    flag = 15;
    delay(1);
   
}

Схема передатчика и приемника в версии модуля rf433 МГц что вызвало запаздывание курсора Transmitter and Reciever Circuit in RF433Mhz module version which caused cursor lag receiver rf433mhz version

, 👍0

Обсуждение

Что именно вы подразумеваете под "выключением питания"? Если они действительно выходят из строя, то вы, скорее всего, перегрузили свой источник питания или где-то создали короткое замыкание, @chrisl

вы сказали, что вам нужна помощь с "перегрузкой мощности".... вы не описали никакой определенной перегрузки в своем посте ... возможно, вы слишком долго боролись с этим, и сейчас наступает путаница ... вы также сказали, что используете передатчик 433 МГц для вычисления движения мыши ... затем вы сказали, что не используете передатчик 433 Мгц ... может быть, вам нужно сделать перерыв, пересмотреть свой проект и заново описать проблему, @jsotola

Чтобы определить, есть ли у вас перегрузка по мощности, вам нужно сложить общий пиковый потребляемый ток всех подсистем и убедиться, что он ниже общего тока, обеспечиваемого вашим источником питания. Вы не показываете никакой информации об источниках питания, которые используете. Вы пытаетесь подключить все к Arduino с помощью USB-источника питания или встроенного регулятора напряжения на Arduino?, @Duncan C

@jsotola Я сменил беспроводной модуль. Раньше это был модуль RF433 МГц. Когда я использовал его для отправки и получения данных, курсор мыши отставал из-за низкой скорости передачи данных. Когда я изменил свое решение и сбросил модуль RF433Mhz и использовал модуль nRF24L01+ для беспроводного соединения, плата Arduino включилась, а затем выключилась. То же самое произошло, когда я просто использовал MPU6050 и nRF24L01+ с Arduino. В чем может быть причина?, @Nahian Rifaat

@DuncanC У меня есть мой ардуино на макетной плате, подключенный USB-кабелем к ноутбуку., @Nahian Rifaat

Возможно, в вашем коде просто есть ошибка, из-за которой он выходит из строя в тот же момент, когда запускается. Чтобы отлаживать вещи, возьмите самую маленькую подфункцию вашего кода и оборудования и убедитесь, что она работает. Проверьте, работает ли гироскоп, проверьте, работает ли радио, проверьте, работает ли распознавание голоса, делайте это индивидуально. Затем начните комбинировать две вещи одновременно и посмотрите, работает ли это по-прежнему., @Avamander

@Avamander, я даже не смог загрузить свой код. Когда я использую arduino только с NRFs или с NRF и модулем распознавания голоса, они не выключаются. MPU6050 также работает с Arduino. Но когда я использую Arduino с nRF и mpu6050, он отключается в течение секунды после подключения к ноутбуку. mpu6050 и голосовой модуль в порядке, так как я уже протестировал их. Но, возможно, nRF захватывает слишком много энергии при использовании с mpu или, возможно, mpu забирает слишком много энергии при использовании с nRF. Может ли быть, что НРФ эффективен? Я не мог заставить его обмениваться данными., @Nahian Rifaat

- Я даже не мог загрузить свой код.- тогда тебе придется трижды проверить проводку. nRF почти не потребляет тока даже при передаче полной мощности, если только вы не используете версию nRF типа "PA+LNA", и в этом случае вы увидите симптомы отключения во время передачи, а не при простом подключении., @Avamander


2 ответа


0

Прочитайте спецификации различных компонентов. Сложите пиковые текущие требования ко всему. В идеале умножьте на 1,2, чтобы дать некоторое (20%) пространство для маневра. Убедитесь, что ваш источник питания обеспечивает такой большой ток. Если вы используете USB, ваша общая доступная мощность составляет 500 мА. В этом почти наверняка и заключается проблема. Ваши устройства потребляют в общей сложности более 500 мА, и вы вызываете отключение от перегрузки.

Если ваша система потребляет больше энергии, чем может обеспечить ваш источник питания, приобретите источник питания с более высоким током и используйте его. (Источник питания 5 В с регулируемым высоким током. Используйте это для обеспечения 5 В, вместо того, чтобы пытаться питать что-либо от источника питания Arduino 5 В)

Редактировать:

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

,

Источник питания, которым не является Arduino. nRF24L01 потребляет больше тока во время передачи, чем может обеспечить Arduino. Дункан Си дал вам правильный ответ. Если вы не можете найти источник питания, соответствующий вашим расчетам, с тем же напряжением и более высоким выходным током будет нормально, этот расчет дает вам минимальное требование., @Gil


0

Это хороший проект, вы проделали хорошую работу. Источником питания Arduino НЕ является. nRF24L01 потребляет больше тока во время передачи, чем может обеспечить Arduino, и у вас больше нагрузки. Я видел это много раз на нескольких форумах и испытал это на себе. Если вы приложите палец к регулятору, вы обожжетесь, он такой горячий. Дункан Си дал вам правильный ответ. Если вы не можете найти источник питания, соответствующий вашим расчетам, с тем же напряжением и более высоким выходным током будет нормально, этот расчет дает вам минимальное требование.

,