Исследование протокола PS/2 для мышки

Автор: Евгений Амосов

В этой статье я попытаюсь объяснить аспекты, связанные с интерфейсом PS/2 для периферийного устройства типа мышь, включая физический, электрический, протокол низкого уровня, режимы работы, команды и расширения.

Мышь воспринимает своё перемещение в рабочей плоскости (обычно – на участке поверхности стола) и передаёт эту информацию компьютеру. Программа, работающая на компьютере, в ответ на перемещение мыши производит на экране действие, отвечающее направлению и расстоянию этого перемещения. В универсальных интерфейсах (например, в оконных) с помощью мыши пользователь управляет специальным курсором – указателем, то есть манипулятором элементами интерфейса.

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

Фактически все эти устройства общаются с компьютером при помощи двух интерфейсов: универсальной последовательной шины (USB) или интерфейса PS/2.

Интерфейс PS/2 расшифровывается как Personal System/2. Широкую популярность он приобрел благодаря использованию для взаимодействия с манипулятором типа мышь в компьютерах Apple Macintosh и позднее в ОС Windows для IBM PC в конце 80-х. Однако сегодня быстро завоевавший популярность интерфейс USB в конечном итоге практически заменил PS/2 полностью. Тем не менее, протокол PS/2 представляет собой интересную платформу для различных экспериментов научного характера. Например, можно использовать мышку с разъемом PS/2 для управления каким-либо передвижным устройством-роботом или сделать свой манипулятор, который при помощи датчиков-гироскопов, закрепленных на пальцах руки, будет эмулировать передвижение курсора на экране, а щелчком пальцев открывать папки и т. д. В дальнейших статьях будет описано, как это можно реализовать.

Интерфейс мыши PS/2 использует двунаправленный последовательный протокол, по которому передаются данные о движении и состоянии кнопок вспомогательному диспетчеру устройств компьютера (далее по тексту – хост). Диспетчер, в свою очередь, посылает команды для мыши, чтобы установить частоту обмена, разрешение, ее перезагрузку, выключение и т. д. Напряжение питания на линии передачи 5В ~100 мА. На Рис. 1 показано обозначение контактов разъема PS/2, на Рис. 2 – возможное подключение мышки к своему устройству:

Входы, разрешение и масштабирование

Стандартный интерфейс мыши PS/2 поддерживает следующие входы: перемещение по координате X (вправо/влево), перемещение по координате Y (вверх/вниз), левая кнопка, средняя кнопка, правая кнопка. Данный тип мыши является стандартом, но сейчас уже не используется. Мышь периодически читает эти входы, обновляет связанные с ними счетчики и устанавливает флаги, чтобы в дальнейшем отправить хосту текущее состояние кнопок и перемещение. Есть много манипуляторов PS/2, которые имеют дополнительные входы и могут сообщить о данных по-другому, чем описано в этом документе. Одним из популярных расширений является Microsoft Intellimouse, которое включает в себя поддержку стандартных входов, а также колеса прокрутки и двух дополнительных кнопок (это уже современные мышки).

У стандартной мыши есть два 9-разрядных счетчика с флагами переполнения, которые отслеживают перемещение: по координате X и по координате Y. Их содержание, а также состояние трех кнопок мыши отправляется хосту в виде 3-хбайтового пакета данных. Счетчики перемещения определяют смещение мыши относительно ее предыдущей позиции, когда было совершено перемещение или когда пришла команда Resend (0xFE).

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

Параметр, который определяет величину увеличения/уменьшения счетчиков перемещения, является разрешением. Разрешение по умолчанию равно четырем значениям на миллиметр, и хост может изменить это значение, используя команду Set Resolution (0xE8).

Существует параметр, который не влияет на счетчики перемещения, но влияет на значения, которые снимаются со счетчиков. Этот параметр называется масштабированием. По умолчанию мышь использует масштабирование 1:1. Однако хост может выбрать масштабирование 2:1, используя команду Set Scaling 2:1 (0xE7). Если будет включено масштабирование 2:1, то мышь применит следующий алгоритм к счетчикам перемещения прежде, чем отправить их содержание хосту (см. Таблицу 1).

Таблица 1. Алгоритм 2:1 масштабирования

Состояние счетчика движения

Отсылаемое значение

0

0

1

1

2

1

3

3

4

6

5

9

N>5

2 * N

Масштабирование 2:1 применяется только к автоматически отсылаемым данным в потоковом режиме. Это не влияет на данные, которые отправляются в ответ на команду Read Data (0xEB).

Пакет данных о перемещениях

