Нужно исправить код

AVD
Offline
Зарегистрирован: 09.06.2012

 Делаю проект- ROV подводный аппарат, управление с джостика через Python.

Вот код Ардуино:

[CODE]void loop()
{
// ждем 3 байта
if (Serial.available() > 2) {
// первый байт
startbyte = Serial.read();
// проверяем (255) ...
if (startbyte == 255) {
// следующие два бйта
for (i=0;i<2;i++) {
userInput[i] = Serial.read();
}
// первый байт = серво перемещение
servo = userInput[0];
// второй байт = положение
pos = userInput[1];
// проверка ошибок
if (pos == 255) { servo = 255; }

// Новая позиция серво
switch (servo) { // движение с перменной pos
case 1: // Ось Х
servo1.write(pos); // вперед, назад
break;
case 2: // Ось Y
servo2.write(pos); // лева, право 
break;
case 3: // Центральный мотор глубины
servo3.write(pos);
break;
case 4: // Серва камеры
servo4.write(pos);
break;

 

В такой схеме все ок!

но мне надо упровление двумя двигателями по двум осям (стоят по бокам аппарата):

1.вперед- работают два мотора

2. вперед и в лева- один мотор сбрасывает обороты, не выключается !!!

3. и т.д.

вот код 2 этой схемы:



[CODE]void loop()
{
  // ждем 3 байта
  if (Serial.available() > 2) {
    // первый байт
    startbyte = Serial.read();
    // проверяем  (255) ...
    if (startbyte == 255) {
      // следующие два бйта
      for (i=0;i<2;i++) {
        userInput[i] = Serial.read();
      }
      // первый байт = серво перемещение
      servo = userInput[0];
      // второй байт = положение
      pos = userInput[1];
      // проверка ошибок
      if (pos == 255) { servo = 255; }
   

      // Новая позиция серво
      switch (servo) {        // движение с перменной pos
        case 1:                // Ось Х
          servo2.write(pos);  // левый вперед, назад
          servo5.write(pos);  // правый вперед,назад
          break;
        case 2:                // Ось Y
          servo2.write(pos);  // левый двигатель реверс( в Питоне поставил в реверс)
          servo5.write(pos);  // правый двигатель вперед
 
          break;
        case 3:                // Центральный мотор глубины
          servo3.write(pos);
          break;
        case 4:                // Серва камеры
          servo4.write(pos);
          break;
.. вот такая схема работает но ! как только задеваю ось X или Y серва пытается уйти в 90 гр. т.е. по отдельности все ок.
[/CODE]

 Как быть?

step962
Offline
Зарегистрирован: 23.05.2011

"Ничччего не понимаю...
Аналогично, шеф" (с)

Что вы подразумеваете под задеванием осей?

Куда у вас ходят сервы?

И чем таки вы управляете - оборотами двигателей или поворотом их. Или поворотом рулевых плоскостей?

Что в поведении аппарата не так?

Как аппарат должен реагировать, чтобы было "так"?

Что "ОК" по-отдельности?

Хотите дельного совета - корректно сформулируйте проблему, требующую решения. Расскажите, какую логику вы собираетесь реализовать, опишите конкретные ситуации, когда на определенные действия органами управления вы ожидаете определенной реакции (какой!?), а получаете что-то невразумительное (как конкретно выглядит это невразумительное!?).

А то

"С одним двигателем все ОК, а с двумя не ОК. Поможите, люди добрые!!!"

AVD
Offline
Зарегистрирован: 09.06.2012

 

Step962 

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

Управление - оборотами двигателя.

 

Сервы это имитаторы моторов -регулятора скорости(далее серво). так безопасней работать ).

Что не так:

На ось Y подключены два двигателя, выходы №2 и №5, и №5 стоит в реверсе. при наклоне джойстика на лево или на право аппарат крутиться на месте.

все как мне и нужно, но движение вперед на данный момент обеспечивает еще один двигатель что не удобно, а нужно сделать так что бы двигатели №2 и №5 обеспечивали движение вперед .

в коде 2 сделал так как мне надо, то есть ось Х управляет движением вперед а ось Y разворотом, но если смешиваем две оси X + Y допустим поворачиваем на право с движением в перед то сервы(моторы) сходят с ума, наровясь каждый раз при пересечении осей занят центральное положение, а всего то надо снизить скорость у мотора № 5 или если на лева то №2, как то так...

 

 

step962
Offline
Зарегистрирован: 23.05.2011

 Ось X, ось Y... Это что?

Пытаюсь угадать, что вы вкладываете в эти понятия - и не могу.

Это как-то с двигателями связано, или с джойстиком?

Мне думается -  с джойстиком, но до конца не уверен. А вы продолжаете хранить тайну.

 

AVD
Offline
Зарегистрирован: 09.06.2012

 X Y ось джойстика

step962
Offline
Зарегистрирован: 23.05.2011

 Если я правильно понял, ось Y у вас отвечает за вправо-влево. Так, или я ошибаюсь?

Если так, то по каким таким соображениям вы решили горизонтальную ось (традиционно X) обозвать "Y"?

AVD
Offline
Зарегистрирован: 09.06.2012

 перепутал )

 

step962
Offline
Зарегистрирован: 23.05.2011

 Не знаю, как у вас, а у меня представление о правильном управлении двумя двигателями (сервами) с помощью одного джойстика такое:

 

1) джойстик вперед - оба двигателя вперед (сервы из нейтрального положения - вперед). Скорость вращения двигателей (угол отклонения качалок сервоприводов) пропорциональна углу отклонения джойстика вперед

 

2) джойстик назад - оба двигателя назад (сервы из нейтрального положения - назад). Скорость вращения двигателей (угол отклонения качалок сервоприводов) пропорциональна углу отклонения джойстика назад.

3) джойстик влево - правый двигатель вперед (правая серва из нейтрального положения - вперед), левый двигатель назад (левая серва из нейтрального положения - назад). Скорости вращения двигателей (уголы отклонения качалок сервоприводов) пропорциональны углу отклонения джойстика влево.

4) джойстик вправо - правый двигатель назад (правая серва из нейтрального положения - назад), левый двигатель вперед (левая серва из нейтрального положения - вперед). Скорости вращения двигателей (уголы отклонения качалок сервоприводов) пропорциональны углу отклонения джойстика вправо.

Эти четыре случая сложностей вызывать не должны - вы же умеете определять углы отклонения джойстика по осям X и Y и передавать эти значения на Ардуину?

Как быть, когда джойстик отклонен вперед-влево (или в пределах любого из остальных квадрантов)?

В этом случае у нас есть два значения - угол отклонения по оси Y (вперед-назад) и по оси X (вправо-влево).

На основании первого значения вычислим скорость поступательного движения V - в точности как в случаях 1)-2).

