สารบัญ:

หุ่นยนต์หยิบและวาง Arduino Base: 8 ขั้นตอน
หุ่นยนต์หยิบและวาง Arduino Base: 8 ขั้นตอน

วีดีโอ: หุ่นยนต์หยิบและวาง Arduino Base: 8 ขั้นตอน

วีดีโอ: หุ่นยนต์หยิบและวาง Arduino Base: 8 ขั้นตอน
วีดีโอ: สอนหุ่นยนต์ ATX2+ Online บทที่ 2 พื้นฐานโปรแกรม Arduino โดย ศูนย์หุ่นยนต์ Ubon TP Robotics by ครูชัย 2024, พฤศจิกายน
Anonim
หุ่นยนต์หยิบและวางฐาน Arduino
หุ่นยนต์หยิบและวางฐาน Arduino
หุ่นยนต์หยิบและวางฐาน Arduino
หุ่นยนต์หยิบและวางฐาน Arduino
หุ่นยนต์หยิบและวางฐาน Arduino
หุ่นยนต์หยิบและวางฐาน Arduino

ฉันได้สร้างแขนหุ่นยนต์อุตสาหกรรมราคาถูกมาก (น้อยกว่า 1,000 ดอลลาร์) เพื่อให้นักเรียนสามารถแฮ็กหุ่นยนต์ขนาดใหญ่ขึ้น และเพื่อให้การผลิตในท้องถิ่นขนาดเล็กสามารถใช้หุ่นยนต์ในกระบวนการได้โดยไม่ทำลายธนาคาร ง่ายต่อการสร้างและทำให้คนกลุ่มอายุ 15 ถึง 50 ปี

ขั้นตอนที่ 1: ข้อกำหนดส่วนประกอบ

ข้อกำหนดส่วนประกอบ
ข้อกำหนดส่วนประกอบ
ข้อกำหนดส่วนประกอบ
ข้อกำหนดส่วนประกอบ
ข้อกำหนดส่วนประกอบ
ข้อกำหนดส่วนประกอบ
ข้อกำหนดส่วนประกอบ
ข้อกำหนดส่วนประกอบ

1. Arduino+ Shield + Pins + Cables

2. ตัวควบคุมมอเตอร์: dm860A (อีเบย์)

3. สเต็ปเปอร์มอเตอร์: 34hs5435c-37b2 (อีเบย์)

4. น็อต M8x45+60+70 และ น็อต M8

5. ไม้อัด 12 มม.

6. ไนลอน 5 มม.

7. แหวนรอง 8mm.

8. สกรูไม้ 4.5x40mm.

9. M3 เคาน์เตอร์จม

10. แหล่งจ่ายไฟ 12v

11. ไดรเวอร์เซอร์โวมอเตอร์ Arduino

ขั้นตอนที่ 2: ดาวน์โหลด Gui

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

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

ขั้นตอนที่ 3: การเชื่อมต่อ

การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ

เชื่อมต่อสายไฟที่ให้ไว้ในภาพจะเข้าใจคุณมากขึ้น

เราจำเป็นต้องเชื่อมต่อไดรเวอร์มอเตอร์กับ Arduino และตัวเชื่อมต่ออื่น ๆ ที่จำเป็นสำหรับหุ่นยนต์ของคุณ

ขั้นตอนที่ 4: อัปโหลดเฟิร์มแวร์และตรวจสอบผลลัพธ์โค้ดใน Arduino Dashboard

การติดตั้งเฟิร์มแวร์บน 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 Ynnnn 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

รหัส uoload ใน ardunio

นำเข้า java.awt.event. KeyEvent;

นำเข้า javax.swing. JOptionPane;

นำเข้าการประมวลผล.ซีเรียล.*;

พอร์ตอนุกรม = null;

// เลือกและแก้ไขบรรทัดที่เหมาะสมสำหรับระบบปฏิบัติการของคุณ

