@Tiamon

Как в Arduino развернуть данные?

Возможно вопрос поставлен не верно, но ситуация такая.
Играюсь с джойстиком от PS2 и от крутилок получаю данные
ps2x.Analog(PSS_LX);
от 127 до 0 это рычажок наклонили влево, причем 0 это максимально наклонен
128 это цифра покоя
от 129 до 255 наклонили в право, 255 это максимально

Хотелось бы передать это усилие от наклона джойстика на мотор через шим
где это самое усилие или скорость уже от 0 до 4095 или в другом варианте от 0 до 255

Сейчас я делаю так

//----------Мотор 5, захват----------------------------

    if (analogPSS_RX < 120 && analogPSS_RX != 0) {                         //Движение в верх
      drive5Up = 1;
    } else {
      drive5Up = 0;
    }

    if (analogPSS_RX > 150) {                         //Движение в низ
      drive5Down = 1;
    } else {
      drive5Down = 0;
    }

if (drive5Up == 1 && drive5Down == 0) {
      MSS.analogWrite(14, 2047);                                // Устанавливаем на 0 выводе     сигнал ШИМ с коэффициентом заполнения 1023 (25%), допускаются значения от 0 до 4095
      MSS.analogWrite(15, 0);                             // Устанавливаем на 1 выводе     сигнал ШИМ с коэффициентом заполнения 2047 (50%), допускаются значения от 0 до 4095
    }

    if (drive5Down == 1 && drive5Up == 0) {
      MSS.analogWrite(14, 0);                             // Устанавливаем на 0 выводе     сигнал ШИМ с коэффициентом заполнения 1023 (25%), допускаются значения от 0 до 4095
      MSS.analogWrite(15, 2047);                                // Устанавливаем на 1 выводе     сигнал ШИМ с коэффициентом заполнения 2047 (50%), допускаются значения от 0 до 4095
    }


Но хотелось бы регулировать скорость с джойстика, но не понимаю как.
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
развернуть

Как-то так

// LEFT --> [127 ... 0] --> [32 ... 4095]
// 
// RIGHT --> [129 ... 255] --> [32 ... 4095]

int calc_speed(int value)
{
  int speed = 0; // для наглядности без ? :
  if(value > 128)
  {
    speed = 4095 / 127 * (value - 128);
  }
  else
  {
    speed = 4095 / 127 * (128 - value);
  }
  return speed;
}

void drive_forward(int speed)
{
  MSS.analogWrite(15, 0);
  MSS.analogWrite(14, speed);                                
}

void drive_backward(int speed)
{
  MSS.analogWrite(14, 0);                             
  MSS.analogWrite(15, speed);
}

void stop()
{
  MSS.analogWrite(14, 0);                             
  MSS.analogWrite(15, 0);
}

void move()
{
  int ds = ps2x.Analog(PSS_LX);
  
  if(ds > 128)
  {
    drive_forward(calc_speed(ds));
  }
  else if(ds < 128)
  {
    drive_backward(calc_speed(ds));
  }
  else
  {
    stop();
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@evgeniy_lm
Если совсем примитивно map тебе в помощь. Если реально, то обороты двигателя серьезно зависят от нагрузки и не будут пропорциональны ШИМ. Т.е. если ШИМ 100 увеличить до 200 это вовсе не значит, что обороты возрастут в двое. В случае если нагрузка постоянная то можно записать таблицу значений ШИМ для каждого значения джойстика (или не для каждого, а промежуточные вычеслять)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы