Два регулятора с одним потенциометром

macsim25m
Offline
Зарегистрирован: 07.05.2018

Добрый день, коллеги! Вопрос такого характера, имею ардуино, потенциометр и два регулятора оборотов подключенных к бессколекторным двигателям.

Суть вопроса, как реализовать в коде, чтобы один из моторов, при вращении потенциометра, вращался в 2,3 или 4 раза медленнее, по отношению ко второму. Код предоставляю.

#include <Servo.h> 

Servo motor_left;
Servo motor_right;

int mot_pin_left = 1;    //Подключаем левый мотор к пину 1
int mot_pin_right = 2;   //Подключаем правый мотор к пину 2

int js_position = 1500;  //Начальная позиция, всегда 1.5 мс для регуляторов бесколлекторных двигателей
int max_position = 2300; //Максимальное значение ШИМ 2.3 мс
int min_position = 800;  //Минимальное значени ШИМ 0.8 мс

int start = 1;  //Флаг задержки запуска

void setup() 
{
  motor_left.attach(mot_pin_left, js_position, max_position);    //Инициальзация левого мотора (порт, начальная позиция, максимальная позиция)       !!!
  motor_right.attach(mot_pin_right, js_position, max_position);  //Инициальзация правого мотора (порт, начальная позиция, максимальная позиция)      !!!
} 

void loop() 
{
  //Начальная установка регуляторов в нулевое положение
  if(start == 1) {
    motor_left.write(js_position);
    motor_right.write(js_position);
    
    delay(700);
    start = 0;
  }
  
  js_position = analogRead(A0);  //Считывание положения потенциометра
  
  js_position = map(js_position, 0, 1023, 75, 140);  //Преобразование положения потенциометра в угол поворота
  motor_left.write(js_position);     //Записываем положение и отправляем на регулятор левого мотора
  motor_right.write(js_position);    //Записываем положение и отправляем на регулятор правого мотора
  
  delay(20);  //Задержка цикла 20 мс
}

 

5N62V
Offline
Зарегистрирован: 25.02.2016

macsim25m пишет:

Суть вопроса, как реализовать в коде, чтобы один из моторов, при вращении потенциометра, вращался в 2,3 или 4 раза медленнее, по отношению ко второму. Код предоставляю.



Здравствуйте! Введите переменную, которая будет зависеть от положения резистора, и будет собой представлять делитель на 2, 3  или 4. 

macsim25m
Offline
Зарегистрирован: 07.05.2018

Спасибо, понял, но какое значение делить на 2,3,4?

5N62V
Offline
Зарегистрирован: 25.02.2016

значение , которое Вы передаете на тот  мото, который должен крутиться медленнее.

Можно так попробовать.

js_position = analogRead(A0);  //Считывание положения потенциометра
byte scaler =    map(js_position, 0, 1023, 2, 4);
  js_position = map(js_position, 0, 1023, 75, 140);  //Преобразование положения потенциометра в угол поворота

  motor_left.write(js_position);     //Записываем положение и отправляем на регулятор левого мотора

  motor_right.write(js_position/scaler);    //Записываем положение и отправляем на регулятор правого мотора

А зачем Вам так надо сделать?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я так понял речь о скорости, а не о угле поворота.

macsim25m
Offline
Зарегистрирован: 07.05.2018

Да, о скорости вращения мотора

macsim25m
Offline
Зарегистрирован: 07.05.2018

Теперь правый мотор совем не крутится. 

Делаю для машинки, чтобы передние колеса крутились быстрее задних.

5N62V
Offline
Зарегистрирован: 25.02.2016

macsim25m пишет:

Теперь правый мотор совем не крутится. 

Делаю для машинки, чтобы передние колеса крутились быстрее задних.

Еще больше заинтриговали.... 

Не крутится - выведите в монитор значения которые получаются, и срасните с теми, которые Вы хотели бы увидеть.

macsim25m
Offline
Зарегистрирован: 07.05.2018

Мотор крутится в промежутке от 79 до 140, при делении на 2, значения не попадают в этот диапазон. Получается надо как-то выставить минимум 79, и максимум, напрмер, 100. А как?

5N62V
Offline
Зарегистрирован: 25.02.2016

macsim25m пишет:

Мотор крутится в промежутке от 79 до 140, при делении на 2, значения не попадают в этот диапазон. Получается надо как-то выставить минимум 79, и максимум, напрмер, 100. А как?

Тогда крайнюю строчку так и пишите:

unsigned int sendRight = js_position/scaler;
if (sendRight<79) motor_right.write(79);
if (sendRigh>100) motor_right.write(100);
if (sendRigh<=100 &&sendRight>=79 ) motor_right.write(sendRight);

 

nik182
Offline
Зарегистрирован: 04.05.2015
 js_positionL = map(js_position, 0, 1023, 79, 140); 
 js_positionR = map(js_position, 0, 1023, 79, 110);
 motor_left.write(js_positionL);  
 motor_right.write(js_positionR);  

 

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

macsim25m пишет:

Мотор крутится в промежутке от 79 до 140, при делении на 2, значения не попадают в этот диапазон. Получается надо как-то выставить минимум 79, и максимум, напрмер, 100. А как?

А смысл? Как Вы потом собираетесь делить это на 2 и на 4? Оно же из интервала вылетит.

Тогда уж дедлить надо не само число, а его превышение над 79.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

Вне зависимости от нагрузки.

И законы физики его не волнуют.

Если на один мы подаем 79, то сколько надо подавать на второй, чтобы он крутился вдвое медленнее?

macsim25m
Offline
Зарегистрирован: 07.05.2018

nik182 пишет:

 js_positionL = map(js_position, 0, 1023, 79, 140); 
 js_positionR = map(js_position, 0, 1023, 79, 110);
 motor_left.write(js_positionL);  
 motor_right.write(js_positionR);  

 

спасибо, этот способ работает!!!

macsim25m
Offline
Зарегистрирован: 07.05.2018

andriano пишет:

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

Вне зависимости от нагрузки.

И законы физики его не волнуют.

Если на один мы подаем 79, то сколько надо подавать на второй, чтобы он крутился вдвое медленнее?

Здравствуйте, 79 это минимальное значение. И была задача чтобы переднее шасси крутилось быстрее чем заднее. И нужно было чтобы при увеличении газа, переднее шасси увеличивал скорость, а заднее шасси увеличивал скорость медленнее.

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

Думаю, что тут вам нужно почитать про алгоритмы разгона/торможения моторов в 3D принтерах. Вам нужна трапециевидная характеристика, только для одного мотора (пары моторов) с более пологим боковыми сторонами. Тогда шасси будут разгонятся с разными ускорениями, но в итоге выйдут на одно и то же значение.