// ปล่อยให้เป็นโมฆะเพื่อใช้พอร์ตโต้ตอบ (กด 'p' ในโปรแกรม)

ชื่อพอร์ตสตริง = null;

//ชื่อพอร์ตสตริง = Serial.list()[0]; // Mac OS X

//ชื่อพอร์ตสตริง = "/dev/ttyUSB0"; // Linux

//ชื่อพอร์ตสตริง = "COM6"; // วินโดว์

สตรีมมิ่งบูลีน = เท็จ;

ความเร็วลอย = 0.001;

สตริง gcode;

int ผม = 0;

เป็นโมฆะ openSerialPort()

{

ถ้า (ชื่อพอร์ต == null) ส่งคืน;

ถ้า (พอร์ต != null) port.stop();

พอร์ต = ซีเรียลใหม่ (นี่, ชื่อพอร์ต, 115200);

port.bufferUntil('\n');

}

เป็นโมฆะ selectSerialPort()

{

ผลลัพธ์สตริง = (สตริง) JOptionPane.showInputDialog (นี่

"เลือกพอร์ตอนุกรมที่สอดคล้องกับบอร์ด Arduino ของคุณ", "เลือกพอร์ตอนุกรม", JOptionPane. PLAIN_MESSAGE, โมฆะ, Serial.list(), 0);

ถ้า (ผลลัพธ์ != null) {

ชื่อพอร์ต = ผลลัพธ์;

openSerialPort();

}

}

การตั้งค่าเป็นโมฆะ ()

{

ขนาด(500, 250);

openSerialPort();

}

ถือเป็นโมฆะวาด ()

{

พื้นหลัง(0);

กรอก (255);

int y = 24, dy = 12;

text("คำแนะนำ", 12, y); y += dy;

text("p: เลือกพอร์ตอนุกรม", 12, y); y += dy;

text("1: ตั้งค่าความเร็วเป็น 0.001 นิ้ว (1 ล้าน) ต่อการเขย่าเบา ๆ", 12, y); y += dy;

text("2: ตั้งค่าความเร็วเป็น 0.010 นิ้ว (10 ล้าน) ต่อการเขย่าเบา ๆ", 12, y); y += dy;

text("3: ตั้งค่าความเร็วเป็น 0.100 นิ้ว (100 ล้าน) ต่อการเขย่าเบา ๆ", 12, y); y += dy;

text("ปุ่มลูกศร: เขย่าเบา ๆ ในระนาบ x-y", 12, y); y += dy;

text("เลื่อนหน้าขึ้น & เลื่อนหน้าลง: เขย่าเบา ๆ ในแกน z", 12, y); y += dy;

text("$: แสดงการตั้งค่า grbl", 12, y); y+= dy;

text("h: กลับบ้าน", 12, y); y += dy;

text("0: เครื่องศูนย์ (ตั้งค่าโฮมเป็นตำแหน่งปัจจุบัน)", 12, y); y += dy;

text("g: สตรีมไฟล์ g-code", 12, y); y += dy;

text("x: หยุดการสตรีม g-code (นี่ไม่ใช่ในทันที)", 12, y); y += dy;

y = ความสูง - dy;

text("ความเร็วในการเขย่าเบา ๆ ในปัจจุบัน: " + ความเร็ว + " นิ้วต่อขั้น", 12, y); y -= dy;

text("พอร์ตอนุกรมปัจจุบัน:" + ชื่อพอร์ต, 12, y); y -= dy;

}

ถือเป็นโมฆะ keyPressed()

