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!



  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
/*---------------------------------------------------------
Programa : MIRA LASER
Autor : Fellipe Couto [ http://www.efeitonerd.com.br ]
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