Sommario:

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

Video: Arduino Base Pick and Place Robot: 8 passaggi

Video: Arduino Base Pick and Place Robot: 8 passaggi
Video: Arduino pick and place robot | Pick and Place Robot using Arduino + Android App | Bluetooth Robot 2024, Novembre
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

Ho realizzato un braccio robotico industriale super economico (meno di 1000 dollari) per consentire agli studenti di hackerare la robotica su larga scala e per consentire alle piccole produzioni locali di utilizzare i robot nei loro processi senza spendere troppo. È facile da costruire e rendere le persone della fascia di età dai 15 ai 50 anni.

Passaggio 1: requisiti dei componenti

Requisiti dei componenti
Requisiti dei componenti
Requisiti dei componenti
Requisiti dei componenti
Requisiti dei componenti
Requisiti dei componenti
Requisiti dei componenti
Requisiti dei componenti

1. Arduino + Scudo + Pin + Cavi

2. Controllore motore: dm860A (Ebay)

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

4. Bulloni M8x45+60+70 e bulloni M8.

5. Compensato da 12 mm.

6. Nylon da 5 mm.

7. Rondelle cieche 8mm.

8. Viti per legno 4.5x40mm.

9. Contatore M3 affondato, 10. Alimentazione 12v

11. driver del servomotore arduino

Passaggio 2: Scarica Gui

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

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

Passaggio 3: connessione

Connessione
Connessione
Connessione
Connessione
Connessione
Connessione

Collegare i fili che sono indicati nell'immagine è una maggiore comprensione per te.

dobbiamo collegare il driver del motore ad Arduino e ad altri connettori richiesti dal tuo robot.

Passaggio 4: caricare il firmware e controllare il risultato del codice nella dashboard di Arduino

Installazione del firmware su Arduino - GRBL:

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

Nota: potresti riscontrare un conflitto durante la compilazione in Arduino. Rimuovi tutte le altre librerie dalla cartella della libreria (../documents/Arduino/libraries).

Configurazione del firmware

Imposta abilita su un timeout più recente. Usa una connessione seriale e scrivi:

$1=255

Imposta il riferimento:

$22=1

Ricorda di impostare seriale su baud: 115200

Codici G utili

Imposta il punto zero per il robot:

G10 L2 Xnnn Ynnn Znnn

Usa il punto zero:

G54

Inizializzazione tipica per centrare il robot:

G10 L2 X1.5 Y1.2 Z1.1

G54

Sposta rapidamente il robot in posizione:

G0 Xnnn Ynnn Znnn

Esempio:

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

Sposta il robot in posizione a una velocità specifica:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (ritorno)

F dovrebbe essere compreso tra 10 (slooooow) e 600 (veloce)

Unità predefinite per X, Y e Z

Quando si utilizzano le impostazioni di step/unità predefinite (250 step/unità) per GRBL e

azionamento passo-passo impostato per 800 passi/giro le seguenti unità si applicano a tutti gli assi:

+- 32 unità = +- 180 gradi

Esempio di codice di elaborazione:

Questo codice può comunicare direttamente con Arduino GRBL.

github.com/damellis/gctrl

Ricordati di impostare seriale su baud: 115200

Codice uoad in ardunio

import java.awt.event. KeyEvent;

import javax.swing. JOptionPane;

import processing.serial.*;

Porta seriale = nullo;

// seleziona e modifica la riga appropriata per il tuo sistema operativo

// lascia null per usare la porta interattiva (premi 'p' nel programma)

String nomeporta = null;

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

//Stringa nomeporta = "/dev/ttyUSB0"; // Linux

//Stringa nomeporta = "COM6"; // Finestre

flusso booleano = falso;

velocità galleggiante = 0.001;

String codice g;

int i = 0;

void openSerialPort()

{

if (portname == null) return;

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

port = new Serial(this, portname, 115200);

port.bufferUntil('\n');

}

void selectSerialPort()

