{"id":164,"date":"2010-07-28T19:42:13","date_gmt":"2010-07-28T22:42:13","guid":{"rendered":"http:\/\/blog.renatopeterman.com.br\/?p=164"},"modified":"2014-01-23T23:01:32","modified_gmt":"2014-01-24T02:01:32","slug":"controlando-servo-motor-a-partir-do-teclado-com-arduino-e-c","status":"publish","type":"post","link":"https:\/\/renatopeterman.com.br\/blog\/2010\/07\/28\/controlando-servo-motor-a-partir-do-teclado-com-arduino-e-c\/","title":{"rendered":"Controlando Servo Motor utilizando o teclado com Arduino e C#"},"content":{"rendered":"<p>J\u00e1 faz alguns dias que venho estudando um pouco de eletr\u00f4nica para o desenvolvimento do meu TCC. Estive pesquisando um pouco sobre microcontroladores e recentemente andei desenvolvendo umas aplica\u00e7\u00f5es com o <a href=\"http:\/\/www.arduino.cc\/\" target=\"_blank\"><strong>Arduino<\/strong><\/a> Duemilanove.<\/p>\n<p>Andei fazendo uns testes com servo motor, e resolvi fazer este tutorial para compartilhar.<\/p>\n<p>Abaixo segue um video que fiz da aplica\u00e7\u00e3o em funcionamento.<br \/>\n<\/p>\n<div style=\"text-align: center;\"><object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"560\" height=\"340\" codebase=\"http:\/\/download.macromedia.com\/pub\/shockwave\/cabs\/flash\/swflash.cab#version=6,0,40,0\"><param name=\"allowFullScreen\" value=\"true\" \/><param name=\"allowscriptaccess\" value=\"always\" \/><param name=\"src\" value=\"http:\/\/www.youtube.com\/v\/6y1mtmVF32w&amp;hl=pt_BR&amp;fs=1?rel=0\" \/><param name=\"allowfullscreen\" value=\"true\" \/><embed type=\"application\/x-shockwave-flash\" width=\"560\" height=\"340\" src=\"http:\/\/www.youtube.com\/v\/6y1mtmVF32w&amp;hl=pt_BR&amp;fs=1?rel=0\" allowscriptaccess=\"always\" allowfullscreen=\"true\"><\/embed><\/object><\/div>\n<p><\/p>\n<p>Para este tutorial \u00e9 necess\u00e1rio que voc\u00ea saiba um m\u00ednimo de programa\u00e7\u00e3o e j\u00e1 tenha feito alguma coisa com o arduino. Se quiser saber mais acesse o site: <a href=\"http:\/\/www.arduino.cc\/\" target=\"_blank\">www.arduino.cc<\/a>.<\/p>\n<p>Este projeto nada mais \u00e9 do que uma interface desenvolvida em C# que permite controlar<!--more--> um servo motor conectado ao arduino a partir das setas direita e esquerda do teclado. Ao final est\u00e3o os links para download dos projetos que podem ser abertos no Visual Studio (utilizei a vers\u00e3o 2008).<br \/>\nDesenvolvi uma vers\u00e3o mais simples utilizada no tutorial e uma outra um pouco mais completa, os dois projetos est\u00e3o disponiveis para download no final.<\/p>\n<p>Tentei desenvolver utilizando Java, por\u00e9m, n\u00e3o consegui compilar no Windows 64 bits. Mas futuramente posto alguma coisa. \ud83d\ude09<\/p>\n<p>Utilizei o servo <a href=\"http:\/\/www.gpdealera.com\/cgi-bin\/wgainf100p.pgm?I=FUTM0031\" target=\"_blank\"><strong>S3003 da Futaba<\/strong><\/a>, mas acredito que n\u00e3o h\u00e1 problema em usar outro modelo.<\/p>\n<p>Abaixo segue uma lista do que utilizei no desenvolvimento:<\/p>\n<ul> <strong> <\/strong><\/p>\n<li><strong><a href=\"http:\/\/www.arduino.cc\/en\/Main\/ArduinoBoardDuemilanove\" target=\"_blank\">Arduino Duemilanove<\/a><\/strong><\/li>\n<li><strong><a href=\"http:\/\/arduino.cc\/en\/Main\/Software\" target=\"_blank\">IDE Arduino 0018<\/a><\/strong><\/li>\n<li><strong><a href=\"http:\/\/www.gpdealera.com\/cgi-bin\/wgainf100p.pgm?I=FUTM0031\">Servo Motor Futaba S3003<\/a><\/strong><\/li>\n<li><strong><a href=\"http:\/\/www.microsoft.com\/express\/Downloads\/\" target=\"_blank\">Visual Studio 2008 Express<\/a> <small>(Acho que n\u00e3o h\u00e1 problema em usar o 2010)<\/small><\/strong><\/li>\n<p><strong><br \/>\n<\/strong><strong> <\/strong><\/ul>\n<p><strong>1\u00ba: Conectar o Servo Motor ao Arduino<\/strong><\/p>\n<p>O Servo Motor que estou utilizando possui um conector com tres fios, um <strong>vermelho (5V)<\/strong>, um <strong>preto (GND)<\/strong> e um <strong>branco (respons\u00e1vel pela comunica\u00e7\u00e3o com o servo)<\/strong>, cada um desses deve ser conectado de acordo com a figura abaixo:<br \/>\n<\/p>\n<div><img loading=\"lazy\" class=\"aligncenter size-full wp-image-231\" title=\"ArduinoServoLigacao\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/ArduinoServoLigacao.jpg\" alt=\"\" width=\"407\" height=\"717\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/ArduinoServoLigacao.jpg 407w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/ArduinoServoLigacao-170x300.jpg 170w\" sizes=\"(max-width: 407px) 100vw, 407px\" \/><\/div>\n<p><strong>2\u00ba: C\u00f3digo para o Arduino e Teste<\/strong><\/p>\n<p>O programa que ser\u00e1 gravado no Arduino, recebe tr\u00eas caracteres atrav\u00e9s atrav\u00e9s da comuni\u00e7\u00e3o serial, por exemplo: se receber &#8220;000&#8221; o motor ira para 0 graus, se receber &#8220;050&#8221; para 50 graus, &#8220;120&#8221; para 120 graus, e assim por diante. \u00c9 dessa forma que os comandos s\u00e3o enviados para o servo<\/p>\n<p>Note que quando inicio a comunica\u00e7\u00e3o Serial utilizando <strong>&#8220;Serial.begin(9600)&#8221;<\/strong>, estou definindo que a taxa de transmiss\u00e3o (baud rate) da porta ser\u00e1 de 9600.<\/p>\n<p>Abra a IDE Arduino 0018. Automaticamente ela j\u00e1 inicia com um novo projeto.<br \/>\nEm seguida, utilize o c\u00f3digo abaixo e fa\u00e7a o upload para o seu Arduino ou se preferir, fa\u00e7a o download do arquivo no final da p\u00e1gina e abra-o na IDE.<\/p>\n<pre>\n\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/><\/div><\/td><td><div class=\"text codecolorer\">\/\/ Importa a biblioteca Servo.h do arduino<br \/>\n#include &amp;lt;Servo.h&amp;gt;<br \/>\n<br \/>\n\/\/ Cria uma variavel do tipo Servo que ser\u00e1<br \/>\n\/\/ o nosso servo.<br \/>\nServo servo1;<br \/>\n<br \/>\n\/\/ Array de char que receber\u00e1 o comando<br \/>\n\/\/ via serial<br \/>\nchar buffer[4];<br \/>\n<br \/>\n\/\/ Variavel que identifica quantos<br \/>\n\/\/ caracteres foram recebidos, pois s\u00f3 \u00e9<br \/>\n\/\/ poss\u00edvel receber um caracter por vez<br \/>\nint received;<br \/>\n<br \/>\nvoid setup(){<br \/>\n<br \/>\n&nbsp; \/\/ Define o baud rate (taxa de trasmiss\u00e3o) como 9600<br \/>\n&nbsp; Serial.begin(9600);<br \/>\n<br \/>\n&nbsp; \/\/ Atribui o servo ao pino 8 do Arduino<br \/>\n&nbsp; servo1.attach(8);<br \/>\n<br \/>\n&nbsp; \/\/ Atribui o valor 0 para a variavel received<br \/>\n&nbsp; received = 0;<br \/>\n<br \/>\n&nbsp; \/\/ Na posi\u00e7\u00e3o 0 do array, atribui o valor '\\0'<br \/>\n&nbsp; \/\/ que identifica onde come\u00e7a o array<br \/>\n&nbsp; buffer[received] = '\\0';<br \/>\n}<br \/>\n<br \/>\nvoid loop(){<br \/>\n<br \/>\n&nbsp; \/\/ Verifica se existe alguma entrada de dados<br \/>\n&nbsp; \/\/ disponivel na entrada serial<br \/>\n&nbsp; if(Serial.available()){<br \/>\n<br \/>\n&nbsp; &nbsp; \/\/ Salva os caracteres no array a cada itera\u00e7\u00e3o<br \/>\n&nbsp; &nbsp; buffer[received++] = Serial.read();<br \/>\n<br \/>\n&nbsp; &nbsp; if(received &amp;gt;= (sizeof(buffer)-1)){<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; \/\/ Imprime na sa\u00edda serial o valor<br \/>\n&nbsp; &nbsp; &nbsp; \/\/ Apenas para mostrar o valor<br \/>\n&nbsp; &nbsp; &nbsp; Serial.println(buffer);<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; \/\/ Converte o valor de &quot;char&quot; para &quot;int&quot;<br \/>\n&nbsp; &nbsp; &nbsp; int numero = atoi(buffer);<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; \/\/ Envia o comando para o Servo Motor<br \/>\n&nbsp; &nbsp; &nbsp; servo1.write(numero);<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; \/\/ Zera novamente a variavel<br \/>\n&nbsp; &nbsp; &nbsp; received = 0;<br \/>\n&nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; \/\/ Limpa o buffer da entrada serial<br \/>\n&nbsp; &nbsp; Serial.flush();<br \/>\n<br \/>\n&nbsp; }<br \/>\n<br \/>\n}<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n<\/pre>\n<p>Ap\u00f3s ter feito o upload do c\u00f3digo para o Arduino, voc\u00ea pode testar utilizando o <strong>Serial Monitor<\/strong> da IDE.<br \/>\nInsira valores entre 0 e 180 utilizando 3 caracteres por exemplo:<\/p>\n<p>Para 0, digite 000<br \/>\nPara 2, digite 002<br \/>\npara 87, digite 087<br \/>\npara 153, digite 153<\/p>\n<p>e assim por diante.<\/p>\n<p>As duas figuras abaixo demonstram como abrir e como utilizar o serial monitor:<br \/>\n<\/p>\n<div>\n<img loading=\"lazy\" class=\"aligncenter size-full wp-image-218\" title=\"serial-monitor-1\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/serial-monitor-1.jpg\" alt=\"\" width=\"364\" height=\"227\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/serial-monitor-1.jpg 364w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/serial-monitor-1-300x187.jpg 300w\" sizes=\"(max-width: 364px) 100vw, 364px\" \/><br \/>\n<br \/>\n<img loading=\"lazy\" class=\"aligncenter size-full wp-image-219\" title=\"serial-monitor-2\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/serial-monitor-2.jpg\" alt=\"\" width=\"473\" height=\"454\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/serial-monitor-2.jpg 473w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/serial-monitor-2-300x287.jpg 300w\" sizes=\"(max-width: 473px) 100vw, 473px\" \/><\/p>\n<\/div>\n<p><strong>3\u00ba: Implementa\u00e7\u00e3o em C#<br \/>\n<\/strong><\/p>\n<p>No c\u00f3digo C# utilizamos a Classe <strong>&#8220;SerialPort&#8221;<\/strong> para conectar a porta serial (no meu caso a porta &#8220;COM3&#8221;) e enviamos o comando desejado atrav\u00e9s da fun\u00e7\u00e3o <strong>&#8220;Write()&#8221;<\/strong> ou <strong>&#8220;WriteLine()&#8221;<\/strong>, podendo ser uma string, um array de char ou de bytes. Simples n\u00e3o ?&#8230; hehe<\/p>\n<p>O c\u00f3digo abaixo mostra como abrir a conex\u00e3o a porta serial &#8220;COM3&#8221; utilizando o Baud Rate de 9600 (como explicado anteriormente) e enviando a string <strong>&#8220;Hello World&#8221;<\/strong>:<\/p>\n<pre>\n\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/><\/div><\/td><td><div class=\"text codecolorer\">SerialPort porta = new SerialPort(&quot;COM3&quot;,9600);<br \/>\nporta.Open();<br \/>\nporta.WriteLine(&quot;Hello World&quot;);<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n<\/pre>\n<p>Para saber qual porta voc\u00ea est\u00e1 utilizando, na IDE Arduino 0018 v\u00e1 no menu <strong>Tools-&gt;Serial Port<\/strong>, conforme a figura abaixo:<br \/>\n<\/p>\n<div><img loading=\"lazy\" class=\"aligncenter size-full wp-image-205\" title=\"menu-portaserial-arduino\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/menu-portaserial-arduino.jpg\" alt=\"\" width=\"473\" height=\"324\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/menu-portaserial-arduino.jpg 473w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/menu-portaserial-arduino-300x205.jpg 300w\" sizes=\"(max-width: 473px) 100vw, 473px\" \/><\/div>\n<p>\nAbaixo segue o c\u00f3digo utilizado na classe da Janela que conecta na porta e interage com o Servo Motor utilizando as setas do teclado.<\/p>\n<pre>\n\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/>108<br \/>109<br \/>110<br \/>111<br \/>112<br \/>113<br \/>114<br \/>115<br \/>116<br \/>117<br \/>118<br \/>119<br \/>120<br \/>121<br \/>122<br \/>123<br \/>124<br \/>125<br \/>126<br \/>127<br \/>128<br \/>129<br \/>130<br \/>131<br \/>132<br \/>133<br \/>134<br \/>135<br \/>136<br \/>137<br \/><\/div><\/td><td><div class=\"text codecolorer\">\/**<br \/>\n&nbsp;*<br \/>\n&nbsp;* Aplicativo desenvolvido para controlar<br \/>\n&nbsp;* servo motores com Arduino a partir de<br \/>\n&nbsp;* uma porta serial.<br \/>\n&nbsp;*<br \/>\n&nbsp;* Autor: Renato Peterman<br \/>\n&nbsp;* E-mail: renato.pet@gmail.com<br \/>\n&nbsp;*<br \/>\n&nbsp;* Data: 26\/07\/2010<br \/>\n&nbsp;*<br \/>\n&nbsp;*\/<br \/>\n<br \/>\nusing System;<br \/>\nusing System.Collections.Generic;<br \/>\nusing System.ComponentModel;<br \/>\nusing System.Data;<br \/>\nusing System.Drawing;<br \/>\nusing System.Linq;<br \/>\nusing System.Text;<br \/>\nusing System.Windows.Forms;<br \/>\nusing System.IO.Ports;<br \/>\n<br \/>\nnamespace ArduinoSimpleServoControl<br \/>\n{<br \/>\n&nbsp; &nbsp; public partial class JanelaPrincipal : Form<br \/>\n&nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Atributo do tipo SerialPort necess\u00e1rio para abrir a conex\u00e3o<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; private SerialPort porta;<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; \/\/ Atributo do tipo int que armazenara a posi\u00e7\u00e3o do motor<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; private int posicao;<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; public JanelaPrincipal()<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; InitializeComponent();<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Atribui o valor zero a posi\u00e7\u00e3o<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posicao = 0;<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/* Cria um novo objeto SerialPort<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Que conecta a porta &quot;COM3&quot;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* E utiliza um Baud Rate (Taxa de Transmiss\u00e3o de dados) de 9600<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*\/<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta = new SerialPort(&quot;COM3&quot;, 9600);<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/Verifica se a porta n\u00e3o est\u00e1 aberta<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!porta.IsOpen)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Abre a porta<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta.Open();<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/* Envia o valor &quot;000&quot;, para que o<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* motor volte para a possi\u00e7\u00e3o 0<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*\/<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta.WriteLine(&quot;000&quot;);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; \/* Sobrescreve o met\u00f3do ProcessCmdKey<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* respons\u00e1vel por processar as entradas<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* do teclado<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*\/<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; protected override bool ProcessCmdKey(ref Message m, Keys keyData)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool blnProcess = false;<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/* Verifica se a tecla que est\u00e1 sendo pressiona<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* \u00e9 a seta Esquerda (Left)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*\/<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (keyData == Keys.Left)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (posicao &amp;gt;= 0 &amp;amp;&amp;amp; posicao &amp;lt; 180)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Incrementa 10<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posicao += 10;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Aqui ser\u00e3o enviados os dados para a porta.<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (posicao &amp;gt;= 0 &amp;amp;&amp;amp; posicao &amp;gt;= 100)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta.WriteLine(posicao.ToString());<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta.WriteLine(&quot;0&quot; + posicao.ToString());<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; labelGraus.Text = posicao.ToString();<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blnProcess = true;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/* Verifica se a tecla que est\u00e1 sendo pressiona<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* \u00e9 a seta Direita (Right)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*\/<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (keyData == Keys.Right)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (posicao &amp;gt; 0 &amp;amp;&amp;amp; posicao &amp;lt;= 180)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Diminui 10<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posicao -= 10;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (posicao &amp;gt;= 0 &amp;amp;&amp;amp; posicao &amp;gt;= 100)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta.WriteLine(posicao.ToString());<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if (posicao == 0)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta.WriteLine(&quot;000&quot;);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; porta.WriteLine(&quot;0&quot; + posicao.ToString());<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; labelGraus.Text = posicao.ToString();<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blnProcess = true;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/* Aqui verifica se &quot;blnProcess&quot; for verdadeiro<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* retorna este m\u00e9todo, se n\u00e3o chama o met\u00f3do pai (super)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*\/<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (blnProcess == true)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return base.ProcessCmdKey(ref m,keyData);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; }<br \/>\n}<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n<\/pre>\n<p>Abaixo a aplica\u00e7\u00e3o resultante do c\u00f3digo acima que mostra o grau de rota\u00e7\u00e3o do servo.<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-236\" title=\"Janela-1\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/Janela-1.jpg\" alt=\"\" width=\"446\" height=\"228\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/Janela-1.jpg 446w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/Janela-1-300x153.jpg 300w\" sizes=\"(max-width: 446px) 100vw, 446px\" \/><\/p>\n<p>No mesmo projeto desenvolvi outra aplica\u00e7\u00e3o um pouco mais completa conforme a figura abaixo, os arquivos de ambas est\u00e3o dispon\u00edveis para download no final da p\u00e1gina.<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-239\" title=\"Janela-2\" src=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/Janela-2.jpg\" alt=\"\" width=\"500\" height=\"388\" srcset=\"https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/Janela-2.jpg 500w, https:\/\/renatopeterman.com.br\/blog\/wp-content\/uploads\/2010\/07\/Janela-2-300x232.jpg 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><br \/>\n<br \/>\n<strong>4\u00ba: Fim<\/strong><\/p>\n<p>Acho que \u00e9 isso ai, agora \u00e9 s\u00f3 divertir e usar a criatividade. \ud83d\ude00<\/p>\n<p>Abaixo segue o link para download do projeto completo, com o projeto para upload no Arduino e as duas aplica\u00e7\u00f5es desenvolvidas em C#.<\/p>\n<p><strong><a href=\"https:\/\/github.com\/renatopeterman\/arduino-servo-control-example\">Download do projeto no GitHub<\/a><\/strong><\/p>\n<p>Pra saber como controlar mais de um servo motor na sua aplica\u00e7\u00e3o <a href=\"https:\/\/renatopeterman.com.br\/blog\/2011\/07\/26\/controlando-dois-ou-mais-servo-motores-com-arduino\/\">clique aqui<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J\u00e1 faz alguns dias que venho estudando um pouco de eletr\u00f4nica para o desenvolvimento do meu TCC. Estive pesquisando um pouco sobre microcontroladores e recentemente andei desenvolvendo umas aplica\u00e7\u00f5es com o Arduino Duemilanove. Andei fazendo uns testes com servo motor, &hellip; <a href=\"https:\/\/renatopeterman.com.br\/blog\/2010\/07\/28\/controlando-servo-motor-a-partir-do-teclado-com-arduino-e-c\/\">Continue lendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23,24,10],"tags":[28,25,29,31,27,30,26,50],"_links":{"self":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts\/164"}],"collection":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/comments?post=164"}],"version-history":[{"count":98,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts\/164\/revisions"}],"predecessor-version":[{"id":943,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/posts\/164\/revisions\/943"}],"wp:attachment":[{"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/media?parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/categories?post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/renatopeterman.com.br\/blog\/wp-json\/wp\/v2\/tags?post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}