СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до 10.07.2025

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

«Манипулятор на Arduino с памятью»

Категория: Прочее

Нажмите, чтобы узнать подробности

В этой статье рассмотрено создание роботизированной руки с помощью платы Arduino и сервомоторов MG995. Эта роботизированная рука будет иметь 4 степени свободы (без учета захвата) и управляться с помощью потенциометров. Кроме этого, мы также сможем записывать и в дальнейшем воспроизводить все движения руки – именно так во многих случаях и программируются роботизированные руки для работы на реальных производствах.

Просмотр содержимого документа
««Манипулятор на Arduino с памятью»»

Муниципальное бюджетное учреждение

дополнительного образования «Станция юных техников»

город Каменск-Шахтинский











Тема проекта:


«Манипулятор на Arduino с памятью»






Автор проекта:

обучающийся объединения

«Робототехника»

учащийся 7 класса,

Кирбабин Иван

Руководитель проекта:

Барышев Евгений Валентинович

педагог дополнительного образования

МБУ ДО «СЮТ»






2024 год

Введение

Робот – манипулятор это трехмерная машина, имеющая три измерения, соответствующие пространству живого существа. В широком понимании манипулятор может быть определен как техническая система, способная для выполнения тяжелых работ в опасной для человека среде на расстоянии [4].

Большой интерес у роботостроителей представляют контроллеры Arduino. Платы радио - конструктора Arduino, весьма простой, но достаточно функциональный для очень быстрого программирования и воплощения в жизнь технических идей [1].

Обучение детей программированию готовых конструкций будет всегда актуальна, так как бурное развитие робототехники связано, прежде всего, с развитием информационных технологий и средств коммуникации.

Цель проекта – создание модели руки – манипулятора, для обучения детей программированию в среде Arduino ID.

Задачи проекта:

  • разработать и построить модель манипулятора с минимальными затратами средств, не уступающую зарубежным аналогам;

  • в качестве механизмов манипулятора использовать сервоприводы;

  • управление механизмами манипулятора осуществить с помощью платы контроллера Arduino UNO R3;

  • разработать программный код в среде программирования Arduino ID для управления моделью.

Для выполнения поставленной цели и задач проекта необходимо изучить виды существующих манипуляторов, техническую литературу по этой теме и аппаратно - вычислительную платформу Arduino ID.

  1. Исследование и анализ



Исследование.

В настоящее время развитие робототехники не идет, а бежит, обгоняя время. Только за первые 10 лет XXI века было изобретено и внедрено более 1 млн. роботов. Но самое интересное, что разработками в этой области могут заниматься не только коллективы больших корпораций, группы ученых и инженеров профессионалов, но и обычные школьники по всему миру [6].

Для изучения робототехники в школе разработано несколько комплексов [7]. Наиболее известные из них – это:

  • Robotis Bioloid;

  • LEGO Mindstorms;

  • fischertechnik;

  • Arduino.

П ромышленный манипулятор — предназначенный для выполнения двигательных и управляющих функций в производственном процессе, т. е. автоматическое устройство, состоящее из манипулятора и перепрограммируемого устройства управления, которое формирует управляющие воздействия, задающие требуемые движения исполнительных органов манипулятора. Применяется для выполнения различных технологических операций (рисунок 1).

Рисунок 1. Манипулятор на производстве.

О бучающий конструктор - манипулятор снабжен роботизированной рукой, которая сжимается и разжимается (рисунок 2). С его помощью можно играть в шахматы, управляя дистанционно. Также можно с помощью робо - руки раздавать визитки. Движение включают в себя: запястье 120°, локоть 300°, базовое вращения 270°, базовые движения 180°. Игрушка очень хорошая и полезная, но стоимость его составляет порядка 17200 рублей.



Рисунок 2. Обучающий конструктор.

