{"id":760,"date":"2014-10-29T09:11:17","date_gmt":"2014-10-29T09:11:17","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=760"},"modified":"2014-10-31T10:01:02","modified_gmt":"2014-10-31T10:01:02","slug":"sbrick-controlo-remoto-com-um-gamepad","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2014\/sbrick-controlo-remoto-com-um-gamepad","title":{"rendered":"SBrick &#8211; controlo remoto com um gamepad"},"content":{"rendered":"<p>Apresento o meu script em python para controlar o <a title=\"SBrick\" href=\"https:\/\/www.sbrick.com\/\">SBrick<\/a> com um gamepad a partir do Linux. Recorro \u00e0 biblioteca PyGame para ler o gamepad (assumindo que o gamepad \u00e9 suportado nativamente pelo Linux, ver tamb\u00e9m o meu artigo sobre <a title=\"AD4M4ST0R \u2013 controlo por joystick\" href=\"http:\/\/ofalcao.pt\/blog\/2014\/ad4m4st0r-controlo-por-joystick\">como utiizar um gamepad com ev3dev<\/a>) e ao comando gatttool do BlueZ 5.0 para comunicar via Bluetooth BLE com o SBrick (assumindo tamb\u00e9m a presen\u00e7a de um dongle Bluetooth 4.0).<\/p>\n<p>&nbsp;<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"Vengit SBrick controlled by gamepad\" width=\"840\" height=\"630\" src=\"https:\/\/www.youtube.com\/embed\/Cm3eSMVfjKA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<p>Este script funciona bem com Ubuntu mas dever\u00e1 tamb\u00e9m funcionar em qualquer variante de Debian incluindo Raspbian (no Raspberry Pi) e <a title=\"ev3dev - Debian on LEGO MINDSTORMS EV3!\" href=\"http:\/\/www.ev3dev.org\/\">ev3dev<\/a> (no LEGO Mindstorms EV3, onde utilizei uma vers\u00e3o inicial deste script).<\/p>\n<pre>#!\/usr\/bin\/env python\r\n\r\n# sudo apt-get install python-pygame\r\n\r\nimport sys, traceback, os\r\nos.environ['SDL_VIDEODRIVER'] = 'dummy'\r\nfrom math import log10\r\nfrom subprocess import call\r\nfrom time import sleep\r\nfrom pygame import joystick, event, display\r\n\r\n### buttons ###\r\nB_TRIANG = 0\r\nB_CIRC = 1\r\nB_CROSS = 2\r\nB_SQUARE = 3\r\nB_LTRIG2 = 4\r\nB_RTRIG2 = 5\r\nB_LTRIG = 6\r\nB_RTRIG = 7\r\nB_SELECT = 8\r\nB_LJOY = 10\r\nB_RJOY = 11\r\nB_START = 9\r\n\r\n\r\ndef main():\r\n\u00a0 try:\r\n\u00a0\u00a0\u00a0 display.init();\r\n\u00a0\u00a0\u00a0 joystick.init();\r\n\u00a0\u00a0\u00a0 js=joystick.Joystick(0);\r\n\u00a0\u00a0\u00a0 js.init();\r\n\r\n\u00a0\u00a0\u00a0 DRIVE_A=\"gatttool -b 00:07:80:7F:28:E1 -i hci0 --char-write --handle=0x0025 --value=0102\"\r\n\u00a0\u00a0\u00a0 DRIVE_B=\"gatttool -b 00:07:80:7F:28:E1 -i hci0 --char-write --handle=0x0025 --value=0103\"\r\n\u00a0\u00a0\u00a0 COAST_A=\"gatttool -b 00:07:80:7F:28:E1 -i hci0 --char-write --handle=0x0025 --value=01020000\"\r\n\u00a0\u00a0\u00a0 COAST_B=\"gatttool -b 00:07:80:7F:28:E1 -i hci0 --char-write --handle=0x0025 --value=01030000\"\r\n\u00a0\u00a0\u00a0 BREAK_A=\"gatttool -b 00:07:80:7F:28:E1 -i hci0 --char-write --handle=0x0025 --value=0002\"\r\n\u00a0\u00a0\u00a0 BREAK_B=\"gatttool -b 00:07:80:7F:28:E1 -i hci0 --char-write --handle=0x0025 --value=0003\"\r\n\r\n\u00a0\u00a0\u00a0 ### starts in Joystick mode ###\r\n\u00a0\u00a0\u00a0 control_by_JOYSTICK=True;\r\n\r\n\u00a0\u00a0\u00a0 num_axes=js.get_numaxes();\r\n\u00a0\u00a0\u00a0 num_buttons=js.get_numbuttons();\r\n\u00a0\u00a0\u00a0 num_hats=js.get_numhats();\r\n\r\n\u00a0\u00a0\u00a0 ### assuming 4 axes, 13 buttons and 1 hat\r\n\r\n\u00a0\u00a0\u00a0 flag=False;\r\n\r\n\u00a0\u00a0\u00a0 while True:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 x=y=motor_r=motor_l=0.0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 event.pump();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 button_mode=js.get_button(B_SELECT);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 button_shot=js.get_button(B_SQUARE);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if button_mode ==1:\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if control_by_JOYSTICK==True:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 control_by_JOYSTICK=False;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'Control Mode=HAT';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 control_by_JOYSTICK=True;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'Control Mode=JOYSTICK';\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ### joysticks axis [-1, +1]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ### x=axis2 , y=-axis3\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ### ignore less than 0.2 (dead zone)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ### apply log10(100x) (to reforce lower values)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ### result is less or equal than 2 = log10(100)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if control_by_JOYSTICK==True:\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Control by Right Joystick, Axis 2 e 3\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 axis2=js.get_axis(2);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 axis3=js.get_axis(3);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 if axis2&gt;0:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if axis2&lt;0.2:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=log10(axis2*100);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 elif axis2&lt;0:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if axis2&gt;-0.2:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=-log10(-axis2*100);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 if axis3&gt;0:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if axis3&lt;0.2:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=-log10(axis3*100);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 elif axis3&lt;0:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if axis3&gt;-0.2:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=log10(-axis3*100);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 if y&lt;&gt;0:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if x&lt;0:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=100*y;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # turn left =&gt; slow motor_l\r\n\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=y*(100+25*x);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_el=100*y;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # turn right =&gt; slow motor_r\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=y*(100-25*x);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 elif x&lt;&gt;0:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # y=0, just turn\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=100*x;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=-motor_l;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 # Control by HAT keys\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 hat=js.get_hat(0);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 if hat==(0,1):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'FRONT';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=100;\r\n\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 elif hat==(1,0):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'RIGHT';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=-100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 elif hat==(0,-1):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'BACK';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=-100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=-100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 elif hat==(-1,0):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'LEFT';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=-100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 elif hat==(1,1):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'FRONT+RIGHT';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=50;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 elif hat==(-1,1):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'FRONT+LEFT';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=50;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 elif hat==(-1,-1):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'BACK+LEFT';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=-100;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=-50;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 elif hat==(1,-1):\r\n#\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print 'BACK+RIGHT';\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_l=-50;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 motor_r=-100;\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # get direction and duty cycle\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if (motor_l&lt;0):\r\n\u00a0\u00a0 \u00a0 dir_l=\"00\"\r\n\u00a0\u00a0 \u00a0 duty_l=str(hex(int(-motor_l)))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dir_l=\"01\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 duty_l=str(hex(int(motor_l)))\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if (motor_r&lt;0):\r\n\u00a0\u00a0 \u00a0 dir_r=\"01\"\r\n\u00a0\u00a0 \u00a0 duty_r=str(hex(int(-motor_r)))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 else:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dir_r=\"00\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 duty_r=str(hex(int(motor_r)))\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 # command+direction+dutycyle\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 command_A=DRIVE_A+dir_r+duty_r[2:]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 command_B=DRIVE_B+dir_l+duty_l[2:]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 call(command_A, shell=True);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 call(command_B, shell=True);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 sleep(0.1)\r\n#\u00a0\u00a0\u00a0\u00a0\u00a0 call(BREAK_A,shell=True);\r\n#\u00a0\u00a0\u00a0\u00a0\u00a0 call(BREAK_B,shell=True);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 call(COAST_A,shell=True);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 call(COAST_B,shell=True);\r\n\r\n\u00a0\u00a0\u00a0 # end while\r\n\r\n\u00a0 except (KeyboardInterrupt, SystemExit):\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 print \"Exiting...\";\r\n\u00a0 except Exception:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 traceback.print_exc(file=sys.stdout);\r\n\r\n\u00a0 js.quit();\r\n\u00a0 joystick.quit();\r\n\u00a0 display.quit();\r\n\u00a0 sys.exit(0);\r\n\r\nif __name__ == \"__main__\":\r\n\u00a0\u00a0\u00a0 main()<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Apresento o meu script em python para controlar o SBrick com um gamepad a partir do Linux. Recorro \u00e0 biblioteca PyGame para ler o gamepad (assumindo que o gamepad \u00e9 suportado nativamente pelo Linux, ver tamb\u00e9m o meu artigo sobre como utiizar um gamepad com ev3dev) e ao comando gatttool do BlueZ 5.0 para comunicar &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2014\/sbrick-controlo-remoto-com-um-gamepad\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;SBrick &#8211; controlo remoto com um 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":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[18,20,26],"tags":[217,219,146,63,67,209,86,221,223,225],"series":[],"class_list":["post-760","post","type-post","status-publish","format-standard","hentry","category-lego","category-linux","category-ubuntu","tag-ble","tag-bluetooth","tag-control","tag-gamepad","tag-joystick","tag-linux","tag-motor","tag-power-functions","tag-python","tag-sbrick"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-cg","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/760","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=760"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/760\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=760"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}