{"id":710,"date":"2014-10-07T18:40:43","date_gmt":"2014-10-07T17:40:43","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=710"},"modified":"2014-10-07T18:40:43","modified_gmt":"2014-10-07T17:40:43","slug":"reles-usb","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2014\/reles-usb","title":{"rendered":"Rel\u00e9s USB"},"content":{"rendered":"<p>Adquiri um m\u00f3dulo <a href=\"http:\/\/www.robot-electronics.co.uk\/htm\/usb_rly16tech.htm\">USB-RLY16<\/a> que permite comandar 8 rel\u00e9s atrav\u00e9s de uma porta USB. A ideia original \u00e9 controlar as minifiguras LEGO em palco pelo que com 8 rel\u00e9s poderei controlar 4 micromotores LEGO de forma independente e em ambos os sentidos (os Xutos&amp;Pontap\u00e9s s\u00e3o 5 pelo que 2 deles ter\u00e3o de partilhar o mesmo motor ou terei de arranjar outra forma para controlar um quinto motor).<\/p>\n<p>O m\u00f3dulo \u00e9 baseado num circuito FT232RL que emula uma porta s\u00e9rie atrav\u00e9s da liga\u00e7\u00e3o USB. Em Linux o suporte a este tipo de devices j\u00e1 vem inclu\u00eddo no kernel sendo associado um device do tipo &#8216;\/dev\/ttyUSBn&#8217;. No meu PC com Ubuntu 14.04 funcionou \u00e0 primeira, tal como no EV3 com ev3dev e estou 100% convencido que com Raspberry Pi e Raspbian acontecer\u00e1 o mesmo.<\/p>\n<p>S\u00e3o necess\u00e1rias duas alimenta\u00e7\u00f5es: uma para o accionamento dos rel\u00e9s e outra (ou outras) para os circuitos controlados pelos rel\u00e9s. Teoricamente podem ser as mesmas mas optei por separ\u00e1-las:<\/p>\n<ul>\n<li>uma pilha PP3 com ficha de 2.1mm para o accionamento dos rel\u00e9s<\/li>\n<li>uma pilha PP3 em caixa LEGO para os motores<\/li>\n<\/ul>\n<p>Nota: a pseudo-documenta\u00e7\u00e3o afirma serem necess\u00e1rios pelo menos 12V\/500 mA para o accionamento dos rel\u00e9s mas dei-me bem com os 9V de uma pilha alcalina PP3.<\/p>\n<p>Ligando ao EV3:<\/p>\n<pre>$ dmesg\r\n(...)\r\nusb 1-1.4: new full-speed USB device number 6 using ohci\r\nusbcore: registered new interface driver usbserial\r\nusbcore: registered new interface driver ftdi_sio\r\nusbserial: USB Serial support registered for FTDI USB Serial Device\r\nftdi_sio 1-1.4:1.0: FTDI USB Serial Device converter detected\r\nusb 1-1.4: Detected FT232RL\r\nusb 1-1.4: Number of endpoints 2\r\nusb 1-1.4: Endpoint 1 MaxPacketSize 64\r\nusb 1-1.4: Endpoint 2 MaxPacketSize 64\r\nusb 1-1.4: Setting MaxPacketSize 64\r\nusb 1-1.4: FTDI USB Serial Device converter now attached to ttyUSB0<\/pre>\n<p>Para comunicar com a placa \u00e9 necess\u00e1rio configurar a porta s\u00e9rie virtual (\/dev\/ttyUSB0) para comunicar a 19200 baud, 8 databits, 2 stop bits, sem paridade (19200 8N2) e sem hardware nem software handshaking. No Ubuntu usei o &#8216;puTTy&#8217; mas como requer ambiente gr\u00e1fico no ev3dev optei pelo &#8216;minicom&#8217;:<\/p>\n<pre>$ apt-get install minicom<\/pre>\n<p>O minicom tem um modo de setup:<\/p>\n<pre>$ minicom -s<\/pre>\n<p>depois de configurado (19200 8N2, no flow control) se carregarmos na tecla &#8216;d&#8217; accionamos todos os rel\u00e9s e na tecla &#8216;n&#8217; desactivamos todos (confirmem numa tabela ASCII que correspondem aos c\u00f3digos decimais 100 e 110). Confirmado o funcionamento podemos sair (&#8216;Control+A&#8217; seguido de &#8216;Q&#8217;), a porta virtual permanece configurada at\u00e9 ao pr\u00f3ximo reboot.<\/p>\n<p>Podemos agora enviar comandos directamente da shell:<\/p>\n<pre>$ echo d &gt; \/dev\/ttyUSB0\r\n$ echo n &gt; \/dev\/ttyUSB0<\/pre>\n<p>Em python podemos comunicar directamente com a porta virtual atrav\u00e9s da biblioteca pyserial (http:\/\/pyserial.sourceforge.net\/):<\/p>\n<pre>$ apt-get install python-serial<\/pre>\n<pre>import serial\r\nfrom time import sleep\r\n\r\nport = serial.Serial(\"\/dev\/ttyUSB0\", baudrate=19200, bytesize=8, parity='N', stopbits=2, timeout=None, xonxoff=0, rtscts=0)\r\nport.write(\"d\");\r\nsleep(1);\r\nport.write(\"n\");\r\nsleep(1);\r\nport.close()<\/pre>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"USB 4 LEGO Motors\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/8CQ2JijAU5Y?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>O video acima corresponde ao script python abaixo:<\/p>\n<pre>import serial\r\nfrom time import sleep\r\n\r\n\r\n# da esquerda para a direita:\r\n# motores A, B, C e D\r\n#\r\n# motor A e\/f o\/p\r\n# motor B g\/h q\/r\r\n# motor C i\/j s\/t\r\n# motor D k\/l u\/v\r\n#\r\n\r\ndef relays_all_off():\r\n\u00a0 port.write(\"n\");\r\n\r\ndef relays_all_on():\r\n\u00a0 port.write(\"d\");\r\n\r\n### Motor A ###\r\ndef motor_A_Right():\r\n\u00a0 port.write(\"ep\");\r\n\r\ndef motor_A_Left():\r\n\u00a0 port.write(\"of\");\r\n\r\ndef motor_A_OFF():\r\n\u00a0 port.write(\"op\");\r\n\r\n### Motor B ###\r\ndef motor_B_Right():\r\n\u00a0 port.write(\"gr\");\r\n\r\ndef motor_B_Left():\r\n\u00a0 port.write(\"qh\");\r\n\r\ndef motor_B_OFF():\r\n\u00a0 port.write(\"qr\");\r\n\r\n### Motor C ###\r\ndef motor_C_Right():\r\n\u00a0 port.write(\"it\");\r\n\r\ndef motor_C_Left():\r\n\u00a0 port.write(\"sj\");\r\n\r\ndef motor_C_OFF():\r\n\u00a0 port.write(\"st\");\r\n\r\n### Motor D ###\r\ndef motor_D_Right():\r\n\u00a0 port.write(\"kv\");\r\n\r\ndef motor_D_Left():\r\n\u00a0 port.write(\"ul\");\r\n\r\ndef motor_D_OFF():\r\n\u00a0 port.write(\"uv\");\r\n\r\n\r\nport = serial.Serial(\"\/dev\/ttyUSB0\", baudrate=19200, bytesize=8, parity='N', stopbits=2, timeout=None, xonxoff=0, rtscts=0)\r\n\r\nmotor_A_Left();\r\nmotor_B_Left();\r\nmotor_C_Left();\r\nmotor_D_Left();\r\nsleep(1);\r\nmotor_A_OFF();\r\nmotor_B_OFF();\r\nmotor_C_OFF();\r\nmotor_D_OFF();\r\nsleep(1);\r\nmotor_A_Right();\r\nmotor_B_Right();\r\nmotor_C_Right();\r\nmotor_D_Right();\r\nsleep(1);\r\nmotor_A_OFF();\r\nmotor_B_OFF();\r\nmotor_C_OFF();\r\nmotor_D_OFF();\r\nsleep(2);\r\n\r\nmotor_A_Left();\r\nsleep(1);\r\nmotor_A_OFF();\r\nsleep(1);\r\nmotor_B_Left();\r\nsleep(1);\r\nmotor_B_OFF();\r\nsleep(1);\r\nmotor_C_Left();\r\nsleep(1);\r\nmotor_C_OFF();\r\nsleep(1);\r\nmotor_D_Left();\r\nsleep(1);\r\nmotor_D_OFF();\r\nsleep(1);\r\n\r\nport.close();<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Adquiri um m\u00f3dulo USB-RLY16 que permite comandar 8 rel\u00e9s atrav\u00e9s de uma porta USB. A ideia original \u00e9 controlar as minifiguras LEGO em palco pelo que com 8 rel\u00e9s poderei controlar 4 micromotores LEGO de forma independente e em ambos os sentidos (os Xutos&amp;Pontap\u00e9s s\u00e3o 5 pelo que 2 deles ter\u00e3o de partilhar o mesmo &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2014\/reles-usb\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;Rel\u00e9s 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":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[18,19,20,24,26],"tags":[86,129,130],"series":[],"class_list":["post-710","post","type-post","status-publish","format-standard","hentry","category-lego","category-lego-mindstorms","category-linux","category-raspberry-pi","category-ubuntu","tag-motor","tag-rele","tag-usb"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-bs","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/710","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=710"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/710\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=710"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=710"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=710"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}