{

Risultato stringa = (Stringa) JOptionPane.showInputDialog(this, "Seleziona la porta seriale che corrisponde alla tua scheda Arduino.", "Seleziona porta seriale", JOptionPane. PLAIN_MESSAGE, nullo, Serial.list(), 0);

if (risultato != nullo) {

nomeporta = risultato;

openSerialPort();

}

}

configurazione nulla()

{

dimensione (500, 250);

openSerialPort();

}

pareggio vuoto()

{

sfondo(0);

riempimento(255);

int y = 24, dy = 12;

text("ISTRUZIONI", 12, y); y += dy;

text("p: seleziona porta seriale", 12, y); y += dy;

text("1: imposta la velocità su 0.001 pollici (1 mil) per jog", 12, y); y += dy;

text("2: imposta la velocità su 0.010 pollici (10 mil) per jog", 12, y); y += dy;

text("3: imposta la velocità su 0,100 pollici (100 mil) per jog", 12, y); y += dy;

text("tasti freccia: jog nel piano x-y", 12, y); y += dy;

text("pagina su & pagina giù: jog nell'asse z", 12, y); y += dy;

text("$: visualizza le impostazioni di grbl", 12, y); y+= dy;

text("h: vai a casa", 12, y); y += dy;

text("0: zero macchina (imposta casa sulla posizione corrente)", 12, y); y += dy;

text("g: trasmetti in streaming un file g-code", 12, y); y += dy;

text("x: stop streaming g-code (questo NON è immediato)", 12, y); y += dy;

y = altezza - dy;

text("velocità corrente: " + velocità + " pollici per passo", 12, y); y -= dy;

text("porta seriale corrente: " + nomeporta, 12, y); y -= dy;

}

tasto voidPremuto()

{

if (tasto == '1') velocità = 0.001;

if (tasto == '2') velocità = 0,01;

if (tasto == '3') velocità = 0,1;

if (!streaming) {

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

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

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

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

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

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

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

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

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

if (chiave == 's') port.write("$3=10\n");

if (chiave == 'e') port.write("$16=1\n");

if (chiave == 'd') port.write("$16=0\n");

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

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

if (chiave == '$') port.write("$$\n");

if (chiave == 'h') port.write("$H\n");

}

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

gcode = nullo; io = 0;

File file = nullo;

println("Caricamento file…");

selectInput("Seleziona un file da elaborare:", "fileSelected", file);

}

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

}

void fileSelected(Selezione file) {

if (selezione == null) {

println("La finestra è stata chiusa o l'utente ha premuto Annulla.");

} altro {

println("Utente selezionato " + selection.getAbsolutePath());

gcode = loadStrings(selection.getAbsolutePath());

if (gcode == null) return;

streaming = vero;

flusso();

}

}

flusso vuoto()

{

if (!streaming) ritorna;

mentre (vero) {

if (i == gcode.length) {

streaming = falso;

Restituzione;

}

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

altrimenti rompere;

}

println(gcode);

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

io++;

}

void serialEvent(Serial p)

{

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

println(s.trim());

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

if (s.trim().startsWith("error")) stream(); //XXX: davvero?

}

Passaggio 5: progettare e stampare tutte le parti in un foglio di compensato

Progetta e stampa tutte le parti in compensato
Progetta e stampa tutte le parti in compensato

Scarica la parte del robot e progetta in AutoCAD e stampa sul foglio di compensato da 12 mm e rifinisci e progetta la parte. Se qualcuno ha bisogno di file cad, lascia il commento nella casella della sezione commenti che invierò direttamente.

Passaggio 6: assemblaggio

Assemblea
Assemblea
Assemblea
Assemblea

raccogliere tutta la parte e disporre nella sequenza sull'immagine che viene data e seguire il diagramma dell'immagine.

Passaggio 7: configurazione delle impostazioni GBRL

Impostazione che ha dimostrato di funzionare sui nostri robot.

