{"id":611,"date":"2018-06-15T23:04:13","date_gmt":"2018-06-15T23:04:13","guid":{"rendered":"http:\/\/leandroip.com\/?p=611"},"modified":"2019-01-24T11:38:06","modified_gmt":"2019-01-24T11:38:06","slug":"scilab-e-arduino-o-basico","status":"publish","type":"post","link":"https:\/\/www.leandroip.com\/?p=611","title":{"rendered":"Scilab e Arduino &#8211; O B\u00e1sico"},"content":{"rendered":"<p>Ol\u00e1, esse material \u00e9 um tipo de guia pra voc\u00ea ter um &#8220;pontap\u00e9&#8221; inicial no assunto: coletar dados com Arduino e Scilab. Conhecimentos b\u00e1sicos em eletr\u00f4nica s\u00e3o desej\u00e1veis mas n\u00e3o obrigat\u00f3rios. Voc\u00ea ler\u00e1 a seguir algumas regras b\u00e1sicas quando mexemos com eletr\u00f4nica. Quanto a programa\u00e7\u00e3o, ser\u00e3o necess\u00e1rios mais conhecimentos se quiser incrementar o que colocarei aqui.<\/p>\n<p><span style=\"color: #808080;\"><em>Os softwares mostrados aqui tratam apenas o sensor de temperatura e sem fazer convers\u00e3o de valores. Completar os programas \u00e9 a atividade que fa\u00e7o em sala de aula. Mas, se voc\u00ea n\u00e3o \u00e9 da aula e quiser os programas completos, envie um e-mail para mim.<\/em><\/span><\/p>\n<h2>Eletr\u00f4nica &#8211; Regras<\/h2>\n<p>N\u00e3o colocarei aqui um tutorial sobre eletr\u00f4nica b\u00e1sica, coloque esse tema numa busca na internet e ter\u00e1 material mais que suficiente. A ideia dessa se\u00e7\u00e3o \u00e9 dar uma no\u00e7\u00e3o b\u00e1sica apenas. De como funciona e do que pode e n\u00e3o pode ser feito.<\/p>\n<p><strong>Regra 1<\/strong>: Todo dispositivo eletr\u00f4nico funciona devido a um fluxo de el\u00e9trons (dos \u00e1tomos). A esse fluxo, damos o nome de corrente el\u00e9trica. Existem duas formas desse fluxo ocorrer (sem muitos detalhes aqui):<\/p>\n<ul>\n<li>Corrente cont\u00ednua: O fluxo de el\u00e9trons parte de um p\u00f3lo positivo e vai em dire\u00e7\u00e3o ao negativo (foi convencionado que \u00e9 assim, pois os c\u00e1lculos tornam-se mais f\u00e1ceis). Pegue uma bateria, nela temos o polo positivo e negativo. O lado positivo tem mais el\u00e9trons que o negativo, logo os lados tentam se equilibrar atrav\u00e9s do fluxo de el\u00e9trons. Quando tudo est\u00e1 equilibrado, ent\u00e3o a bateria est\u00e1 descarregada.<\/li>\n<li>Corrente alternada: O fluxo de el\u00e9trons muda de dire\u00e7\u00e3o constantemente, n\u00e3o h\u00e1 um polo definido. \u00c9 a corrente que temos nas tomadas de casa (110\/220Vca). Dessa forma \u00e9 mais f\u00e1cil levar energia a longas dist\u00e2ncias, por\u00e9m \u00e9 mais perigosa, pois d\u00e1 choque.<\/li>\n<\/ul>\n<p>Usaremos aqui a corrente cont\u00ednua.<\/p>\n<p><strong>Regra 2<\/strong>: Nunca conecte o positivo com o negativo diretamente (n\u00e3o cause um curto-circuito): Se voc\u00ea conectar o positivo e o negativo de uma pilha carregada usando apenas um peda\u00e7o de fio el\u00e9trico, vai perceber fa\u00edscas e aquecimento. N\u00e3o fa\u00e7a isso por muito tempo (mais do que alguns milissegundos),\u00a0 pois a pilha pode estourar e voc\u00ea se machucar.<\/p>\n<p>Se a fonte de energia for outra, como a porta USB do computador, que contem 5 Vcc (Volts corrente cont\u00ednua), voc\u00ea pode acabar estragando essa porta.<\/p>\n<p>\u00c9 obvio que n\u00e3o queremos um curto-circuito, mas acidentes acontecem. Por isso, ao revisar um circuito antes de lig\u00e1-lo, <strong>tenha como prioridade encontrar poss\u00edveis causas de curto circuito<\/strong>, depois vemos outras coisas.<\/p>\n<p>Entre o positivo e o negativo deve sempre haver alguma carga. Isto \u00e9, alguma coisa que ser\u00e1 ligada. Os el\u00e9trons saem do positivo, passam pela(s) carga(s) e da\u00ed encontram o negativo (fluxo).<\/p>\n<p><strong>Regra 3<\/strong>: Se ver fuma\u00e7a, desligue da fonte de energia imediatamente.<\/p>\n<h2>Circuito Eletr\u00f4nico<\/h2>\n<p>O circuito eletr\u00f4nico para coletar os dados est\u00e1 na Figura abaixo. Voc\u00ea vai precisar de um Arduino, um LM35 (sensor de temperatura) e LDR (sensor de luminosidade) e um resitor de 10KOhms.<\/p>\n<p><a href=\"http:\/\/leandroip.com\/wp-content\/uploads\/2018\/06\/arduinoscilab1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-614 alignright\" src=\"http:\/\/leandroip.com\/wp-content\/uploads\/2018\/06\/arduinoscilab1-243x300.png\" alt=\"\" width=\"363\" height=\"448\" srcset=\"https:\/\/www.leandroip.com\/wp-content\/uploads\/2018\/06\/arduinoscilab1-243x300.png 243w, https:\/\/www.leandroip.com\/wp-content\/uploads\/2018\/06\/arduinoscilab1.png 415w\" sizes=\"auto, (max-width: 363px) 100vw, 363px\" \/><\/a><\/p>\n<p>Observe o fluxo: O 5V da placa \u00e9 levado (pelo fio vermelho) ao LDR, depois ele volta para o Arduino na porta de entrada A1 para leitura e tamb\u00e9m vai para o resistor. Passando por este, encontra-se o negativo (GND).<\/p>\n<p>O 5V tamb\u00e9m \u00e9 levado ao LM35, o qual contem um circuito interno para medi\u00e7\u00e3o de temperatura.<\/p>\n<h2>Software para o Arduino<\/h2>\n<p>O software de leitura \u00e9 bastante simples. Primeiro, inicializamos a porta serial para comunica\u00e7\u00e3o. Depois, implementamos a sequ\u00eancia de comandos em loop, a qual \u00e9: (a) Ler o sensor; (b) Imprimir &#8220;S:&#8221; para indicar inicio de transmiss\u00e3o; (c) Enviar o valor; (d) enviar &#8220;\\n&#8221; para indicar t\u00e9rmino de transmiss\u00e3o; (e) aguardar 500ms. Terminada essa sequ\u00eancia, o processador volta a executar (a).<\/p>\n<p>Nos microcontroladores, o programa \u00e9 tal que permanece em loop infinito.<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"Software para o Arduino\">int sensorValue = 0; \r\n\r\nvoid setup() {\r\n  \/\/Inicializa a comunicacao serial\r\n  Serial.begin(9600);\r\n}\r\n\r\n\/\/Essa funcao permanece rodando em loop\r\nvoid loop() {\r\n  \/\/ le o sensor\r\n  sensorValue = analogRead(A0);\r\n  \/\/ escreve na serial\r\n  Serial.print(\"S:\");\r\n  Serial.print(sensorValue);\r\n  Serial.print(\"\\n\");\r\n  \/\/espera 500ms\r\n  delay(500);\r\n}<\/pre>\n<p>O programa come\u00e7a a executar assim que energizamos o mesmo atrav\u00e9s da USB do computar (da\u00ed o cuidado com curtos-circuitos).<\/p>\n<p>Copie o c\u00f3digo acima para a IDE do Arduino, selecione a porta COM correta e a placa tamb\u00e9m. Clique em Carregar, o programa ser\u00e1 compilado e carregado no Arduino.<\/p>\n<p>Considera\u00e7\u00f5es ao programar para microcontroladores:<\/p>\n<ul>\n<li>As vari\u00e1veis n\u00e3o costumam ter o mesmo tamanho que no computador. Ex.: Um &#8220;int&#8221; no Arduino pode armazenar apenas valores entre\u00a0-32,768 at\u00e9 32,767.\n<ul>\n<li>Se precisar mais do que isso e apenas positivo use: unsigned int, que vai de 0 a 65535;<\/li>\n<li>Se precisar de mais ainda: <a href=\"https:\/\/www.arduino.cc\/reference\/en\/#variables\">Vari\u00e1veis no Arduino<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Software do Scilab<\/h2>\n<p>O Arduino envia os dados para o computador atrav\u00e9s de uma porta serial, emulada pela conex\u00e3o USB. Para ler esses dados, o Scilab precisa se conectar a porta serial correspondente, que \u00e9 a mesma utilizada para carregar o programa.<\/p>\n<p><strong>Antes de come\u00e7ar<\/strong>, \u00e9 necess\u00e1rio ter instalado o plugin de comunica\u00e7\u00e3o serial no Scilab. V\u00e1 no menu Aplicativos-&gt;Gerenciador de m\u00f3dulos &#8211; ATOMS. V\u00e1 na categoria <em>Contributed Scilab Builds<\/em> e instale o m\u00f3dulo <em>Serial communication<\/em>. Reinicie o Scilab para ativar o m\u00f3dulo.<\/p>\n<p>O programa a seguir \u00e9 executado pelo Scilab no computador. Execute este programa ap\u00f3s programar o Arduino. Lembre de selecionar a porta correta, no exemplo abaixo estamos usando a porta COM5.<\/p>\n<pre class=\"lang:matlab decode:true \" title=\"Software do Scilab\">\/\/Abrir porta serial COM5\r\nh = openserial(5,\"9600,n,8,1\")\r\ntic()\r\nwhile %t\r\n    [n, v] = msscanf(readserial(h),\"S:%d\\n\");\r\n    if(n&gt;0) then\r\n        printf(\"Valor = %d\\n\", v);\r\n        plot([toc()],[v],\"-ro\")\r\n        sleep(250);\r\n    end\r\nend\r\ncloseserial(h); \/\/fecha a serial, devido ao loop infinito nunca ser\u00e1 executado\r\n                \/\/execute manualmente este comando para fechar a porta serial\r\n                \/\/N\u00e3o ser\u00e1 poss\u00edvel executar o programa novametne se a porta j\u00e1 estiver aberta<\/pre>\n<p>Esse programa recebe um valor do Arduino e plota num gr\u00e1fico. A fun\u00e7\u00e3o toc() \u00e9 usada para saber em que momento (em segundos) a informa\u00e7\u00e3o chegou, ent\u00e3o voc\u00ea ver\u00e1 um gr\u00e1fico valor X tempo.<\/p>\n<p>Note o uso de msscanf. Note ainda:<\/p>\n<ol>\n<li>O primeiro par\u00e2metro \u00e9 a fun\u00e7\u00e3o readserial(h), que retorna um valor lido da serial;<\/li>\n<li>O segundo par\u00e2metro \u00e9\u00a0&#8220;S:%d\\n&#8221;. Note que coincide com o que o Arduino envia. Apenas passamos o formato para o msscanf dizendo que come\u00e7a com S:, tem um inteiro no meio (%d) e termina com &#8220;\\n&#8221;. Cada %d colocado, o msscanf entende que voc\u00ea quer o valor que estiver al\u00ed, no nosso caso \u00e9 onde o Arduino coloca o valor da leitura. Ent\u00e3o, ele \u00e9 retornado. No retorno [n,v], n \u00e9 a quantidade de itens retornados, nesse caso ser\u00e1 1; e v \u00e9 o valor desse item.\n<ol>\n<li>readserial pode retornar vazio se nada tiver para ser lido, por isso, ap\u00f3s a leitura testamos se n &gt; 0 (tem leitura)<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Tendo um valor v v\u00e1lido, plotamo-o no gr\u00e1fico.<\/p>\n<p>Se voc\u00ea interromper o programa, e quando reexecutar ele mostrar um erro de que a porta j\u00e1 est\u00e1 sendo usada, execute\u00a0closeserial(h) e tente novamente. O erro acontece porqu\u00ea esse programa abre a porta serial no come\u00e7o, mas fica no loop e nunca a fecha. E quando interrompemos, a porta pode continuar aberta pelo Scilab. N\u00e3o \u00e9 permitido abrir a porta mais de uma vez, seja pelo mesmo programa ou programas diferentes.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1, esse material \u00e9 um tipo de guia pra voc\u00ea ter um &#8220;pontap\u00e9&#8221; inicial no [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-611","post","type-post","status-publish","format-standard","hentry","category-uncategorized","entry","grid"],"_links":{"self":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=611"}],"version-history":[{"count":9,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/611\/revisions"}],"predecessor-version":[{"id":867,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/611\/revisions\/867"}],"wp:attachment":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}