Благодаря проекту «uArm», каждый желающий может собрать своего настольного мини - робота. «uArm» — это 4-x осевой манипулятор, миниатюрная версия промышленного робота «ABB PalletPack IRB460» (рисунок 3) Манипулятор оснащен микропроцессором Atmel и набором сервомоторов, общая стоимость необходимых деталей — 12959 рублей. Проект uArm требует хотя бы начальных навыков программирования и опыта конструирования лего. Мини - робот можно запрограммировать на множество функций: от игры на музыкальном инструменте, до загрузки какой - то сложной программы. В настоящее время ведется разработка приложений для iOS и Android, что позволит управлять «uArm» со смартфона.

Рисунок 3. Манипуляторы «uArm»

Большинство существующих манипуляторов предполагают расположение двигателей непосредственно в суставах. Это проще конструктивно, но выходит, что двигатели должны поднимать не только полезную нагрузку, но и другие двигатели.

Анализ. За основу взяли, манипулятор, представленный на сайте Kickstarter [5], который назывался «uArm». Преимущество этой конструкции в том, что площадка для размещения захвата всегда расположена параллельно рабочей поверхности. Тяжелые двигатели расположены у основания, усилия передаются через тяги. В итоге манипулятор имеет три сервопривода (три степени свободы), которые позволяют ему перемещать инструмент по всем трем осям на 90 градусов.

В подвижных частях манипулятора решили установить подшипники. Такая конструкция манипулятора имеет массу преимуществ перед многими моделями, которые сейчас есть в продаже: Всего в манипуляторе использовано 11 подшипников: 10 штук на вал 3мм и один на вал 30мм.

Характеристики руки манипулятора:

• высота: 300мм;

• рабочая зона (при полностью вытянутом манипуляторе): от 140мм до 300мм вокруг основания;

• максимальная грузоподъемность на вытянутой руке: 200 грамм;

• потребляемый ток, не более: 800 мА.

Простота сборки. Очень много внимания уделили тому, чтобы была такая последовательность сборки манипулятора, при которой все детали прикручивать предельно удобно. Особенно сложно было сделать это для узлов мощных сервоприводов в основании.

Управление реализуется с помощью переменных резисторов, пропорциональное управление типа пантограф, как у ядерщиков и у героя в большом роботе из фильма «Аватар», можно управлять и мышкой, а по примерам программного кода можно составить свои алгоритмы движения.

Открытость проекта. Любой желающий может сделать свои инструменты (присоску или зажим для карандаша) и загрузить в контроллер необходимую для выполнения поставленной задачи программу (скетч).



  1. Этапы изготовления узлов и сборка манипулятора

    1. Материалы и инструменты

Для изготовления руки - манипулятора использовали композитную панель, толщиной 3мм и 5мм. Это материал, который состоит из двух алюминиевых листов, толщиной 0,21 мм соединенных термопластичной прослойкой из полимера, обладает хорошей жесткостью, легкий и хорошо обрабатывается. Скаченные фотографии манипулятора в интернете обрабатывались компьютерной программой Inkscape (векторный графический редактор). В программе AutoCAD (трёхмерная система автоматизированного проектирования и черчения) чертились чертежи для модели руки – манипулятора (приложение, рисунок 18 и рисунок 19). Готовые детали плеч и рабочего инструмента манипулятора показаны на рисунке 4, на рисунке 5 основание манипулятора. Все детали для модели изготавливались на фрезерном станке с ЧПУ.

Рисунок 4. Готовые детали для манипулятора.

Рисунок 5. Готовые детали основания манипулятора.

    1. Механическая начинка манипулятора

Для основания манипулятора использовали сервоприводы MG-995 (рисунок 6). Это цифровые сервоприводы с металлическими шестеренками и шарикоподшипниками, они обеспечивают усилие 4,8кг/см, точную отработку позиции и приемлемую скорость. Весит один сервопривод 55,0 граммов при размерах 40,7 х 19,7 х 42,9мм, напряжение питания от 4,8 до 7,2 вольт.

Для захвата и поворота кисти использовали сервоприводы MG-90S (рисунок 7). Это тоже цифровые сервоприводы с металлическими шестеренками и шарикоподшипник на выходном валу, они обеспечивают усилие 1,8кг/см и точную отработку позиции. Весит один сервопривод 13,4 грамма при размерах 22,8 х 12,2 х 28,5мм, напряжение питания от 4,8 до 6,0 вольт.

