首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蓝牙低能慢反应时间

蓝牙低能慢反应时间
EN

Stack Overflow用户
提问于 2018-04-06 03:16:17
回答 1查看 1.2K关注 0票数 2

我目前正尝试用AdafruitFeather32u4来控制一个2台马达(一辆小型遥控汽车)和一个android应用程序。下面是我使用的内容:

MitAppInventor 2用于应用程序,显然是用于汽车的Arduino IDE。

App并没有一种分享代码的愉快方式,但基本上我通过了配对,并到达了只需按下按钮的地方。它们工作得很完美,使汽车向前、向后、左、右行驶。我遇到的问题是,当我从电脑上拔下羽毛时,按下按钮和马达之间的时间大约是1.5秒,这对驾驶来说绝对是不可以的。

Arduino所做的就是接收电话中的数组,这将是状态,0,1,2,3或4。取决于这个数字,它将电机按所需的方向打开。

我使用的代码只是修改了指南中的代码

这是我的Arduino IDE代码:

代码语言:javascript
复制
/*********************************************************************
 This is an example for our nRF51822 based Bluefruit LE modules

 Pick one up today in the adafruit shop!

 Adafruit invests time and resources providing this open source code,
 please support Adafruit and open-source hardware by purchasing
 products from Adafruit!

 MIT license, check LICENSE for more information
 All text above, and the splash screen below must be included in
 any redistribution
*********************************************************************/

#include <Arduino.h>
#include <SPI.h>
#if not defined (_VARIANT_ARDUINO_DUE_X_) && not defined (_VARIANT_ARDUINO_ZERO_)
  #include <SoftwareSerial.h>
#endif

#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"

#include "BluefruitConfig.h"

/*=========================================================================
    APPLICATION SETTINGS

  FACTORYRESET_ENABLE     Perform a factory reset when running this sketch

                            Enabling this will put your Bluefruit LE module
                              in a 'known good' state and clear any config
                              data set in previous sketches or projects, so
                            running this at least once is a good idea.

                            When deploying your project, however, you will
                              want to disable factory reset by setting this
                              value to 0. If you are making changes to your
                            Bluefruit LE device via AT commands, and those
                              changes aren't persisting across resets, this
                              is the reason why. Factory reset will erase
                              the non-volatile memory where config data is
                              stored, setting it back to factory default
                              values.

                            Some sketches that require you to bond to a
                              central device (HID mouse, keyboard, etc.)
                              won't work at all with this feature enabled
                              since the factory reset will clear all of the
                              bonding data stored on the chip, meaning the
                              central device won't be able to reconnect.
    MINIMUM_FIRMWARE_VERSION  Minimum firmware version to have some new features
    MODE_LED_BEHAVIOUR        LED activity, valid options are
                              "DISABLE" or "MODE" or "BLEUART" or
                              "HWUART"  or "SPI"  or "MANUAL"
    -----------------------------------------------------------------------*/
    #define FACTORYRESET_ENABLE         1
    #define MINIMUM_FIRMWARE_VERSION    "0.6.6"
    #define MODE_LED_BEHAVIOUR          "MODE"
/*=========================================================================*/

// Pin Configuration and Firmware Declarations

#define LED_PIN       13

const unsigned long
  BLINKTIME =         100;

unsigned long 
  t_blink =           0L;

int
  blinkState =        LOW;

// Create the bluefruit object, either software serial...uncomment these lines
/*
SoftwareSerial bluefruitSS = SoftwareSerial(BLUEFRUIT_SWUART_TXD_PIN, BLUEFRUIT_SWUART_RXD_PIN);

Adafruit_BluefruitLE_UART ble(bluefruitSS, BLUEFRUIT_UART_MODE_PIN,
                      BLUEFRUIT_UART_CTS_PIN, BLUEFRUIT_UART_RTS_PIN);
*/

/* ...or hardware serial, which does not need the RTS/CTS pins. Uncomment this line */
// Adafruit_BluefruitLE_UART ble(Serial1, BLUEFRUIT_UART_MODE_PIN);

/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);

