{"id":381,"date":"2014-02-03T12:38:25","date_gmt":"2014-02-03T12:38:25","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=381"},"modified":"2014-02-03T12:38:25","modified_gmt":"2014-02-03T12:38:25","slug":"raspberry-pi-como-alternativa-lego-wedo","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2014\/raspberry-pi-como-alternativa-lego-wedo","title":{"rendered":"Raspberry Pi como alternativa LEGO WeDo"},"content":{"rendered":"<p>Para a primeira aplica\u00e7\u00e3o pr\u00e1tica montei o Roaring Lion do conjunto LEGO WeDo (as instru\u00e7\u00f5es de montagem deste e outros modelos simples <a title=\"LEGO WeDo Building Instructions\" href=\"http:\/\/support.legoeducation.us\/Support\/Product_Support\/WeDo?art=6691\" target=\"_blank\">est\u00e3o disponiveis<\/a> no site LEGO Education).<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/02\/raspberrypi-lego-roaring-lion.jpg\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-382\" alt=\"raspberrypi-lego-roaring-lion\" src=\"https:\/\/i0.wp.com\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/02\/raspberrypi-lego-roaring-lion-1024x723.jpg?resize=467%2C330\" width=\"467\" height=\"330\" srcset=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/02\/raspberrypi-lego-roaring-lion.jpg?resize=1024%2C723&amp;ssl=1 1024w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/02\/raspberrypi-lego-roaring-lion.jpg?resize=300%2C211&amp;ssl=1 300w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/02\/raspberrypi-lego-roaring-lion.jpg?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 467px) 85vw, 467px\" \/><\/a>O le\u00e3o \u00e9 muito simples: fazendo rodar o motor num sentido ele levanta-se nas patas dianteiras, no outro sentido volta a deitar-se (como n\u00e3o h\u00e1 sensor de posi\u00e7\u00e3o \u00e9 necess\u00e1rio afinar os tempos \u00e0 m\u00e3o)<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/02\/lego-roaring-lion.jpg\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-383\" alt=\"lego-roaring-lion\" src=\"https:\/\/i0.wp.com\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/02\/lego-roaring-lion-1024x768.jpg?resize=467%2C350\" width=\"467\" height=\"350\" srcset=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/02\/lego-roaring-lion.jpg?resize=1024%2C768&amp;ssl=1 1024w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/02\/lego-roaring-lion.jpg?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/02\/lego-roaring-lion.jpg?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 467px) 85vw, 467px\" \/><\/a>Numa primeira fase testei comandar o le\u00e3o remotamente a partir de uma sess\u00e3o SSH, criando para isso um script (lion.py) em python:<\/p>\n<pre>#!\/usr\/bin\/python3\n\nimport sys\nfrom time import sleep\nimport pifacedigitalio\n\nDELAY_UP = 0.17       # o le\u00e3o custa um pouco mais a subir\nDELAY_DOWN = 0.14     # do que a descer\n\npifacedigital = pifacedigitalio.PiFaceDigital()\nled7=pifacedigital.leds[7]\nled6=pifacedigital.leds[6]\nled7.turn_off()\nled6.turn_off()\n\ncomando='.'\n\nwhile(comando!=\"s\"):\n\u00a0comando=input(\"Comando: \")\n\u00a0if (comando==\"c\"):\n\u00a0\u00a0 print(\"Para cima!\")\n\u00a0\u00a0 led7.turn_on()\n\u00a0\u00a0 sleep(DELAY_UP)\n\u00a0\u00a0 led7.turn_off()\n\u00a0elif (comando==\"b\"):\n\u00a0\u00a0 print(\"Para baixo!\")\n\u00a0\u00a0 led6.turn_on()\n\u00a0\u00a0 sleep(DELAY_DOWN)\n\u00a0\u00a0 led6.turn_off()\n\u00a0elif (comando==\"s\"):\n\u00a0\u00a0 print(\"Tchau!\")\n\u00a0else:\n\u00a0\u00a0 print(\"?\") # comando desconhecido<\/pre>\n<p>\u00c9 necess\u00e1rio dar permiss\u00f5es de execu\u00e7\u00e3o ao script:<\/p>\n<pre>sudo chmod u+x lion.py<\/pre>\n<p>Para correr, basta invocar directamente o script:<\/p>\n<p>.\/lion.py<\/p>\n<p>Os comandos s\u00e3o simples:<\/p>\n<ul>\n<li>c &#8211; para cima<\/li>\n<li>b &#8211; para baixo<\/li>\n<li>s &#8211; para sair<\/li>\n<\/ul>\n<p>Funciona bem mas seria bem melhor se o le\u00e3o estivesse sempre \u00e0 espera de um comando e pudessemos usar o rato em vez do teclado, por exemplo a partir de um browser.<\/p>\n<p>Para isso precisamos de um servidor (daemon) http &#8211; poderia ter ido para o apache mas preferi ir \u00e0 procura de um servidor http mais leve e encontrei o <a title=\"Monkey + Raspbian on Raspberry Pi\" href=\"http:\/\/monkey-project.com\/raspberry\/\" target=\"_blank\">Monkey<\/a> (no passado tive boas experi\u00eancias com o <a href=\"http:\/\/www.lighttpd.net\/\" target=\"_blank\">lighttpd<\/a> e existe tamb\u00e9m o <a href=\"http:\/\/wiki.nginx.org\/\" target=\"_blank\">nginx<\/a>):<\/p>\n<p>Come\u00e7amos por adicionar o reposit\u00f3rio para usar a vers\u00e3o directamente mais recente em vez da que vem do mundo Debian:<\/p>\n<pre>sudo nano \/etc\/apt\/sources.list<\/pre>\n<p>e adicionar a linha<\/p>\n<pre>deb http:\/\/packages.monkey-project.com\/primates_pi primates_pi main<\/pre>\n<p>depois actualizar a cache:<\/p>\n<pre>sudo apt-get update<\/pre>\n<p>e instalar todos os componentes:<\/p>\n<pre>sudo apt-get install monkey\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-liana\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-logger\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-dirlisting\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-cgi\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-fastcgi\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-mandril\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-cheetah\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monkey-auth<\/pre>\n<p>(embora s\u00f3 seja, mesmo necess\u00e1rios o monkey e os m\u00f3dulos liana e cgi )<\/p>\n<p>Para testar basta aceder por browser na porta 2001:<\/p>\n<pre>http:\/\/192.168.1.123:2001\/<\/pre>\n<p>(o conte\u00fado desta p\u00e1gina est\u00e1 ficamente em \/usr\/share\/monkey\/)<\/p>\n<p>Para poder invocar scripts de python a partir de p\u00e1ginas html \u00e9 necess\u00e1rio recorrer a <a title=\"Wikipedia: Common Gateway Interface\" href=\"http:\/\/en.wikipedia.org\/wiki\/Common_Gateway_Interface\" target=\"_blank\">CGI<\/a> (penso que seria poss\u00edvel fastcgi mas esta n\u00e3o \u00e9 de todo a minha especialidade).<\/p>\n<p>Criei uma pasta s\u00f3 para armazenar os scripts que v\u00e3o ser acedidos por browser:<\/p>\n<pre>sudo mkdir \/usr\/share\/monkey\/cgi-bin<\/pre>\n<p>\u00c9 necess\u00e1rio configurar o monkey para carregar o m\u00f3dulo CGI:<\/p>\n<pre>sudo nano \/etc\/monkey\/plugins.load<\/pre>\n<p>basta descomentar a linha (mentendo os espa\u00e7os em branco):<\/p>\n<pre>Load \/usr\/lib\/monkey\/monkey-cgi.so<\/pre>\n<p>al\u00e9m disso \u00e9 necess\u00e1rio mudar a conta com que o monkey corre para poder utilizar as libraries do PiFace:<\/p>\n<pre>sudo nano \/etc\/monkey\/monkey.conf<\/pre>\n<p>(basta mudar de www-data para root)<br \/>\nE finalmente reiniciar o monkey:<\/p>\n<pre>sudo service monkey restart<\/pre>\n<p>Para testar, colocar na pasta \/usr\/share\/monkey\/cgi-bin o ficheiro hello.cgi:<\/p>\n<pre>#!\/usr\/bin\/python3\nprint(\"Content-Type: text\/html\")\u00a0\u00a0\u00a0\u00a0 # HTML is following\nprint()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # blank line, end of headers\nprint(\"&lt;TITLE&gt;CGI script output&lt;\/TITLE&gt;\")\nprint(\"&lt;H1&gt;This is my first CGI script&lt;\/H1&gt;\")\nprint(\"Hello, world!\")<\/pre>\n<p>(eventualmente dar-lhe permiss\u00f5es de execu\u00e7\u00e3o &#8211; sudo chmod u+x)<\/p>\n<p>E aceder por browser: http:\/\/192.168.1.123:2001\/cgi-bin\/hello.cgi<\/p>\n<p>Confirmado o funcionamento, criar 2 scripts para controlo do le\u00e3o:<\/p>\n<ul>\n<li><a href=\"http:\/\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/02\/cima.txt\">cima.cgi<\/a><\/li>\n<li><a href=\"http:\/\/151.236.52.166\/blog\/wp-content\/uploads\/2014\/02\/baixo.txt\">baixo.cgi<\/a><\/li>\n<\/ul>\n<p>E uma p\u00e1gina que se limita a disponibilizar dois links para os dois scripts:<\/p>\n<pre>&lt;html&gt;&lt;head&gt;\n&lt;title&gt;Pitagoras&lt;\/title&gt;\n&lt;\/head&gt;&lt;body&gt;\n&lt;p&gt;&lt;a href=\"cgi-bin\/cima.cgi\"&gt;Para cima!&lt;\/a&gt;&lt;\/p&gt;\n&lt;p&gt;&lt;a href=\"cgi-bin\/baixo.cgi\"&gt;Para baixo!&lt;\/a&gt;&lt;\/p&gt;\n&lt;\/body&gt;&lt;\/html&gt;<\/pre>\n<p>E&#8230;<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"Pitagoras e a Esfinge\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/LXi7JlyBQQo?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>funciona!<\/p>\n<p>\u00c9 pena que o CGI obrigue a que cada vez que \u00e9 dado um comando seja reinicializado o python e recarregados os m\u00f3dulos &#8211; cada comando demora por isso demora 2 ou 3 segundos. Os melhoramentos ficam para outra altura.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para a primeira aplica\u00e7\u00e3o pr\u00e1tica montei o Roaring Lion do conjunto LEGO WeDo (as instru\u00e7\u00f5es de montagem deste e outros modelos simples est\u00e3o disponiveis no site LEGO Education). O le\u00e3o \u00e9 muito simples: fazendo rodar o motor num sentido ele levanta-se nas patas dianteiras, no outro sentido volta a deitar-se (como n\u00e3o h\u00e1 sensor de &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2014\/raspberry-pi-como-alternativa-lego-wedo\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;Raspberry Pi como alternativa LEGO WeDo&#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":[18,24],"tags":[44,74,85,223],"series":[],"class_list":["post-381","post","type-post","status-publish","format-standard","hentry","category-lego","category-raspberry-pi","tag-cgi-bin","tag-lego-wedo","tag-monkey","tag-python"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-69","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/381","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=381"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/381\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=381"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=381"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=381"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}