Рисунок 6. Сервопривод MG-995 Рисунок 7. Сервопривод MG90S

Подшипник размером 30х55х13 используется для облегчения поворота основания руки – манипулятора с грузом (рисунок 8). На рисунке 9 показано поворотное устройство с сервоприводом манипулятора в сборе.

Чертежи в приложении на рисунке 18 необходимо распечатать в масштабе 1:1, а чертежи на рисунке 19 необходимо увеличить в 2 раза.

Рисунок 8. Установка подшипника.

Рисунок 9. Поворотное устройство в сборе.

Рисунок 10. Основание руки – манипулятора в сборе.

Рисунок 11. Детали для сборки захвата. Рисунок 12. Захват в сборе.

    1. Электронная начинка манипулятора

Есть такой открытый проект, который называется Arduino. Основа этого проекта – базовый аппаратный модуль и программа, в которой можно написать код для контроллера на специализированном языке, и которая позволяет этот модуль подключить и запрограммировать.

Для работы с манипулятором использовали плату Arduino UNO R3 (рисунок 13) и совместимую плату расширения для подключения сервоприводов (рисунок 15). На нем установлен стабилизатор 5 вольт, для питания сервоприводов, PLS-контакты для подключения сервоприводов и разъем для подключения переменных резисторов. Питание осуществляется от блока 9В, 3А.

Рисунок 13. Плата контроллера Arduino UNO R3.

Принципиальная схема расширения для платы контроллера Arduino UNO R3 разрабатывалась с учетом поставленных задач (рисунок 14).



Рисунок 14. Принципиальная схема платы расширения для контроллера.



Монтажная плата для расширения контроллера Arduino UNO R3 изображена на рисунке 15.

Рисунок 15. Плата расширения для контроллера.

Подключаем плату Arduino UNO R3 с помощью кабеля USB A-B к компьютеру, устанавливаем необходимые настройки в среде программирования, составляем программу (скетч) для работы сервоприводов используя библиотеки Arduino. Компилируем (проверяем) скетч, затем загружаем в контроллер (рисунок 16). Программный код для настройки манипулятора находится в приложении таблица 2.

Рисунок 16. Окно программы Arduino ID со скетчем.

Калибровка заключается в указании крайних значений угла поворота для каждого сервопривода, так чтобы детали не мешали их движениям.

Отсоедините все сервоприводы от Trema-Power Shield, загрузите скетч и подключите питание.

Откройте монитор последовательного порта.

В мониторе будут отображаться углы поворота каждого сервопривода (в градусах).

Подключите первый сервопривод (управляющий вращением основания) к выводу D3.

Поворот ручки первого Trema-потенциометра (вывод A0) приведёт к повороту первого сервопривода (вывод D3), а в мониторе изменится значение текущего угла этого сервопривода (значение: A0 = ... ). Крайние положения первого сервопривода будут лежать в диапазоне, от 10 до 170 градусов (как написано в первой строке кода loop). Этот диапазон можно изменить, заменив значения последних двух аргументов функции map() в первой строке кода loop, на новые. Например, заменив 170 на 180, Вы увеличите крайнее положение сервопривода в данном направлении. А заменив 10 на 20, Вы уменьшите другое крайнее положение того же сервопривода.

Если Вы заменили значения, то нужно заново загрузить скетч. Теперь сервопривод будет поворачиваться в новых, заданных Вами, пределах.

Подключите второй сервопривод (управляющий поворотом левого плеча) к выводу D5.

Поворот ручки второго Trema-потенциометра (вывод A1) приведёт к повороту второго сервопривода (вывод D5), а в мониторе изменится значение текущего угла этого сервопривода (значение: A1 = ...). Крайние положения второго сервопривода будут лежать в диапазоне, от 80 до 170 градусов (как написано во второй строке кода loop скетча). Этот диапазон изменяется, так же как и для первого сервопривода.

Если Вы заменили значения, то нужно заново загрузить скетч.

