sexta-feira, 2 de novembro de 2012

[Tutorial] Controlando Servo Motor utilizando o teclado

Publicação retirada de: www.renatopeterman.com.br

Já faz alguns dias que venho estudando um pouco de eletrônica para o desenvolvimento do meu TCC. Estive pesquisando um pouco sobre microcontroladores e recentemente andei desenvolvendo umas aplicações com o Arduino Duemilanove.
Andei fazendo uns testes com servo motor, e resolvi fazer este tutorial para compartilhar.
Abaixo segue um video que fiz da aplicação em funcionamento.

Para este tutorial é necessário que você saiba um mínimo de programação e já tenha feito alguma coisa com o arduino. Se quiser saber mais acesse o site: www.arduino.cc.
Este projeto nada mais é do que uma interface desenvolvida em C# que permite controlarum servo motor conectado ao arduino a partir das setas direita e esquerda do teclado. Ao final estão os links para download dos projetos que podem ser abertos no Visual Studio (utilizei a versão 2008).
Desenvolvi uma versão mais simples utilizada no tutorial e uma outra um pouco mais completa, os dois projetos estão disponiveis para download no final.
Tentei desenvolver utilizando Java, porém, não consegui compilar no Windows 64 bits. Mas futuramente posto alguma coisa. ;)
Utilizei o servo S3003 da Futaba, mas acredito que não há problema em usar outro modelo.
Abaixo segue uma lista do que utilizei no desenvolvimento:
1º: Conectar o Servo Motor ao Arduino
O Servo Motor que estou utilizando possui um conector com tres fios, um vermelho (5V), um preto (GND) e um branco (responsável pela comunicação com o servo), cada um desses deve ser conectado de acordo com a figura abaixo:



2º: Código para o Arduino e Teste
O programa que será gravado no Arduino, recebe três caracteres através através da comunição serial, por exemplo: se receber “000″ o motor ira para 0 graus, se receber “050″ para 50 graus, “120″ para 120 graus, e assim por diante. É dessa forma que os comandos são enviados para o servo
Note que quando inicio a comunicação Serial utilizando “Serial.begin(9600)”, estou definindo que a taxa de transmissão (baud rate) da porta será de 9600.
Abra a IDE Arduino 0018. Automaticamente ela já inicia com um novo projeto.
Em seguida, utilize o código abaixo e faça o upload para o seu Arduino ou se preferir, faça o download do arquivo no final da página e abra-o na IDE.

// Importa a biblioteca Servo.h do arduino
#include <Servo.h>

// Cria uma variavel do tipo Servo que será
// o nosso servo.
Servo servo1;

// Array de char que receberá o comando
// via serial
char buffer[4];

// Variavel que identifica quantos
// caracteres foram recebidos, pois só é
// possível receber um caracter por vez
int received;

void setup(){

  // Define o baud rate (taxa de trasmissão) como 9600
  Serial.begin(9600);

  // Atribui o servo ao pino 8 do Arduino
  servo1.attach(8);

  // Atribui o valor 0 para a variavel received
  received = 0;

  // Na posição 0 do array, atribui o valor '\0'
  // que identifica onde começa o array
  buffer[received] = '\0';
}

void loop(){

  // Verifica se existe alguma entrada de dados
  // disponivel na entrada serial
  if(Serial.available()){

    // Salva os caracteres no array a cada iteração
    buffer[received++] = Serial.read();

    if(received >= (sizeof(buffer)-1)){

      // Imprime na saída serial o valor
      // Apenas para mostrar o valor
      Serial.println(buffer);

      // Converte o valor de "char" para "int"
      int numero = atoi(buffer);

      // Envia o comando para o Servo Motor
      servo1.write(numero);

      // Zera novamente a variavel
      received = 0;
    }

    // Limpa o buffer da entrada serial
    Serial.flush();

  }

}

Após ter feito o upload do código para o Arduino, você pode testar utilizando o Serial Monitor da IDE.
Insira valores entre 0 e 180 utilizando 3 caracteres por exemplo:
Para 0, digite 000
Para 2, digite 002
para 87, digite 087
para 153, digite 153
e assim por diante.
As duas figuras abaixo demonstram como abrir e como utilizar o serial monitor:







3º: Implementação em C#
No código C# utilizamos a Classe “SerialPort” para conectar a porta serial (no meu caso a porta “COM3″) e enviamos o comando desejado através da função “Write()” ou“WriteLine()”, podendo ser uma string, um array de char ou de bytes. Simples não ?… hehe
Para saber qual porta você está utilizando, na IDE Arduino 0018 vá no menu Tools->Serial Port, conforme a figura abaixo:


Abaixo segue o código utilizado na classe da Janela que conecta na porta e interage com o Servo Motor utilizando as setas do teclado.

// Importa a biblioteca Servo.h do arduino
#include <Servo.h>

// Cria uma variavel do tipo Servo que será
// o nosso servo.
Servo servo1;

// Array de char que receberá o comando
// via serial
char buffer[4];

// Variavel que identifica quantos
// caracteres foram recebidos, pois só é
// possível receber um caracter por vez
int received;

void setup(){

// Define o baud rate (taxa de trasmissão) como 9600
Serial.begin(9600);

// Atribui o servo ao pino 8 do Arduino
servo1.attach(8);

// Atribui o valor 0 para a variavel received
received = 0;

// Na posição 0 do array, atribui o valor '\0'
// que identifica onde começa o array
buffer[received] = '\0';
}

void loop(){

// Verifica se existe alguma entrada de dados
// disponivel na entrada serial
if(Serial.available()){

// Salva os caracteres no array a cada iteração
buffer[received++] = Serial.read();

if(received <= (sizeof(buffer)-1)){

// Imprime na saída serial o valor
// Apenas para mostrar o valor
Serial.println(buffer);

// Converte o valor de "char" para "int"
int numero = atoi(buffer);

// Envia o comando para o Servo Motor
servo1.write(numero);

// Zera novamente a variavel
received = 0;
}

// Limpa o buffer da entrada serial
Serial.flush();

}

}
No mesmo projeto desenvolvi outra aplicação um pouco mais completa conforme a figura abaixo, os arquivos de ambas estão disponíveis para download no final da página.



4º: Fim
Acho que é isso ai, agora é só divertir e usar a criatividade. :D
Abaixo segue o link para download do projeto completo, com o projeto para upload no Arduino e as duas aplicações desenvolvidas em C#.

Publicação retirada de: http://www.renatopeterman.com.br/blog/