Мазмуну:

Ардуино базасын тандоо жана жайгаштыруу роботу: 8 кадам
Ардуино базасын тандоо жана жайгаштыруу роботу: 8 кадам

Video: Ардуино базасын тандоо жана жайгаштыруу роботу: 8 кадам

Video: Ардуино базасын тандоо жана жайгаштыруу роботу: 8 кадам
Video: Code Typhon Studio / Обзор / Преимущества, особенности / Установка, удаление / Object Pascal IDE 2024, Июль
Anonim
Arduino Base Pick and Place роботу
Arduino Base Pick and Place роботу
Arduino Base Pick and Place роботу
Arduino Base Pick and Place роботу
Arduino Base Pick and Place роботу
Arduino Base Pick and Place роботу

Мен студенттерге ири масштабдагы робототехниканы бузууга жана кичинекей жергиликтүү өндүрүштөргө роботторду банкты бузбастан колдонууга мүмкүнчүлүк берүү үчүн супер арзан (1000 доллардан аз) өндүрүштүк робот колун жасадым. Бул 15 жаштан 50 жашка чейинки курактагы адамдарды куруу жана жасоо оңой.

1 -кадам: Компоненттердин талабы

Компоненттердин талабы
Компоненттердин талабы
Компоненттердин талабы
Компоненттердин талабы
Компоненттердин талабы
Компоненттердин талабы
Компоненттердин талабы
Компоненттердин талабы

1. Arduino + Shield + Pins + Cables

2. Мотор контроллери: dm860A (Ebay)

3. Steppermotor: 34hs5435c-37b2 (Ebay)

4. M8x45+60+70 болт жана M8 болт.

5. 12 мм фанера.

6. 5 мм нейлон.

7. Сокур кир жуугучтар 8мм.

8. Жыгач бурамалары 4.5x40мм.

9. M3 Counter чөгүп кетти, 10. 12в электр менен камсыздоо

11. servo мотор айдоочусу arduino

2 -кадам: Gui жүктөп алыңыз

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

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

3 -кадам: Туташуу

Байланыш
Байланыш
Байланыш
Байланыш
Байланыш
Байланыш

Сүрөттө берилген зымдарды туташтыруу сиз үчүн чоң түшүнүк.

Биз мотор драйверин Arduino жана башка роботторго ылайыктуу болгон башка туташтыргычтарга туташтырышыбыз керек.

4 -кадам: Камтылган программаны жүктөп, Arduino тактасындагы коддун жыйынтыгын текшериңиз

Камтылган программаны Arduinoго орнотуу - GRBL:

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

Эскертүү: Arduinoдо компиляциялоодо чыр чыгып кетиши мүмкүн. Башка бардык китепканаларды китепкана папкаңыздан алып салыңыз (../documents/Arduino/libraries).

Камтылган программаны орнотуу

Жаңы иштетүү убактысын күйгүзүңүз. Сериялык туташууну колдонуңуз жана жазыңыз:

$1=255

Хостингди коюу:

$22=1

Сериалды baudго коюуну унутпаңыз: 115200

Пайдалуу G-коддору

Робот үчүн нөл чекитти коюңуз:

G10 L2 Xnnn Ynnn Znnn

Нөл чекитин колдонуңуз:

G54

Роботтун борборуна типтүү инициализация:

G10 L2 X1.5 Y1.2 Z1.1

G54

Роботту тез ордунан жылдырыңыз:

G0 Xnnn Ynnn Znnn

Мисал:

G0 X10.0 Y3.1 Z4.2 (кайтаруу)

Белгилүү ылдамдыкта роботту позицияга жылдырыңыз:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (кайтаруу)

F 10 ортосунда болушу керек (slooooow) жана 600 (тез)

X, Y жана Z үчүн демейки бирдиктер

Демейки кадам/бирдик орнотууларын колдонууда (250 кадам/бирдик) GRBL жана

800 кадам/ревер үчүн орнотулган тепкичтүү диск бардык огу үчүн колдонулат:

+- 32 бирдик = +- 180 градус

Кодду иштетүү мисалы:

Бул код Arduino GRBL менен түз байланыша алат.

github.com/damellis/gctrl

Сериалды baudго коюуну унутпаңыз: 115200

Code uoload in arunio

java.awt.event. KeyEvent импорттоо;

javax.swing. JOptionPane импорттоо;

импортту иштетүү.сериал.*;

Сериялык порт = null;

// операциялык системаңызга ылайыктуу линияны тандаңыз жана өзгөртүңүз

// интерактивдүү портту колдонуу үчүн нөл катары калтырыңыз (программада 'p' баскычын басыңыз)

String portname = null;

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

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

// String portname = "COM6"; // Windows

логикалык агым = жалган;

сүзүү ылдамдыгы = 0,001;

String gcode;

int i = 0;

жараксыз openSerialPort ()