Стандартная мышь PS/2 посылает информацию о движении/кнопках хосту, используя следующий 3-хбайтовый пакет (см. Таблицу 2):

Таблица 2. Пакет данных о перемещениях

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0

Байт 1

Y-переполнение

X-переполнение

Y знак бит

Х знак

бит

всегда

1

Средняя

кнопка

правая

кнопка

левая

кнопка

Байт 2

X-перемещение

Байт 3

Y-перемещение

Значения перемещения – это два 9-разрядных целых числа, где старший значащий бит, появляется битом «X/Y знак» в 1-м байте из передаваемого пакета данных. Их значение представляет смещение мыши относительно ее предыдущей позиции, определенной текущим разрешением. Диапазон отсылаемых значений лежит в пределах от -255 до +255. Если этот диапазон будет превышен, то установится соответствующий бит переполнения.

Режимы работы

Создание отчетов данных обработано согласно режиму, в котором работает мышь. Есть четыре режима работы:

сброс (Reset) – начальный режим, в котором мышь выполняет инициализацию и самодиагностику;

поток (Stream) – рабочий режим по умолчанию, в котором мышь отправляет пакеты данных о перемещениях, когда происходит перемещение или изменяются состояния кнопок;

удаленный (Remote) – хост должен упорядочить пакеты данных о перемещениях;

обратный (Wrap) – диагностический режим, в котором мышь отправляет каждый полученный пакет назад к хосту.

Режим сброса (Reset)

Мышь переходит в режим сброса при включении питания или в ответ на команду Reset (0xFF). После ввода этого режима мышь выполняет диагностическую самопроверку и устанавливает следующие значения по умолчанию:

Частота дискретизации =100 значений в секунду

Разрешение =4 значения на 1мм

Масштабирование =1:1

Создание отчетов данных = отключено

После режима самодиагностики мышь отправляет хосту результат проверки – 0xAA (успешно) или 0xFC (ошибка).

Следующим значением после 0xAA или 0xFC мышь отправляет свой ID=0x00. Это значение указывает на то, что это мышь, а не клавиатура или иное устройство. В некоторых описаниях протокола указано, что хост не должен передавать данные, пока тот не получит ID устройства. Однако некоторые BIOS’ы отправляют команду Reset (0xFF) сразу после команды 0xAA, полученной после того, как включенное питание было сброшено.

Как только мышь отправила свой ID устройства хосту, она входит в потоковый режим.

Потоковый режим (Stream)

В потоковом режиме мышь отправляет данные перемещения, когда обнаруживается перемещение или изменение в состоянии одной или более кнопок мыши. Максимальная частота, на которой можно сообщить об этих данных, известна как частота дискретизации. Этот параметр изменяется в пределах от 10 до 200 значений в секунду (по умолчанию – 100 значений в секунду). Хост может изменить это значение, используя команду Set Sample Rate (0xF3).

Отметим, что создание отчетов отключено по умолчанию. Мышь не будет фактически слать пакеты данных о перемещениях, пока она не получит команду Enable Data Reporting (0xF4).

Потоковый режим – рабочий режим по умолчанию или режим, в который можно установить, используя команду Set Stream Mode (0xEA).

Удаленный режим (Remote)

В удаленном режиме мышь читает свои входы и обновляет счетчики/флаги на текущей частоте дискретизации, но не отсылает автоматически пакеты данных, если произошло перемещение. Вместо этого хост опрашивает мышь, используя команду Read Data (0xEB). После получения этой команды мышь отсылает единственный пакет данных о перемещениях и сбрасывает свои счетчики перемещения.

Мышь входит в удаленный режим при получении команды Set Remote Mode (0xF0). Удаленный режим используется редко.

Обратный режим (Wrap)

Это «эхо»-режим, в котором каждый байт, полученный мышью, отсылается назад к хосту. Даже если полученный байт будет соответствовать системной команде, то мышь не станет отвечать на эту команду, а только отправит данный байт назад хосту. Однако есть два исключения: команды Reset (0xFF) и Reset Wrap Mode (0xEC). Мышь обработает их как допустимые команды и не отправит назад хосту.

Обратный режим используется редко.

Расширения Intellimouse

Популярное расширение стандартной мыши PS/2 – Microsoft Intellimouse – включает в себя поддержку в общей сложности пяти кнопок мыши и трех осей перемещения (вправо/влево, вверх/вниз и колесо прокрутки). Эти дополнительные функции требуют использования 4-х байтового пакета данных перемещения, а не стандартного 3-х байтового. Так как стандартные драйверы мыши PS/2 не могут распознать этот пакетный формат, Intellimouse обязан работать точно как стандартная мышь PS/2. Таким образом, если Intellimouse будет использоваться на компьютере, который поддерживает только стандартную мышь PS/2, то она (мышка) будет все еще функционировать, за исключением колеса прокрутки и 4-й и 5-й кнопок.