Подключите третий сервопривод (управляющий поворотом правого плеча) к выводу D6. и аналогичным образом осуществите его калибровку.

Подключите четвертый сервопривод (управляющий захватом) к выводу D9. и аналогичным образом осуществите его калибровку.

Калибровку достаточно выполнить 1 раз, после сборки манипулятора. Внесённые Вами изменения (значения предельных углов) сохранятся в файле скетча.

Тестирование работы роботизированной руки

Подайте питание на плату Arduino через порт USB с вашего компьютера и откройте окно монитора последовательной связи – в нем вы увидите приветственное сообщение.

Теперь введите R в окне монитора последовательной связи и нажмите ввод. Внизу монитора последовательной связи должна быть установлена опция Newline. Пример работы программы в этом режиме показан на следующем рисунке:

Информация, показанная на этом рисунке, может быть использована для отладки. Цифры, начинающиеся с 69, это текущая позиция сервомоторов с 0-го до 5-го. Значения индекса – это размер массива. Помните, что максимальный размер массива ограничен 700 числами, поэтому старайтесь не превышать этот размер. После того как вы завершите запись, нажмите P и ввод в окне монитора последовательной связи и программа переключится в режим воспроизведения и на экране тогда появится примерно следующая картина:



Во время режима воспроизведения роботизированная рука будет повторять те же самые движения, которые она совершала в режиме записи. Эти движения она будет выполнять снова и снова до тех пор пока вы не прервете ее работу из окна монитора последовательной связи.

  1. Заключение

Данная модель манипулятора, отличается низкой себестоимостью, от таких как простой конструктор «Уткоробот» который выполняет 2 движения и стоит 1102 рублей, или Лего - конструктор «Полицейский участок» стоимостью 8429 рублей. Конструктор «Манипулятор на Ардуино с памятью» выполняет 5 движений и стоит 2384 рубля.

Низкая себестоимость способствовала разработке технического конструктора манипулятора, на примере которой наглядно продемонстрирован принцип работы манипулятора, выполнение поставленных задач в игровой форме.

Принцип работы в среде программирования Arduino отлично зарекомендовал себя на испытаниях. Такой способ управления и обучения программированию в игровой форме не только возможен, но и эффективен.

  1. Источники информации

Литература:

  1. Гололобов Н. В.О проекте Arduino для школьников. Москва. 2011.

  2. Курт Е. Д. Введение в микроконтроллеры с Перевод на русский язык Т. Волкова. 2012.

  3. Белов А. В. Самоучитель разработчика устройств на микроконтроллерах AVR. Наука и техника, Санкт-Петербург, 2008.



Интернет ресурс:

  1. http://www.customelectronics.ru/robo-ruka-sborka-mehaniki - манипулятор на гусеничном ходу.

  2. http://robocraft.ru/blog/electronics/660.html - манипулятор по Bluetooth.

  3. http://robocraft.ru/blog/mechanics583.html - ссылка на статью и видео.

  4. http://edurobots.ru/category/uroki - Arduino для начинающих.



Программное обеспечение:

  1. Компьютерная программа Inkscape, версия - 0.92.3 - (векторный графический редактор).

  2. Компьютерная программа AutoCAD, версия 2013, (трёхмерная система автоматизированного проектирования и черчения).

  3. Компьютерная программа Arduino ID, версия 1.8.6, (открытая среда программирования.)



  1. Приложение


Рисунок 17. Фотография «Манипулятора на Ардуино с памятью»

Рисунок 18. Чертеж основания манипулятора

Рисунок 19. Чертеж стрелы и захвата манипулятора.

Таблица 1.

// Программный код для калибровки манипулятора

#include // Подключаем библиотеку Servo для работы с сервоприводами

Servo servo1; // Объявляем объект servo1 для работы с сервоприводом основания

Servo servo2; // Объявляем объект servo2 для работы с сервоприводом левого плеча

Servo servo3; // Объявляем объект servo3 для работы с сервоприводом правого плеча

Servo servo4; // Объявляем объект servo4 для работы с сервоприводом захвата

int valR1, valR2, valR3, valR4; // Объявляем переменные для хранения значений потенциометров

