Управление трактором с помощью джойстика

Ага. Полуоси из легированной термообработанной стали. Такие вещи не подлежат сварке.
Надо полуоси помощней, либо как-то иначе колёса крепить.
Подозреваю срезало не от веса трактора, а от динамических нагрузок. В системе ДВС-НАСОС-ГИДРОМОТОР должен быть демпфер, дабы исключить жесткие гидроудары, либо перепускной клапан на распределителе настроить на меньшее давление.
Вообще надо хотя бы примерно посчитать вес, скорость, максимальный крутящий момент трактора, далее выбирать насос по рабочему объёму и характеристикам ДВС. Это в двух словах.

Всем доброгод дня.
Я вернулся. Сделал все изменения. Полностью переделал подвеску. Теперь это поворотные кулаки от ВАЗ 2108. В гранату вварена втулка которая одевается на гидромотор. Все работает уже отрабатываю навыки управления.
Работа гидросистемы не совсем так как я планировал. Но в принципе хорошо.
Я думал у меня будет на входе в гидрораспределитель высокое давление. И при включении гидрораспределителя оно будет направлятся на работу гидромоторов. Оказалось что гидрораспределитель в нейтральном положении стравливает все давление и оно близко к нулю. А при его включении канал слива перекрывается и с этого момента давление начинает расти и приводит в работу гидромоторы.
Из-за этого пришлось изменять логику управления. А именно при разворотах вокруг своей оси требуется давления значительно больше чем просто для движения вперёд. И чтобы он начал вращаться нужно добавлять обороты двигателя иначе производительности насосов не хватает. А так как у меня рычаг газа был типа как у самолёта. То есть добавил и он остался в том положении, то получалось так что если много добавил трактор начинал вращаться довольно быстро и при отпускании джойстика было некомфортно. Сейчас я сделал педаль газа и регулирую угловую скорость вращения с помощью газа. Ну и вообще удобно на малых оборотах задаешь джойстиком направление движения и потом добавляешь скорость. Максимум 15 км. При том двигатель работает на больших оборотах. Поэтому даже при резкой установке джойстика в нейтральное положение все безопасно.
Это в крации.

Теперь о том что нужно доработать.
Думаю надо менять чувствительность джойстика. На стенде работало все нормально. Но на испытаниях. Не получается плавного изменения скорости путем изменения хода джойстика. То есть добавляешь добавляешь он стоит потом проходит какой-то рубеж и гидрораспределитель сразу открывается на большую величину и происходит не большой но рывок. И потом он как на максимуме едет. Конечно газ выручает. Но при разворотах получается что сторона которая должна замедлиться она либо останавливается либо едет также как и другая сторона.
Я думаю надо измерить напряжение при котором идёт срабатывание и настроить на его изменение Ардуино.

И ещё несколько раз было так при движении задом при заруливании в гараж двигаеешся по тихонько тронешься остановиться то есть такими имльсами. И пару раз было что Ардуино зависало и трактор переставал откликаться на джойстик. При том это происходило в движении. И чтобы остановиться приходилось использовать аварийное обестачивание системы

После обесточивания все начинало работать нормально.

Возможно я что-что путаю, но гидрораспределители бывают разной степени “плавности”. На крайний случай можно доработать напильником золотник, сделав плавные заходы.
Ну и проблема нелинейности движения от положения органа управления прогнозируема.
Особенно электрораспределитель смущает.
Смотрел устройство ПУМ-500 и подобных? Там всё решено.
Ща почитал, у гидрораспределителей такая характеристика есть “фаза точного управления”. Как раз то самое.

Сейчас испытываю замерил напряжение на выходе Ардуино. Очень очень плавно перемешял джойстик. На напряжении 1.6 вольта оожил. И абсолютно не важно какие обороты были на двигателе. Напряжение на входе в гидрораспределитель было 6,5- 7 вольт. Максимальные значения пока на могу измерить точно

С одной стороны - Поздравляю, что процесс идет в нужную сторону!
С другой, Все эти косяки вполне ожидаемые. почему неоднократно про безопасность и писали.

Сейчас нужно как-то откалибровать электрическую часть и джойстик тут наверно не очень удобен. Желательно плавно изменять ШИМ, видеть сколько его есть и сопоставлять с троганием и скоростью.
Там сейчас в схеме есть какой-то знаковый индикатор или ничего?

Измерил максимальное напряжение. Меня очень сильно удивило то что после 11 вольт никакого изменения я не обнаружил. Получается хоть и на электромагнитах написано 24 вольта . Мне хватит 12. Я подключил через 12 Вольт управление и значения стали на выходе Ардуино минимальное 3 Вольта максимальное 5.
Остаётся изменить программу и должно получиться что дергания исчезнут. Даже при 12 волтах уже стало приятней управлять. А единственно очень большой холостой ход. Но ход джойстика стал менее чувствительный