{

ถ้า (คีย์ == '1') ความเร็ว = 0.001;

ถ้า (คีย์ == '2') ความเร็ว = 0.01;

ถ้า (คีย์ == '3') ความเร็ว = 0.1;

ถ้า (!สตรีมมิ่ง) {

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

ถ้า (รหัสคีย์ == ขวา) 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");

ถ้า (รหัสคีย์ == ลง) 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 (คีย์ == 'h') port.write ("G90\nG20\nG00 X0.000 Y0.000 Z0.000\n");

if (คีย์ == 'v') port.write("$0=75\n$1=74\n$2=75\n");

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

if (คีย์ == 's') port.write("$3=10\n");

if (คีย์ == 'e') port.write("$16=1\n");

ถ้า (คีย์ == 'd') port.write("$16=0\n");

ถ้า (คีย์ == '0') openSerialPort();

ถ้า (คีย์ == 'p') selectSerialPort();

if (คีย์ == '$') port.write("$$\n");

if (คีย์ == 'h') port.write("$H\n");

}

if (!streaming && คีย์ == 'g') {

gcode = null; ผม = 0;

ไฟล์ไฟล์ = null;

println("กำลังโหลดไฟล์…");

selectInput("เลือกไฟล์ที่จะประมวลผล:", "fileSelected", ไฟล์);

}

ถ้า (คีย์ == 'x') สตรีมมิ่ง = false;

}

เป็นโมฆะ fileSelected (การเลือกไฟล์) {

ถ้า (การเลือก == null) {

println("หน้าต่างถูกปิดหรือผู้ใช้กดยกเลิก");

} อื่น {

println("ผู้ใช้เลือก" + selection.getAbsolutePath());

gcode = loadStrings(selection.getAbsolutePath());

ถ้า (gcode == null) ส่งคืน;

สตรีมมิ่ง = จริง;

ลำธาร();

}

}

กระแสเป็นโมฆะ ()

{

ถ้า (!streaming) กลับมา;

ในขณะที่ (จริง) {

ถ้า (i == gcode.length) {

สตรีมมิ่ง = เท็จ;

กลับ;

}

ถ้า (gcode.trim().length() == 0) i++;

อย่างอื่นแตก;

}

println(gcode);

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

ผม++;

}

เป็นโมฆะ serialEvent(Serial p)

{

สตริง s = p.readStringUntil('\n');

println(s.trim());

ถ้า (s.trim().startsWith("ok")) stream();

ถ้า (s.trim().startsWith("error")) stream(); // XXX: จริงเหรอ?

}

ขั้นตอนที่ 5: ออกแบบและพิมพ์ชิ้นส่วนทั้งหมดในแผ่นไม้อัด

ออกแบบและพิมพ์ชิ้นส่วนทั้งหมดในแผ่นไม้อัด
ออกแบบและพิมพ์ชิ้นส่วนทั้งหมดในแผ่นไม้อัด

