Ардуино и мышь

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

Приветствую всех. 

Некоторое время назад приобрел ардуино, балуюсь понемногу. Вчера дошло дело до обычной мышки компьютерной. Мышка как мышка: две кнопки, колесо, 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. Аргумент — тот самый байт информации. Как бы ни был прост код, именно логики его понять не могу. А интересно. Сможет кто-то пояснить?

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

Заранее благодарен.

leshak
Offline
Зарегистрирован: 29.09.2011

 Во первых int это не один, два байта.

Понять "что делается" - вообщем-то можно. А вот "зачем".... :(

Если я правильно понимаю, то логика тут такая. Если у прочитанного status четвертый бит установлен в ноль, то просто возвращается то, что прочитал read(), если у статуса 4-тый бит 1, то прочитанному из read в старшем байте все биты устанавливаются 1.

То есть если, например в x прочиталось B00100000 01010101 , то вернется B11111111 01010101

"Зачем" это делается - можно только гадать. Возможно так показывается "направление" (отрицательность).

Зачем это сделанно через цикл и сдвиги - тоже не ясно. По идее строчки 4-6 можно заменить на "x|=0xFF00" (что-бы короче) или "x=x | B1111111100000000"  (что-бы наглядей)

 

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

В самом деле, не обратил внимания даже, что там два байта. Но суть не меняется, используются только 6 разрядов, как я уже говорил, три — на нажатие кнопок, один всегда в единице, два в единице, если происходит движение влево/вниз. Остальные — всегда в нуле возвращаются.

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

Возвращаемая величина этой функции лежит в диапазоне [-127; 127]. Если функция вызывается без задержек, достичь переполнения трудно, но если сделать задержку между вызовами, то без проблем. То есть величина эта накапливается до следующего вызова.

Я бы, возможно, не интересовался этими вопросами, если бы все не было настолько загадочно. 

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

leshak
Offline
Зарегистрирован: 29.09.2011

 Честно говоря трудно понять из вашего описания про что вы говорите. Какую фунцию вы подразумеваете под "этой функцией", причем тут кнопки и т.п. Где подразумевается x, а где status, и откуда берутся их значиния - все это за кадром. Я описал вам что делает тот код который вы привели - выставляет в единицы старший байт. Что и приводт к возвращению "отрицательного значения". Почитайте как кодируются отрицательные числа в двоичной системе.  http://goo.gl/Ex7a

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

Благодарю за ссылку, но с дополнительным кодом я знаком достаточно хорошо, чтобы упустить в очередной раз чтение о нем. 

«Эта функция» — та, что приведена в первом посте. 

Кнопки, в общем-то, не причастны к теме вычисления координат. Возможно, я немно разрозненно описал принцип работы, поэтому не совсем ясно, что хотел сказать.

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

Про кручение колеса мыслей нет? Завтра, может быть, попробую посмотреть сигналы на «лишнем» выводе, может что и прояснится. Но вдруг кто-то уже сталкивался. 

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

gwer пишет:

 Мышка как мышка: две кнопки, колесо, USB.

Хвостом пришлось пожертвовать и распотрошить его, в итоге у меня 5 проводков.

Напишите подробнее - что за 5 проводков.

черный, красный, белый, зеленый...

Какой еще?

К какому выводу USB он подходит?

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 

gwer пишет:

Глянул библиотеки под PS/2

и

gwer пишет:

Мышка как мышка: две кнопки, колесо, USB.

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

В любом случае - библиотеки от PS/2 - не подойдут. Если мышь действительно USB. (а не PS/2 плюс конвертер в USB)

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

step962 пишет:

Напишите подробнее - что за 5 проводков.

черный, красный, белый, зеленый...

Какой еще?

К какому выводу USB он подходит?

Еще в прозрачной оплетке один. Черный/красный — земля/питание, белый и зеленый для получения сигналов использую.

Тип usb — A. 

leshak пишет:

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

В любом случае - библиотеки от PS/2 - не подойдут. Если мышь действительно USB. (а не PS/2 плюс конвертер в USB)

Не слишком ли кардинально? Я же сказал, что сама по себе библиотека работает прекрасно, причем не только эта. 

leshak
Offline
Зарегистрирован: 29.09.2011

gwer пишет:

 

Не слишком ли кардинально? Я же сказал, что сама по себе библиотека работает прекрасно, причем не только эта. 

Ну тогда в чем проблема? Пользуйтесь библиотекой которая работает прекрасно. У вас случилось чудо. Ардуина вдруг, научилась сама по себе выступать USB хостом. Да еще с помощью библиотеки для PS2. А другие, дураки, деньги на железо тратят, что-бы usb к ардуине подключить. А нужно, оказывается, просто разъемом пожертвовать.

Мне только непонятно зачем вы вопросы задаете если сами все знаете прекрасно и лучше других?

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

gwer пишет:

 сама по себе библиотека работает прекрасно. 

Как может "прекрасно" работать библиотека, функции которой не возвращают необходимые вам данные?

Или вы вкладываете в слово "прекрасно" какой-то иной смысл?

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

leshak, а можно без сарказма?

step962 пишет:

Как может "прекрасно" работать библиотека, функции которой не возвращают необходимые вам данные?

Или вы вкладываете в слово "прекрасно" какой-то иной смысл?

Данные-то возвращаются, причем правильные. Несмотря на попытки помочь, кажется, никто не удосужился внимательно прочитать, о чем именно я просил, либо быстро забывали и переходили к другому.

Первый вопрос, черт с ним, разберу самостоятельно уж. 

Упор был сделан на то. что, возможно, кто-то сталкивался с подобным и имеет опыт решения непосредственной задачи. 

Просто забавляет, когда после 5+ постов обсуждения того, как работает, внезапно оказывается, что оно, видите ли, не может работать. Работает оно. То, для чего написана библиотека, выполняется отлично. Интересна была сама логика. А также назначение «лишнего» выхода и опрос положения колеса без прямого подключения к энкодеру. 

Пойду к гадалке =D

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

В общем, по большей части разобрался. Четвертый и пятый бит — индикаторы движения в отрицательном направлении, если в единице, то производится перевод величины перемещения из дополнительного кода в прямой. Само же перемещение отсылается в последующих двух байтах. 

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

Колесо победить не удалось. Интернеты говорят о расширении Intellimouse, придуманном Майкрософтом. В соответствие с ним необходимо изменить частоту дискредитации в определенном порядке, после чего включается режим со скроллом и в четвертом байте должна приходить информация по скроллу. Однако включить данную приблуду не удалось. 

О других режимах ничего не нашлось, поэтому пока без колеса. Грызун Genius GM-03003 NetScroll+ MiniTraveler. Если никто не сталкивался с конкретной задачей, может кто-то знает, где почитать о других вариантах включения скролла? 

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

Все вопросы закрыты. Удалось побороть в итоге и колесо. 

Gelay
Offline
Зарегистрирован: 19.03.2014

gwer, пожалуйста отзовись. Очень интересно как ты заставил колесико у мышки работать. Ты молодец, что с этим смог разобраться, твоя тема сильно помогла мне даже без колесика, но с колесиком, конечно, будет еще лучше :)