После включения питания или сброса Microsoft Intellimouse работает точно так же, как стандартная мышь PS/2 (то есть использует 3-х байтовый пакет данных о перемещениях, отвечает на все команды таким же образом, как на стандартную мышь PS/2, и сообщает о ID устройства 0x00).

Чтобы включить колесо прокрутки, хост отправляет следующую последовательность команд:

  1. Установить частоту дискретизации = 200
  2. Установить частоту дискретизации = 100
  3. Установить частоту дискретизации = 80

Хост отправляет команду Get device ID (0xF2) и ожидает ответа. Если это стандартная мышь PS/2 (то есть не IntelliMouse), то она ответит ID устройства 0x00. В этом случае хост распознает факт, что мышь действительно не имеет колеса прокрутки, и будет продолжать обрабатывать ее как стандартную мышь PS/2. Однако если будет подключена Microsoft Intellimouse, то она ответит ID=0x03. Это сообщит хосту, что у присоединенного манипулятора есть колесо прокрутки, и хост перейдет в режим ожидания 4-х байтового пакета данных о перемещениях (см. Таблицу 3):

Таблица 3. 4-х байтовый пакет данных

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0

Байт 1

Y-переполнение

X-переполнение

Y знак бит

Х знак

бит

всегда

1

средняя

кнопка

правая

кнопка

левая

кнопка

Байт 2

X-перемещение

Байт 3

Y-перемещение

Байт 4

Z-перемещение

«Z-перемещение» – дополнительное значение, которое представляет собой перемещение колеса прокрутки начиная с последнего отчета данных. Допустимые значения находятся в диапазоне от -8 до +7. Это означает, что число фактически представлено как четыре младших, значащих бита; старшие четыре бита – только как расширение знака.

Чтобы включить колесо прокрутки, а также 4-ю и 5-ю кнопки, хост отправляет следующую последовательность команд:

  1. Установить частоту дискретизации = 200
  2. Установить частоту дискретизации = 200
  3. Установить частоту дискретизации = 80

Хост шлет команду Get device ID (0xF2) и ожидает ответа. Microsoft Intellimouse отвечает ID устройства =0x04, затем использует следующий 4-хбайтовый пакет данных перемещения (см. Таблицу 5):

Таблица 5. Пакет данных для активации колеса прокрутки и дополнительных кнопок

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0

Байт 1

Y-переполнение

X-переполнение

Y знак бит

Х знак

бит

всегда

1

средняя

кнопка

правая

кнопка

левая

кнопка

Байт 2

X-перемещение

Байт 3

Y-перемещение

Байт 4

0

0

5-я

кнопка

4-я

кнопка

Z-перемещение

   

4-я кнопка =1, если нажата 4-я кнопка мыши, и 5-я кнопка =1, если нажата 5-я кнопка мыши. «Z-перемещение» представляет собой значение движения, которое произошло начиная с последнего отчета данных. Действительные значения изменяются в пределах от -8 до +7.

Набор команд