/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST */
//Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
//                             BLUEFRUIT_SPI_MOSI, BLUEFRUIT_SPI_CS,
//                             BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);


// A small helper
void error(const __FlashStringHelper*err) {
  Serial.println(err);
  while (1);
}



/**************************************************************************/
/*!
    @brief  Sets up the HW an the BLE module (this function is called
            automatically on startup)
*/
/**************************************************************************/
void setup(void)
{
  pinMode(LED_PIN, OUTPUT);

  while (!Serial);  // required for Flora & Micro
  delay(500);

  Serial.begin(115600);
  Serial.println(F("Adafruit Bluefruit Command Mode Example"));
  Serial.println(F("---------------------------------------"));

  /* Initialise the module */
  Serial.print(F("Initialising the Bluefruit LE module: "));

  if ( !ble.begin() )
  {
    error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
  }
  Serial.println( F("OK!") );

  if ( FACTORYRESET_ENABLE )
  {
    /* Perform a factory reset to make sure everything is in a known state */
    Serial.println(F("Performing a factory reset: "));
    if ( ! ble.factoryReset() ){
      error(F("Couldn't factory reset"));
    }
  }

  /* Disable command echo from Bluefruit */
  ble.echo(false);

  Serial.println("Requesting Bluefruit info:");
  /* Print Bluefruit information */
  ble.info();

  Serial.println(F("Please use Adafruit Bluefruit LE app to connect in UART mode"));
  Serial.println(F("Then Enter characters to send to Bluefruit"));
  Serial.println();

  ble.verbose(false);  // debug info is a little annoying after this point!

  /* Wait for connection */
  while (! ble.isConnected()) {
      delay(500);
  }

  // LED Activity command is only supported from 0.6.6
  if ( ble.isVersionAtLeast(MINIMUM_FIRMWARE_VERSION) )
  {
    // Change Mode LED Activity
    Serial.println(F("******************************"));
    Serial.println(F("Change LED activity to " MODE_LED_BEHAVIOUR));
    ble.sendCommandCheckOK("AT+HWModeLED=" MODE_LED_BEHAVIOUR);
    Serial.println(F("******************************"));
  }
}

/**************************************************************************/
/*!
    @brief  Constantly poll for new command or response data
*/
/**************************************************************************/
void loop(void)
{
  // Now Check for incoming characters from Bluefruit
  ble.println("AT+BLEUARTRX");
  ble.readline();
  ble.waitForOK();

  String BLEbuffer = ble.buffer;

  if (BLEbuffer.length() && BLEbuffer.indexOf("OK") == -1) 
    Serial.print(F("[Recv] ")); Serial.println(BLEbuffer);


  if (BLEbuffer.indexOf("Status") >= 0) {
    Serial.println(F("Status Request Received"));
    ble.print("AT+BLEUARTTX=");
    if (t_blink) {
      ble.println("BLNK");
    }
    else {
      if (blinkState)
        ble.println("ON");
      else
        ble.println("OFF");
    }

    // check response stastus
    if (! ble.waitForOK() ) {
      Serial.println(F("Failed to get response"));
    }

    ble.println("AT+BLEUARTRX");

  }

  else if (BLEbuffer.indexOf("0") >= 0) {
    blinkState = LOW;
    digitalWrite(LED_PIN, blinkState);
    analogWrite(13, 0);
    analogWrite(11, 0);
    digitalWrite(18, LOW);
    digitalWrite(19, LOW);
    digitalWrite(20, LOW);
    digitalWrite(21, LOW);
    t_blink = 0;
    ble.print("AT+BLEUARTTX=");
    ble.println("OFF");
    //Serial.println(F("OFF Request Received"));
    ble.println("AT+BLEUARTRX");
  }
  else if (BLEbuffer.indexOf("1") >= 0) {
    //if (!t_blink) t_blink = millis();
    analogWrite(13, 100);
    analogWrite(11, 100);
    digitalWrite(18, HIGH);
    digitalWrite(19, LOW);
    digitalWrite(20, LOW);
    digitalWrite(21, HIGH);
    ble.print("AT+BLEUARTTX=");
    ble.println("FORWARD");
    //Serial.println(F("BLINK Request Received"));
    ble.println("AT+BLEUARTRX");
  }
  else if (BLEbuffer.indexOf("2") >= 0) {
    blinkState = HIGH;
    digitalWrite(LED_PIN, blinkState);
    analogWrite(13, 100);
    analogWrite(11, 100);
    digitalWrite(18, LOW);
    digitalWrite(19, HIGH);
    digitalWrite(20, HIGH);
    digitalWrite(21, LOW);

    t_blink = 0;
    ble.print("AT+BLEUARTTX=");
    ble.println("BACK");
    //Serial.println(F("ON Request Received"));
    ble.println("AT+BLEUARTRX");
  }
  else if (BLEbuffer.indexOf("3") >= 0) {
    analogWrite(13, 100);
    analogWrite(11, 100);
    digitalWrite(18, HIGH);
    digitalWrite(19, LOW);
    digitalWrite(20, HIGH);
    digitalWrite(21, LOW);
    ble.print("AT+BLEUARTTX=");
    ble.println("LEFT");
    //Serial.println(F("BLINK Request Received"));
    ble.println("AT+BLEUARTRX");
  }
  else if (BLEbuffer.indexOf("4") >= 0) {
    //if (!t_blink) t_blink = millis();
    analogWrite(13, 100);
    analogWrite(11, 100);
    digitalWrite(18, LOW);
    digitalWrite(19, HIGH);
    digitalWrite(20, LOW);
    digitalWrite(21, HIGH);

    ble.print("AT+BLEUARTTX=");
    ble.println("RIGHT");
    //Serial.println(F("BLINK Request Received"));
    ble.println("AT+BLEUARTRX");
  }
  BLEbuffer = "";
}

