Arduino: Accionamento e Controlo de Servos Via Teclado

Introdução

Nesta edição irei evoluir um pouco mais as funcionalidades demonstradas no artigo publicado na edição 39 sobre o Accionamento de Servos Usando Arduino apresentando agora um artigo sobre o accionamento e controlo de servos usando o teclado do computador como input das acções pretendidas.

Desta forma será possível controlar a acção dos servos usando a interface das teclas do teclado para a definição das acções.

Para a implementação e controlo dos servos usando o teclado não é necessário efectuar qualquer alteração ao esquema eléctrico apresentado no artigo da edição 39, bastando apenas usar a tecnologia Processing como interface de ligação entre o utilizador e o micro-controlador Arduino.

Programação

A linguagem de programação Processing foi a linguagem de programação utilizada para a criação da interface que permitiu o controlo do micro-controlador.   Esta linguagem usa uma sintaxe muito semelhante à da linguagem de programação C e permite efectuar com alguma facilidade interfaces gráficas.

No entanto também disponibiliza algumas funcionalidades que permitem recolher o resultado do input de um dispositivo de entrada como o teclado ou o rato e usar essa mesma informação para despoletar uma acção.

Neste caso o Arduino estará conectado via porta de série, que na verdade é emulada pelo cabo USB. Usando a biblioteca processing.serial iremos recolher o input do teclado e enviá-lo para o micro-controlador Arduino em tempo real para que seja despoletada a acção pretendida.

O exemplo demonstrado irá ter apenas 5 acções em que as teclas UP, DOWN, RIGHT, LEFT e S que despoletam a acção de andar para a frente, para trás, para a direita, para a esquerda e para parar, respectivamente.

Arduino: Código-Fonte Utilizado

Apesar de as acções serem dadas a partir do teclado e recolhidas pela pequena aplicação programada usando a linguagem de programação Processing é necessário que o micro-controlador esteja programado de modo a saber reagir às acções despoletadas pelo utilizador.

Para isso usamos o seguinte código-fonte, que não é mais do que os movimentos pré-definidos em quem a recepção do código ASCII pertencente a determinada tecla recolhida pela função n = Serial.read(); se traduz numa acção real dos servos.

//Definição de Variáveis
int n;
int motorPin1 = 5;
int motorPin2 = 6;
int motorPin3 = 10;
int motorPin4 = 11;

void setup()
{
  Serial.begin(9600);
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop()
{
  //Verificar se a Porta de Série está disponível
  if (Serial.available() > 0)
  {
    n = Serial.read();
  }
  //Definição das Acções andar para a frente, para trás, para a direita, para a esquerda e para parar
  if (n == 119)
  {
    //Avançar
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
  }
  if ( n == 115)
  {
    //Recuar
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
  }
  if ( n == 100)
  {
    //Direita
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
  }
  if ( n == 97)
  {
    //Esquerda
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
  }
  if (n == 113)
  {
    //Parar
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
}

Este será o código que estará armazenado pelo micro-controlador Arduino, e é em muito semelhante ao código apresentado no artigo publicado na edição 39, tempo apenas definidas as acções que serão realizadas pelos servos mediante o input recebido.

Processing: Interface Utilizador / Arduino

No exemplo em questão é o utilizador que irá despoletar as acções dos servos mediante o toque em determinadas teclas do teclado do computador, sendo neste caso as teclas UP, DOWN, RIGHT, LEFT e S despoletam a acção de andar para a frente, para trás, para a direita, para a esquerda e para parar, respectivamente.

Para que tal aconteça temos de criar uma “interface” entre o utilizador e o micro-controlador Arduino que irá então despoletar as acções sobre os servos. Para isso iremos utilizar uma pequena aplicação recorrendo à linguagem de programação Processing que irá servir de ponte entre a recolha das acções dadas pelo utilizador e a sua transmissão para o micro-controlador Arduino para que este as possa interpretar e processar.

//Definição da biblioteca utilizada
import processing.serial.*;

Serial myPort;

void setup()
{
  size(200,200); 

  noStroke();
  background(0);

  // Alteração "COM35para a Porta COM pretendida
  myPort = new Serial(this, "COM3", 9600);
}

void draw()
{
  //Seta avançar
  triangle(100 , 25, 75, 75, 125, 75);
  //Seta Esquerda
  triangle(75 , 125, 75, 75, 25, 100);
  //Seta Recuar
  triangle(75 , 125, 100, 175, 125, 125);
  //Seta Direita
  triangle(175 , 100, 125, 75, 125, 125);
}

void keyPressed()
{
  if (key == CODED)
  {
    if (keyCode == UP)
    {
      myPort.write(119);
      fill(153);
      //Seta avançar
      triangle(100 , 25, 75, 75, 125, 75);
      fill(255);
      //Seta Esquerda
      triangle(75 , 125, 75, 75, 25, 100);
      //Seta Recuar
      triangle(75 , 125, 100, 175, 125, 125);
      //Seta Direita
      triangle(175 , 100, 125, 75, 125, 125);
    }
    else if (keyCode == DOWN)
    {
      myPort.write(115);
      fill(153);
      //Seta Recuar
      triangle(75 , 125, 100, 175, 125, 125);
      fill(255);
      //Seta avançar
      triangle(100 , 25, 75, 75, 125, 75);
      //Seta Esquerda
      triangle(75 , 125, 75, 75, 25, 100);
      //Seta Recuar
      triangle(75 , 125, 100, 175, 125, 125);
      //Seta Direita
      triangle(175 , 100, 125, 75, 125, 125);
    }
    else if (keyCode == LEFT)
    {
      myPort.write(100);
      fill(153);
      //Seta Esquerda
      triangle(75 , 125, 75, 75, 25, 100);
      fill(255);
      //Seta Recuar
      triangle(75 , 125, 100, 175, 125, 125);
      //Seta avançar
      triangle(100 , 25, 75, 75, 125, 75);
      //Seta Esquerda
      triangle(75 , 125, 75, 75, 25, 100);
      //Seta Direita
      triangle(175 , 100, 125, 75, 125, 125);
    }
    else if (keyCode == RIGHT)
    {
      myPort.write(97);
      fill(153);
      //Seta Direita
      triangle(175 , 100, 125, 75, 125, 125);
      fill(255);
      //Seta Esquerda
      triangle(75 , 125, 75, 75, 25, 100);
      //Seta Recuar
      triangle(75 , 125, 100, 175, 125, 125);
      //Seta avançar
      triangle(100 , 25, 75, 75, 125, 75);
    }
  }
  else if (key == 's' || key == 'S')
  {
    myPort.write(113);
  }
}

A recolha e transmissão do input dado pelo utilizador através do teclado é feita usando a a biblioteca processing.serial.

No fundo o que esta pequena aplicação faz é verificar se alguma das teclas previamente referidas foi pressionada, caso a resposta seja positiva esta vai enviar a respectiva informação (código ASCII definido para a tecla em causa) através do comando myPort.write("código ASCII"); de modo a que este seja recebido pelo micro-controlador Arduino e de seguida seja interpretado e processado resultando numa acção por parte dos servos.

Conclusão

O artigo desta edição mostra apenas uma das inúmeras formas do utilizador controlar directamente e em tempo real as acções dos servos usando como “processador/interpretador” dos dados o micro-controlador Arduino.

Como se diz na gíria popular a criatividade de cada um é o limite, sendo que é possível aplicar este exemplo aos mais variados projectos recorrendo à agilidade e facilidade de programação do micro-controlador Arduino.

Publicado na edição 42 (PDF) da Revista PROGRAMAR.