// Назначаем выводы:

const uint8_t pinR1 = A2; // Определяем константу с № вывода потенциометра управл. основанием

const uint8_t pinR2 = A3; // Определяем константу с № вывода потенциометра управл. левым плечом

const uint8_t pinR3 = A4; // Определяем константу с № вывода потенциометра управл. правым плечом

const uint8_t pinR4 = A5; // Определяем константу с № вывода потенциометра управл. захватом

const uint8_t pinS1 = 10; // Определяем константу с № вывода сервопривода основания

const uint8_t pinS2 = 9; // Определяем константу с № вывода сервопривода левого плеча

const uint8_t pinS3 = 8; // Определяем константу с № вывода сервопривода правого плеча

const uint8_t pinS4 = 7; // Определяем константу с № вывода сервопривода захвата

void setup()

{

Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта

servo1.attach(pinS1); // Назначаем объекту servo1 управление сервоприводом 1

servo2.attach(pinS2); // Назначаем объекту servo2 управление сервоприводом 2

servo3.attach(pinS3); // Назначаем объекту servo3 управление сервоприводом 3

servo4.attach(pinS4); // Назначаем объекту servo4 управление сервоприводом 4

}

void loop()

{

valR1=map(analogRead(pinR1), 0, 1024, 10, 170);

servo1.write(valR1); // Вращаем основанием. Указанные в данной строке углы: 10 и 170 возможно потребуется изменить (откалибровать)

valR2=map(analogRead(pinR2), 0, 1024, 80, 170);

servo2.write(valR2); // Управляем левым плечом. Указанные в данной строке углы: 80 и 170 возможно потребуется изменить (откалибровать)

valR3=map(analogRead(pinR3), 0, 1024, 60, 170);

servo3.write(valR3); // Управляем правым плечом. Указанные в данной строке углы: 60 и 170 возможно потребуется изменить (откалибровать)

valR4=map(analogRead(pinR4), 0, 1024, 40, 70);

servo4.write(valR4); // Управляем захватом. Указанные в данной строке углы: 40 и 70 возможно потребуется изменить (откалибровать)

Serial.println((String) "A1 = "+valR1+",\t A2 = "+valR2+", \t A3 = "+valR3+", \t A4 = "+valR4); // Выводим углы в монитор

}



Таблица 2.

// Программный код для манипулятора с памятью

#include //Servo header file

//Declare object for 5 Servo Motors

Servo Servo_0;

Servo Servo_1;

Servo Servo_2;

Servo Servo_3;

Servo Gripper;

//Global Variable Declaration

int S0_pos, S1_pos, S2_pos, S3_pos, G_pos;

int P_S0_pos, P_S1_pos, P_S2_pos, P_S3_pos, P_G_pos;

int C_S0_pos, C_S1_pos, C_S2_pos, C_S3_pos, C_G_pos;

int POT_0,POT_1,POT_2,POT_3,POT_4;

int saved_data[700]; //Array for saving recorded data

int array_index=0;

char incoming = 0;

int action_pos;

int action_servo;

void setup() {

Serial.begin(9600); //Serial Monitor for Debugging

//Declare the pins to which the Servo Motors are connected to

Servo_0.attach(3);

Servo_1.attach(5);

Servo_2.attach(6);

Servo_3.attach(9);

Gripper.attach(10);

//Write the servo motors to initial position

Servo_0.write(80);

Servo_1.write(168);

Servo_2.write(133);

Servo_3.write(60);

Gripper.write(100);

Serial.println("Press 'R' to Record and 'P' to play"); //Instruct the user

}

void Read_POT() //Function to read the Analog value form POT and map it to Servo value

{

POT_0 = analogRead(A0); POT_1 = analogRead(A1); POT_2 = analogRead(A2); POT_3 = analogRead(A3); POT_4 = analogRead(A4); //Read the Analog values form all five POT

S0_pos = map(POT_0,0,1024,10,170); //Map it for 1st Servo (Base motor)

S1_pos = map(POT_1,0,1024,115,170); //Map it for 2nd Servo (Hip motor)

S2_pos = map(POT_2,0,1024,85,150); //Map it for 3rd Servo (Shoulder motor)

S3_pos = map(POT_3,0,1024,30,120); //Map it for 4th Servo (Neck motor)

G_pos = map(POT_4,0,1024,35,140); //Map it for 5th Servo (Gripper motor)

}