Следующее – набор команд; он является стандартом для мыши с интерфейсом PS/2. Если мышь находится в потоковом режиме, хост должен отключить создание отчетов данных (команда 0xF5) прежде, чем отправить какие-то команды.

  • 0xFF (Reset) – мышь отвечает командой (0xFA) и входит в режим сброса.
  • 0xFE (Resend) – хост отправляет эту команду всякий раз, когда он получает ошибочные данные от мыши. Мышь отвечает, посылая последний пакет, который она отправила хосту. Если мышь отвечает на команду Resend другим недопустимым пакетом, хост может или дать другую команду Resend, или сформировать команду Error (0xFC) и произвести сброс питания с мыши. Эта команда не буферизована, что означает, что Resend никогда не будет отправляться в ответ на команду Resend.
  • 0xF6 (Set Defaults) – мышь отвечает командой (0xFA) и устанавливает следующие значения: частота дискретизации =100, разрешение =4 значения на 1 миллиметр, масштабирование =1:1, создание отчетов данных = отключено. Мышь сбрасывает все свои счетчики перемещения и входит в потоковый режим.
  • 0xF5 (Disable Data Reporting) – мышь отвечает командой (0xFA), отключается создание отчетов данных и сбрасываются счетчики перемещения.
  • 0xF4 (Enable Data Reporting) – мышь отвечает командой (0xFA), включается режим создания отчетов данных и сбрасываются счетчики перемещения. Эта команда может быть получена в тот момент, когда мышь находится в удаленном режиме, но будет выполнена, только если мышь переключится в потоковый режим.
  • 0xF3 (Set Sample Rate) – мышь отвечает командой (0xFA) и ожидает один байт из хоста. Мышь сохраняет этот байт как новую частоту дискретизации. После получения частоты дискретизации мышь снова отвечает командой (0xFA) и сбрасывает свои счетчики перемещения. Допустимые частоты дискретизации – 10, 20, 40, 60, 80, 100 и 200 значений в секунду.
  • 0xF2 (Get Device ID) – мышь отвечает командой (0xFA), сопровождая его ID устройства (0x00 для стандартной мыши PS/2). Мышь должна также сбросить свои счетчики перемещения.
  • 0xF0 (Set Remote Mode) – мышь отвечает командой (0xFA), сбрасывает свои счетчики перемещения и входит в удаленный режим.
  • 0xEE (Set Wrap Mode) – мышь отвечает командой (0xFA), сбрасывает свои счетчики перемещения и входит в эхо-режим.
  • 0xEC (Reset Wrap Mode) – мышь отвечает командой (0xFA), сбрасывает свои счетчики перемещения и входит в режим, в котором она была до эхо-режима (в потоковый или удаленный).
  • 0xEB (Read Data) – мышь отвечает командой (0xFA) и отправляет пакет данных перемещения. Это единственный способ считать данные в удаленном режиме. После того, как пакет данных был успешно отправлен, мышь сбрасывает свои счетчики перемещения.
  • 0xEA (Set Stream Mode) – мышь отвечает командой (0xFA), сбрасывает свои счетчики перемещения и входит в потоковый режим.
  • 0xE9 (Status Request) – мышь отвечает командой (0xFA), затем передается следующий 3-хбайтовый пакет состояния (см. Таблицу 6):

Таблица 6. Пакет состояния

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0

Байт 1

Всегда

0

Режим

включение

масштабирование

всегда

0

левая

кнопка

средняя

кнопка

правая

кнопка

Байт 2 Разрешение              
Байт 3 частота опроса              

Правая, средняя, левая кнопка =1, если соответствующая кнопка нажата; 0, если кнопка не нажата.

Масштабирование =1, если масштабирование 2:1; 0, если масштабирование 1:1 (см. команды 0xE7 и 0xE6).

Включение =1, если включено создание отчетов данных; 0, если создание отчетов данных отключено (см. команды 0xF5 и 0xF4).

Режим =1, если удаленный режим включен; 0, если включен потоковый режим (см. команды 0xF0 и 0xEA).

  • • 0xE8 (Set Resolution) – мышь отвечает командой (0xFA), читает один байт из хоста и снова отвечает командой (0xFA), затем сбрасывает свои счетчики перемещения. Побайтовое чтение от хоста определяет разрешение следующим образом (см. Таблицу 7):

Таблица 7. Расшифровка данных, принятых с хоста

Байт, считанный с хоста

Разрешение

00

1 значение/мм

01

2 значения/мм

02

4 значения/мм

03

8 значений/мм

  • 0xE7 (Set Scaling 2:1) – мышь отвечает командой (0xFA), затем включает масштабирование 2:1.
  • 0xE6 (Set Scaling 1:1) – мышь отвечает командой (0xFA), затем включает масштабирование 1:1.

 

Инициализация

Мышь PS/2 обычно обнаруживается/инициализируется, только когда компьютер загружается. Таким образом, мышь не может использоваться в горячем подключении; в результате приходится перезапускать свой компьютер всякий раз, когда устанавливается/удаляется мышь PS/2.

Начальное обнаружение мыши PS/2 происходит во время включения компьютера. Если мышь будет обнаружена, то BIOS позволит операционной системе конфигурировать/использовать мышь. Иначе устанавливается запрет на передачу по шине мыши. Если загружать компьютер с присоединенной мышью, отключить мышь и повторно ее включить в то время, когда загружается Windows, ОС в состоянии обнаружить мышь и дать с ней работать.

Рассмотрим передачу данных между компьютером и стандартной мышью PS/2 во время процесса начальной загрузки (Листинг 1).

