Нужно исправить код
- Войдите на сайт для отправки комментариев
Сб, 09/06/2012 - 23:20
Делаю проект- 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
Спасибо за ответ, действительно написал не понятно, попробую растолковать что мне нужно.
Управление - оборотами двигателя.
Сервы это имитаторы моторов -регулятора скорости(далее серво). так безопасней работать ).
Что не так:
На ось Y подключены два двигателя, выходы №2 и №5, и №5 стоит в реверсе. при наклоне джойстика на лево или на право аппарат крутиться на месте.
все как мне и нужно, но движение вперед на данный момент обеспечивает еще один двигатель что не удобно, а нужно сделать так что бы двигатели №2 и №5 обеспечивали движение вперед .
в коде 2 сделал так как мне надо, то есть ось Х управляет движением вперед а ось Y разворотом, но если смешиваем две оси X + Y допустим поворачиваем на право с движением в перед то сервы(моторы) сходят с ума, наровясь каждый раз при пересечении осей занят центральное положение, а всего то надо снизить скорость у мотора № 5 или если на лева то №2, как то так...
Ось X, ось Y... Это что?
Пытаюсь угадать, что вы вкладываете в эти понятия - и не могу.
Это как-то с двигателями связано, или с джойстиком?
Мне думается - с джойстиком, но до конца не уверен. А вы продолжаете хранить тайну.
X Y ось джойстика
Если я правильно понял, ось Y у вас отвечает за вправо-влево. Так, или я ошибаюсь?
Если так, то по каким таким соображениям вы решили горизонтальную ось (традиционно X) обозвать "Y"?
перепутал )
Не знаю, как у вас, а у меня представление о правильном управлении двумя двигателями (сервами) с помощью одного джойстика такое:
1) джойстик вперед - оба двигателя вперед (сервы из нейтрального положения - вперед). Скорость вращения двигателей (угол отклонения качалок сервоприводов) пропорциональна углу отклонения джойстика вперед
2) джойстик назад - оба двигателя назад (сервы из нейтрального положения - назад). Скорость вращения двигателей (угол отклонения качалок сервоприводов) пропорциональна углу отклонения джойстика назад.
3) джойстик влево - правый двигатель вперед (правая серва из нейтрального положения - вперед), левый двигатель назад (левая серва из нейтрального положения - назад). Скорости вращения двигателей (уголы отклонения качалок сервоприводов) пропорциональны углу отклонения джойстика влево.
4) джойстик вправо - правый двигатель назад (правая серва из нейтрального положения - назад), левый двигатель вперед (левая серва из нейтрального положения - вперед). Скорости вращения двигателей (уголы отклонения качалок сервоприводов) пропорциональны углу отклонения джойстика вправо.
Эти четыре случая сложностей вызывать не должны - вы же умеете определять углы отклонения джойстика по осям X и Y и передавать эти значения на Ардуину?
Как быть, когда джойстик отклонен вперед-влево (или в пределах любого из остальных квадрантов)?
В этом случае у нас есть два значения - угол отклонения по оси Y (вперед-назад) и по оси X (вправо-влево).
На основании первого значения вычислим скорость поступательного движения V - в точности как в случаях 1)-2).
На основании второго значения вычислим скорость "поворотного" движения u - в точности как в случаях 3)-4).
Осталась самая малость - на левый движок подаем напряжение, соответствующее скорости V+u, на правый - V-u.
Для сервоприводов соответственно не скорости рассчитываются, а углы отклонения качалок.
Представление правильное.
вы же умеете определять углы отклонения джойстика по осям X и Y и передавать эти значения на Ардуину?
Честно, нет.
А джойстик "кнопочный", т.е. умеет определять только центральное положение и крайние, или "аналоговый", т.е. с него можно снимать также информацию об угле отклонения в ту или иную сторону?
аналоговый скорее всего logitech force 3d pro
Step962, Спасибо что уделяете мне время! с меня причитается.
Step962 помогите пожалуйста настроить, а то лето пройдет ) , а я так и не поплаваю.
Давайте бартером, у меня есть новые не нужные компоненты к ардуине: arduino.cc/en/Main/ArduinoMotorShieldR3 и arduino.cc/en/Main/ArduinoEthernetShield , перешлю почтой.
Я могу вам помочь на этапе обработки данных полученных от джойстика. Но вот считывать информацию с него вы должны научиться сами - через компьютер или напрямую. У меня под рукой нет соответствующего устройства, и раньше вопросами взаимодействия с джойстиком я не заморачивался, так что ...
Кста, а почему вы хотите управлять именно с джойстика? почему не пара потенциометров? На их основе, добавив немножко железок можно сваять вполне работоспособный аналоговый джойстик, который идеально приспособлен для прямого подключения к Ардуине. Посмотрите статьи по этой ссылке (я бы порекомендовал вот такое решение) - может быть отыщете вариант, подходящий для вашей задачи.
Ну а когда подадите нормальный управляющий сигнал - цифровую ли информацию с компьютера, получив ее от USB-джойстика, или аналоговую от упомянутой чуть выше конструкции - тогда можно будет приступить и к логике управления вашим батискафом...
Так данные (байты) то есть с джойстика, система работает, позиции серво то есть в переменной POS,
Вот подсказали,добавить переменные для запоминания углов серв и высчитать скорость, но для меня это дебри:
запоминать в переменных обновления значений по осям так, чтобы всегда знать значения X и Y джойстика. Далее, у вас есть два канала: левый и правый, им нужно задавать скорость/положение в зависимости от этих величин. Конечное значение скорости/положения можно получить из текущего положения джойстика:
leftChannel = max(-1, min(1, joyX + joyY))
rightChannel = max(-1, min(1, joyX - joyY))
Результат привести из диапазона [-1; 1] к нужному, по вкусу.
Вот код Питона, с него поступает 3 байта (0 тоже байт плучается? ось Х).
Может конечно ну его и так все работает но, очень надо.