İçindekiler:
- Adım 1: Bileşen Gereksinimi
- 2. Adım: Gui'yi İndirin
- 3. Adım: Bağlantı
- Adım 4: Ürün Yazılımını Yükleyin ve Arduino Dashboard'da Kod Sonucunu Kontrol Edin
- Adım 5: Tüm Parçaları Kontrplak Levhada Tasarlayın ve Yazdırın
- Adım 6: Montaj
- 7. Adım: GBRL Ayarlarını Kurun
- Adım 8: Son Kodu Yükleyin ve Arduino Uno Yazılım Panosundaki Sanal Sonucu Kontrol Edin
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Öğrencilerin daha büyük ölçekli robotikleri hacklemelerini sağlamak ve küçük yerel üretimlerin bankayı bozmadan süreçlerinde robotları kullanmalarını sağlamak için süper ucuz (1000 dolardan az) bir endüstriyel robot kolu yaptım. 15 ila 50 yaş arası insanları inşa etmek ve yapmak kolaydır.
Adım 1: Bileşen Gereksinimi
1. Arduino+ Shield + Pinler + Kablolar
2. Motor denetleyicisi: dm860A (Ebay)
3. Step motor: 34hs5435c-37b2 (Ebay)
4. M8x45+60+70 cıvatalar ve M8 cıvatalar.
5. 12mm Kontrplak.
6. 5mm Naylon.
7. Kör pullar 8mm.
8. Ahşap Vidalar 4.5x40mm.
9. M3 Sayaç battı, 10. 12v güç kaynağı
11. servo motor sürücüsü arduino
2. Adım: Gui'yi İndirin
zapmaker.org/projects/grbl-controller-3-0/
github.com/grbl/grbl/wiki/Using-Grbl
3. Adım: Bağlantı
Resimde verilen telleri bağlayarak daha iyi anlayacaksınız.
Motor sürücüsünü Arduino'ya ve robotunuza göre gerekli olan diğer konektörlere bağlamamız gerekiyor.
Adım 4: Ürün Yazılımını Yükleyin ve Arduino Dashboard'da Kod Sonucunu Kontrol Edin
Firmware'i Arduino - GRBL'ye kurmak:
github.com/grbl/grbl/wiki/Compiling-Grbl
Not: Arduino'da derleme yaparken bir çakışma yaşayabilirsiniz. Diğer tüm kitaplıkları kitaplık klasörünüzden kaldırın (../documents/Arduino/libraries).
Bellenim kurulumu
Etkinleştirmeyi daha yeni bir zaman aşımına ayarlayın. Seri bağlantı kullanın ve şunu yazın:
$1=255
Hedef aramayı ayarla:
$22=1
Seriyi baud olarak ayarlamayı unutmayın: 115200
Kullanışlı G kodları
Robot için sıfır noktası ayarlayın:
G10 L2 Xnnn Ynnn Znnn
Sıfır noktası kullanın:
G54
Robotu merkezlemek için tipik başlatma:
G10 L2 X1.5 Y1.2 Z1.1
G54
Robotu hızlı konuma getirin:
G0 Xnnn Ynnn Znnn
Örnek:
G0 X10.0 Y3.1 Z4.2 (dönüş)
Robotu belirli bir hızda pozisyona getirin:
G1 Xnnn Ynnn Znnn Fnnn
G1 X11 Y3 Z4 F300 (dönüş)
F, 10(yavaş) ile 600(hızlı) arasında olmalıdır
X, Y ve Z için varsayılan birimler
GRBL için varsayılan adım/birim ayarlarını (250 adım/birim) kullanırken ve
800 adım/dev için step sürücü kurulumu tüm eksenler için aşağıdaki birimler geçerlidir:
+- 32 birim = +- 180 derece
İşlem kodu örneği:
Bu kod doğrudan Arduino GRBL ile iletişim kurabilir.
github.com/damellis/gctrl
Seriyi baud olarak ayarlamayı unutmayın: 115200
Arduino'da uoload kodu
java.awt.event. KeyEvent'i içe aktar;
javax.swing. JOptionPane'i içe aktarın;
işleme.serisini içe aktar.*;
Seri bağlantı noktası = boş;
// işletim sisteminiz için uygun satırı seçin ve değiştirin
// etkileşimli bağlantı noktasını kullanmak için boş bırakın (programda 'p'ye basın)
Dize bağlantı noktası adı = boş;
//Dize portadı = Serial.list()[0]; // Mac OS X
//Dize bağlantı noktası adı = "/dev/ttyUSB0"; // Linux
//Dize bağlantı noktası adı = "COM6"; // Pencereler
boole akışı = yanlış;
şamandıra hızı = 0.001;
string gcode;
int ben = 0;
geçersiz openSerialPort()
{
if (portadı == null) dönüş;
if (port != null) port.stop();
bağlantı noktası = yeni Seri(bu, bağlantı noktası adı, 115200);
port.bufferUntil('\n');
}
geçersiz selectSerialPort()
{
Dize sonucu = (Dize) JOptionPane.showInputDialog(bu, "Arduino kartınıza karşılık gelen seri bağlantı noktasını seçin.", "Seri bağlantı noktası seçin", JOptionPane. PLAIN_MESSAGE, boş, Seri.list(), 0);
if (sonuç != boş) {
portadı = sonuç;
openSerialPort();
}
}
geçersiz kurulum()
{
boyut(500, 250);
openSerialPort();
}
geçersiz çekiliş()
{
arkaplan(0);
doldur(255);
int y = 24, dy = 12;
text("TALİMATLAR", 12, y); y += dy;
text("p: seri port seç", 12, y); y += dy;
text("1: hızı jog başına 0,001 inç (1 mil) olarak ayarlayın", 12, y); y += dy;
text("2: hızı jog başına 0,010 inç (10 mil) olarak ayarlayın", 12, y); y += dy;
text("3: hızı jog başına 0,100 inç (100 mil) olarak ayarlayın", 12, y); y += dy;
text("ok tuşları: x-y düzleminde ilerleyin", 12, y); y += dy;
text("sayfa yukarı ve sayfa aşağı: z ekseninde ilerleyin", 12, y); y += dy;
text("$: grbl ayarlarını göster", 12, y); y+= dy;
text("h: eve git", 12, y); y += dy;
text("0: sıfır makine (geçerli konuma ayarlayın)", 12, y); y += dy;
text("g: bir g kodu dosyasının akışını gerçekleştirin", 12, y); y += dy;
text("x: g kodu akışını durdurun (bu hemen DEĞİLDİR)", 12, y); y += dy;
y = yükseklik - dy;
text("geçerli hareket hızı: " + hız + " adım başına inç", 12, y); y -= dy;
text("geçerli seri bağlantı noktası: " + bağlantı noktası adı, 12, y); y -= dy;
}
geçersiz tuşBasılmış()
{
if (anahtar == '1') hız = 0.001;
if (anahtar == '2') hız = 0.01;
if (anahtar == '3') hız = 0.1;
if (!akış) {
if (keyCode == SOL) port.write("G91\nG20\nG00 X-" + hız + " Y0.000 Z0.000\n");
if (keyCode == SAĞ) port.write("G91\nG20\nG00 X" + hız + " Y0.000 Z0.000\n");
if (keyCode == UP) port.write("G91\nG20\nG00 X0.000 Y" + hız + " Z0.000\n");
if (keyCode == DOWN) port.write("G91\nG20\nG00 X0.000 Y-" + hız + " Z0.000\n");
if (keyCode == KeyEvent. VK_PAGE_UP) port.write("G91\nG20\nG00 X0.0000 Y0.000 Z" + hız + "\n");
if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write("G91\nG20\nG00 X0.000 Y0.000 Z-" + hız + "\n");
//if (anahtar == 'h') port.write("G90\nG20\nG00 X0.0000 Y0.000 Z0.000\n");
if (key == 'v') port.write("$0=75\n$1=74\n$2=75\n");
//if (anahtar == '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 (anahtar == '0') openSerialPort();
if (anahtar == 'p') selectSerialPort();
if (key == '$') port.write("$$\n");
if (key == 'h') port.write("$H\n");
}
if (!streaming && key == 'g') {
gcode = boş; ben = 0;
Dosya dosyası = boş;
println("Dosya yükleniyor…");
selectInput("İşlenecek bir dosya seçin:", "fileSelected", dosya);
}
if (key == 'x') akış = false;
}
void fileSelected(Dosya seçimi) {
if (seçim == boş) {
println("Pencere kapatıldı veya kullanıcı iptal tuşuna bastı.");
} Başka {
println("Kullanıcı seçildi " +selection.getAbsolutePath());
gcode = loadStrings(selection.getAbsolutePath());
if (gcode == null) döner;
akış = doğru;
aktarım();
}
}
geçersiz akış()
{
eğer (!streaming) dönerse;
while (doğru) {
if (i == gcode.length) {
akış = yanlış;
dönüş;
}
if (gcode.trim().length() == 0) i++;
başka kırılma;
}
println(gcode);
port.write(gcode + '\n');
ben++;
}
void serialEvent(Seri p)
{
String s = p.readStringUntil('\n');
println(s.trim());
if (s.trim().startsWith("ok")) stream();
if (s.trim().startsWith("hata")) stream(); // XXX: gerçekten mi?
}
Adım 5: Tüm Parçaları Kontrplak Levhada Tasarlayın ve Yazdırın
Robot parçasını ve tasarımını AutoCAD'de indirin ve 12 mm'lik kontrplak levha ve bitiş ve tasarım bölümünü yazdırın. Herhangi birinin cad dosyasına ihtiyacı varsa lütfen yorum bölümüne yorum bırakın, ben `doğrudan göndereceğim.
Adım 6: Montaj
tüm parçaları toplayın ve verilen görüntü üzerinde sıraya göre düzenleyin ve görüntü diyagramını takip edin.
7. Adım: GBRL Ayarlarını Kurun
Robotlarımızda işe yaradığı kanıtlanmış ayar.
$0=10 (adım darbesi, usec) $1=255 (adım boşta kalma gecikmesi, msn) $2=7 (adım bağlantı noktası ters çevirme maskesi:00000111) $3=7 (dir bağlantı noktası ters çevirme maskesi:0000111) $4=0 (adım etkinleştirme ters çevirme, bool) $5=0 (limit pinleri ters çevir, bool) $6=1 (prob pini ters çevir, bool) $10=3 (durum raporu maskesi:00000011) $11=0.020 (bağlantı sapması, mm) 12$=0.002 (yay toleransı, mm) 13$ =0 (rapor inç, bool) $20=0 (yumuşak limitler, bool) $21=0 (sabit limitler, bool) $22=1 (homing döngüsü, bool) $23=0 (homing dir invert mask:00000000) $24=100.000 (hedef arama beslemesi, mm/dak) 25=500.000 $ (hedef arama, mm/dak) 26=250 $ (yer arama geri dönüşü, msn) 27=1.000 $ (yer arama çekme, mm) 100$=250.000 (x, adım/mm) 101$= 250.000 (y, adım/mm) 102=250.000 (z, adım/mm) 110=500.000 (x maksimum hız, mm/dak) 111=500.000 (y maksimum hız, mm/dak) 112=500.000 (z maksimum hız, mm/dk) 120$=10.000 (x hızlanma, mm/sn^2) 121=10.000 (y hızlanma, mm/sn^2) 122$=10.000 (z hızlanma, mm/sn^2) 130$=200.000 (x maks. hareket), mm) 131=200.000 (y maks. hareket, mm) 132=200.000 (z maks. hareket, mm)
Adım 8: Son Kodu Yükleyin ve Arduino Uno Yazılım Panosundaki Sanal Sonucu Kontrol Edin
// Birimler: CM
float b_height = 0;
kayan a1 = 92;
kayan a2 = 86;
float snude_len = 20;
boolean doZ = yanlış;
kayan taban_açı;// = 0;
float arm1_angle; // = 0;
yüzer arm2_angle; //= 0;
kayan nokta bx = 60;// = 25;
yüzer = 60;// = 0;
kayan nokta bz = 60;// = 25;
kayan nokta x = 60;
yüzer y = 60;
kayan nokta z = 60;
yüzer q;
yüzer c;
yüzer V1;
yüzer V2;
yüzer V3;
yüzer V4;
yüzer V5;
geçersiz kurulum() {
boyut(700, 700, P3D);
cam = yeni PeasyCam(bu, 300);
cam.setMinimumMesafe(50);
cam.setMaximumDistance(500);
}
geçersiz beraberlik() {
// liginger:
y = (fareX - genişlik/2)*(-1);
x = (fareY - yükseklik/2)*(-1);
bz = z;
tarafından = 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 = radyan(90.0) - q;
V5 = radyan(180) - V4 - radyan(90);
arm2_angle = radyan(180.0) - (V5 + V1);
taban_açı = derece(atan2(bx, by));
arm1_angle=derece(arm1_angle);
arm2_angle=derece(arm2_angle);
//println(tarafından, bz);
//kol1_açı = 90;
//kol2_açı = 45;
/*
arm2_angle = 23;
arm1_angle= 23;
arm2_angle=23;
*/
// etkileşimli:
// eğer (doZ)
//
// {
// base_angle = base_angle+ mouseX-pmouseX;
// } Başka
// {
// arm1_angle =arm1_angle+ pmouseX-mouseX;
// }
//
// arm2_angle = arm2_angle+ fareY-pmouseY;
draw_robot(taban_açı, -(kol1_açı-90), kol2_açı+90 - (-(kol1_açı-90)));
// println(taban_açı + ", " + kol1_açı + ", " + kol2_açı);
}
void draw_robot(float base_angle, float arm1_angle, float arm2_angle)
{
döndürmeX(1.2);
döndürZ(-1.2);
arkaplan(0);
ışıklar();
pushMatrix();
// TEMEL
doldur(150, 150, 150);
box_corner(50, 50, b_height, 0);
döndürme(radyan(taban_açı), 0, 0, 1);
// KOL 1
doldur(150, 0, 150);
box_corner(10, 10, a1, arm1_angle);
// KOL 2
doldur(255, 0, 0);
box_corner(10, 10, a2, arm2_angle);
// SNUDE
doldur(255, 150, 0);
box_corner(10, 10, snude_len, -arm1_angle-arm2_angle+90);
popMatrix();
pushMatrix();
float 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);
doldur(255, 255, 0);
kutu(20);
popMatrix();
doldur(255, 255, 255, 50);
kutu(action_box_size, action_box_size, action_box_size);
popMatrix();
}
void box_corner(float w, float h, float d, float döndürme)
{
döndür(radyan(döndür), 1, 0, 0);
çevir(0, 0, d/2);
kutu(w, h, d);
çevir(0, 0, d/2);
}
geçersiz tuşBasılmış()
{
if (anahtar == 'z')
{
doZ = !doZ;
}
if (anahtar == 'h')
{
// hepsini sıfıra ayarla
arm2_angle = 0;
arm1_angle = 90;
taban_açı = 0;
}
if (anahtar == 'g')
{
println(derece(V1));
println(derece(V5));
}
if (anahtar Kodu == YUKARI)
{
z++;
}
if (anahtar Kodu == AŞAĞI)
{
z --;
}
if (anahtar == 'o')
{
y = 50;
z = 50;
println(q);
println(c, "c");
println(V1, "V1");
println(V2);
println(V3);
println(kol1_açı);
println(V4);
println(V5);
println(arm2_açı);
}
}