3 волта и 5 это как раз ШИМ сигнал
Просто я именно его значения и определял.

То что ты намерил тестером это просто некие попугаи, которые сложно отождествить со значением ШИМ на ардуине, в чем и вопрос.
Желательно сразу четко задавать цифровое значение и смотреть , что при этом получается.
Потом можно будет сделатьь некую таблицу перекодировки для джойстика

У меня есть тестер. И да я измерил значения при которых трактор начал оживать. прикинул что от 0 до 255 это 0-5 вольт значит 150-255 это и будет 3-5 вольт.
Вот так изменил не знаю павильно?

// пин светодиода
const uint8_t Led = 13;

// пины осей джойстика
const uint8_t pin_joyX = A0; // пин оси Х джойстика
const uint8_t pin_joyY = A1; // пин оси Y джойстика
const uint8_t pin_joyZ = A2; // пин оси Z джойстика
// пины клапанов
const uint8_t pin_valweFL =  5; // пин электромагнита A (вперед левая)
const uint8_t pin_valweFR = 9; // пин электромагнита B (вперед правая)
const uint8_t pin_valweBL = 10; // пин электромагнита C (назад левая)
const uint8_t pin_valweBR = 11; // пин электромагнита D (назад правая)

// это калибровки джойстика (минимум, центр, максимум), они для каждой оси могут быть разные
// можете замерить 1 раз и вписать в программу, можете потом всетаки реализоввать калибровку, как я очень советую
// ВАЖНО пишем реальное значение "до упора"
// Если "до упора вперед" это 600, а "до упора назад" это 200 то так и пишем, по возрастанию не сортируем!
int16_t   joyX_F_max = 415; // X до упора вперед
int16_t     joyX_mid = 505; // X центр
int16_t   joyX_B_max = 610; // X до упора назад
int16_t   joyY_L_max = 405; // Y до упора влево
int16_t     joyY_mid = 505; // Y центр
int16_t   joyY_R_max = 630; // Y до упора вправо
int16_t  joyZ_CW_max = 430; // Z до упора по часовой
int16_t     joyZ_mid = 528; // Z центр
int16_t joyZ_CCW_max = 649; // Z до упора против часовой

// это отклонения джойстика от центра, которые будут игнорироваться (называется death zone - мертвая зона)
// нужно чтобы избегать нежелательные срабатывания когда сенсоры джойстика немного "поплывут"
// от разницы температуры или изменения окружающего магнитного поля
const uint8_t joy_dz = 15;

// вычисляем начало интервалов для каждой оси, с учетом калибровки центров и мертвой зоны
// эта часть вычислит правильно независимо от того, в цифрах joyX_F_max больше или меньше чем joyX_B_max (и так же для остальных осей)
int16_t   joyX_F_min =   joyX_F_max > joyX_mid ? joyX_mid + joy_dz : joyX_mid - joy_dz;
int16_t   joyX_B_min =   joyX_B_max > joyX_mid ? joyX_mid + joy_dz : joyX_mid - joy_dz;
int16_t   joyY_L_min =   joyY_L_max > joyY_mid ? joyY_mid + joy_dz : joyY_mid - joy_dz;
int16_t   joyY_R_min =   joyY_R_max > joyY_mid ? joyY_mid + joy_dz : joyY_mid - joy_dz;
int16_t  joyZ_CW_min =  joyZ_CW_max > joyZ_mid ? joyZ_mid + joy_dz : joyZ_mid - joy_dz;
int16_t joyZ_CCW_min = joyZ_CCW_max > joyZ_mid ? joyZ_mid + joy_dz : joyZ_mid - joy_dz;



void setup() {

  pinMode(Led, OUTPUT);
  pinMode(pin_valweFL, OUTPUT);
  pinMode(pin_valweFR, OUTPUT);
  pinMode(pin_valweBL, OUTPUT);
  pinMode(pin_valweBR, OUTPUT);
  
  Serial.begin(9600);
  
}