Листинг 1 

 

	Включение питания:
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: FF Команда сброса
	Мышь: FA Подтверждение
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: FF Команда сброса
	Мышь: FA Подтверждение
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: FF Команда сброса
	Мышь: FA Подтверждение
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: C8 число 200
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 64 число 100
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 50 число 80
	Мышь: FA Подтверждение
	Хост: F2 Прочитать тип устройства
	Мышь: FA Подтверждение
	Мышь: 00 Идентификатор мыши
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 0A число 10
	Мышь: FA Подтверждение
	Хост: F2 Прочитать тип устройства
	Мышь: FA Подтверждение
	Мышь: 00 Идентификатор мыши
	Хост: E8 Установить разрешение
	Мышь: FA Подтверждение
	Хост: 03 8 значений/мм
	Мышь: FA Подтверждение
	Хост: E6 Установить масштабирование 1:1
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 28 число 40
	Мышь: FA Подтверждение
	Хост: F4 Включить
	Мышь: FA Подтверждение
	Инициализация завершена...
	Если нажата левая кнопка.
	Мышь: 09 1 1 00001001; Бит0 – состояние левой кнопки мыши; Бит3 всегда =1
	Мышь: 00 1 1 Нет X-перемещений
	Мышь: 00 1 1 Нет Y-перемещений
	... и отпущена левая кнопка мыши:
	Мышь: 08 0 1 00001000 Бит0 – состояние левой кнопки мыши; Бит3 всегда =1
	Мышь: 00 1 1 Нет X-перемещений
	Мышь: 00 1 1 Нет Y-перемещений

Теперь рассмотрим обмен данными между компьютером и мышью Intellimouse (при загрузке компьютера).

 

	Включение питания:
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: FF Команда сброса
	Мышь: FA Подтверждение
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: FF Команда сброса (все, надоело. Дальше хост не выделяю)
	Мышь: FA Подтверждение
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: FF Команда сброса
	Мышь: FA Подтверждение
	Мышь: AA Тестовый режим
	Мышь: 00 Идентификатор мыши
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: C8 число 200
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 64 число 100
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 50 число 80
	Мышь: FA Подтверждение
	Хост: F2 Прочитать тип устройства
	Мышь: FA Подтверждение
	Мышь: 03 Идентификатор мыши
	Хост: E8 Установить разрешение
	Мышь: FA Подтверждение
	Хост: 03 8 значений/мм
	Мышь: FA Подтверждение
	Хост: E6 Установить масштабирование 1:1
	Dev: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 28 число 40
	Мышь: FA Подтверждение
	Хост: F4 Включить устройство
	Мышь: FA Подтверждение
	Если нажата левая кнопка мыши…
	Мышь: 09 00001001 Бит0 – состояние левой кнопки мыши; Бит3 всегда =1
	Мышь: 00 Нет X-перемещений
	Мышь: 00 Нет Y-перемещений
	Мышь: 00 Нет Z-перемещений
	... и отпущена левая кнопка мыши:
	Мышь: 08 00001000
	Мышь: 00 Нет X-перемещений
	Мышь: 00 Нет Y-перемещений
	Мышь: 00 Нет Z-перемещений
	После установки драйвера IntelliMouse Microsoft с поддержкой 4-х и 5-х кнопок
	была найдена следующая последовательность:
	...то же самое, что и раньше...
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: C8 число 200
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 64 число 100
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 50 число 80
	Мышь: FA Подтверждение
	Хост: F2 Прочитать тип устройства
	Мышь: FA Подтверждение
	Мышь: 03 Идентификатор мыши
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: C8 число 200
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: C8 число 200
	Мышь: FA Подтверждение
	Хост: F3 Установить частоту дискретизации
	Мышь: FA Подтверждение
	Хост: 50 число 80
	Мышь: FA Подтверждение
	Хост: F2 Прочитать тип устройства
	Мышь: FA Подтверждение
	Мышь: 04 Идентификатор мыши

 

Заключение

Удалось выяснить принцип работы мышки – протокол обмена с компьютером. Благодаря полученной информации представилась возможность использовать мышь не только по ее прямому назначению, но и для поделок, как я говорил выше. Самый простой пример – это прикрепление мышки под днище самодельного робота, а так как мы знаем протокол обмена, можно, например, сделать дешевый импровизированный GPS-навигатор, и ваш робот будет всегда знать, где он находится, а заодно и шарики мышки будут использоваться как дополнительные колеса. Другой пример. Подключаем мышку к тому же самому роботу и управляем им: двинул мышь вперед – робот поехал вперед, кликнул мышкой – робот выстрелил импровизированной ракетой.

Вы можете ответить или разместить запись на вашем сайте.

Ответить

Powered by Procoder