Table des matières:
- Étape 1: Exigence des composants
- Étape 2: Télécharger l'interface graphique
- Étape 3: Connexion
- Étape 4: Téléchargez le micrologiciel et vérifiez le résultat du code dans le tableau de bord Arduino
- Étape 5: Concevez et imprimez toutes les pièces en feuille de contreplaqué
- Étape 6: Assemblage
- Étape 7: Configurer les paramètres GBRL
- Étape 8: téléchargez le code final et vérifiez le résultat virtuel dans le tableau de bord du logiciel Arduino Uno
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
J'ai fabriqué un bras robotique industriel très bon marché (moins de 1000 dollars) pour permettre aux étudiants de pirater la robotique à plus grande échelle et pour permettre aux petites productions locales d'utiliser des robots dans leurs processus sans se ruiner. C'est facile à construire et à rendre le groupe d'âge des personnes de 15 à 50 ans.
Étape 1: Exigence des composants
1. Arduino + Shield + Broches + Câbles
2. Contrôleur de moteur: dm860A (Ebay)
3. Moteur pas à pas: 34hs5435c-37b2 (Ebay)
4. Boulons M8x45+60+70 et boulons M8.
5. Contreplaqué de 12 mm.
6. Nylon de 5 mm.
7. Rondelles aveugles 8mm.
8. Vis à bois 4.5x40mm.
9. Comptoir M3 coulé, 10. Alimentation 12v
11. pilote de servomoteur arduino
Étape 2: Télécharger l'interface graphique
zapmaker.org/projects/grbl-controller-3-0/
github.com/grbl/grbl/wiki/Using-Grbl
Étape 3: Connexion
Connectez les fils qui sont donnés dans l'image est une meilleure compréhension pour vous.
nous devons connecter le pilote du moteur à Arduino et à d'autres connecteurs requis selon votre robot.
Étape 4: Téléchargez le micrologiciel et vérifiez le résultat du code dans le tableau de bord Arduino
Installation du firmware sur Arduino - GRBL:
github.com/grbl/grbl/wiki/Compiling-Grbl
Remarque: vous pouvez rencontrer un conflit lors de la compilation dans Arduino. Supprimez toutes les autres bibliothèques de votre dossier de bibliothèque (../documents/Arduino/libraries).
Configuration du micrologiciel
Réglez l'activation sur un délai d'expiration plus récent. Utilisez une connexion série et écrivez:
$1=255
Définir le référencement:
$22=1
N'oubliez pas de régler la série sur baud: 115200
Codes G utiles
Définir le point zéro pour le robot:
G10 L2 Xnnn Ynnn Znnn
Utiliser le point zéro:
G54
Initialisation typique pour centrer le robot:
G10 L2 X1.5 Y1.2 Z1.1
G54
Déplacez le robot en position rapide:
G0 Xnnn Ynnn Znnn
Exemple:
G0 X10.0 Y3.1 Z4.2 (retour)
Déplacez le robot vers une position à une vitesse spécifique:
G1 Xnnn Ynnn Znnn Fnnn
G1 X11 Y3 Z4 F300 (retour)
F doit être compris entre 10 (slooooow) et 600 (rapide)
Unités par défaut pour X, Y et Z
Lors de l'utilisation des paramètres de pas/unités par défaut (250 pas/unité) pour GRBL et
Entraînement pas à pas configuré pour 800 pas/tour, les unités suivantes s'appliquent à tous les axes:
+- 32 unités = +- 180 degrés
Exemple de code de traitement:
Ce code peut communiquer directement avec l'Arduino GRBL.
github.com/damellis/gctrl
N'oubliez pas de régler la série sur baud: 115200
Code uoload dans ardunio
importer java.awt.event. KeyEvent;
importer javax.swing. JOptionPane;
import processing.serial.*;
Port série = nul;
// sélectionnez et modifiez la ligne appropriée pour votre système d'exploitation
// laissez null pour utiliser le port interactif (appuyez sur 'p' dans le programme)
Chaîne nom de port = null;
//Chaîne nom de port = Serial.list()[0]; // Mac OS X
//Chaîne nom de port = "/dev/ttyUSB0"; //Linux
//Chaîne nom de port = "COM6"; // Les fenêtres
flux booléen = faux;
vitesse flottante = 0,001;
String gcode;
entier je = 0;
void openSerialPort()
{
if (nom de port == null) return;
if (port != null) port.stop();
port = new Serial(this, portname, 115200);
port.bufferUntil('\n');
}
void selectSerialPort()
{
Résultat de la chaîne = (chaîne) JOptionPane.showInputDialog (ceci, "Sélectionnez le port série qui correspond à votre carte Arduino.", "Sélectionner le port série", JOptionPane. PLAIN_MESSAGE, nul, Serial.list(), 0);
if (résultat != nul) {
nom de port = résultat;
openSerialPort();
}
}
void setup()
{
taille (500, 250);
openSerialPort();
}
tirage nul()
{
arrière-plan(0);
remplir(255);
entier y = 24, dy = 12;
text("INSTRUCTIONS", 12, y); y += dy;
text("p: sélectionnez le port série", 12, y); y += dy;
text("1: régler la vitesse sur 0,001 pouce (1 mil) par jogging", 12, y); y += dy;
text("2: régler la vitesse sur 0,010 pouce (10 mil) par jogging", 12, y); y += dy;
text("3: régler la vitesse sur 0,100 pouce (100 mil) par jogging", 12, y); y += dy;
text("touches fléchées: jog dans le plan x-y", 12, y); y += dy;
text("page up & page down: jogging sur l'axe z", 12, y); y += dy;
text("$: afficher les paramètres grbl", 12, y); y+= dy;
text("h: rentrer à la maison", 12, y); y += dy;
text("0: zéro machine (réglé à la maison à l'emplacement actuel)", 12, y); y += dy;
text("g: diffuser un fichier g-code", 12, y); y += dy;
text("x: arrêter la diffusion du g-code (ceci n'est PAS immédiat)", 12, y); y += dy;
y = hauteur - dy;
text("vitesse de jogging actuelle: " + vitesse + " pouces par pas", 12, y); y -= dy;
text("port série actuel: " + nom de port, 12, y); y -= dy;
}
touche videAppuyée ()
{
si (touche == '1') vitesse = 0,001;
si (touche == '2') vitesse = 0,01;
si (touche == '3') vitesse = 0,1;
si (!streaming) {
if (keyCode == LEFT) port.write("G91\nG20\nG00 X-" + vitesse + " Y0.000 Z0.000\n");
if (keyCode == RIGHT) port.write("G91\nG20\nG00 X" + vitesse + " Y0.000 Z0.000\n");
if (keyCode == UP) port.write("G91\nG20\nG00 X0.000 Y" + vitesse + " Z0.000\n");
if (keyCode == DOWN) port.write("G91\nG20\nG00 X0.000 Y-" + vitesse + " Z0.000\n");
if (keyCode == KeyEvent. VK_PAGE_UP) port.write("G91\nG20\nG00 X0.000 Y0.000 Z" + vitesse + "\n");
if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write("G91\nG20\nG00 X0.000 Y0.000 Z-" + vitesse + "\n");
//if (clé == 'h') port.write("G90\nG20\nG00 X0.000 Y0.000 Z0.000\n");
if (clé == 'v') port.write("$0=75\n$1=74\n$2=75\n");
//if (clé == 'v') port.write("$0=100\n$1=74\n$2=75\n");
if (clé == 's') port.write("$3=10\n");
if (clé == 'e') port.write("$16=1\n");
if (clé == 'd') port.write("$16=0\n");
if (clé == '0') openSerialPort();
if (clé == 'p') selectSerialPort();
if (clé == '$') port.write("$$\n");
if (clé == 'h') port.write("$H\n");
}
if (!streaming && clé == 'g') {
gcode = null; je = 0;
Fichier fichier = nul;
println("Chargement du fichier…");
selectInput("Sélectionnez un fichier à traiter:", "fileSelected", file);
}
if (clé == 'x') streaming = false;
}
void fileSelected (Sélection de fichier) {
if (sélection == null) {
println("La fenêtre a été fermée ou l'utilisateur a cliqué sur annuler.");
} autre {
println("Utilisateur sélectionné " + selection.getAbsolutePath());
gcode = loadStrings(selection.getAbsolutePath());
if (gcode == null) return;
diffusion = vrai;
flux();
}
}
flux vide()
{
si (!streaming) retourne;
tandis que (vrai) {
if (i == gcode.length) {
diffusion en continu = faux;
revenir;
}
if (gcode.trim().length() == 0) i++;
sinon casser;
}
println(gcode);
port.write(gcode + '\n');
je++;
}
void serialEvent(Serial p)
{
Chaîne s = p.readStringUntil('\n');
println(s.trim());
if (s.trim().startsWith("ok")) stream();
if (s.trim().startsWith("error")) stream(); // XXX: vraiment ?
}
Étape 5: Concevez et imprimez toutes les pièces en feuille de contreplaqué
Téléchargez la pièce et la conception du robot dans AutoCAD et imprimez-la sur la feuille de contreplaqué de 12 mm et la partie finition et conception. Si quelqu'un a besoin d'un fichier cad, laissez le commentaire dans la zone de section des commentaires, je vous l'enverrai directement.
Étape 6: Assemblage
rassembler toute la partie et disposer dans la séquence sur image qui est donnée et suivre le schéma de l'image.
Étape 7: Configurer les paramètres GBRL
Réglage qui a fait ses preuves sur nos robots.
$0=10 (step pulse, usec) $1=255 (step inactif delay, msec) $2=7 (step port invert mask:00000111) $3=7 (dir port invert mask:00000111) $4=0 (step enable invert, bool) 5 $ = 0 (inversion des broches de limite, bool) 6 $=1 (inversion des broches de la sonde, bool) 10 $=3 (masque de rapport d'état: 00000011) 11 $=0,020 (déviation de jonction, mm) 12 $=0,002 (tolérance d'arc, mm) 13 $ =0 (rapport pouces, bool) $20=0 (limites souples, bool) $21=0 (limites dures, bool) $22=1 (cycle de référencement, bool) $23=0 (homing dir invert mask:00000000) $24=100.000 (homing feed, mm/min) $25=500.000 (homing cherche, mm/min) $26=250 (homing antibounce, msec) $27=1.000 (homing pull-off, mm) $100=250.000 (x, pas/mm) $101= 250 000 (y, pas/mm) 102 $=250 000 (z, pas/mm) 110 $=500 000 (x taux max, mm/min) 111 $=500 000 (y taux max, mm/min) 112 $=500 000 (z taux max, 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 course max, mm) 131 $=200 000 (y course max, mm) 132 $=200 000 (z course max, mm)
Étape 8: téléchargez le code final et vérifiez le résultat virtuel dans le tableau de bord du logiciel Arduino Uno
// Unités: CM
float b_height = 0;
flotteur a1 = 92;
flottant a2 = 86;
float snude_len = 20;
booléen doZ = faux;
float base_angle;// = 0;
float arm1_angle; // = 0;
float arm2_angle; //= 0;
flottant bx = 60; // = 25;
flotter par = 60; // = 0;
flottant bz = 60; // = 25;
flottant x = 60;
flottant y = 60;
flotteur z = 60;
flotteur q;
flotteur c;
flotteur V1;
flotteur V2;
flotteur V3;
flotteur V4;
flotteur V5;
void setup() {
taille (700, 700, P3D);
cam = nouveau PeasyCam (ceci, 300);
cam.setMinimumDistance(50);
cam.setMaximumDistance(500);
}
tirage nul () {
//ligneur:
y = (sourisX - largeur/2)*(-1);
x = (sourisY - hauteur/2)*(-1);
bz = z;
par = 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;
bras1_angle = q;
V4 = radians(90,0) - q;
V5 = radians (180) - V4 - radians (90);
arm2_angle = radians (180,0) - (V5 + V1);
base_angle = degrés(atan2(bx, by));
bras1_angle=degrés(bras1_angle);
arm2_angle=degrés(arm2_angle);
//println(par, bz);
//bras1_angle = 90;
//bras2_angle = 45;
/*
bras2_angle = 23;
bras1_angle= 23;
bras2_angle=23;
*/
// interactif:
// si (doZ)
//
// {
// angle_base = angle_base+ mouseX-pmouseX;
// } autre
// {
// bras1_angle = bras1_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)
{
rotationX(1.2);
rotationZ(-1,2);
arrière-plan(0);
lumières();
pushMatrix();
// BASE
remplir (150, 150, 150);
box_corner (50, 50, b_height, 0);
rotation(radians(base_angle), 0, 0, 1);
// ARM 1
remplir (150, 0, 150);
box_corner (10, 10, a1, arm1_angle);
// ARM 2
remplir (255, 0, 0);
box_corner (10, 10, a2, arm2_angle);
// SNUDE
remplir (255, 150, 0);
box_corner (10, 10, snude_len, -arm1_angle-arm2_angle+90);
popMatrice();
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);
remplir (255, 255, 0);
boîte(20);
popMatrice();
remplir (255, 255, 255, 50);
box(action_box_size, action_box_size, action_box_size);
popMatrice();
}
void box_corner(float w, float h, float d, float rotation)
{
rotation(radians(rotation), 1, 0, 0);
translate(0, 0, d/2);
boîte(l, h, d);
translate(0, 0, d/2);
}
touche videAppuyée ()
{
si (clé == 'z')
{
doZ = !doZ;
}
si (clé == 'h')
{
// met tout à zéro
bras2_angle = 0;
bras1_angle = 90;
base_angle = 0;
}
si (clé == 'g')
{
println(degrés(V1));
println(degrés(V5));
}
si (keyCode == UP)
{
z ++;
}
if (keyCode == DOWN)
{
z --;
}
si (clé == 'o')
{
y = 50;
z = 50;
println(q);
println(c, "c");
println(V1, "V1");
println(V2);
println(V3);
println(bras1_angle);
println(V4);
println(V5);
println(bras2_angle);
}
}