На основании второго значения вычислим скорость "поворотного" движения u - в точности как в случаях 3)-4).

Осталась самая малость - на левый движок подаем напряжение, соответствующее скорости V+u, на правый - V-u.

Для сервоприводов соответственно не скорости рассчитываются, а углы отклонения качалок.
 

 

AVD
Offline
Зарегистрирован: 09.06.2012

Представление правильное.

вы же умеете определять углы отклонения джойстика по осям X и Y и передавать эти значения на Ардуину?

Честно, нет.

 

step962
Offline
Зарегистрирован: 23.05.2011

 А джойстик "кнопочный", т.е. умеет определять только центральное положение и крайние, или "аналоговый", т.е. с него можно снимать также информацию об угле отклонения в ту или иную сторону?

AVD
Offline
Зарегистрирован: 09.06.2012

 аналоговый скорее всего logitech force 3d pro

AVD
Offline
Зарегистрирован: 09.06.2012

 Step962, Спасибо что уделяете мне время! с меня причитается.

AVD
Offline
Зарегистрирован: 09.06.2012

 Step962 помогите пожалуйста настроить, а то лето пройдет ) , а я так и не поплаваю.

Давайте бартером, у меня есть новые не нужные компоненты к ардуине: arduino.cc/en/Main/ArduinoMotorShieldR3 и arduino.cc/en/Main/ArduinoEthernetShield , перешлю почтой.

 

step962
Offline
Зарегистрирован: 23.05.2011

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

Кста, а почему вы хотите управлять именно с джойстика? почему не пара потенциометров? На их основе, добавив немножко железок можно сваять вполне работоспособный аналоговый джойстик, который идеально приспособлен для прямого подключения к Ардуине. Посмотрите статьи по этой ссылке (я бы порекомендовал вот такое решение) - может быть отыщете вариант, подходящий для вашей задачи.

Ну а когда подадите нормальный управляющий сигнал - цифровую ли информацию с компьютера, получив ее от USB-джойстика, или аналоговую от упомянутой чуть выше конструкции - тогда можно будет приступить и к логике управления вашим батискафом...

AVD
Offline
Зарегистрирован: 09.06.2012

 Так данные (байты) то есть с джойстика, система работает, позиции серво то есть в переменной POS, 

Вот подсказали,добавить переменные для запоминания углов серв и высчитать скорость, но для меня это дебри:

 

запоминать в переменных обновления значений по осям так, чтобы всегда знать значения X и Y джойстика. Далее, у вас есть два канала: левый и правый, им нужно задавать скорость/положение в зависимости от этих величин. Конечное значение скорости/положения можно получить из текущего положения джойстика:

 

leftChannel = max(-1, min(1, joyX + joyY))
rightChannel = max(-1, min(1, joyX - joyY))

Результат привести из диапазона [-1; 1] к нужному, по вкусу.

 

Вот код Питона, с него поступает 3 байта (0 тоже байт плучается? ось Х).

# Allow for multiple joysticks
joy = []
 
# Handle joystick event
def handleJoyEvent(e):
    # Identify joystick axes and assign events
    if e.type == pygame.JOYAXISMOTION:
        axis = "unknown"
    if (e.dict['axis'] == 0):
        axis = "X"
    if (e.dict['axis'] == 1):
        axis = "Y"
    if (e.dict['axis'] == 2):
        axis = "Throttle"
        if (e.dict['axis'] == 3):
            axis = "Z"
 
 # Convert joystick value to servo position for each axis
 if (axis != "unknown"):
     str = "Axis: %s; Value: %f" % (axis, e.dict['value'])
     # Uncomment to display axis values:
         #output(str, e.dict['joy'])
 
 # X Axis
 if (axis == "X"):
     pos = e.dict['value']
     # convert joystick position to servo increment, 0-180
     move = round(pos * 90, 0) 
     serv = int(90 + move) \\ можно добавить сервы ( -) реверс.
     # and send to Arduino over serial connection
     servo.move(1, serv)
 

Может конечно ну его и так все работает но, очень надо.