ดาวน์โหลดชิ้นส่วนหุ่นยนต์และการออกแบบใน AutoCAD แล้วพิมพ์ลงบนแผ่นไม้อัดขนาด 12 มม. และส่วนการตกแต่งและการออกแบบ หากใครต้องการไฟล์ cad โปรดแสดงความคิดเห็นในช่องส่วนความคิดเห็น ฉันจะ `คุณส่งโดยตรง

ขั้นตอนที่ 6: การประกอบ

การประกอบ
การประกอบ
การประกอบ
การประกอบ

รวบรวมชิ้นส่วนทั้งหมดและจัดเรียงตามลำดับบนภาพที่ได้รับและทำตามแผนภาพภาพ

ขั้นตอนที่ 7: ตั้งค่าการตั้งค่า GBRL

การตั้งค่าที่พิสูจน์แล้วว่าทำงานกับหุ่นยนต์ของเราได้

$0=10 (step pulse, usec) $1=255 (step idle delay, msec) $2=7 (step port invert mask:00000111) $3=7 (dir port invert mask:00000111) $4=0 (ขั้นตอนเปิดใช้งาน invert, bool) $5=0 (จำกัดการสลับพิน, บูล) $6=1 (กลับหัวโพรบพิน, บูล) $10=3 (รูปแบบรายงานสถานะ:00000011) $11=0.020 (เบี่ยงเบนทางแยก, มม.) $12=0.002 (ความทนทานต่อส่วนโค้ง, มม.) $13 =0 (รายงานนิ้ว, บูล) $20=0 (ขีดจำกัดแบบซอฟต์, บูล) $21=0 (ขีดจำกัดแบบฮาร์ด, บูล) $22=1 (รอบกลับบ้าน, บูล) $23=0 (homing dir invert mask:00000000) $24=100.000 (homing feed, mm/min) $25=500.000 (homing find, mm/min) $26=250 (homing debounce, 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 อัตราสูงสุด mm/min) $111=500.000 (y อัตราสูงสุด mm/min) $112=500.000 (z อัตราสูงสุด, mm/min) $120=10,000 (x 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), mm) $131=200.000 (y max travel, mm) $132=200.000 (z max travel, mm)

ขั้นตอนที่ 8: อัปโหลดรหัสสุดท้ายและตรวจสอบผลลัพธ์เสมือนใน Arduino Uno Software Dashboard

// หน่วย: CM

ลอย b_height = 0;

ลอย a1 = 92;

ลอย a2 = 86;

ลอย snude_len = 20;

บูลีน doZ = เท็จ;

ฐานลอย;// = 0;

ลอย arm1_angle; // = 0;

ลอยแขน2_angle; //= 0;

float bx = 60;// = 25;

ลอยตัว = 60;// = 0;

float bz = 60;// = 25;

ลอย x = 60;

ลอย y = 60;

ลอย z = 60;

ลอย q;

ลอยค;

ลอย V1;

ลอย V2;

ลอย V3;

ลอย V4;

ลอย V5;

การตั้งค่าเป็นโมฆะ () {

ขนาด (700, 700, P3D);

cam = PeasyCam ใหม่ (นี่ 300);

กล้อง.setMinimumDistance(50);

cam.setMaximumDistance(500);

}

โมฆะวาด () {

//ลินนิ่งเกอร์:

y = (mouseX - ความกว้าง/2)*(-1);

x = (เมาส์Y - ความสูง/2)*(-1);

bz = z;

โดย = 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=degrees(arm1_angle);

arm2_angle=degrees(arm2_angle);

//println(โดย, 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 (float base_angle, float arm1_angle, float arm2_angle)

{

หมุนX(1.2);

หมุนZ(-1.2);

พื้นหลัง(0);

ไฟ ();

pushMatrix();

// ฐาน

เติม(150, 150, 150);

box_corner(50, 50, b_height, 0);

หมุน(เรเดียน(ฐาน_angle), 0, 0, 1);

// แขน 1

กรอก (150, 0, 150);

box_corner(10, 10, a1, arm1_angle);

// แขน 2

กรอก (255, 0, 0);

box_corner(10, 10, a2, arm2_angle);

// สนู้ด

กรอก (255, 150, 0);

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

popMatrix();

pushMatrix();

ลอย 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();

}

เป็นโมฆะ box_corner (ลอย w, ลอย h, ทุ่น d, ลอยหมุน)

{

หมุน(เรเดียน(หมุน), 1, 0, 0);

แปล(0, 0, d/2);

กล่อง(w, h, d);

แปล(0, 0, d/2);

}

ถือเป็นโมฆะ keyPressed()

{

ถ้า (คีย์ == 'z')

{

doZ = !doZ;

}

ถ้า (คีย์ == 'h')

{

// ตั้งค่าทั้งหมดเป็นศูนย์

arm2_angle = 0;

arm1_angle = 90;

base_angle = 0;

}

ถ้า (คีย์ == 'g')

{

println(องศา(V1));

println(องศา(V5));

}

ถ้า (keyCode == ขึ้น)

{

z ++;

}

ถ้า (keyCode == ลง)

{

ซ --;

}

ถ้า (คีย์ == 'o')

{

y = 50;

z = 50;

println(q);

println(c, "c");

println(V1, "V1");

พิมพ์ (V2);

พิมพ์ (V3);

พิมพ์ (arm1_angle);

พิมพ์ (V4);

พิมพ์ (V5);

println(arm2_angle);

}

}

แนะนำ: