segunda-feira, 29 de maio de 2017

CARRINHO ROBÔ FASE 3

     Olá pessoal. Nesta etapa de nosso projeto vamos acrescentar um movimento extra para a garra que montamos na aula passada. Agora a garra poderá subir ou descer. Isso vai facilitar quando quisermos que o robô pegue um objeto. Este movimento será realizado por um pequeno motor de passo. Acrescentando este novo acessório ao nosso robô, poderemos estudar o funcionamento e controle de motores de passo. Ao carregar o esketch no robô, alguns movimentos vão ficar invertidos, mas isso é proposital...




O SKETCH: (com alguns "errinhos" propositais...)

// PROGRAMA CARRINHO ROBÔ 3 (RODAS - PONTE H - GARRA - SERVO MOTOR - MOTOR DE PASSO)

/*    Este programa controla as rodas e a garra do carrinho por meio da comunicação serial, via teclado. 
  Para o controle do carrinho, o mesmo deve estar conectado via USB. Os comandos possíveis são:
  'f'- carrinho anda para frente;
  'r'- carrinho anda para trás;
  'e'- vira para a esquerda;
  'd'- vira para a direita;
  'h'- potencia máxima quando acionada alguma porta PWM;
  'l'- potencia reduzida;
  'p'- garra fecha;
  's'- garra abre;
  'i'- sobe a garra;
  'j'- desce a garra;
*/

#include <Servo.h> // biblioteca para controle do servo motor;
#include <Stepper.h> // biblioteca para controle do motor de passo;
Servo myservo;  // cria um objeto que possibilita o controle de um servo;
Stepper motor(2048, 8, 11, 10, 12);


int tempo = 500; // Variavel que controla o tempo dos motores;
char comando = 'v'; // Recebe o valor digitado;
int POT = 255; // Controla a potencia das portas PWM;
int volta = 512; // numero de passos para 1/4 de volta do motor de passo (uma volta completa tem 2048 passos);