所有这一切应该做的每一个循环是读取一行,挑选字符,并运行该字符的代码块。我不认为它有什么理由滞后,因为数据量似乎非常小。此外,如果我将其插入并运行,则几乎没有延迟。一旦我拔掉它,它就会保持连接,除了巨大的延迟之外,一切都还能正常工作。

我最初的想法是,缓冲区中充满了“空白”命令,它必须在真正的命令之前处理所有这些命令,但如果是这样的话,它将滞后于串行监视器打开。

到目前为止,我已经尝试将波特率更改为一个较低的数字,认为300是最小的,如果问题是堆栈获得太多命令来对300进行排序,那么与我以前拥有的115600相比,这将是一个很小的数目,但没有结果。我也尝试了削减代码,这似乎是我可以使用的最低限度的代码,使它仍然有效。

我确实读过它可能有助于应用onSerialEvent()方法,但是当我尝试它时,它会被困在:

代码语言:javascript
复制
if ( ble.isVersionAtLeast(MINIMUM_FIRMWARE_VERSION) )
      {
        // Change Mode LED Activity
        Serial.println(F("******************************"));
        Serial.println(F("Change LED activity to " MODE_LED_BEHAVIOUR));
        ble.sendCommandCheckOK("AT+HWModeLED=" MODE_LED_BEHAVIOUR);
        Serial.println(F("******************************"));
      }

可能是电线的问题吗?例如,我可能需要一个电容器,然后电机,以防止他们必须“提升”到所需的电力,真正开始运动?我对电气不是很了解,但这只是一个想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-13 22:44:41

所以解决方案非常简单,我不认为它是BLE唯一的解决方案,因为它只与串行命令(即serial.print())有关。在设备不再与计算机连接后,在代码中包含这些命令将导致板对它们不作出响应,或在最终放弃之前尝试处理这些命令花费额外的时间(我对实际情况的猜测)。

解决方案是在上传到设备之前简单地注释掉所有的串行命令,以便在不插入的情况下运行代码。或者,您显然可以将它们全部删除,但下次尝试编辑代码时,可能会妨碍您的调试体验。

我认为,与其删除这个问题,不如用我发现的答案来回答未来可能会对其他人有所帮助的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49684738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档