Ардуино и мышь
- Войдите на сайт для отправки комментариев
Приветствую всех.
Некоторое время назад приобрел ардуино, балуюсь понемногу. Вчера дошло дело до обычной мышки компьютерной. Мышка как мышка: две кнопки, колесо, USB. Хвостом пришлось пожертвовать и распотрошить его, в итоге у меня 5 проводков.
Два из них по цвету подключил к питанию и земле, осталось болтаться еще три. Глянул библиотеки под ps/2, там требуется только два. Методом научного тыка выявил нужные.
Пробовал работать с двумя библиотеками, но остановился на этой.
Функция из библиотеки отдает массив, первый элемент которого — байт информации, второй — смещение по X, третий — смещение по Y.
Обработать информацию о движении по второму и третьему элементу — не проблема, конечно. Но интересен сам принцип работы, который оказался не до конца понятен. Подумал, может кто-то знает и поможет расширить кругозор.
Вся информация по сути берется из первого (нулевого) элемента массива. Первые три бита обращаются в единицу, если нажата права/левая кнопка или колесо (кождому нажатию соответствующий бит соответствует). Третий бит — всегда 1. Четвертый и пятый обращают в единицу, если мышь движется влево или вниз соответственно. Я было обрадовался, что логика ясна, но нет. Шестой и седьмой биты всегда равны нулю.
То есть о смещении мыши вправо и вверх информация в цифровом виде (есть/нет) не поступает. Определить его у меня выходило только из второго и третьего элемента возвращаемого массива, которые считаются функцией вида:
int PS2Mouse::read_movement_x(int status) { int x = read(); if (bitRead(status, 4)) { for(int i = 8; i < 16; ++i) { x |= (1<<i); } } return x; }
Аналогичная функция и для Y. Аргумент — тот самый байт информации. Как бы ни был прост код, именно логики его понять не могу. А интересно. Сможет кто-то пояснить?
Это первое. А второе, тоже для тех, кто сталкивался: что делать с кручением колеса? Предполагаю, что третий провод тут и пригодится. Вот только информации по этому не нашлось. Конечно, там обычный энкодер стоит, можно к нему подцепиться напрямую, но хочется более изящного решения. Есть идеи?
Заранее благодарен.
Во первых int это не один, два байта.
Понять "что делается" - вообщем-то можно. А вот "зачем".... :(
Если я правильно понимаю, то логика тут такая. Если у прочитанного status четвертый бит установлен в ноль, то просто возвращается то, что прочитал read(), если у статуса 4-тый бит 1, то прочитанному из read в старшем байте все биты устанавливаются 1.
То есть если, например в x прочиталось B00100000 01010101 , то вернется B11111111 01010101
"Зачем" это делается - можно только гадать. Возможно так показывается "направление" (отрицательность).
Зачем это сделанно через цикл и сдвиги - тоже не ясно. По идее строчки 4-6 можно заменить на "x|=0xFF00" (что-бы короче) или "x=x | B1111111100000000" (что-бы наглядей)
В самом деле, не обратил внимания даже, что там два байта. Но суть не меняется, используются только 6 разрядов, как я уже говорил, три — на нажатие кнопок, один всегда в единице, два в единице, если происходит движение влево/вниз. Остальные — всегда в нуле возвращаются.
Приведенная выше функция возвращает ноль, если движения не было, отрицательное число, если двигалась влево, положительное — если вправо. Но передаваемый аргумент при движении вправо является нулем, насколько я понимаю. Как происходит расчет, ума не приложу.
Возвращаемая величина этой функции лежит в диапазоне [-127; 127]. Если функция вызывается без задержек, достичь переполнения трудно, но если сделать задержку между вызовами, то без проблем. То есть величина эта накапливается до следующего вызова.
Я бы, возможно, не интересовался этими вопросами, если бы все не было настолько загадочно.
Все, что пока что приходит на ум с учетом известных сведений: старший байт аргумента используется для расчета смещений. Но как это происходит, все равно в четкую картинку не складывается. Особенно при условии того, что нет никакой индикации движения вправо/вверх.
Честно говоря трудно понять из вашего описания про что вы говорите. Какую фунцию вы подразумеваете под "этой функцией", причем тут кнопки и т.п. Где подразумевается x, а где status, и откуда берутся их значиния - все это за кадром. Я описал вам что делает тот код который вы привели - выставляет в единицы старший байт. Что и приводт к возвращению "отрицательного значения". Почитайте как кодируются отрицательные числа в двоичной системе. http://goo.gl/Ex7a
Благодарю за ссылку, но с дополнительным кодом я знаком достаточно хорошо, чтобы упустить в очередной раз чтение о нем.
«Эта функция» — та, что приведена в первом посте.
Кнопки, в общем-то, не причастны к теме вычисления координат. Возможно, я немно разрозненно описал принцип работы, поэтому не совсем ясно, что хотел сказать.
Пока расписывал работу всего этого, обратил внимание на косвенную рекурсию. Пожалуй, попробую еще повтыкать, может что и прояснится. Больше всего смущает именно отсутствие сигнализации о движении вверх/вправо. Но отложим.
Про кручение колеса мыслей нет? Завтра, может быть, попробую посмотреть сигналы на «лишнем» выводе, может что и прояснится. Но вдруг кто-то уже сталкивался.
Мышка как мышка: две кнопки, колесо, USB.
Хвостом пришлось пожертвовать и распотрошить его, в итоге у меня 5 проводков.
Напишите подробнее - что за 5 проводков.
черный, красный, белый, зеленый...
Какой еще?
К какому выводу USB он подходит?
Глянул библиотеки под PS/2
и
Мышка как мышка: две кнопки, колесо, USB.
А ничего что это разные интерфейсы, с совершенно разной логикой? USB - намного более интелектуальный. Нужно либо его аппаратная поддержка в камне (atmega32u и подобные), либо USB host шилд, либо искать софтерную реализацию USB хоста.
В любом случае - библиотеки от PS/2 - не подойдут. Если мышь действительно USB. (а не PS/2 плюс конвертер в USB)
Напишите подробнее - что за 5 проводков.
черный, красный, белый, зеленый...
Какой еще?
К какому выводу USB он подходит?
Еще в прозрачной оплетке один. Черный/красный — земля/питание, белый и зеленый для получения сигналов использую.
Тип usb — A.
А ничего что это разные интерфейсы, с совершенно разной логикой? USB - намного более интелектуальный. Нужно либо его аппаратная поддержка в камне (atmega32u и подобные), либо USB host шилд, либо искать софтерную реализацию USB хоста.
В любом случае - библиотеки от PS/2 - не подойдут. Если мышь действительно USB. (а не PS/2 плюс конвертер в USB)
Не слишком ли кардинально? Я же сказал, что сама по себе библиотека работает прекрасно, причем не только эта.
Не слишком ли кардинально? Я же сказал, что сама по себе библиотека работает прекрасно, причем не только эта.
Ну тогда в чем проблема? Пользуйтесь библиотекой которая работает прекрасно. У вас случилось чудо. Ардуина вдруг, научилась сама по себе выступать USB хостом. Да еще с помощью библиотеки для PS2. А другие, дураки, деньги на железо тратят, что-бы usb к ардуине подключить. А нужно, оказывается, просто разъемом пожертвовать.
Мне только непонятно зачем вы вопросы задаете если сами все знаете прекрасно и лучше других?
сама по себе библиотека работает прекрасно.
Как может "прекрасно" работать библиотека, функции которой не возвращают необходимые вам данные?
Или вы вкладываете в слово "прекрасно" какой-то иной смысл?
leshak, а можно без сарказма?
Как может "прекрасно" работать библиотека, функции которой не возвращают необходимые вам данные?
Или вы вкладываете в слово "прекрасно" какой-то иной смысл?
Данные-то возвращаются, причем правильные. Несмотря на попытки помочь, кажется, никто не удосужился внимательно прочитать, о чем именно я просил, либо быстро забывали и переходили к другому.
Первый вопрос, черт с ним, разберу самостоятельно уж.
Упор был сделан на то. что, возможно, кто-то сталкивался с подобным и имеет опыт решения непосредственной задачи.
Просто забавляет, когда после 5+ постов обсуждения того, как работает, внезапно оказывается, что оно, видите ли, не может работать. Работает оно. То, для чего написана библиотека, выполняется отлично. Интересна была сама логика. А также назначение «лишнего» выхода и опрос положения колеса без прямого подключения к энкодеру.
Пойду к гадалке =D
В общем, по большей части разобрался. Четвертый и пятый бит — индикаторы движения в отрицательном направлении, если в единице, то производится перевод величины перемещения из дополнительного кода в прямой. Само же перемещение отсылается в последующих двух байтах.
Пятая жила — нечто таинственное, информации не несет, запаяно на металлический кожух USB-штекера. Гугление ничего не дало, насколько я знаю, контактом не является, зачем оно надо — остается только догадываться ()экран какой-нибудь? Просвятите, если кто в курсе.
Колесо победить не удалось. Интернеты говорят о расширении Intellimouse, придуманном Майкрософтом. В соответствие с ним необходимо изменить частоту дискредитации в определенном порядке, после чего включается режим со скроллом и в четвертом байте должна приходить информация по скроллу. Однако включить данную приблуду не удалось.
О других режимах ничего не нашлось, поэтому пока без колеса. Грызун Genius GM-03003 NetScroll+ MiniTraveler. Если никто не сталкивался с конкретной задачей, может кто-то знает, где почитать о других вариантах включения скролла?
Все вопросы закрыты. Удалось побороть в итоге и колесо.
gwer, пожалуйста отзовись. Очень интересно как ты заставил колесико у мышки работать. Ты молодец, что с этим смог разобраться, твоя тема сильно помогла мне даже без колесика, но с колесиком, конечно, будет еще лучше :)
Привет всем. to leshak: сарказм действительно неуместен. Большинство usb мышей по умолчанию поддерживают протокол ps2, иначе откуда бы взялись переходники usb/ps2. Но у меня с юсб завелась лишь одна мышь из 5. Грусна. Кто-нить еще есть в теме посоветоваться, или умерло обсуждение?
<когда будешь читать, представляй себе, что говорит низкий, величественный голос>
Здравствуй DAD, ХО-ХО-ХО, тебе несказанно повезло, что я, великий Gelay, некогда участник этой темы, вернулся в нее спустя 2 года после последнего сообщения, спустя 4 года после предпоследнего сообщения, чтобы помочь тебе и ответить на твои вопросы, искатель.
<хотя скорее всего ты получишь ответы типа "не помню", "наверно", "может быть" :) И как ты точно выждал 2 года, всего на 4 дня ошибся:) >
Огромную роль в этом событии сыграла система уведомлений о новых сообщениях, которая помогла Мне узнать о тебе и прислала волшебное письмо на мою волшебную электронную почту.
Расскажи искатель, что тебя волнует.
На счет того что не любая USB мышь заводится на PS/2 - действительно так, все реже и реже производитель добавляет в них режим для PS/2