DAD
Offline
Зарегистрирован: 23.06.2014

Привет всем. to leshak: сарказм действительно неуместен. Большинство usb мышей по умолчанию поддерживают протокол ps2, иначе откуда бы взялись переходники usb/ps2. Но у меня с юсб завелась лишь одна мышь из 5. Грусна. Кто-нить еще есть в теме посоветоваться, или умерло обсуждение?

Gelay
Offline
Зарегистрирован: 19.03.2014

<когда будешь читать, представляй себе, что говорит низкий, величественный голос>

Здравствуй DAD, ХО-ХО-ХО, тебе несказанно повезло, что я, великий Gelay, некогда участник этой темы, вернулся в нее спустя 2 года после последнего сообщения, спустя 4 года после предпоследнего сообщения, чтобы помочь тебе и ответить на твои вопросы, искатель.

<хотя скорее всего ты получишь ответы типа "не помню", "наверно", "может быть" :)   И как ты точно выждал 2 года, всего на 4 дня ошибся:) >

Огромную роль в этом событии сыграла система уведомлений о новых сообщениях, которая помогла Мне узнать о тебе и прислала волшебное письмо на мою волшебную электронную почту.

Расскажи искатель, что тебя волнует.

На счет того что не любая USB мышь заводится на PS/2 - действительно так, все реже и реже производитель добавляет в них режим для PS/2