Оглавление:
- Шаг 1: Требования к компонентам
- Шаг 2: Загрузите Gui
- Шаг 3: Подключение
- Шаг 4. Загрузите прошивку и проверьте результат кода на панели управления Arduino
- Шаг 5: спроектируйте и распечатайте все детали из фанерного листа
- Шаг 6: Сборка
- Шаг 7: Настройте параметры GBRL
- Шаг 8. Загрузите окончательный код и проверьте виртуальный результат на панели инструментов программного обеспечения Arduino Uno
Видео: Робот для выбора и установки базы Arduino: 8 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
Я сделал сверхдешевую (менее 1000 долларов) руку промышленного робота, чтобы студенты могли взламывать крупномасштабную робототехнику и позволить небольшим местным производствам использовать роботов в своих процессах, не нарушая при этом денег. Его легкость в создании и создании людей возрастной группы от 15 до 50 лет.
Шаг 1: Требования к компонентам
1. Arduino + экран + контакты + кабели
2. Моторконтроллер: dm860A (Ebay)
3. Шаговый двигатель: 34hs5435c-37b2 (Ebay)
4. Болты M8x45 + 60 + 70 и M8.
5. Фанера 12мм.
6. 5 мм нейлон.
7. Глухие шайбы 8мм.
8. Шурупы по дереву 4,5x40 мм.
9. M3 Counter потоплен, 10. Источник питания 12 В
11. Драйвер серводвигателя 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).
Настройка прошивки
Установите enable на более новый тайм-аут. Используйте последовательное соединение и напишите:
$1=255
Установить самонаведение:
$22=1
Не забудьте установить последовательный порт на бод: 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 (медленно) до 600 (быстро)
Единицы измерения по умолчанию для X, Y и Z
При использовании настроек шага / единиц по умолчанию (250 шагов / единица) для GRBL и
Шаговый привод, настроенный на 800 шагов / об, следующие единицы применяются для всех осей:
+ - 32 единицы = + - 180 градусов
Пример кода обработки:
Этот код может напрямую связываться с Arduino GRBL.
github.com/damellis/gctrl
Не забудьте установить последовательный порт на бод: 115200
Код uoload в ардунио
import java.awt.event. KeyEvent;
import javax.swing. JOptionPane;
import processing.serial. *;
Последовательный порт = ноль;
// выбираем и изменяем соответствующую строку для вашей операционной системы
// оставьте значение null, чтобы использовать интерактивный порт (нажмите в программе 'p')
Строка portname = null;
// Строка portname = Serial.list () [0]; // Mac OS X
// Строка portname = "/ dev / ttyUSB0"; // Linux
// Строка portname = "COM6"; // Windows
логическая потоковая передача = ложь;
скорость поплавка = 0,001;
String gcode;
int я = 0;
void openSerialPort ()
{
если (portname == null) return;
если (порт! = ноль) port.stop ();
порт = новый последовательный (это, имя порта, 115200);
port.bufferUntil ('\ п');
}
недействительным selectSerialPort ()
{
String result = (String) JOptionPane.showInputDialog (this, «Выберите последовательный порт, соответствующий вашей плате Arduino.», "Выбрать последовательный порт", JOptionPane. PLAIN_MESSAGE, нулевой, Serial.list (), 0);
if (результат! = null) {
имя порта = результат;
openSerialPort ();
}
}
установка void ()
{
размер (500, 250);
openSerialPort ();
}
недействительная ничья ()
{
фон (0);
заполнить (255);
int y = 24, dy = 12;
текст («ИНСТРУКЦИЯ», 12, y); y + = dy;
текст («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;
текст («клавиши со стрелками: бег в плоскости x-y», 12, y); y + = dy;
текст ("страница вверх и страница вниз: перемещение по оси z", 12, y); y + = dy;
text ("$: отображать настройки grbl", 12, y); y + = dy;
текст («ч: иди домой», 12, у); y + = dy;
text ("0: нулевая машина (установить текущее местоположение)", 12, y); y + = dy;
text ("g: поток файла с g-кодом", 12, y); y + = dy;
text ("x: остановить потоковую передачу g-кода (это НЕ немедленно)", 12, y); y + = dy;
y = высота - dy;
текст ("текущая скорость толчкового режима:" + скорость + "дюймов на шаг", 12, y); y - = dy;
текст ("текущий последовательный порт:" + имя порта, 12, y); y - = dy;
}
недействительный keyPressed ()
{
if (key == '1') speed = 0.001;
if (key == '2') speed = 0,01;
if (key == '3') speed = 0,1;
if (! streaming) {
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");
// если (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");
// если (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");
если (ключ == '0') openSerialPort ();
если (ключ == 'p') selectSerialPort ();
если (ключ == '$') port.write ("$$ / n");
if (key == 'h') port.write ("$ H / n");
}
if (! потоковая передача && key == 'g') {
gcode = null; я = 0;
Файл file = null;
println ("Загрузка файла…");
selectInput («Выберите файл для обработки:», «fileSelected», файл);
}
если (key == 'x') streaming = false;
}
void fileSelected (Выбор файла) {
if (selection == null) {
println ("Окно было закрыто или пользователь нажал кнопку отмены.");
} еще {
println («Выбрано пользователем» + selection.getAbsolutePath ());
gcode = loadStrings (selection.getAbsolutePath ());
если (gcode == null) возврат;
streaming = true;
транслировать();
}
}
пустой поток ()
{
если (! потоковая передача) возврат;
while (true) {
if (i == gcode.length) {
потоковая передача = ложь;
возвращение;
}
если (gcode .trim (). length () == 0) я ++;
иначе сломаться;
}
println (gcode [я]);
порт.write (gcode + '\ n');
i ++;
}
void serialEvent (серийный р)
{
Строка s = p.readStringUntil ('\ n');
println (s.trim ());
если (s.trim (). startWith ("хорошо")) stream ();
если (s.trim (). startWith ("ошибка")) stream (); // ХХХ: правда?
}
Шаг 5: спроектируйте и распечатайте все детали из фанерного листа
Загрузите деталь робота и конструкцию в AutoCAD и распечатайте на листе фанеры толщиной 12 мм, а также отделку и конструкцию. Если кому-то нужен cad-файл, пожалуйста, оставьте комментарий в поле для комментариев, я отправлю его напрямую.
Шаг 6: Сборка
соберите все части и расположите в последовательности на изображении, которое дано, и следуйте диаграмме изображения.
Шаг 7: Настройте параметры GBRL
Настройка, которая доказала свою эффективность на наших роботах.
$ 0 = 10 (шаговый импульс, мксек) $ 1 = 255 (шаговая задержка холостого хода, мс) $ 2 = 7 (шаговая маска инвертирования порта: 00000111) $ 3 = 7 (маска инвертирования порта dir: 00000111) $ 4 = 0 (инвертирование шага включения, bool) $ 5 = 0 (инверсия концевых штифтов, bool) $ 6 = 1 (инверсия штифта датчика, bool) $ 10 = 3 (маска отчета о состоянии: 00000011) $ 11 = 0,020 (отклонение перехода, мм) $ 12 = 0,002 (допуск дуги, мм) $ 13 = 0 (отчетные дюймы, bool) $ 20 = 0 (мягкие пределы, bool) $ 21 = 0 (жесткие ограничения, bool) $ 22 = 1 (цикл возврата в исходное положение, bool) $ 23 = 0 (маска инвертирования исходного направления: 00000000) $ 24 = 100,000 (подача в исходное положение, мм / мин) $ 25 = 500,000 (поиск точки начала отсчета, мм / мин) $ 26 = 250 (отклонение от точки начала отсчета, мсек) $ 27 = 1,000 (отвод в исходное положение, мм) $ 100 = 250,000 (x, шаг / мм) $ 101 = 250.000 (y, шаг / мм) $ 102 = 250.000 (z, шаг / мм) $ 110 = 500.000 (x макс. Скорость, мм / мин) $ 111 = 500.000 (y макс. Скорость, мм / мин) $ 112 = 500.000 (z макс. Скорость, мм / мин) $ 120 = 10.000 (ускорение x, мм / сек ^ 2) $ 121 = 10.000 (ускорение y, мм / сек ^ 2) $ 122 = 10.000 (ускорение z, мм / сек ^ 2) $ 130 = 200000 (x макс. ход, мм) $ 131 = 200 000 (макс. ход по оси, мм) $ 132 = 200 000 (макс. ход по оси, мм)
Шаг 8. Загрузите окончательный код и проверьте виртуальный результат на панели инструментов программного обеспечения Arduino Uno
// Единицы: CM
float b_height = 0;
float a1 = 92;
float a2 = 86;
float snude_len = 20;
логическое doZ = false;
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;
float q;
float c;
float V1;
поплавок V2;
float V3;
поплавок V4;
поплавок V5;
void setup () {
размер (700, 700, P3D);
cam = новый PeasyCam (this, 300);
cam.setMinimumDistance (50);
cam.setMaximumDistance (500);
}
void draw () {
// ligninger:
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);
}
void draw_robot (float base_angle, float arm1_angle, float arm2_angle)
{
rotateX (1.2);
rotateZ (-1,2);
фон (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;
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);
заполнить (255, 255, 0);
ящик (20);
popMatrix ();
заполнить (255, 255, 255, 50);
коробка (action_box_size, action_box_size, action_box_size);
popMatrix ();
}
void box_corner (float w, float h, float d, float rotate)
{
вращать (радианы (вращать), 1, 0, 0);
перевести (0, 0, d / 2);
коробка (ш, в, г);
перевести (0, 0, d / 2);
}
недействительный keyPressed ()
{
если (ключ == 'z')
{
doZ =! doZ;
}
если (ключ == 'ч')
{
// обнулить все
arm2_angle = 0;
arm1_angle = 90;
base_angle = 0;
}
если (ключ == 'g')
{
println (градусы (V1));
println (градусы (V5));
}
если (keyCode == UP)
{
z ++;
}
если (keyCode == ВНИЗ)
{
z -;
}
если (ключ == 'о')
{
у = 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);
}
}
Рекомендуемые:
Как утилизировать телефоны Android для BOINC или складной установки без использования батарей: 8 шагов
Как утилизировать телефоны Android для BOINC или складного устройства без использования батарей: ПРЕДУПРЕЖДЕНИЕ: Я НИКОГДА НЕ НЕСУСЬ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПОВРЕЖДЕНИЯ, ВЫЯВЛЕННЫЕ ВАШЕМУ ОБОРУДОВАНИЮ, СЛЕДУЯ ЭТОМ РУКОВОДСТВУ. Это руководство более эффективно для пользователей BOINC (личный выбор / причины), его также можно использовать для СКЛАДЫВАНИЯ. Поскольку у меня мало времени, я
Робот для захвата и установки на основе RFID: 4 шага
Робот для захвата и установки на основе RFID: на протяжении многих лет люди пытаются заменить человеческую работу машинами. Машины, называемые роботами, быстрее и эффективнее людей. Термин робототехника практически определяется как исследование, проектирование и использование роботизированных систем для производства. Роботы
Контроллер стартера DOL на основе IOT для ирригационной насосной установки: 6 шагов
Контроллер стартера DOL на базе IOT для ирригационной насосной установки: Здравствуйте, друзья. В этой инструкции рассказывается, как удаленно контролировать и управлять ирригационной насосной установкой через Интернет. История: На своей ферме я получаю электроэнергию от местной сети только около 6 часов в день. Сроки нестандартные, наличие по
Как разобрать ноутбук Dell Inspiron 15 5570 для установки твердотельного накопителя M.2: 20 шагов
Как разобрать ноутбук Dell Inspiron 15 5570 для установки твердотельного накопителя M.2: Если вы найдете эту инструкцию полезной, подумайте о подписке на мой канал Youtube для предстоящих обучающих материалов по технологии DIY. Спасибо
Расширьте прозрачный чехол для iPhone для установки аксессуаров: 3 шага
Расширьте прозрачный чехол для iPhone, чтобы в нем можно было разместить аксессуары: в этой инструкции вы узнаете, как изменить отверстие в нижней части акрилового чехла для iPhone, чтобы приспособить для него зарядное устройство, которое в противном случае было бы слишком широким для него. На этой фотографии показан сам чехол (розовый штука сзади - это наклеивающийся ЖК-дисплей