0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
|
|
1 | |
Управление с джойстика03.07.2011, 15:44. Просмотров 8198. Ответов 10
Метки нет Все метки)
(
Есть такой джойстик http://www.chipdip.ru/product/fjn10k15.aspx которым надо управлять гусеничной платформой.
Надо придумать какой-то адекватный алгоритм вычисления коэффициентов заполнения ШИМ для обоих двигателей и направление вращения. С направлением проблем нет, а вот с коэффициентами проблема. Пробовал извращаться с геометрией, самый нормальный результат получился когда координата х задавала ШИМ одного двигателя, а второй вычислялся как длина вектора (по теореме Пифагора, там еще прикол был с извлечением квадратного корня). Так же вариант просто нарисовать таблицу с коэф. ШИМ и смотреть в какую ячейку попадает вектор, но это как-то не по спортивному, хочется нормальный алгоритм.
0
|
|
03.07.2011, 15:44 | |
Управление машинкой с джойстика
Реально ли реализовать управление программой от джойстика Программирование джойстика |
|
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 526
|
|
03.07.2011, 15:54 | 2 |
hittroysir
Вычитанием можно.. Нажимаешь вперёд на джойстик до максимума (вот тебе 100% шим на обоих двигателях) немного поворачиваешь джойстик влево (смотришь показания АЦП) и отнимаешь от значения ШИМ левого двигателя показания АЦП Сообразил??
0
|
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
|
|
03.07.2011, 16:23 | 3 |
А по диагонали поставить жойстик религия не позволяет?
0
|
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
|
|
03.07.2011, 19:38 | 4 |
Да, по диагонали работает, пробовал :). Потом пробовал программно повернуть на 45 градусов, очень много кода вышло.
Я считаю что можно написать эффективный код чтобы работало в таком виде как есть, можете думать что это спортивный интерес.
0
|
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
|
|
04.07.2011, 11:26 | 5 |
А что сложного с поворотом? Для двумерного случая матрица вращения:
cos(A) -sin(A) sin(A) cos(A) А если рассматривать поворот на фиксированный градус (как у тебя, на 45), то вообще все просто. Что-то типа такого: x1 = x * cos(45°) + y * sin(45°) = sqrt(2)/2*(x+y) y1 = y * cos(45°) - x * sin(45°) = sqrt(2)/2*(y-x) Если не интересны точные абсолютные значения, то корнями пренебрегаем. Итого: x1 = x+y y1 = y-x
0
|
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
|
|
04.07.2011, 14:23 | 6 |
А я извращался с полярной системой координат... спасибо, только еще остались траблы когда угол меньше 45°, буду что-то думать.
0
|
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 176
|
|
04.07.2011, 23:58 | 7 |
как тут уже вывели: для каждого из моторов либо складывать либо вычитать положение ручек.. кстати эти х и у относительно нуля(средней точки) должны вычисляться вроде
а как эта штуковина в пользовании? возвращается ручка в среднее положение?
0
|
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
|
|
05.07.2011, 02:38 | 8 |
![]()
0
|
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
|
|
05.07.2011, 16:31 | 9 |
Получается такая система координат (если использовать знаковые переменные то центр будет в точке (0,0)). Для каждой четверти преобразовываю в локальную систему 0-125 (в центре мертвая зона). Сейчас вектор ОА переходит в ОВ и я напрямую могу копировать координаты в регистры ШИМ. ОВ -> ОС, здесь уже работает только 1 двигатель, а по идеи должны работать еще оба. Если джойстик в точке D то координаты уходят в минуса, т.е. значение больше 127 в беззнаковых переменных. Я думаю если поворачивать не на 45 градусов, а просто уменьшать угол в два раза будет то что надо, т.е. OA->OB, OB->OD. как это сделать еще не придумал.
0
|
0 / 0 / 0
Регистрация: 02.07.2011
Сообщений: 96
|
|
05.07.2011, 19:10 | 10 |
Ну если значения отрицательные, так и крути в обратную сторону 2-й двиг, тогда в точке С будет одинаковое по скорости но разное по направлению движение 2-х двигателей.
Т.е. в секторе 0А-0В оба двигателя вперед с разной скоростью, в векторе 0В, только один, в секторе 0В-0С в разнве стороны с разной скоростью соотвественно.
0
|
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 185
|
|
11.07.2011, 15:33 | 11 |
Сделал как советовали, все работает. Сейчас мне кажется все таким очевидным, как я до такого сам не додумался?
код Код
a = readadc (0); b = readadc (1); //x = (b+a)*0.7; x = b + a; tmp = x >> 2; x = x - tmp; //y = (a-b)*0.7; y = a - b; tmp = y >> 2; y = y - tmp; if (y > 4) { PORTD &= ~(1 << 6); //OCR1А вперед (левый) PORTD |= 1 << 7; OCR1A = y + 110; } else if (y < -4) { PORTD |= 1 << 6; //OCR1А назад (левый) PORTD &= ~(1 << 7); OCR1A = y*(-1) + 110; } else { if (x > 4) { PORTD &= ~(1 << 2); //OCR1B вперед PORTD |= 1 << 3; OCR1B = x + 110; } else if (x < -4) { PORTD |= 1 << 2; //OCR1B назад PORTD &= ~(1 << 3); OCR1B = x*(-1) + 110; } if ((x<= 4 || x>=-4) && (y<=4 || y>=-4)) { PORTD &= ~(1 << 2); PORTD &= ~(1 << 3); PORTD &= ~(1 << 7); PORTD &= ~(1 << 6); OCR1B = 0; OCR1A = 0; }
0
|
11.07.2011, 15:33 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Создание джойстика Отслеживание джойстика Эмулятор джойстика размеры джойстика Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |