{"id":526,"date":"2014-08-14T15:13:47","date_gmt":"2014-08-14T14:13:47","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=526"},"modified":"2014-08-14T15:13:47","modified_gmt":"2014-08-14T14:13:47","slug":"ev3dev-keypad-usb","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2014\/ev3dev-keypad-usb","title":{"rendered":"ev3dev &#8211; keypad USB"},"content":{"rendered":"<p>Ter o LEGO Mindstorms EV3 a correr uma vers\u00e3o quase standard de Debian Linux come\u00e7a agora a revelar as suas vantagens: podemos atirar-lhe com quase tudo o que tivermos na nossa gaveta de sucata&#8230; como por exemplo um teclado num\u00e9rico USB:<\/p>\n<figure style=\"width: 250px\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/b.scdn.gr\/images\/sku_main_images\/002460\/2460744\/large_1525793-Roline.jpg?resize=250%2C250\" alt=\"\" width=\"250\" height=\"250\" \/><figcaption class=\"wp-caption-text\">USB Keypad (roline)<\/figcaption><\/figure>\n<p>O sistema operativo reconhece-o como um teclado convencional:<\/p>\n<pre>root@ev3dev:~# dmesg\nusb 1-1.4.1: new low-speed USB device number 7 using ohci\ninput: USB-compliant keyboard as \/devices\/platform\/ohci.0\/usb1\/1-1\/1-1.4\/1-1.4.1\/1-1.4.1:1.0\/0003:0B38:0003.0001\/input\/input2\nhid-generic 0003:0B38:0003.0001: input: USB HID v1.10 Keyboard [USB-compliant keyboard] on usb-ohci.0-1.4.1\/input0\ninput: USB-compliant keyboard as \/devices\/platform\/ohci.0\/usb1\/1-1\/1-1.4\/1-1.4.1\/1-1.4.1:1.1\/0003:0B38:0003.0002\/input\/input3\nhid-generic 0003:0B38:0003.0002: input: USB HID v1.10 Mouse [USB-compliant keyboard] on usb-ohci.0-1.4.1\/input1<\/pre>\n<pre>root@ev3dev:~# lsusb\nBus 001 Device 007: ID 0b38:0003 Gear Head Keyboard\nBus 001 Device 006: ID 058f:9254 Alcor Micro Corp. Hub<\/pre>\n<p>(o teclado tem embutido um hub USB de 2 portas da\u00ed o segundo device USB reportado)<\/p>\n<p>O sistema operativo cria entradas do tipo &#8216;event#&#8217; em &#8216;\/dev\/input&#8217; assim como apontadores com descritivos mais leg\u00edveis:<\/p>\n<pre>ls \/dev\/input\/by-id\/ -la\nlrwxrwxrwx 1 root root\u00a0 10 Aug 13 23:38 usb-0b38_USB-compliant_keyboard-event-if01 -&gt; ..\/event2\nlrwxrwxrwx 1 root root\u00a0 10 Aug 13 23:38 usb-0b38_USB-compliant_keyboard-event-kbd -&gt; ..\/event1\n<\/pre>\n<p>De modo que o teclado pode ser referido por um destes dois ficheiros:<\/p>\n<ul>\n<li>\/dev\/input\/event1<\/li>\n<li>\/dev\/input\/usb-0b38_USB-compliant_keyboard-event-kbd<\/li>\n<\/ul>\n<p>Enquanto que o sufixo &#8220;event1&#8221; \u00e9 vari\u00e1vel, o descritivo &#8220;by-id&#8221; n\u00e3o \u00e9 &#8211; no meu laptop Ubuntu o mesmo comando retorna:<\/p>\n<pre>~$ ls \/dev\/input\/by-id\/ -la\nlrwxrwxrwx 1 root root\u00a0 10 Aug 13 23:38 usb-0b38_USB-compliant_keyboard-event-if01 -&gt; ..\/event19\nlrwxrwxrwx 1 root root\u00a0 10 Aug 13 23:38 usb-0b38_USB-compliant_keyboard-event-kbd -&gt; ..\/event18<\/pre>\n<p>por isso \u00e9 prefer\u00edvel utilizar o descritivo &#8220;by-id&#8221;.<\/p>\n<p>N\u00e3o \u00e9 suficiente ler os valores deste ficheiro &#8211; o primir de uma tecla gera gera um c\u00f3digo de v\u00e1rios caracteres aparentemente ininteligiveis:<\/p>\n<pre>~$ cat \/dev\/input\/event1\nw\ufffd\ufffdS\ufffdV\u0001\u0004\u0004Sw\ufffd\ufffdS\ufffdV\u0001\u0001E\u0001w\ufffd\ufffdS\ufffdV\u0001w\ufffd\ufffdS\ufffdW\u0001\u0011w\ufffd\ufffdS\ufffdW\u0001w\ufffd\ufffdS\ufffd\ufffd\u0001\u0004\u0004Sw\ufffd\ufffdS\ufffd\ufffd\u0001\u0001Ew\ufffd\ufffdS\ufffd\ufffd\u0001^C<\/pre>\n<p>A solu\u00e7\u00e3o \u00e9 usar o comando &#8216;showkey -s&#8217; para descodificar. Por exemplo premindo a tecla &#8216;4&#8217; com e sem &#8216;NumLock&#8217; activo resulta:<\/p>\n<pre>cat \/dev\/input\/by-id\/usb-0b38_USB-compliant_keyboard-event-kbd &gt; showkey -s<\/pre>\n<ul>\n<li>Sem Numlock: &#8220;^[[D&#8221;<\/li>\n<li>Com NumLock: &#8220;4&#8221;<\/li>\n<\/ul>\n<p>Felizmente isto s\u00f3 \u00e9 necess\u00e1rio se quisermos ler directamente o teclado. Em situa\u00e7\u00f5es normais, quando os nossos programas est\u00e3o a correr, o pr\u00f3prio sistema operativo pode fazer esse trabalho por n\u00f3s. No caso do ev3dev podemos ler uma \u00fanica tecla a partir da consola com o seguinte comando bash:<\/p>\n<pre>read -s -n 1 Tecla &lt; \/dev\/tty1<\/pre>\n<p>O par\u00e2metro &#8216;-s&#8217; serve para correr em modo silencioso (i.e. a tecla n\u00e3o \u00e9 simult\u00e2neamente escrita na consola) e o par\u00e2metro &#8216;-n 1&#8217; for\u00e7a a leitura de um \u00fanico caracter (quanto ao pipe &#8216;&lt; \/dev\/tty1&#8217; descobri entretanto que tanto faz referir \/dev\/tty0 como \/dev\/tty1 portanto a partir daqui refiro a consola do ev3dev como \/dev\/tty1&#8230; porque sim)<\/p>\n<p>O script abaixo junta esta informa\u00e7\u00e3o com a obtida anterior a respeito dos motores e permite controlar a rota\u00e7\u00e3o do motor com as teclas &#8216;4&#8217; (LEFT) e &#8216;6&#8217; (RIGHT), terminado com a tecla &#8216;ENTER&#8217;.<\/p>\n<pre>#!\/bin\/bash\n\n#chmod +x controlkey.sh\n\ntput clear &gt; \/dev\/tty1\nsetfont \/usr\/share\/consolefonts\/Lat15-TerminusBold32x16.psf.gz\necho -n \"Prima tecla\" &gt; \/dev\/tty1\n\nwhile true; do\n\n\u00a0 read -s -n 1 char &lt; \/dev\/tty1\n\u00a0 if [[ \"$char\" = \"\" ]]; then\n\u00a0\u00a0\u00a0 break\n\u00a0 fi\n\n\u00a0 case \"$char\" in\n\n\u00a0 4) echo \"LEFT\" &gt; \/dev\/tty1\n\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 0 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/duty_cycle_sp\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 1 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/run\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 50 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/duty_cycle_sp\n\u00a0\u00a0\u00a0\u00a0 sleep 1s\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 0 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/run\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 0 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/duty_cycle_sp\n\n\u00a0\u00a0\u00a0 ;;\n\n\u00a0 6) echo \"RIGHT\" &gt; \/dev\/tty1\n\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 0 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/duty_cycle_sp\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 1 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/run\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 -50 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/duty_cycle_sp\n\u00a0\u00a0\u00a0\u00a0 sleep 1s\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 0 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/run\n\u00a0\u00a0\u00a0\u00a0 echo\u00a0\u00a0 0 &gt; \/sys\/class\/tacho-motor\/tacho-motor0\/duty_cycle_sp\n\n\u00a0\u00a0\u00a0 ;;\n\u00a0\u00a0 esac\n\ndone\n\necho \"Bye!\" &gt; \/dev\/tty1\n\n<\/pre>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"ev3dev - using a keypad\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/KxICfllZeA8?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>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ter o LEGO Mindstorms EV3 a correr uma vers\u00e3o quase standard de Debian Linux come\u00e7a agora a revelar as suas vantagens: podemos atirar-lhe com quase tudo o que tivermos na nossa gaveta de sucata&#8230; como por exemplo um teclado num\u00e9rico USB: O sistema operativo reconhece-o como um teclado convencional: root@ev3dev:~# dmesg usb 1-1.4.1: new low-speed &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2014\/ev3dev-keypad-usb\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;ev3dev &#8211; keypad USB&#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":[13,16,19],"tags":[69,111],"series":[],"class_list":["post-526","post","type-post","status-publish","format-standard","hentry","category-ev3dev","category-geek","category-lego-mindstorms","tag-keypad","tag-teclado"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-8u","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/526","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=526"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/526\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=526"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}