Бесщеточный двигатель "дергается" сам по себе при подключении к батарее

Я пытался создать приложение-слайдер Bluetooth, которое могло бы управлять скоростью вращения бесщеточного двигателя. Передатчик, который я использую, - это Arduino Mega. Проблема , с которой я столкнулся, заключается в том, что мой двигатель начнет дергаться в очень случайные моменты времени, даже если мой код Arduino указывает ESC.write(0), то есть ESC должен оставаться полностью неподвижным.

Кроме того, я заметил, что подергивание начинается именно в тот момент, когда я подключаю свой модуль Bluetooth HM10 к Arduino. Двигатель по-прежнему может управляться слайдером в моем приложении, однако, даже когда слайдер установлен на ноль, двигатель включается сам по себе! Я приложу видео к этой проблеме по этой ссылке.

Пара вещей, которые я заметил, которые могут представлять интерес: когда пули ESC соприкасаются друг с другом, появляются слышимые искры, а также ожоговые отверстия.

Вот мой код arduino


/*
   -- Новый проект --
   
   Этот исходный код графического пользовательского интерфейса
был автоматически сгенерирован редактором RemoteXY.
   Для компиляции этого кода с помощью библиотеки RemoteXY 2.4.3 или более поздней версии
загрузите по ссылке http://remotexy.com/en/library/
   Подключение с помощью мобильного приложения RemoteXY по ссылке http://remotexy.com/en/download/
- для ANDROID 4.7.12 или более поздней версии;
     - для iOS 1.4.7 или более поздней версии;
    
   Этот исходный код является свободным программным обеспечением; вы можете распространять его и/или
   измените его в соответствии с условиями GNU Lesser General Public
   Лицензия, опубликованная Фондом свободного программного обеспечения; либо
   версия 2.1 Лицензии или (по вашему выбору) любая более поздняя версия.    
*/

//////////////////////////////////////////////
//        Библиотека RemoteXY include       //
//////////////////////////////////////////////

// RemoteXY select connection mode and include library 
#define REMOTEXY_MODE__SOFTSERIAL
#include <SoftwareSerial.h>

#include <RemoteXY.h>

#include <Servo.h>

Servo ESC; //create servo object

// RemoteXY connection settings 
#define REMOTEXY_SERIAL_RX 10
#define REMOTEXY_SERIAL_TX 11
#define REMOTEXY_SERIAL_SPEED 9600


// RemoteXY configurate  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,2,0,0,0,60,0,11,13,1,
  4,0,23,16,17,64,2,26,2,0,
  31,5,22,11,2,26,31,31,79,78,
  0,79,70,70,0,129,0,5,7,18,
  6,17,76,69,68,0,129,0,15,85,
  37,6,17,83,101,114,105,97,108,32,
  111,117,116,112,117,116,0 };
  
// this structure defines all the variables and events of your control interface 
struct {

    // input variables
  int8_t slider_1; // =0..100 slider position 
  uint8_t switch_1; // =1 if switch ON and =0 if OFF 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

int power = 8;
int ledPin = 2;

void setup() 
{
  RemoteXY_Init (); 

  digitalWrite(LED_BUILTIN, HIGH);
  // TODO you setup code

  pinMode (LED_BUILTIN, OUTPUT);
  pinMode (power, OUTPUT);
  pinMode (ledPin, OUTPUT);
  //pinMode (7, OUTPUT);
  //int ledMapping;

  ESC.attach(6, 1000, 2000); //attach ESC to output from pin 6
  
  Serial.begin(9600);
}

void loop() 
{ 
  RemoteXY_Handler ();


  //Serial.println(RemoteXY.slider_1);
  digitalWrite(power, HIGH); //supply power to Bluetooth module through pin 8
  //digitalWrite(7, HIGH);
  int ledMapping = map(RemoteXY.slider_1, 0, 100, 0, 255);
  //Serial.println(ledMapping);
  analogWrite(ledPin, ledMapping);

  int spinMapping = map(RemoteXY.slider_1, 0, 100, 0, 180); //map the slider to the servo
  if (RemoteXY.switch_1 == 1){
  ESC.write(spinMapping); //write to the ESC the value of mapped slider
  }
  else if (RemoteXY.switch_1 == 0){
  ESC.write(0);
  }
  Serial.println(spinMapping);
  
  if(RemoteXY.switch_1 == 1){
  digitalWrite(LED_BUILTIN, HIGH);
  }
  else if (RemoteXY.switch_1 == 0){
   digitalWrite(LED_BUILTIN, LOW);
  }
  
  // TODO you loop code
  // use the RemoteXY structure for data transfer
  // do not call delay() 


}

Но я не думаю, что это проблема. Причина в том, что, хотя у меня есть ESC.write(0), когда светодиодный переключатель выключен, ESC все еще вращается (как видно из видео) случайным образом и дергается.

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

, 👍1

Обсуждение

пожалуйста, укажите фактический код вместо ссылки .... также добавьте принципиальную схему схемы, @jsotola

в чем заключается ваш вопрос? ... это сайт для вопросов и ответов, @jsotola

`Вот мой код arduino, в котором, по-моему, нет проблемы. Причина в том, что, хотя у меня есть ESC.напишите(0), когда светодиодный выключатель выключен"... откуда вы знаете, что светодиод выключен? ... код светодиода находится в инструкции "если", отличной от кода двигателя ... кроме того, светодиод может гореть очень недолго, и вы никогда его не увидите ... ваш код не содержит функций отладки, которые можно было бы использовать для подтверждения ваших мыслей, @jsotola

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

@jsotola спасибо за ответы. Я должен уточнить: я использовал RemoteXY, приложение, которое позволяет Arduino взаимодействовать со смартфоном через Bluetooth. Я знаю, что переменная slider_1 установлена в ноль (так как индикатор built_in включается и выключается, когда ползунок включен и выключен), поэтому код должен ввести другое значение, если (slider_1 ==0) {ESC.запись(0)} раздел. Я подозреваю, что это так, однако, возможно, неисправное соединение может привести к тому, что ESC будет подавать питание на двигатель независимо от логических утверждений в коде?, @Brian J Yang

"неисправное соединение может привести к тому, что ESC будет подавать питание на двигатель" ... начните думать о тестировании отдельных компонентов ... проверьте теорию "плохого соединения"... напишите код, который запускает двигатель на одну или две секунды, останавливает двигатель на пять секунд и повторяет, @jsotola

посмотрите на пример кода blinkWithoutDelay ... измените его так, чтобы светодиод выключался каждую секунду или две, независимо от того, в каком он находится состоянии.... включите светодиод с помощью if(RemoteXY.switch_1 == 1){ .... это сообщит вам, есть ли какие-либо фантомные нажатия кнопок .... в принципе, светодиод включается только нажатием кнопки, и только время ожидания отключает его .... очень высока вероятность того, что светодиод будет гореть достаточно долго, чтобы вы могли его увидеть, если будет получено фантомное нажатие кнопки, @jsotola


1 ответ


1

попробуйте отсоединить ESC вместо ESC.write(0)

,

Не могли бы вы подробнее рассказать о своем ответе? Например, быстро объяснить, как отсоединить ESC и как это повлияет., @sa_leinad