$0=10 (passo impulso, usec) $1=255 (passo idle delay, msec) $2=7 (passo port invert mask:00000111) $3=7 (dir port invert mask:00000111) $4=0 (passo abilita inversione, bool) $5=0 (limite pin invert, bool) $6=1 (probe pin invert, bool) $10=3 (maschera rapporto stato:00000011) $11=0.020 (deviazione giunzione, mm) $12=0.002 (tolleranza arco, mm) $13 =0 (report pollici, bool) $20=0 (limiti soft, bool) $21=0 (limiti rigidi, bool) $22=1 (ciclo di homing, bool) $23=0 (homing dir invert mask:00000000) $24=100.000 (avanzamento homing, mm/min) $25=500.000 (ricerca homing, mm/min) $26=250 (homing antirimbalzo, msec) $27=1.000 (homing pull-off, mm) $100=250.000 (x, step/mm) $101= 250.000 (y, step/mm) $ 102=250.000 (z, step/mm) $110=500.000 (x velocità massima, mm/min) $ 111=500.000 (y velocità massima, mm/min) $112=500.000 (z velocità massima, mm/min) $120=10.000 (x accelerazione, mm/sec^2) $121=10.000 (y accelerazione, mm/sec^2) $122=10.000 (z accelerazione, mm/sec^2) $130=200.000 (x corsa massima, mm) $131=200.000 (y corsa massima, mm) $132=200.000 (z corsa massima, mm)

Passaggio 8: caricare il codice finale e controllare il risultato virtuale nella dashboard del software Arduino Uno

// Unità: CM

float b_height = 0;

galleggiante a1 = 92;

galleggiante a2 = 86;

float snude_len = 20;

booleano doZ = falso;

float base_angle;// = 0;

float arm1_angle; // = 0;

galleggiante arm2_angle; //= 0;

float bx = 60;// = 25;

float di = 60;// = 0;

float bz = 60;// = 25;

flottante x = 60;

flottante y = 60;

galleggiante z = 60;

galleggiante q;

galleggiante c;

galleggiante V1;

galleggiante V2;

galleggiante V3;

galleggiante V4;

galleggiante V5;

void setup() {

dimensione (700, 700, P3D);

cam = new PeasyCam (questo, 300);

cam.setMinimumDistance(50);

cam.setMaximumDistance(500);

}

disegno vuoto() {

//allineatore:

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

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

bz = z;

per = y;

bx = x;

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

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 = radianti(90,0) - q;

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

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

angolo_base = gradi(atan2(bx, per));

arm1_angle=gradi(arm1_angle);

arm2_angle=gradi(arm2_angle);

//println(di, bz);

//angolo_braccio1 = 90;

//arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle= 23;

arm2_angle=23;

*/

// interattivo:

// if (doZ)

//

// {

// angolo_base = angolo_base+ mouseX-pmouseX;

// } altro

// {

// 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)

{

ruotareX(1.2);

ruotareZ(-1.2);

sfondo(0);

luci();

pushMatrix();

// BASE

riempimento(150, 150, 150);

box_corner(50, 50, b_height, 0);

rotazione(radianti(angolo_base), 0, 0, 1);

// BRACCIO 1

riempimento(150, 0, 150);

box_corner(10, 10, a1, arm1_angle);

// BRACCIO 2

riempimento(255, 0, 0);

box_corner(10, 10, a2, arm2_angle);

// NUDO

riempimento(255, 150, 0);

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

popMatrix();

pushMatrix();

galleggiante action_box_size=100;

translate(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);

riempimento(255, 255, 0);

scatola(20);

popMatrix();

riempimento(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 ruota)

{

rotazione(radianti(ruota), 1, 0, 0);

tradurre(0, 0, d/2);

casella (w, h, d);

tradurre(0, 0, d/2);

}

tasto voidPremuto()

{

if (chiave == 'z')

{

doZ = !doZ;

}

if (chiave == 'h')

{

// imposta tutto a zero

arm2_angle = 0;

arm1_angle = 90;

angolo_base = 0;

}

if (tasto == 'g')

{

println(gradi(V1));

println(gradi(V5));

}

if (codice chiave == SU)

{

z++;

}

if (codice tasto == GI)

{

z--;

}

if (chiave == '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);

}

}

Consigliato: