{"id":550,"date":"2014-08-20T12:58:38","date_gmt":"2014-08-20T11:58:38","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=550"},"modified":"2014-08-20T12:58:38","modified_gmt":"2014-08-20T11:58:38","slug":"ev3dev-wireless-gamepad","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2014\/ev3dev-wireless-gamepad","title":{"rendered":"ev3dev &#8211; wireless gamepad"},"content":{"rendered":"<div class=\"seriesmeta\">This post is part 3 of 9 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/ad4m4st0r-um-rover-lego\" class=\"series-122\" title=\"AD4M4ST0R - um rover LEGO\">AD4M4ST0R - um rover LEGO<\/a><\/div><p>O gamepad utilizado no <a title=\"AD4M4ST0R \u2013 um rover LEGO\" href=\"http:\/\/ofalcao.pt\/blog\/2014\/ad4m4st0r-um-rover-lego\">AD4M4ST0R<\/a> \u00e9 um &#8220;<a title=\"Gioteck VX-2 Wireless Controller\" href=\"http:\/\/www.gioteck.com\/products\/playstation-3\/controllers-ps3\/vx-2-wireless\/\">Gioteck VX-2 Wireless Controller<\/a>&#8221; comprado na FNAC por \u20ac19.99. Qualquer modelo compat\u00edvel com PC dever\u00e1 funcionar, desde que use um dongle USB (os modelos por cabo USB tamb\u00e9m funcionar\u00e3o mas n\u00e3o servem para o caso). Quando o stack bluetooth estiver funcional no ev3dev tamb\u00e9m dever\u00e3o funcionar gamepads desse tipo<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/08\/gamepad.jpg\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-551\" src=\"https:\/\/i0.wp.com\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/08\/gamepad.jpg?resize=840%2C630\" alt=\"gamepad\" width=\"840\" height=\"630\" srcset=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/08\/gamepad.jpg?w=1000&amp;ssl=1 1000w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/08\/gamepad.jpg?resize=300%2C225&amp;ssl=1 300w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a>O gamepad \u00e9 reconhecido automaticamente como um gamepad e como um disposito de classe OHCI:<\/p>\n<pre>root@ev3dev:~# dmesg\n(...)\nusb 1-1.4: new full-speed USB device number 4 using ohci\nhid-generic 0003:25F0:83C2.0001: usb_submit_urb(ctrl) failed: -1\nhid-generic 0003:25F0:83C2.0001: timeout initializing reports\ninput: Goodbetterbest Ltd Gioteck VX2 2.4G Wireless Controller as \/devices\/platform\/ohci.0\/usb1\/1-1\/1-1.4\/1-1.4:1.0\/0003:25F0:83C2.0001\/input\/input2\nhid-generic 0003:25F0:83C2.0001: input: USB HID v1.10 Gamepad [Goodbetterbest Ltd Gioteck VX2 2.4G Wireless Controller] on usb-ohci.0-1.4\/input0<\/pre>\n<p>Mas a implementa\u00e7\u00e3o USB deixa um bocado a desejar:<\/p>\n<pre>root@ev3dev:~# lsusb\nBus 001 Device 004: ID 25f0:83c2<\/pre>\n<p>Bela porcaria, nem um descritivo? Vamos inspeccionar com mais detalhe:<\/p>\n<pre>root@ev3dev:~#\u00a0 lsusb -d 25f0:83c2 -v\n\nBus 001 Device 004: ID 25f0:83c2 \u00a0\nDevice Descriptor:\n\u00a0 bLength\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 18\n\u00a0 bDescriptorType\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\n\u00a0 bcdUSB\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1.10\n\u00a0 bDeviceClass\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0 (Defined at Interface level)\n\u00a0 bDeviceSubClass\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\u00a0 bDeviceProtocol\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\u00a0 bMaxPacketSize0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 16\n\u00a0 idVendor\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x25f0\n\u00a0 idProduct\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x83c2\n\u00a0 bcdDevice\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3.15\n\u00a0 iManufacturer\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1 Goodbetterbest Ltd\n\u00a0 iProduct\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2 Gioteck VX2 2.4G Wireless Controller\n\u00a0 iSerial\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\u00a0 bNumConfigurations\u00a0\u00a0\u00a0\u00a0\u00a0 1\n\u00a0 Configuration Descriptor:\n\u00a0\u00a0\u00a0 bLength\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 9\n\u00a0\u00a0\u00a0 bDescriptorType\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2\n\u00a0\u00a0\u00a0 wTotalLength\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 41\n\u00a0\u00a0\u00a0 bNumInterfaces\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\n\u00a0\u00a0\u00a0 bConfigurationValue\u00a0\u00a0\u00a0\u00a0 1\n\u00a0\u00a0\u00a0 iConfiguration\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\u00a0\u00a0\u00a0 bmAttributes\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x80\n\u00a0\u00a0\u00a0\u00a0\u00a0 (Bus Powered)\n\u00a0\u00a0\u00a0 MaxPower\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 500mA\n\u00a0\u00a0\u00a0 Interface Descriptor:\n\u00a0\u00a0\u00a0\u00a0\u00a0 bLength\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 9\n\u00a0\u00a0\u00a0\u00a0\u00a0 bDescriptorType\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4\n\u00a0\u00a0\u00a0\u00a0\u00a0 bInterfaceNumber\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\u00a0\u00a0\u00a0\u00a0\u00a0 bAlternateSetting\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\u00a0\u00a0\u00a0\u00a0\u00a0 bNumEndpoints\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2\n\u00a0\u00a0\u00a0\u00a0\u00a0 bInterfaceClass\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3 Human Interface Device\n\u00a0\u00a0\u00a0\u00a0\u00a0 bInterfaceSubClass\u00a0\u00a0\u00a0\u00a0\u00a0 0 No Subclass\n\u00a0\u00a0\u00a0\u00a0\u00a0 bInterfaceProtocol\u00a0\u00a0\u00a0\u00a0\u00a0 0 None\n\u00a0\u00a0\u00a0\u00a0\u00a0 iInterface\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HID Device Descriptor:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bLength\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 9\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bDescriptorType\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 33\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bcdHID\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1.10\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bCountryCode\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0 Not supported\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bNumDescriptors\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bDescriptorType\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 34 Report\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wDescriptorLength\u00a0\u00a0\u00a0\u00a0 137\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Report Descriptors:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ** UNAVAILABLE **\n\u00a0\u00a0\u00a0\u00a0\u00a0 Endpoint Descriptor:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bLength\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 7\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bDescriptorType\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bEndpointAddress\u00a0\u00a0\u00a0\u00a0 0x01\u00a0 EP 1 OUT\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bmAttributes\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Transfer Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Interrupt\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Synch Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 None\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Usage Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Data\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wMaxPacketSize\u00a0\u00a0\u00a0\u00a0 0x0010\u00a0 1x 16 bytes\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bInterval\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 10\n\u00a0\u00a0\u00a0\u00a0\u00a0 Endpoint Descriptor:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bLength\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 7\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bDescriptorType\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bEndpointAddress\u00a0\u00a0\u00a0\u00a0 0x82\u00a0 EP 2 IN\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bmAttributes\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Transfer Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Interrupt\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Synch Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 None\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Usage Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Data\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wMaxPacketSize\u00a0\u00a0\u00a0\u00a0 0x0020\u00a0 1x 32 bytes\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bInterval\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\nDevice Status:\u00a0\u00a0\u00a0\u00a0 0x0000\n\u00a0 (Bus Powered)\n\n<\/pre>\n<p>Sendo OHCI temos tamb\u00e9m:<\/p>\n<pre>root@ev3dev:~# ls \/dev\/input\/by-id\/ -la\ntotal 0\ndrwxr-xr-x 2 root root\u00a0 60 Aug 15 07:16 .\ndrwxr-xr-x 4 root root 140 Aug 15 07:16 ..\nlrwxrwxrwx 1 root root\u00a0\u00a0 9 Aug 15 07:16 usb-Goodbetterbest_Ltd_Gioteck_VX2_2.4G_Wireless_Controller-event-joystick -&gt; ..\/event2\n\n<\/pre>\n<p>No Ubuntu consigo ver o estado dos v\u00e1rios bot\u00f5es e joysticks do gamepad com o comando &#8216;jstest&#8217; do pacote &#8216;joystick&#8217; por isso:<\/p>\n<pre>root@ev3dev:~# apt-get install joystick\nroot@ev3dev:~# jstest --normal \/dev\/input\/by-id\/usb-Goodbetterbest_Ltd_Gioteck_VX2_2.4G_Wireless_Controller-event-joystick\nDriver version is 0.8.0.\njstest is not fully compatible with your kernel. Unable to retrieve button map!\nJoystick (Unknown) has 2 axes and 2 buttons.\nTesting ... (interrupt to exit)\n\njstest: error reading: Invalid argument<\/pre>\n<p>&#8220;Not fully compatible with your kernel&#8221;&#8230; Oops!<\/p>\n<p>Podemos sempre aceder directamente:<\/p>\n<pre>root@ev3dev:~# cat \/dev\/input\/by-id\/usb-Goodbetterbest_Ltd_Gioteck_VX2_2.4G_Wireless_Controller-event-joystick\n\ufffdS\ufffdz\u0001\u0004\u0004\u0001\u00a0\u00a0 \u00a0\ufffdS\ufffdz\u0001\u00010\u0001\u0001\ufffdS\ufffdz\u0001\ufffdS\ufffd\ufffd\u0003\u0004\u0004\u0001\u00a0\u00a0 \u00a0\ufffdS\ufffd\ufffd\u0003\u00010\u0001\ufffdS\ufffd\ufffd\u0003<\/pre>\n<p>carregar um bot\u00e3o apenas gerou esta sequ\u00eancia de caracteres estranha&#8230; pelo menos sabemos que funciona s\u00f3 falta entender o formato. Como sou pregui\u00e7oso fui buscar o PyGame, um m\u00f3dulo de python muito usado na comunidade Raspberry Pi que j\u00e1 faz isso &#8211; a semelhan\u00e7a do EV3 com o Raspberry Pi \u00e9 t\u00e3o impressionante que lhe podemos ir buscar ideias para quase tudo.<\/p>\n<pre>root@ev3dev:~# apt-get install python-pygame\nroot@ev3dev:~# nano joystick.py\nroot@ev3dev:~# chmod +x joystick.py\nroot@ev3dev:~# python joystick.py<\/pre>\n<p>O script python &#8216;joystick.py&#8217;:<\/p>\n<pre>import traceback, os\n\nos.environ['SDL_VIDEODRIVER'] = 'dummy'\n\nfrom pygame import joystick, event, display\n\ndef main():\n\u00a0 try:\n\n\u00a0\u00a0\u00a0 display.init()\n\u00a0\u00a0\u00a0 joystick.init()\n\u00a0\u00a0\u00a0 js=joystick.Joystick(0)\n\u00a0\u00a0\u00a0 js.init()\n\n\u00a0\u00a0\u00a0 num_axes=js.get_numaxes()\n\u00a0\u00a0\u00a0 num_buttons=js.get_numbuttons()\n\u00a0\u00a0\u00a0 num_hats=js.get_numhats()\n\n\u00a0\u00a0\u00a0 print 'Axes:', num_axes\n\u00a0\u00a0\u00a0 print 'Buttons:', num_buttons\n\u00a0\u00a0\u00a0 print 'Hats:', num_hats\n\n\u00a0\u00a0\u00a0 while True:\n\u00a0\u00a0\u00a0\u00a0\u00a0 event.pump()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 for i in range(0, num_axes):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'Axis %i: %6.3f' % (i, js.get_axis(i))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 for i in range(0, num_buttons):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'Button %i: %r' % (i, js.get_button(i))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 for i in range(0, num_hats):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'Hat %i: %s' % (i, js.get_hat(i))\n\n\u00a0 except (KeyboardInterrupt, SystemExit):\n\u00a0\u00a0\u00a0 print \"Exiting...\"\n\u00a0 except Exception:\n\u00a0\u00a0\u00a0 traceback.print_exc(file=sys.stdout)\n\n\u00a0 sys.exit(0)\n\nif __name__ == \"__main__\":\n\u00a0\u00a0\u00a0 main()\n<\/pre>\n<p>\u00c0 custa deste script fiquei a saber que o gamepad tem 4 axes (2 por cada joystick anal\u00f3gico), 13 buttons e 1 hat (o hat \u00e9 o conjunto de 4 teclas direccionais \u00e0 esquerda do gamepad) que quando accionados devolvem:<\/p>\n<p>Para cada um dos 13 bot\u00f5es:<\/p>\n<p style=\"padding-left: 30px;\">gatilho esquerdo = 6<br \/>\nbot\u00e3o sobre gatilho esquerdo = 4<br \/>\ngatilho direito = 7<br \/>\nbot\u00e3o sobre gatilho direito = 5<br \/>\nselect = 8<br \/>\nstart = 9<br \/>\nhome = 12<br \/>\ntriangulo = 0<br \/>\ncirculo = 1<br \/>\ncruz = 2<br \/>\nquadrado = 3<br \/>\nbot\u00e3o do joystick esquerdo = 10<br \/>\nbot\u00e3o do joystick direito = 11<\/p>\n<p>(o bot\u00e3o &#8220;Turbo&#8217; ao centro do gamepad parece n\u00e3o funcionar)<\/p>\n<p>Para cada um dos 4 bot\u00f5es do hat:<\/p>\n<p style=\"padding-left: 30px;\">cima = (0,1)<br \/>\ndireita = (1,0)<br \/>\nbaixo = (0,-1)<br \/>\nesquerda = (-1,0)<\/p>\n<p>Para o joystick da direita:<\/p>\n<p style=\"padding-left: 30px;\">todo para cima: Eixo 3 = -1<br \/>\ntodo para baixo: Eixo 3 = 1<br \/>\ntodo para direita: Eixo 2 = 1<br \/>\ntodo para esquerda: Eixo 2 = -1<br \/>\n=&gt; (x,y) = (axis2,-axis3)<\/p>\n<p>Para o joystick da esquerda:<\/p>\n<p style=\"padding-left: 30px;\">todo para cima: Eixo 1 = -1<br \/>\ntodo para baixo: Eixo 1 = 1<br \/>\ntodo para direita: Eixo 0 = 1<br \/>\ntodo para esquerda: Eixo 0 = -1<br \/>\n=&gt; (x,y) = (axis0,-axis1)<\/p>\n<p>O gamepad tem tamb\u00e9m um motor interno para vibra\u00e7\u00e3o (force feedback?) mas que s\u00f3 funciona com Playstation 3. Curiosamente de vez em quando acontece-me poucos minutos depois de desligar o EV3 o gamepad desatar a vibrar.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This post is part 3  of 9 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/ad4m4st0r-um-rover-lego\" class=\"series-122\" title=\"AD4M4ST0R - um rover LEGO\">AD4M4ST0R - um rover LEGO<\/a><\/div><p>O gamepad utilizado no AD4M4ST0R \u00e9 um &#8220;Gioteck VX-2 Wireless Controller&#8221; comprado na FNAC por \u20ac19.99. Qualquer modelo compat\u00edvel com PC dever\u00e1 funcionar, desde que use um dongle USB (os modelos por cabo USB tamb\u00e9m funcionar\u00e3o mas n\u00e3o servem para o caso). Quando o stack bluetooth estiver funcional no ev3dev tamb\u00e9m dever\u00e3o funcionar gamepads desse &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2014\/ev3dev-wireless-gamepad\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;ev3dev &#8211; wireless gamepad&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[1],"tags":[],"series":[122],"class_list":["post-550","post","type-post","status-publish","format-standard","hentry","category-sem-categoria","series-ad4m4st0r-um-rover-lego"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-8S","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/comments?post=550"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/550\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=550"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}