{

if (portname == null) return;

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

порт = жаңы серия (бул, порт аталышы, 115200);

port.bufferUntil ('\ n');

}

жараксыз SelectSerialPort ()

{

String жыйынтыгы = (String) JOptionPane.showInputDialog (бул, "Arduino тактаңызга туура келген сериялык портту тандаңыз.", "Сериялык портту тандоо", JOptionPane. PLAIN_MESSAGE, нөл, Serial.list (), 0);

if (result! = null) {

portname = натыйжа;

openSerialPort ();

}

}

жараксыз орнотуу ()

{

өлчөмү (500, 250);

openSerialPort ();

}

жараксыз тартуу ()

{

background (0);

толтуруу (255);

int y = 24, dy = 12;

текст ("КӨРСӨТМӨЛӨР", 12, у); y += dy;

текст ("p: serial series", 12, y); y += dy;

текст ("1: ылдамдыкты 0,001 дюймга (1 мил) чуркоо үчүн коюу", 12, у); y += dy;

текст ("2: ылдамдыкты 0,010 дюймга (10 мил) коюңуз", 12, у); y += dy;

текст ("3: ылдамдыкты 0.100 дюймга (100 мил) чуркоо үчүн коюу", 12, у); y += dy;

текст ("жебе баскычтары: x-y тегиздигинде чуркоо", 12, у); y += dy;

текст ("бет өйдө жана бет ылдый: z огунда чуркоо", 12, у); y += dy;

текст ("$: display grbl settings", 12, y); y+= dy;

текст ("ч: үйгө кет", 12, у); y += dy;

текст ("0: нөл машина (үйдү учурдагы жерге коюу)", 12, у); y += dy;

текст ("g: stream a g-code file", 12, y); y += dy;

текст ("x: g-коддун агымын токтотуу (бул дароо эмес)", 12, y); y += dy;

y = бийиктиги - dy;

текст ("учурдагы чуркоо ылдамдыгы:" + ылдамдык "" кадамга дюйм ", 12, у); y -= dy;

текст ("учурдагы сериялык порт:" + порт аты, 12, у); y -= dy;

}

void keyPressed ()

{

if (key == '1') speed = 0.001;

if (key == '2') speed = 0.01;

if (key == '3') speed = 0.1;

if (! агылып) {

if (keyCode == LEFT) port.write ("G91 / nG20 / nG00 X-" + ылдамдыгы + "Y0.000 Z0.000 / n");

if (keyCode == RIGHT) port.write ("G91 / nG20 / nG00 X" + ылдамдыгы + "Y0.000 Z0.000 / n");

if (keyCode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + ылдамдыгы + "Z0.000 / n");

if (keyCode == DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y-" + ылдамдыгы + "Z0.000 / n");

if (keyCode == KeyEvent. VK_PAGE_UP) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z" + ылдамдыгы + "\ n");

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + ылдамдыгы + "\ 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 (! агым && key == 'g') {

gcode = null; i = 0;

Файл файлы = null;

println ("Файл жүктөлүүдө…");

selectInput ("Иштетиле турган файлды тандаңыз:", "fileSelected", файл);

}

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

}

void fileSelected (Файлды тандоо) {

эгер (тандоо == нөл) {

println ("Терезе жабылган же колдонуучу жокко чыгарууну баскан.");

} башка {

println ("Колдонуучу тандалды" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return;

агым = чындык;

агым ();

}

}

бош агым ()

{

if (! streaming) return;

while (true) {

эгер (i == gcode.length) {

агым = жалган;

кайтуу;

}

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

башка сындыруу;

}

println (gcode );

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

i ++;

}

жараксыз serialEvent (Сериялык б)

{

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

println (s.trim ());

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

if (s.trim (). beginWith ("error")) stream (); // ХХХ: чын эле?

}

5 -кадам: Дизайн жана бардык бөлүгүн фанер баракчасына басып чыгаруу

Дизайн жана бардык бөлүгүн фанер баракчасына басып чыгаруу
Дизайн жана бардык бөлүгүн фанер баракчасына басып чыгаруу

Роботтун бөлүгүн жана дизайнын AutoCADга жүктөп алып, 12 мм фанера баракчасына жана финиш жана дизайн бөлүгүн басып чыгарыңыз. Эгерде кимдир бирөөгө кад файлы керек болсо, комментарийди комментарийлер бөлүмүнө калтырыңыз, мен сизди түз жөнөтөм.

6 -кадам: Ассамблея

Ассамблея
Ассамблея
Ассамблея
Ассамблея

бардык бөлүктү чогултуп, берилген сүрөттүн ырааттуулугун ирээтке келтирип, сүрөт диаграммасын аткарыңыз.

7 -кадам: Орнотуу GBRL Орнотуулар

Бул роботторубузда иштээри далилденди.

$ 0 = 10 (кадамдын импульсу, usec) $ 1 = 255 (кадамдын боштугунан кечигүү, msec) $ 2 = 7 (кадамдык портту инверттөө маскасы: 00000111) $ 3 = 7 (dir port invert mask: 00000111) $ 4 = 0 (step invert, bool $ 5 = 0 (чектөө казыктары инверттөө, бол) $ 6 = 1 (илгичтүү пин инверттөө, бол) $ 10 = 3 (статус отчетунун маскасы: 00000011) $ 11 = 0,020 (кошулуу четтөөсү, мм) $ 12 = 0,002 (жаа толеранттуулугу, мм) $ 13 = 0 (отчет дюйм, бол) $ 20 = 0 (жумшак чектер, бол) $ 21 = 0 (катуу чектер, бол) $ 22 = 1 (homing цикли, бол) $ 23 = 0 (homing dir invert маскасы: 00000000) $ 24 = 100.000 (homing feed, mm/min) $ 25 = 500.000 (homing search, mm/min) $ 26 = 250 (homing debounce, msec) $ 27 = 1.000 (homing pull-off, mm) $ 100 = 250.000 (x, step/mm) $ 101 = 250.000 (ж, кадам/мм) $ 102 = 250.000 (z, кадам/мм) $ 110 = 500.000 (х максималдуу ылдамдык, мм/мүн) $ 111 = 500.000 (ж максималдуу ылдамдык, мм/мүн) $ 112 = 500.000 (z максималдуу чен, мм/мүн) $ 120 = 10.000 (х accel, mm/sec^2) $ 121 = 10.000 (y accel, mm/sec^2) $ 122 = 10.000 (z accel, mm/sec^2) $ 130 = 200.000 (x max travel, мм) $ 131 = 200.000 (y макс саякат, мм) $ 132 = 200.000 (z max саякат, мм)

8 -кадам: Акыркы кодду жүктөп, Arduino Uno программалык камсыздоо панелиндеги виртуалдык жыйынтыкты текшериңиз

// Бирдиктер: CM

float b_height = 0;

float a1 = 92;

float a2 = 86;

float snude_len = 20;

логикалык doZ = жалган;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

float by = 60; // = 0;

float bz = 60; // = 25;

float x = 60;

float y = 60;

float z = 60;

сүзүү q;

сүзүү c;

float V1;

калкыма V2;

float V3;

калкып V4;

калкып V5;

жараксыз орнотуу () {

өлчөмү (700, 700, P3D);

cam = жаңы PeasyCam (бул, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

жараксыз тартуу () {

// лигингер:

y = (mouseX - туурасы/2)*(- 1);

x = (mouseY - бийиктик/2)*(- 1);

bz = z;

by = 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 = радиандар (90,0) - q;

V5 = радиандар (180) - V4 - радиандар (90);

arm2_angle = радиандар (180.0) - (V5 + V1);

base_angle = градус (atan2 (bx, by));

arm1_angle = градус (arm1_angle);

arm2_angle = градус (arm2_angle);

// println (by, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle = 23;

arm2_angle = 23;

*/

// интерактивдүү:

// эгер (doZ)

//

// {

// base_angle = base_angle+ mouseX-pmouseX;

//} башка

// {

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

}

жараксыз draw_robot (калкып жүрүүчү базалык

{

rotateX (1.2);

rotateZ (-1.2);

background (0);

жарыктар ();

pushMatrix ();

// БАЗА

толтуруу (150, 150, 150);

box_corner (50, 50, b_height, 0);

айлануу (радиандар (base_angle), 0, 0, 1);

// ARM 1

толтуруу (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

толтуруу (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

толтуруу (255, 150, 0);

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

popMatrix ();

pushMatrix ();

float action_box_size = 100;

которуу (0, -action_box_size/2, action_box_size/2+b_height);

pushMatrix ();

которуу (x, action_box_size- y-action_box_size/2, z-action_box_size/2);

толтуруу (255, 255, 0);

кутуча (20);

popMatrix ();

толтуруу (255, 255, 255, 50);

кутуча (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

void box_corner (wat w, float h, float d, float rotate)

{

айлануу (радиандар (айлануу), 1, 0, 0);

которуу (0, 0, d/2);

кутуча (ж, ч, г);

которуу (0, 0, d/2);

}

void keyPressed ()

{

эгер (ачкыч == 'z')

{

doZ =! doZ;

}

эгер (ачкыч == 'ч')

{

// баарын нөлгө коюңуз

arm2_angle = 0;

arm1_angle = 90;

base_angle = 0;

}

эгер (ачкыч == 'g')

{

println (даражалар (V1));

println (даражалар (V5));

}

эгер (keyCode == UP)

{

z ++;

}

эгер (keyCode == ТӨМӨН)

{

z -;

}

эгер (ачкыч == '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);

}

}

Сунушталууда: