Índice:

Arduino Base Pick and Place Robot: 8 etapas
Arduino Base Pick and Place Robot: 8 etapas

Vídeo: Arduino Base Pick and Place Robot: 8 etapas

Vídeo: Arduino Base Pick and Place Robot: 8 etapas
Vídeo: robot race. line follower robot with arduino program 2024, Julho
Anonim
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot

Eu fiz um braço de robô industrial super barato (menos de 1000 dólares) para permitir que os alunos hackear robótica em maior escala e para permitir que pequenas produções locais usem robôs em seus processos sem quebrar o banco. Sua facilidade para construir e fazer a faixa etária pessoas de 15 a 50 anos.

Etapa 1: Requisitos de componentes

Requisito de Componentes
Requisito de Componentes
Requisito de Componentes
Requisito de Componentes
Requisito de Componentes
Requisito de Componentes
Requisito de Componentes
Requisito de Componentes

1. Arduino + Escudo + Pinos + Cabos

2. Controlador de motor: dm860A (Ebay)

3. Motor de passo: 34hs5435c-37b2 (Ebay)

4. Parafusos M8x45 + 60 + 70 e parafusos M8.

5. Contraplacado de 12 mm.

6. Nylon de 5 mm.

7. Arruelas cegas de 8 mm.

8. Parafusos para madeira 4.5x40mm.

9. Contador M3 afundado, 10. Fonte de alimentação 12v

11. servo motor driver arduino

Etapa 2: Baixe o Gui

zapmaker.org/projects/grbl-controller-3-0/

github.com/grbl/grbl/wiki/Using-Grbl

Etapa 3: Conexão

Conexão
Conexão
Conexão
Conexão
Conexão
Conexão

Conectar os fios indicados na imagem é uma melhor compreensão para você.

precisamos conectar o driver do motor ao Arduino e outros conectores necessários de acordo com o seu robô.

Etapa 4: faça upload do firmware e verifique o resultado do código no painel do Arduino

Instalando o firmware no Arduino - GRBL:

github.com/grbl/grbl/wiki/Compiling-Grbl

Nota: Você pode obter um conflito ao compilar no Arduino. Remova todas as outras bibliotecas de sua pasta de biblioteca (../documents/Arduino/libraries).

Configuração de firmware

Defina habilitar para um tempo limite mais recente. Use uma conexão serial e escreva:

$1=255

Definir homing:

$22=1

Lembre-se de definir serial para baud: 115200

Códigos G úteis

Defina o ponto zero para o robô:

G10 L2 Xnnn Ynnn Znnn

Use o ponto zero:

G54

Inicialização típica para centralizar o robô:

G10 L2 X1.5 Y1.2 Z1.1

G54

Mova o robô para a posição rapidamente:

G0 Xnnn Ynnn Znnn

Exemplo:

G0 X10.0 Y3.1 Z4.2 (retorno)

Mova o robô para a posição em uma velocidade específica:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (retorno)

F deve estar entre 10 (slooooow) e 600 (rápido)

Unidades padrão para X, Y e Z

Ao usar configurações de etapas / unidades padrão (250 etapas / unidade) para GRBL e

acionamento de passo configurado para 800 passos / rev, as seguintes unidades se aplicam a todos os eixos:

+ - 32 unidades = + - 180 graus

Exemplo de código de processamento:

Este código pode se comunicar diretamente com o Arduino GRBL.

github.com/damellis/gctrl

Lembre-se de definir serial para baud: 115200

Código uoload em ardunio

import java.awt.event. KeyEvent;

import javax.swing. JOptionPane;

import processing.serial. *;

Porta serial = nula;

// selecione e modifique a linha apropriada para o seu sistema operacional

// deixe como nulo para usar a porta interativa (pressione 'p' no programa)

String portname = null;

// String portname = Serial.list () [0]; // Mac OS X

// String portname = "/ dev / ttyUSB0"; // Linux

// String portname = "COM6"; // Janelas

fluxo booleano = falso;

velocidade de flutuação = 0,001;

String gcode;

int i = 0;

void openSerialPort ()

