{"id":734,"date":"2014-10-26T10:18:38","date_gmt":"2014-10-26T10:18:38","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=734"},"modified":"2014-10-27T23:44:43","modified_gmt":"2014-10-27T23:44:43","slug":"sbrick-snap","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2014\/sbrick-snap","title":{"rendered":"SBrick + Snap!"},"content":{"rendered":"<p>A linguagem <a href=\"http:\/\/snap.berkeley.edu\/\">Snap! <\/a>(antes designada BYOB) \u00e9 uma linguagem de programa\u00e7\u00e3o visual baseada na experi\u00eancia &#8220;drag-and-drop&#8221;, uma reimplementa\u00e7\u00e3o extendida da linguagem <a href=\"http:\/\/scratch.mit.edu\">Scratch<\/a> que tem ganho alguma notoriedade por ter sido inclu\u00edda no ambiente gr\u00e1fico dos Raspberry Pi.<\/p>\n<p>Eis um exemplo de um programa muito simples, que faz um rover andar \u00e0s voltas:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-SBrick1.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-735\" src=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-SBrick1.png?resize=317%2C310\" alt=\"snap-SBrick1\" width=\"317\" height=\"310\" srcset=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-SBrick1.png?w=317&amp;ssl=1 317w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-SBrick1.png?resize=300%2C293&amp;ssl=1 300w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-SBrick1.png?resize=306%2C300&amp;ssl=1 306w\" sizes=\"auto, (max-width: 317px) 85vw, 317px\" \/><\/a>De h\u00e1 um par de anos para c\u00e1 que alimento a ideia de utilizar Snap! para ensinar \u00e0 miudagem [e n\u00e3o s\u00f3] conceitos b\u00e1sicos de rob\u00f3tica. A forma como o Snap! est\u00e1 a ser desenvolvido permite criar \u00abdevice extensions\u00bb para interagir com dispositivos f\u00edsicos (descobri o Snap! justamente por ter uma extens\u00e3o para Mindstorms NXT, a <a href=\"http:\/\/github.com\/technoboy10\/snap-nxt\">Snap-NXT by Technoboy10<\/a>) e hoje criei a minha primeira extens\u00e3o, para o Sbrick.<\/p>\n<p>Basicamente editei a extens\u00e3o para Mindstorms NXT, deitei fora a parte espec\u00edfica do NXT e acrescentei os meus comandos que invocam o comando gatttool do BlueZ (do que resulta a minha extens\u00e3o apenas funcionar em Linux, lamento).<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"SBrick Snap v01\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/qcI09cp44j0?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>A device extension consiste em dois ficheiros:<\/p>\n<ul>\n<li><a href=\"http:\/\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-sbrick.py_.zip\">snap-sbrick.py<\/a><\/li>\n<li><a href=\"http:\/\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-sbrick.xml_.zip\">snap-sbrick.xml<\/a><\/li>\n<\/ul>\n<p>O primeiro \u00e9 um programa em Python que corre um servidor http muito b\u00e1sico que aceita comandos http. O segundo \u00e9 uma defini\u00e7\u00e3o XML das funcionalidades implementadas (dois comandos apenas: &#8216;move motor&#8217; e &#8216;stop motor&#8217;, sendo poss\u00edvel controlar 3 \u00abmotores\u00bb: A = channel#1, B=channel#2 e P = channel#1+channel#2). Estando o programa &#8216;snap-sbrick.py&#8217; a correr, lan\u00e7amos o Snap! com a device extension quando acedemos por browser ao endere\u00e7o:<\/p>\n<pre>http:\/\/snap.berkeley.edu\/snapsource\/snap.html#open:http:\/\/localhost:1330\/snap-sbrick<\/pre>\n<p>Ou seja o Snap! em si \u00e9 carregado da Universidade de Berkeley e apontado para o nosso PC de onde carrega as defini\u00e7\u00f5es das funcionalidades adicionais. \u00c9 poss\u00edvel carregar o Snap! a partir do nosso pr\u00f3prio PC para trabalhar em modo offline mas isso j\u00e1 \u00e9 outra hist\u00f3ria.<\/p>\n<p>A defini\u00e7\u00e3o dos comandos pode tamb\u00e9m ser feita graficamente, sendo depois gerado um ficheiro XML semelhante ao acima referido:<\/p>\n<ul>\n<li>comando &#8216;move motor&#8217;<\/li>\n<\/ul>\n<p><a href=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-movemotor-def.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-743\" src=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-movemotor-def.png?resize=811%2C515\" alt=\"snap-movemotor-def\" width=\"811\" height=\"515\" srcset=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-movemotor-def.png?w=811&amp;ssl=1 811w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-movemotor-def.png?resize=300%2C190&amp;ssl=1 300w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-movemotor-def.png?resize=472%2C300&amp;ssl=1 472w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/a><\/p>\n<ul>\n<li>comando &#8216;stop motor&#8217;<\/li>\n<\/ul>\n<p><a href=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-stopmotor-def.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-744\" src=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-stopmotor-def.png?resize=480%2C284\" alt=\"snap-stopmotor-def\" width=\"480\" height=\"284\" srcset=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-stopmotor-def.png?w=480&amp;ssl=1 480w, https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2014\/10\/snap-stopmotor-def.png?resize=300%2C177&amp;ssl=1 300w\" sizes=\"auto, (max-width: 480px) 85vw, 480px\" \/><\/a>Podemos ver que a defini\u00e7\u00e3o de &#8216;move motor&#8217; est\u00e1 bem melhor que a de &#8216;stop motor&#8217; &#8211; \u00e9 feita uma valida\u00e7\u00e3o dos par\u00e2metros, se speed n\u00e3o pertencer ao intervalo [-100,100] ou se motor n\u00e3o for A\/B\/P \u00e9 gerada uma excep\u00e7\u00e3o.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A linguagem Snap! (antes designada BYOB) \u00e9 uma linguagem de programa\u00e7\u00e3o visual baseada na experi\u00eancia &#8220;drag-and-drop&#8221;, uma reimplementa\u00e7\u00e3o extendida da linguagem Scratch que tem ganho alguma notoriedade por ter sido inclu\u00edda no ambiente gr\u00e1fico dos Raspberry Pi. Eis um exemplo de um programa muito simples, que faz um rover andar \u00e0s voltas: De h\u00e1 um &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2014\/sbrick-snap\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;SBrick + Snap!&#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":[225,213],"series":[],"class_list":["post-734","post","type-post","status-publish","format-standard","hentry","category-lego","category-linux","category-ubuntu","tag-sbrick","tag-snap"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-bQ","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/734","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=734"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/734\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=734"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}