Настройка потенциометра для работы мотора

franklin
Offline
Зарегистрирован: 06.09.2018

Всем привет. Не могу настроить потенциометр управления моторчиком так, чтобы при малейшем повороте вправо мотор начинал крутиться с минимальной скорость, а при выкручивании доконца мотор набирал скорость 100%

У меня получается два варианта: либо мотор стартует с середины указателя потенциометра при значении ШИМ 185 и набирает 100% скорости при максимально выкрученном потенциометра, либо

к нулевому значению я прибавляю значение чуть меньше 185 (к примеру 175), то мотор начинает крутиться при небольшом повороте потенциометра, но на середином положении мотор уже набирает скорость 100%. Подскажите, как мне осуществить задумку, я только начал осваивать arduino

 

const int input3 = 2; //переменная на драйвер мотора L293D контакт input3, разъем D2 на arduino
const int input4 = 3; //переменная на драйвер мотора L293D контакт input4, разъем D3 на arduino
const int enable2 = 5; //переменная на драйвер мотора L293D контакт enable2, разъем D5 на arduino. числом управляем скоростью мотора
#define pot A0 //переменная pot для потенциометра b10k, разъем A0
void setup() {
  Serial.begin(9600);
  pinMode(input3, OUTPUT); //инициализируем in3 как выход
  pinMode(input4, OUTPUT); //инициализируем in4 как выход
  pinMode(enable2, OUTPUT); //инициализируем en2 как выход
  pinMode(pot, INPUT);  //инициализируем pot как вход
}
void loop() 
{
  int x = analogRead(pot);   //задаем переменную x, данные с потенциометра 0-1023
  int y = map(x, 0, 1023, 0, 255); //задаем переменную y(x) в пределах 0-255  
  int z = y+175; //при значении z=185-190 мотор начинает крутиться. 
  digitalWrite(input3, HIGH);//направление вращения мотора
  digitalWrite(input4, LOW);//направление вращения мотора
//  if (y>135) 
//  {
    analogWrite(enable2, z);
 //   }
    if (y<11)
    {
      analogWrite(enable2, 0);
    }
    if (z>255)
    {
      analogWrite(enable2, 255);
    }
  Serial.print("x=");
  Serial.print(x);
  Serial.print("   y=");
  Serial.println(y);
  delay(200);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скорее всего Вам нужно взять потенциометр с правильной характеристикой (taper). У Вас какой? Поди логарифмический? Ну или программно её исправлять.

franklin
Offline
Зарегистрирован: 06.09.2018

Я взял B10K он линейный. Дело в том, что при ШИМ <185 мотор жужжит, но не крутится

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да и мотор тоже "логарифмический". Вы что думаете что скорость прямопропорционально напряжению на нем или скважности. Опять же скорость может проседать от большой нагрузке (моменте) на моторе. Особенно если напряжение пониженое.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот это не поможет: map(x, 0, 1023, 185, 255); ?

vvadim
Offline
Зарегистрирован: 23.05.2012

а мотор ваш подходит к драйверу  (или наоборот) ?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Если речь про DC-моторчик, то у него обратно-линейная характеристика скорости вращения от момента на валу: чем больше нагрузка (трение в т.ч.), тем меньше скорость. Есть т.н. "останавливающий момент" при котором скорость на валу 0.

Также, тяговый момент у него линейно зависит от тока, подаваемого на мотор. Чем больше ток - тем больший момент он может преодолеть на одной скорости. Для одного и того же момента на валу, ток мотора прямо и линейно зависит от напряжения на нем.

Якорь мотора + редуктор + исп. механизм обладают определенной инерцией к изменению скорости вращения. Она может быть достаточно велика, в миниуме - у меня получалось что-то около 16мсек для типового 130-го мотора с Али.

И последнее: ШИМ, подаваемый на мотор это периодический сигнал. Включено/выключено. Он конечно в значительной степени интегрируется конденсатором мотора, но не совсем.

Отсюда, если Вы хотите управлять скоростью мотора, требуется понимать что при изменении нагрузки значение ШИМ должно быть РАЗНЫМ. В частности, это относится к моменту трогания с места. И ещё: чем выше частота ШИМ, тем ХУЖЕ управляется мотор, особенно на "малых оборотах". Как ни странно.

Соответственно, если Вы хотите "стартовать" с меньшего ШИМ - попробуйте снизить его частоту. Далее, если Вы хотите управлять мотором ЛИНЕЙНО, потребуется снять его характеристику в рабочем состоянии (под нагрузкой) и уже по ней преобразовывать положение резистора в величину ШИМ. Небольшая табличка будет лучше справляться с задачей чем map().

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Както в РУ машинке делал при пуске на 10мс 100% а потом плавненько поднимал.
Тела находящиеся в спокойствии ленивые и им надо дать пинка - физика блин...
Или ввести обратную связь по оборотам + регулятор

franklin
Offline
Зарегистрирован: 06.09.2018

Мужики то ли я вас не понимаю, то ли вы не поймете, что я хочу :)