{

if (portname == null) return;

if (port! = null) port.stop ();

porta = novo Serial (este, nome da porta, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

String result = (String) JOptionPane.showInputDialog (this, "Selecione a porta serial que corresponde à sua placa Arduino.", "Selecione a porta serial", JOptionPane. PLAIN_MESSAGE, nulo, Serial.list (), 0);

if (resultado! = nulo) {

portname = resultado;

openSerialPort ();

}

}

void setup ()

{

tamanho (500, 250);

openSerialPort ();

}

void draw ()

{

fundo (0);

preencher (255);

int y = 24, dy = 12;

texto ("INSTRUÇÕES", 12, y); y + = dy;

texto ("p: selecionar porta serial", 12, y); y + = dy;

texto ("1: definir a velocidade para 0,001 polegadas (1 mil) por jog", 12, y); y + = dy;

texto ("2: definir a velocidade para 0,010 polegadas (10 mil) por jog", 12, y); y + = dy;

texto ("3: definir a velocidade para 0,100 polegadas (100 mil) por jog", 12, y); y + = dy;

texto ("teclas de seta: mover no plano x-y", 12, y); y + = dy;

texto ("página acima e página abaixo: mover no eixo z", 12, y); y + = dy;

texto ("$: exibir configurações grbl", 12, y); y + = dy;

texto ("h: ir para casa", 12, y); y + = dy;

text ("0: zero machine (set home to the current location)", 12, y); y + = dy;

texto ("g: transmitir um arquivo de código g", 12, y); y + = dy;

text ("x: parar o streaming de código G (NÃO é imediato)", 12, y); y + = dy;

y = altura - dy;

texto ("velocidade atual de jog:" + velocidade + "polegadas por passo", 12, y); y - = dy;

texto ("porta serial atual:" + nome da porta, 12, y); y - = dy;

}

void keyPressed ()

{

if (chave == '1') velocidade = 0,001;

if (chave == '2') velocidade = 0,01;

if (tecla == '3') velocidade = 0,1;

if (! streaming) {

if (keyCode == LEFT) port.write ("G91 / nG20 / nG00 X-" + velocidade + "Y0.000 Z0.000 / n");

if (keyCode == RIGHT) port.write ("G91 / nG20 / nG00 X" + velocidade + "Y0.000 Z0.000 / n");

if (keyCode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + velocidade + "Z0.000 / n");

if (keyCode == DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y-" + velocidade + "Z0.000 / n");

if (keyCode == KeyEvent. VK_PAGE_UP) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z" + velocidade + "\ n");

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + velocidade + "\ n");

// if (key == 'h') port.write ("G90 / nG20 / nG00 X0.000 Y0.000 Z0.000 / n");

if (key == 'v') port.write ("$ 0 = 75 / n $ 1 = 74 / n $ 2 = 75 / n");

// if (key == 'v') port.write ("$ 0 = 100 / n $ 1 = 74 / n $ 2 = 75 / n");

if (key == 's') port.write ("$ 3 = 10 / n");

if (key == 'e') port.write ("$ 16 = 1 / n");

if (key == 'd') port.write ("$ 16 = 0 / n");

if (key == '0') openSerialPort ();

if (key == 'p') selectSerialPort ();

if (key == '$') port.write ("$$ / n");

if (key == 'h') port.write ("$ H / n");

}

if (! streaming && key == 'g') {

gcode = null; i = 0;

Arquivo arquivo = nulo;

println ("Carregando arquivo…");

selectInput ("Selecione um arquivo para processar:", "fileSelected", arquivo);

}

if (key == 'x') streaming = false;

}

void fileSelected (seleção de arquivo) {

if (seleção == null) {

println ("A janela foi fechada ou o usuário clicou em cancelar.");

} outro {

println ("Usuário selecionado" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return;

streaming = verdadeiro;

Stream();

}

}

void stream ()

{

if (! streaming) retornar;

while (true) {

if (i == gcode.length) {

streaming = falso;

Retorna;

}

if (gcode .trim (). length () == 0) i ++;

senão quebrar;

}

println (gcode );

port.write (gcode + '\ n');

i ++;

}

void serialEvent (Serial p)

{

String s = p.readStringUntil ('\ n');

println (s.trim ());

if (s.trim (). startsWith ("ok")) stream ();

if (s.trim (). startsWith ("erro")) stream (); // XXX: realmente?

}

Etapa 5: Projete e imprima todas as peças em uma folha de madeira compensada

Projetar e imprimir todas as peças em folha de madeira compensada
Projetar e imprimir todas as peças em folha de madeira compensada

Baixe a peça e o projeto do robô no AutoCAD e imprima na folha de compensado de 12 mm e o acabamento e a parte do projeto. Se alguém precisar do arquivo cad, por favor, deixe o comentário na caixa de seção de comentários que enviarei diretamente.

Etapa 6: Montagem

conjunto
conjunto
conjunto
conjunto

reúna toda a parte e organize na seqüência na imagem que é dada e siga o diagrama da imagem.

Etapa 7: definir as configurações de GBRL

Configuração que provou funcionar em nossos robôs.

$ 0 = 10 (pulso de etapa, usec) $ 1 = 255 (atraso de etapa inativa, mseg) $ 2 = 7 (máscara de inversão de porta de etapa: 00000111) $ 3 = 7 (máscara de inversão de porta dir: 00000111) $ 4 = 0 (etapa de ativação de inversão, bool) $ 5 = 0 (pino de limite invertido, bool) $ 6 = 1 (pino da sonda invertido, bool) $ 10 = 3 (máscara de relatório de status: 00000011) $ 11 = 0,020 (desvio de junção, mm) $ 12 = 0,002 (tolerância de arco, mm) $ 13 = 0 (polegadas de relatório, bool) $ 20 = 0 (limites flexíveis, bool) $ 21 = 0 (limites rígidos, bool) $ 22 = 1 (ciclo de homing, bool) $ 23 = 0 (máscara de inversão de dir homing: 00000000) $ 24 = 100.000 (homing feed, mm / min) $ 25 = 500.000 (homing search, mm / min) $ 26 = 250 (homing debounce, mseg) $ 27 = 1.000 (homing pull-off, mm) $ 100 = 250.000 (x, passo / mm) $ 101 = 250.000 (y, step / mm) $ 102 = 250.000 (z, step / mm) $ 110 = 500.000 (x taxa max, mm / min) $ 111 = 500.000 (y max rate, mm / min) $ 112 = 500.000 (z max rate, mm / min) $ 120 = 10.000 (x aceler, mm / s ^ 2) $ 121 = 10.000 (y aceler, mm / s ^ 2) $ 122 = 10.000 (z aceler, mm / s ^ 2) $ 130 = 200.000 (x curso máximo, mm) $ 131 = 200.000 (curso máximo de y, mm) $ 132 = 200.000 (curso máximo de z, mm)

Etapa 8: faça upload do código final e verifique o resultado virtual no painel do software Arduino Uno

// Unidades: CM

float b_height = 0;

float a1 = 92;

float a2 = 86;

float snude_len = 20;

boolean doZ = false;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

flutuar por = 60; // = 0;

float bz = 60; // = 25;

float x = 60;

float y = 60;

float z = 60;

float q;

float c;

float V1;

float V2;

float V3;

float V4;

float V5;

void setup () {

tamanho (700, 700, P3D);

cam = novo PeasyCam (este, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

void draw () {

// ligninger:

y = (mouseX - largura / 2) * (- 1);

x = (mouseY - altura / 2) * (- 1);

bz = z;

por = y;

bx = x;

float y3 = sqrt (bx * bx + por * por);

c = sqrt (y3 * y3 + bz * bz);

V1 = acos ((a2 * a2 + a1 * a1-c * c) / (2 * a2 * a1));

V2 = acos ((c * c + a1 * a1-a2 * a2) / (2 * c * a1));

V3 = acos ((y3 * y3 + c * c-bz * bz) / (2 * y3 * c));

q = V2 + V3;

arm1_angle = q;

V4 = radianos (90,0) - q;

V5 = radianos (180) - V4 - radianos (90);

arm2_angle = radianos (180,0) - (V5 + V1);

ângulo_base = graus (atan2 (bx, por));

arm1_angle = graus (arm1_angle);

arm2_angle = graus (arm2_angle);

// println (por, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle = 23;

arm2_angle = 23;

*/

// interativo:

// if (doZ)

//

// {

// base_angle = base_angle + mouseX-pmouseX;

// } outro

// {

// arm1_angle = arm1_angle + pmouseX-mouseX;

// }

//

// arm2_angle = arm2_angle + mouseY-pmouseY;

draw_robot (base_angle, - (arm1_angle-90), arm2_angle + 90 - (- (arm1_angle-90)));

// println (base_angle + "," + arm1_angle + "," + arm2_angle);

}

void draw_robot (float base_angle, float arm1_angle, float arm2_angle)

{

rotateX (1,2);

rotateZ (-1,2);

fundo (0);

luzes ();

pushMatrix ();

// BASE

encher (150, 150, 150);

box_corner (50, 50, b_height, 0);

rotate (radianos (base_angle), 0, 0, 1);

// ARM 1

encher (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

preencher (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

preencher (255, 150, 0);

box_corner (10, 10, snude_len, -arm1_angle-arm2_angle + 90);

popMatrix ();

pushMatrix ();

float action_box_size = 100;

traduzir (0, -action_box_size / 2, action_box_size / 2 + b_height);

pushMatrix ();

translate (x, action_box_size- y-action_box_size / 2, z-action_box_size / 2);

preencher (255, 255, 0);

caixa (20);

popMatrix ();

preencher (255, 255, 255, 50);

box (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

void box_corner (float w, float h, float d, float girar)

{

girar (radianos (girar), 1, 0, 0);

traduzir (0, 0, d / 2);

caixa (w, h, d);

traduzir (0, 0, d / 2);

}

void keyPressed ()

{

if (chave == 'z')

{

doZ =! doZ;

}

if (chave == 'h')

{

// definir tudo para zero

arm2_angle = 0;

arm1_angle = 90;

ângulo_base = 0;

}

if (chave == 'g')

{

println (graus (V1));

println (graus (V5));

}

if (keyCode == UP)

{

z ++;

}

if (keyCode == DOWN)

{

z -;

}

if (chave == 'o')

{

y = 50;

z = 50;

println (q);

println (c, "c");

println (V1, "V1");

println (V2);

println (V3);

println (arm1_angle);

println (V4);

println (V5);

println (arm2_angle);

}

}

Recomendado: