{"id":697,"date":"2014-09-29T15:49:08","date_gmt":"2014-09-29T14:49:08","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=697"},"modified":"2014-09-29T15:49:08","modified_gmt":"2014-09-29T14:49:08","slug":"1-wire-lego-led-stripe","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2014\/1-wire-lego-led-stripe","title":{"rendered":"1-wire LEGO LED stripe"},"content":{"rendered":"<div class=\"seriesmeta\">This post is part 2 of 3 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/rede-de-controlo-1-wire\" class=\"series-128\" title=\"Rede de controlo 1-wire\">Rede de controlo 1-wire<\/a><\/div><p>E agora um primeira experi\u00eancia com m\u00faltiplos DS2413 numa mesma microLAN&#8230;<\/p>\n<p>Cada dispositivo 1-wire tem um ID distinto gravado em f\u00e1brica:<\/p>\n<pre>$sudo ls \/mnt\/1wire\/\n3A.4C2B13000000\u00a0 81.086D33000000\u00a0 settings\u00a0\u00a0\u00a0 structure\u00a0 uncached\n3A.B0E216000000\u00a0 bus.1\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0 statistics\u00a0 system<\/pre>\n<p>Vemos que temos 3 dispositivos de 2 classes diferentes.\u00a0 A classe 81 \u00e9 a do Master Controller (o adaptador USB DS9490R) e a classe\u00a0 3A \u00e9 a do DS2413. Temos portanto dois dispositivos DS2413 na rede, cada um com o seu ID:<\/p>\n<ul>\n<li>4C2B13000000<\/li>\n<li>B0E216000000<\/li>\n<\/ul>\n<p>Na forma como o owfs lida com 1-wire o par &#8220;Classe.ID&#8221; funciona como um endere\u00e7o. \u00c9 poss\u00edvel definir alias mas funcionam apenas localmente (isto \u00e9: se movermos a microLAN do meu Ubuntu para o LEGO ev3dev t\u1ebdm de ser redefinidos) e na minha primeira experi\u00eancia com alias perdi o acesso aos dispositivos por isso deixo para outra altura.<\/p>\n<p>Sendo da mesma classe, estes dois dispositivos partilham os mesmos atributos (PIO.A, PIO.B e PIO.ALL por exemplo). Se tiver um LED em cada PIO destes devices podemos por exemplo acender todos os LEDs percorrendo todos os dispositivos da classe 3A e escrevendo &#8220;1,1&#8221; na subpasta PIO.ALL.<\/p>\n<p>O programa abaixo acende cada LED em sequ\u00eancia, primeiro num sentido depois no outro:<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"1-wire LEGO LED stripe #1\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/1MTlZI4bd3w?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<pre>import sys, traceback\nfrom time import sleep\nfrom subprocess import call\n\n# B0E216000000\/PIO.A = primeiro LED\n# B0E216000000\/PIO.B = segundo LED\n# 4C2B13000000\/PIO.A = terceiro LED\n# 4C2B13000000\/PIO.B = quarto LED\n\ndef main():\n\u00a0\u00a0\u00a0 try:\n\n# apagar tudo ao comecar\n\n\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while True:\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0# apaga tudo\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 call(\"echo 1 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.A\", shell=True); # LED1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep(0.25);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0# apaga tudo\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 call(\"echo 1 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.B\", shell=True); # LED2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep(0.25);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0# apaga tudo\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 1 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.A\", shell=True); # LED3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep(0.25);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0# apaga tudo\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 1 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.B\", shell=True); # LED4\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep(0.25);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0# apaga tudo\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 1 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.A\", shell=True); # LED3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep(0.25);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0# apaga tudo\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 call(\"echo 1 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.B\", shell=True); # LED2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep(0.25);\n\n\n\u00a0\u00a0\u00a0 except (KeyboardInterrupt, SystemExit):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print \"Exiting...\";\n\u00a0\u00a0\u00a0 except Exception:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 traceback.print_exc(file=sys.stdout);\n\n# apagar tudo antes de sair\n\n\u00a0\u00a0\u00a0 call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0\u00a0 call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0\u00a0 sys.exit(0);\n\nif __name__ == \"__main__\":\n\u00a0\u00a0\u00a0 main()<\/pre>\n<p>&nbsp;<\/p>\n<p>E o programa abaixo acende as luzes aleatoriamente, mais pr\u00f3prio para um concerto ou uma discoteca (com tempo hei-de estudar a forma de usar as rotinas PyAudio para medir a intensidade de uma m\u00fasica e controlar as luzes ao ritmo desta embora duvide que o EV3 tenha CPU para tal).<\/p>\n<p>&nbsp;<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"1-wire LEGO LED stripe #2\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/d11-kMI1BDE?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<pre>import sys, traceback\nfrom time import sleep\nfrom subprocess import call\nfrom random import randrange\n\n# B0E216000000\/PIO.A = primeiro LED\n# B0E216000000\/PIO.B = segundo LED\n# 4C2B13000000\/PIO.A = terceiro LED\n# 4C2B13000000\/PIO.B = quarto LED\n\n\ndef main():\n\u00a0\u00a0\u00a0 try:\n\n# apagar tudo ao comecar\n\n\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while True:\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0# apaga tudo\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (randrange(2) == 1):\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 call(\"echo 1 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.A\", shell=True); # LED1\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (randrange(2) == 1):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 1 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.B\", shell=True); # LED2\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (randrange(2) == 1):\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 1 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.A\", shell=True); # LED3\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (randrange(2) == 1):\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0call(\"echo 1 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.B\", shell=True); # LED4\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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 sleep(0.25);\n\n\n\u00a0\u00a0\u00a0 except (KeyboardInterrupt, SystemExit):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print \"Exiting...\";\n\u00a0\u00a0\u00a0 except Exception:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 traceback.print_exc(file=sys.stdout);\n\n# apagar tudo antes de sair\n\n\u00a0\u00a0\u00a0 call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.B0E216000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0\u00a0 call(\"echo 0,0 &gt; \/mnt\/1wire\/3A.4C2B13000000\/PIO.ALL\", shell=True);\n\u00a0\u00a0\u00a0 sys.exit(0);\n\nif __name__ == \"__main__\":\n\u00a0\u00a0\u00a0 main()<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This post is part 2  of 3 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/rede-de-controlo-1-wire\" class=\"series-128\" title=\"Rede de controlo 1-wire\">Rede de controlo 1-wire<\/a><\/div><p>E agora um primeira experi\u00eancia com m\u00faltiplos DS2413 numa mesma microLAN&#8230; Cada dispositivo 1-wire tem um ID distinto gravado em f\u00e1brica: $sudo ls \/mnt\/1wire\/ 3A.4C2B13000000\u00a0 81.086D33000000\u00a0 settings\u00a0\u00a0\u00a0 structure\u00a0 uncached 3A.B0E216000000\u00a0 bus.1\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0 statistics\u00a0 system Vemos que temos 3 dispositivos de 2 classes diferentes.\u00a0 A classe 81 \u00e9 a do Master Controller (o adaptador USB &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2014\/1-wire-lego-led-stripe\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;1-wire LEGO LED stripe&#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":[16,18,20],"tags":[28,73,109],"series":[128],"class_list":["post-697","post","type-post","status-publish","format-standard","hentry","category-geek","category-lego","category-linux","tag-1-wire","tag-led","tag-stripe","series-rede-de-controlo-1-wire"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-bf","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/697","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=697"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/697\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=697"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}