void Record() //Function to Record the movements of the Robotic Arm

{

Read_POT(); //Read the POT values for 1st time

//Save it in a variable to compare it later

P_S0_pos = S0_pos;

P_S1_pos = S1_pos;

P_S2_pos = S2_pos;

P_S3_pos = S3_pos;

P_G_pos = G_pos;

Read_POT(); //Read the POT value for 2nd time

if (P_S0_pos == S0_pos) //If 1st and 2nd value are same

{

Servo_0.write(S0_pos); //Control the servo

if (C_S0_pos != S0_pos) //If the POT has been turned

{

saved_data[array_index] = S0_pos + 0; //Save the new position to the array. Zero is added for zeroth motor (for understading purpose)

array_index++; //Increase the array index

}

C_S0_pos = S0_pos; //Saved the previous value to check if the POT has been turned

}

//Similarly repeat for all 5 servo Motors

if (P_S1_pos == S1_pos)

{

Servo_1.write(S1_pos);

if (C_S1_pos != S1_pos)

{

saved_data[array_index] = S1_pos + 1000; //1000 is added for 1st servo motor as differentiator

array_index++;

}

C_S1_pos = S1_pos;

}

if (P_S2_pos == S2_pos)

{

Servo_2.write(S2_pos);

if (C_S2_pos != S2_pos)

{

saved_data[array_index] = S2_pos + 2000; //2000 is added for 2nd servo motor as differentiator

array_index++;

}

C_S2_pos = S2_pos;

}

if (P_S3_pos == S3_pos)

{

Servo_3.write(S3_pos);

if (C_S3_pos != S3_pos)

{

saved_data[array_index] = S3_pos + 3000; //3000 is added for 3rd servo motor as differentiater

array_index++;

}

C_S3_pos = S3_pos;

}

if (P_G_pos == G_pos)

{

Gripper.write(G_pos);

if (C_G_pos != G_pos)

{

saved_data[array_index] = G_pos + 4000; //4000 is added for 4th servo motor as differentiator

array_index++;

}

C_G_pos = G_pos;

}

//Print the value for debugging

Serial.print(S0_pos); Serial.print(" "); Serial.print(S1_pos); Serial.print(" "); Serial.print(S2_pos); Serial.print(" "); Serial.print(S3_pos); Serial.print(" "); Serial.println(G_pos);

Serial.print ("Index = "); Serial.println (array_index);

delay(100);

}

void Play() //Functon to play the recorded movements on the Robotic ARM

{

for (int Play_action=0; Play_action

{

action_servo = saved_data[Play_action] / 1000; //The fist character of the array element is split for knowing the servo number

action_pos = saved_data[Play_action] % 1000; //The last three characters of the array element is split to know the servo postion

switch(action_servo){ //Check which servo motor should be controlled

case 0: //If zeroth motor

Servo_0.write(action_pos);

break;

case 1://If 1st motor

Servo_1.write(action_pos);

break;

case 2://If 2nd motor

Servo_2.write(action_pos);

break;

case 3://If 3rd motor

Servo_3.write(action_pos);

break;

case 4://If 4th motor

Gripper.write(action_pos);

break;

}

delay(50);

}

}

void loop() {

if (Serial.available() 1) //If something is received from serial monitor

{

incoming = Serial.read();

if (incoming == 'R')

Serial.println("Robotic Arm Recording Started......");

if (incoming == 'P')

Serial.println("Playing Recorded sequence");

}

if (incoming == 'R') //If user has selected Record mode

Record();

if (incoming == 'P') //If user has selected Play Mode

Play();

}





24




Скачать

Рекомендуем курсы ПК и ППК для учителей

Вебинар для учителей

Свидетельство об участии БЕСПЛАТНО!