สารบัญ:
- ขั้นตอนที่ 1: ข้อกำหนดส่วนประกอบ
- ขั้นตอนที่ 2: ดาวน์โหลด Gui
- ขั้นตอนที่ 3: การเชื่อมต่อ
- ขั้นตอนที่ 4: อัปโหลดเฟิร์มแวร์และตรวจสอบผลลัพธ์โค้ดใน Arduino Dashboard
- ขั้นตอนที่ 5: ออกแบบและพิมพ์ชิ้นส่วนทั้งหมดในแผ่นไม้อัด
- ขั้นตอนที่ 6: การประกอบ
- ขั้นตอนที่ 7: ตั้งค่าการตั้งค่า GBRL
- ขั้นตอนที่ 8: อัปโหลดรหัสสุดท้ายและตรวจสอบผลลัพธ์เสมือนใน Arduino Uno Software Dashboard
วีดีโอ: หุ่นยนต์หยิบและวาง Arduino Base: 8 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
ฉันได้สร้างแขนหุ่นยนต์อุตสาหกรรมราคาถูกมาก (น้อยกว่า 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);
}
}
แนะนำ:
DIY "PC Usage Meter ROG Base" โดยใช้ Arduino และ Python: 5 ขั้นตอน (พร้อมรูปภาพ)
DIY "เครื่องวัดการใช้งานพีซี ROG Base" โดยใช้ Arduino และ Python: ************************************* +ก่อนอื่น คำแนะนำนี้เขียนขึ้นโดยผู้ที่ไม่ใช่เจ้าของภาษาอังกฤษ…… ไม่ใช่ศาสตราจารย์ภาษาอังกฤษ ดังนั้นโปรดแจ้งข้อผิดพลาดทางไวยากรณ์ก่อนที่จะล้อเลียนฉัน:p +และโปรดอย่าเลียนแบบ
Mini Baffle Sur Base De Haut-parleurs De Télévision: 6 ขั้นตอน
Mini Baffle Sur Base De Haut-parleurs De Télévision: Ayant récupéré des haut-parleurs d'une vieille télé, j'ai décidé d'en faire des baffles เท une petite chaîne hi-fi. Vous verrez donc comment j'ai procédé, c'est plutôt simple, et vous pourrez aussi le faire à condition d'adapter le boîtier à vot
Luminaria En Base a Music: 4 ขั้นตอน
Luminaria En Base a เพลง: El proyecto nace de la investigación y ejecución de una luminaria, que sus colores funcionen a partir de la traducción de las frecuencias de la música en luces en formato RGB_Este amanece รายชื่อเพลงตามที่ได้รับ: ใช่
Arduino Base Auto Direction Robot: 8 ขั้นตอน (พร้อมรูปภาพ)
Arduino Base Auto Direction Robot: เป็นหุ่นยนต์ที่เคลื่อนที่โดยหลีกเลี่ยงสิ่งกีดขวาง มันตรวจจับวัตถุและดูรอบทิศทางและไปต่อในที่ที่มีพื้นที่ว่าง
Super Mario Bros ได้แรงบันดาลใจจาก Wii ด้วย USB Base: 5 ขั้นตอน (พร้อมรูปภาพ)
Super Mario Bros ได้แรงบันดาลใจจาก Wii ด้วยฐาน USB: ในคำแนะนำนี้ฉันจะแสดงให้คุณเห็นว่าฉันปรับแต่ง Wii ด้วยธีม Super Mario Bros ได้อย่างไร แต่ส่วนใหญ่จะเพิ่มที่ชาร์จและพอร์ต usb ลงในฐานและคอนโซลได้อย่างไร คำเตือน: ฉันไม่รับผิดชอบหากคุณทำเครื่อง Wii ของคุณพัง การรับประกันของคุณจะเป็นโมฆะหากคุณ