void loop() {

  // это мы получаем "сырые" показания с датчиков холла (оси джойстика) как есть
  int16_t joy_X = analogRead(pin_joyX);
  int16_t joy_Y = analogRead(pin_joyY);
  int16_t joy_Z = analogRead(pin_joyZ);
  
  // нормализуем значения
  // функция map() нам пропорционально приведет занчение с холла из интервала joyX_F_min..joyX_F_max к интервалу 0..255
  // но эта функция позволяет выходить за рамки интервала, если joy_X не лежит в пределах joyX_F_min..joyX_F_max
  // и получится значение за пределами интервала 0..255
  // поэтому используем функцию constrain(), которая обрежет результат выполнения map() до нужных 0..255
  int16_t          forward = constrain(map(joy_X,   joyX_F_min,   joyX_F_max, 150, 255), 0, 255); // полуось джойстика "вперед"
  int16_t         backward = constrain(map(joy_X,   joyX_B_min,   joyX_B_max, 150, 255), 0, 255); // полуось джойстика "назад"
  int16_t             left = constrain(map(joy_Y,   joyY_L_min,   joyY_L_max, 150, 255), 0, 255); // полуось джойстика "влево"
  int16_t            right = constrain(map(joy_Y,   joyY_R_min,   joyY_R_max, 150, 255), 0, 255); // полуось джойстика "вправо"
  int16_t        clockwise = constrain(map(joy_Z,  joyZ_CW_min,  joyZ_CW_max, 150, 255), 0, 255); // полуось джойстика "по часовой"
  int16_t counterclockwise = constrain(map(joy_Z, joyZ_CCW_min, joyZ_CCW_max, 150, 255), 0, 255); // полуось джойстика "против часовой"
  
//  /* для отладки выведем в порт значения
  Serial.println("forward: " + String(forward) +
              ", backward: " + String(backward) +
                  ", left: " + String(left) +
                 ", right: " + String(right) +
             ", clockwise: " + String(clockwise) +
      ", counterclockwise: " + String(counterclockwise));/**/
  
  // теперь у вас нормализованные значения 0..255, на их основе можно вычислить степень открытости клапанов
  // причем по одной оси только одно значение сможет быть больше нуля, если джойстик вообще был отклонен
  
  // значения для клапанов
  int16_t valweFL = 0; // электромагнит A (вперед левая)
  int16_t valweFR = 0; // электромагнит B (вперед правая)
  int16_t valweBL = 0; // электромагнит C (назад левая)
  int16_t valweBR = 0; // электромагнит D (назад правая)
  
  if (forward > 0 || backward > 0) {
    // есть движение вперед или назад, повороты замедлением одной стороны
    valweFL = constrain( forward -  left, 150, 255);
    valweFR = constrain( forward - right, 150, 255);
    valweBL = constrain(backward -  left, 150, 255);
    valweBR = constrain(backward - right, 150, 255);
  } else {
    // нет движения вперед или назад, делаем разворот
    valweFL = clockwise;
    valweFR = counterclockwise;
    valweBL = counterclockwise;
    valweBR = clockwise;                 
  }
  
  // выводим ШИМ
  analogWrite(pin_valweFL, valweFL);
  analogWrite(pin_valweFR, valweFR);
  analogWrite(pin_valweBL, valweBL);
  analogWrite(pin_valweBR, valweBR);
    
//  /* для отладки выведем в порт значения
  Serial.println("valweFL: " + String(valweFL) +
               ", valweFR: " + String(valweFR) +
               ", valweBL: " + String(valweBL) +
               ", valweBR: " + String(valweBR));/**/

}

Специально для вас.
Пришлось зарегистрироваться на rutub
Вот ссылка испытаний

1 лайк

Хорошая самоделка, ездит.
При повороте переднее колесо, расположенное с той стороны в которую осуществляется поворот, двигается боком и соответственно “скачет”, не из-за этого ли срезало полуоси?

С логикой тут все правильно, но сам тестер не обязан правильно усреднять импульсные сигналы, поэтому нельзя сказать насколько точен такой переход.
Из этой ситуации как минимум 2 выхода.

  1. То что ты начал делать сейчас, пытаться подобрать нужные параметры опытным путем, методом последовательного приближения. В какой-то степени это наверняка улучшит ситуацию, но если в системе имеются какие-то нелинейные переходы, то бороться с ними будет не просто.
  2. Вариант, что написал выше. Т.е. точно выставляется значение ШИМ и смотрится реакция системы, тогда нелинейности сразу станут видны и алгоритм управления можно описать более точно. Но это сама по себе отдельная работа получается.

Это уже к программистам, мне нет смысла влезать в эту область.

и заднее тоже, движется по дуге, гипотенуза всегда больше любого катета, если Пифагор не врёт

2 лайка

Логично. 4 колеса разворачиваются всегда со скольжением. Ведь гидромоторы одной стороны подключены последовательно. То есть связь жёсткая. Можно параллельно попробовать, будет гидравлический дифференциал.

по грязи пойдёт, а вот по асфальту и твёрдому покрытию будут большие проблемы

Можно распределитель в схему ввести для переключения этих режимов.

видимо трансмиссию надо делать по схеме БТР-70