Бесщеточный двигатель "дергается" сам по себе при подключении к батарее
Я пытался создать приложение-слайдер 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, но послушно, если двигатель включается сам по себе, даже когда он должен быть остановлен, это очень опасно использовать.
@Brian J Yang, 👍1
Обсуждение1 ответ
попробуйте отсоединить ESC вместо ESC.write(0)
Не могли бы вы подробнее рассказать о своем ответе? Например, быстро объяснить, как отсоединить ESC и как это повлияет., @sa_leinad
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как заставить сервопривод вращаться на угол больше 180°
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Как повернуть серводвигатель на определенный угол?
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- 6 + 1 двигательей подключенных к arduino uno?
- Bluetooth-модуль HC-05 не принимает AT-команды
- Управление двигателями и сервоприводами с помощью L298N
пожалуйста, укажите фактический код вместо ссылки .... также добавьте принципиальную схему схемы, @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