5 de maio de 2014

Mira Laser


E o laser não erra! Projeto simples, mas muito interessante!
As posições são gravadas manualmente através de dois potenciômetros. Após isso, o robô mira laser trabalha sozinho. O movimento é feito por dois servo motores.

Já pensou que é essa a base de funcionamento de um robô de solda?! Com criatividade, a partir desse projeto podemos ter vários outros!

Segue o esquema elétrico do circuito e o código fonte.

Valeu! Abraços!



/*-----------------------
 Programa : MIRA LASER
 Autor    : Fellipe Couto
 Data     : 03/05/2014
 -----------------------*/

#include <Servo.h> //Biblioteca do Servo Motor
#define servo1 6 //Servo motor 1 no pino 6
#define servo2 7 //Servo motor 2 no pino 7
#define laser 8 //Laser no pino 8
#define potX A0 //Potenciometro 1 (right / left) ligado na entrada analogica A0
#define potY A1 //Potenciometro 2 (up / down) ligado na entrada analogica A1
#define bRec A2 //Botao para gravar as posicoes ligado na entrada analogica A2, com resistor de pull-down 10K

Servo servoRightLeft; //Varíavel do servo motor para direita e esquerda
Servo servoUpDown; //Varíavel do servo motor para cima e para baixo

int pX[100] = {}; //Array com as posicoes gravadas de right/left
int pY[100] = {}; //Array com as posicoes gravadas de up/down
int qtdRec = 0; //Quantidade de posicoes gravadas
boolean rec = true;

/*----- SETUP -----*/
void setup() {
  //Configura o pino do laser
  pinMode(laser, OUTPUT);

  //Configura os pinos dos servos
  servoRightLeft.attach(servo1);
  servoUpDown.attach(servo2);
}

/*----- LOOP PRINCIPAL -----*/
void loop() {
  if (rec == true) {
    target();
  } else {
    autoLaser();
  }
}

/*----- LASER MANUAL PARA GRAVAR OS ALVOS -----*/
void target() {
  //Laser ligado
  digitalWrite(laser, HIGH);

  //Posicoes do potenciometro
  int x = map(analogRead(potX), 0, 1023, 0, 180);
  int y = map(analogRead(potY), 0, 1023, 0, 180);

  //Posiciona os servos
  servoRightLeft.write(x);
  servoUpDown.write(y);

  //Se o botao for pressionado, grava as posicoes
  if (analogRead(bRec) == 1023) {
    qtdRec++;
    pX[qtdRec] = x;
    pY[qtdRec] = y;
    blinkLaser();

    //Se o botao permanecer pressionado apos o laser piscar, inicia a mira automatica
    if (analogRead(bRec) == 1023) {
      rec = false;
      delay(2000);
    }
  }
}

/*----- LASER AUTOMATICO -----*/
void autoLaser() {
  for (int i = 1; i <= qtdRec; i++) {
    //Posiciona os servos
    servoRightLeft.write(pX[i]);
    servoUpDown.write(pY[i]);
    delay(500);

    //Pisca o laser
    blinkLaser();

    //Se o botao permanecer pressionado apos o laser piscar, finaliza a mira automatica
    if (analogRead(bRec) == 1023) {
      rec = true;
      i = qtdRec + 1;
      delay(2000);

      //Se o botao permanecer pressionado após o delay, não mantem as posicoes que ja estavam gravadas
      if (analogRead(bRec) == 1023) {
        qtdRec = 0;
        digitalWrite(laser, HIGH);
        delay(1000);
        digitalWrite(laser, LOW);
        delay(2000);
      }
    }
  }
}

/*----- PISCA O LASER -----*/
void blinkLaser() {
  for (int i = 0; i < 15; i++) {
    digitalWrite(laser, HIGH);
    delay(50);
    digitalWrite(laser, LOW);
    delay(50);
  }
}

11 comentários:

  1. Boa Dia, muito legal esse tuto, mas me veio uma duvida, voce disse: As posições são gravadas manualmente através de dois potenciômetros. Após isso, o robô mira laser trabalha sozinho. MAS COMO FAZER ESSA GRAVAÇÃO? pena que o video não mostra como.

    pode me informar?

    abraço

    ResponderExcluir
    Respostas
    1. Bom dia, Eduardo!
      Após posicionar o laser através dos potenciômetros, é só pressionar um botão (push-button) que a posição é memorizada. Na figura do esquema elétrico, pode-se ver o botão bRec, e no fonte está comentado na linha 55.
      Abraços!

      Excluir
  2. Obrigado pela paciência em responder a tantos pedidos, Mas isso é memorizado pelo programa e o arduino?

    ResponderExcluir
    Respostas
    1. As posições estão sendo memorizadas somente pelo programa, através do vetores (array) pX e pY. Quando o Arduino reinicia, perde-se as posições memorizadas. Pode-ser utilizar a EEPROM, e nesse caso, toda vez que iniciar o programa, você carrega os vetores com os valores gravados na memória EEPROM.

      Excluir
  3. VOCE DISSE:através do vetores (array) pX e pY. Quando o Arduino reinicia, perde-se as posições memorizadas. Pode-ser utilizar a EEPROM, e nesse caso, toda vez que iniciar o programa, você carrega os vetores com os valores gravados na memória EEPROM.

    NESTE CASO NÃO É PRECISO MAIS FAZER NADA QUE JA ESTARIA TUDO AUTOMATIZADO POR QUE ESTA MEMORIZADO NA EEPROM?

    ResponderExcluir
    Respostas
    1. Exato! Deixando as posições gravadas na EEPROM, o circuito pode ser desligado que a memória não é perdida. Quando liga-lo novamente, as posições continuam memorizadas.

      Excluir
  4. Poxa que legal as possibilidades que a programação tem. E muito obrigado por responder-me.

    Estou sofrendo para apreender programação, eletrônica, e a matemática usada nos cálculos.

    Quando tiver tempo, faça uns videos nos ensinando a programar, se puder né.

    abraço

    ResponderExcluir
  5. otmo projerto daria para modificar para um braço robotico o q mudar no esquema desde j OB

    ResponderExcluir
    Respostas
    1. Bom dia! Esse projeto está configurado para controlar 2 motores servo, e é possível sim efetuar alterações para controle de braço.

      Excluir
  6. Felipe beleza, parabéns! Sei que o projeto já tem um tempo. Mas seria possível você atualizar essa projeto ou ensinar como inserir uma EEPROM e adequar o código ? Obrigado desde já. werdn@msn.com

    ResponderExcluir
  7. FILEPE PARABÉNS PROJETO MUITO MASSA! TERIA COMO MOSTRAR A GRAVAÇÃO NA MEMORIA EEPROM ? cjr.pinheiro@hotmail.com

    ResponderExcluir