void setup()
{
  myservo.attach(2);  // define em que pino digital esta conectado o servo;

  Serial.begin(9600); // inicia comunicacao serial;

  // declaracao dos pinos utilizados:
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);

  motor.setSpeed(5); // velocidade do motor de passo; 
}
void loop()
{
  if (Serial.available()) // verifica se existe algo digitado no monitor serial;
  {
    comando = Serial.read(); // carrega o valor digitado no monitor serial na variavel "comando";

    if (comando == 'f') // verifica se a variavel "comando" contem a letra "f"; Se verdadeiro aciona as portas
                        //que fazem com que o carrinho ande para a frente pelo tempo contido na variavel "tempo", apos isso desliga todas as portas;
    {

      Serial.println("carrinho.anda para frente!");
      analogWrite(3, POT);
      analogWrite(6, POT);
      analogWrite(9, 0);
      analogWrite(5, 0);
      delay(tempo);

      analogWrite(3, 0);
      analogWrite(6, 0);
      analogWrite(9, 0);
      analogWrite(5, 0);
    }
    if (comando == 'r') // verifica se a variavel "comando" contem a letra "r"; Se verdadeiro aciona as portas
                        //que fazem com que o carrinho ande para a tras pelo tempo contido na variavel "tempo", apos isso desliga todas as portas;
    {
      Serial.println("carrinho.anda para tras!");
      analogWrite(5, POT);
      analogWrite(9, POT);
      analogWrite(3, 0);
      analogWrite(6, 0);
      delay(tempo);

      analogWrite(3, 0);
      analogWrite(6, 0);
      analogWrite(9, 0);
      analogWrite(5, 0);
    }
    if (comando == 'e') // verifica se a variavel "comando" contem a letra "e"; Se verdadeiro aciona as portas
                        //que fazem com que o carrinho ande para a esquerda pelo tempo contido na variavel "tempo", apos isso desliga todas as portas;
    {
      Serial.println("carrinho.anda para esquerda!");
      analogWrite(3, POT);
      analogWrite(9, POT);
      analogWrite(5, 0);
      analogWrite(6, 0);
      delay(tempo);

      analogWrite(3, 0);
      analogWrite(6, 0);
      analogWrite(9, 0);
      analogWrite(5, 0);
    }
    if (comando == 'd')  // verifica se a variavel "comando" contem a letra "d"; Se verdadeiro aciona as portas
                        //que fazem com que o carrinho ande para a direita pelo tempo contido na variavel "tempo", apos isso desliga todas as portas;
    {
      Serial.println("carrinho.anda para direita!");
      analogWrite(5, POT);
      analogWrite(6, POT);
      analogWrite(3, 0);
      analogWrite(9, 0);
      delay(tempo);

      analogWrite(3, 0);
      analogWrite(6, 0);
      analogWrite(9, 0);
      analogWrite(5, 0);
    }

    if (comando == 'h')  // verifica se a variavel "comando" contem a letra "h"; Se verdadeiro carrega na variavel "POT
                         // o valor de 255, que fará com que as portas PWM enviem a potencia maxima para os motores quando acionados;
    {
      POT = 255;
      Serial.print("velocidade maxima. Pot:");
      Serial.println(POT);

    }
    if (comando == 'l')  // verifica se a variavel "comando" contem a letra "l"; Se verdadeiro carrega na variavel "POT
                         // o valor de 200, que fará com que as portas PWM enviem uma potencia reduzida para os motores quando acionados;
    {
      POT = 200;
      Serial.print("velocida media. Pot: ");
      Serial.println(POT);

    }

    if (comando == 's')  // verifica se a variavel "comando" contem a letra "p"; Se verdadeiro faz com que o eixo do servo motor gire
                         // para a posicao de 180 graus, fazendo com que a garra feche;
    {
      Serial.println(" Garra fechada!!! ");
      myservo.write(180);                  // comanda servo para a posicao indicada;
      delay(1000);                           // espera ate que o servo chegue na posicao ordenada;
     
    }

    if (comando == 'p')  // verifica se a variavel "comando" contem a letra "s"; Se verdadeiro faz com que o eixo do servo motor gire
                         // para a posicao de 0 graus, fazendo com que a garra abra;
    {
      Serial.println(" Garra aberta!!! ");
      myservo.write(0);                   // comanda servo para a posicao indicada;
      delay(1000); // espera ate que o servo chegue na posicao ordenada;
      
    }

    if (comando == 'i')  // verifica se a variavel "comando" contem a letra "i"; Se verdadeiro faz com que o eixo do motor de passo gire
                         // 5 vezes no sentido horário, fazendo com que a garra suba;
    {
      Serial.println(" Garra sobe!!! ");
      motor.step(volta*1);                   // comanda o motor de passo para subir a garra, girando o eixo 5 vezes no sentido horário;
      delay(500);
      digitalWrite(8,LOW);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
    }

    if (comando == 'j')  // verifica se a variavel "comando" contem a letra "j"; Se verdadeiro faz com que o eixo do motor de passo gire
                         // 5 vezes no sentido anti-horário, fazendo com que a garra deça;
    {
      Serial.println(" Garra desce!!! ");
      motor.step(-volta*1);                   // comanda o motor de passo para descer a garra, girando o eixo 5 vezes no sentido anti-horário;
      delay(500);
      digitalWrite(8,LOW);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
    }
    else   // caso seja digitado qualquer outro comando diferente dos definidos acima, imprime a mensagem: "comando desconhecido!";
    {
      digitalWrite(2,LOW);
    }
  }
}
   // Fim do programa;




Programinha simples para controle do motor de passo:


int volta = 2048;
#include <Stepper.h>

Stepper motor(2048, 8, 11, 10, 12);

void setup() {

  motor.setSpeed(5);

}

void loop() {
   
  motor.step(volta*1);
  delay(1000);

  motor.step(-volta * 1);
  delay(1000);
}

Nenhum comentário:

Postar um comentário