Мне нужно помочь с кодом. У меня обычный DC-моторчик от игрушек на 5V. Задумка такая: 

Изначально у меня был такой простой код

const int input3 = 2; //переменная на драйвер мотора L293D контакт input3, разъем D2 на arduino
const int input4 = 3; //переменная на драйвер мотора L293D контакт input4, разъем D3 на arduino
const int enable2 = 5; //переменная на драйвер мотора L293D контакт enable2, разъем D5 на arduino. числом управляем скоростью мотора
#define pot A0 //переменная pot для потенциометра b10k, разъем A0
void setup() {
  Serial.begin(9600);
  pinMode(input3, OUTPUT); //инициализируем in3 как выход
  pinMode(input4, OUTPUT); //инициализируем in4 как выход
  pinMode(enable2, OUTPUT); //инициализируем en2 как выход
  pinMode(pot, INPUT);  //инициализируем pot как вход
}
void loop() 
{
  int x = analogRead(pot);   //задаем переменную x, данные с потенциометра 0-1023
  int y = map(x, 0, 1023, 0, 255); //задаем переменную y(x) в пределах 0-255  
  digitalWrite(input3, HIGH);//направление вращения мотора
  digitalWrite(input4, LOW);//направление вращения мотора
    analogWrite(enable2, y);
  Serial.print("x=");
  Serial.print(x);
  Serial.print("   y=");
  Serial.println(y);
  delay(200);
}

Экспериментальным путем когда я крутил потенциометр и наблюдал значения X и Y в мониторе порта я выяснил, что при значении Y меньше 185 моторчик жужжит, но не крутится. А при значении Y=185 он начинает крутиться и скорость его возрастает до максимальной при значении Y=255. Как-то не прикольно было выкручивать наполовину потенциометр, чтобы он начал работать, а хотелось, чтобы я повернул чуть чуть ручку потенциометра (например на значение Y=10), а программа уже подставила в значение Y=185. А далее когда я продолжал выкручивать потенциометр, то значение Y росло плавно, параллельно оставшимся значениям на потенциометре.

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

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вот здесь же Вам всё написали: #4

franklin
Offline
Зарегистрирован: 06.09.2018

kalapanga пишет:

Вот здесь же Вам всё написали: #4

Поначалу не сработало, но потом поковырялся и все получилось!

Теперь код выглядит таким образом

const int input3 = 2; //переменная на драйвер мотора L293D контакт input3, разъем D2 на arduino
const int input4 = 3; //переменная на драйвер мотора L293D контакт input4, разъем D3 на arduino
const int enable2 = 5; //переменная на драйвер мотора L293D контакт enable2, разъем D5 на arduino. числом управляем скоростью мотора
#define pot A0 //переменная pot для потенциометра b10k, разъем A0

void setup() {
  Serial.begin(9600);
  pinMode(input3, OUTPUT); //инициализируем in3 как выход
  pinMode(input4, OUTPUT); //инициализируем in4 как выход
  pinMode(enable2, OUTPUT); //инициализируем en2 как выход
  pinMode(pot, INPUT);  //инициализируем pot как вход
}

void loop()
{
  int x = analogRead(pot);   //задаем переменную x, данные с потенциометра 0-1023
  int y = map(x, 0, 1023, 135, 255); //задаем переменную y(x) в пределах 0-255
  digitalWrite(input3, HIGH);//направление вращения мотора
  digitalWrite(input4, LOW);//направление вращения мотора
  if (x < 30) //x=30 примерно два-три градуса поворота потенциометра
  {
    analogWrite(enable2, 0);
  }
  else
  {
    analogWrite(enable2, y);
  }
  if (y > 245) //потенциометр дрожит, и не выдает значение 255. если y>245, то присваиваем y=255
  {
    analogWrite(enable2, 255);
  }
  //      Serial.print("x=");
  //      Serial.print(x);
  //      Serial.print("   y=");
  //      Serial.println(y);
  delay(200);
}

Если кто-нибудь напишет как правильнее написать, буду признателен :)

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Вас наверное еще сюрприс будет ждать в виде того что при нагрузке на валу он и со 185 не тронется:)
Обратная связь нужна...

franklin
Offline
Зарегистрирован: 06.09.2018

yul-i-an пишет:
Вас наверное еще сюрприс будет ждать в виде того что при нагрузке на валу он и со 185 не тронется:) Обратная связь нужна...

Точно, ждет :) Потом я буду использовать 24V DC-motor и блок питания для него. Ну и стартовое значение ШИМ подкорректирую под него. Спасибо

А что Вы имеете ввиду под обратной связью? Стало интересно

sadman41
Offline
Зарегистрирован: 19.10.2016

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

strarbit
Offline
Зарегистрирован: 12.06.2016

прямо сказать, не верно тестирование игрушка мотор и далее заменить на большой мотор. Будете иметь плохой опыт

sadman41
Offline
Зарегистрирован: 19.10.2016

Плохой опыт - это тоже хорошо. Если не совершать ошибок, то нельзя и научиться их преодолевать.