Изготовление передвижного робота с манипулятором
Секция: Технические науки
III Студенческая международная научно-практическая конференция «Технические и математические науки. Студенческий научный форум»
Изготовление передвижного робота с манипулятором
Введение
Одно из ведущих направлений современной науки является робототехника. По всей России и всему миру проводятся состязания и конкурсы роботов для студентов, школьников и просто заинтересованных в этой сфере людей. Робототехника – это прикладная наука, опирающаяся на такие дисциплины, как информатика, электроника, математика, физика и механика. Целью данной работы является создание робота с дистанционным управлением на базе платформы Arduino.
Одним из самых распространенных видов роботов являются роботы- манипуляторы. Этапы его создания можно разделить на несколько основных частей:
· Проектирование
· Подготовка нужных комплектующих
· Сборка
· Программирование
Проектирование
Основной задачей в проекте было сделать дистанционное управление роботом. Для этого разделим наш проект на две части: передатчик (пульт управления) и приемник (передвижная платформа с манипулятором). В качестве «мозгов» решено было взять платы Arduino. Для приемника Arduino MEGA, так как он обладает большим количеством выходов, как аналоговых, так и цифровых, большим объёмом памяти в чипе контроллера. А для передатчика была взята Arduino NANO. Что бы осуществить дистанционный обмен информацией между платами был взят модуль беспроводной связи NRF24L01. Для управления угла поворота сервоприводов руки манипулятора решено было взять 4 потенциометра, и преобразовывая аналоговое значение изменения сопротивления в цифровое, отправлять цифровые данные на приемник. Управление моторами платформы происходит по аналогичному принципу, только в качестве контроллера выступает модуль с джойстиком. Так как напрямую к плате Arduino подключать моторы не имеет смысла, для управления их скоростью и направлением вращения решено было взять драйвер двигателя постоянного тока L298n.
Сборка робота
Для изготовления передвижного робота с манипулятором, в качестве платформы была выбрана четырехколесная база с двигателями постоянного тока. Рука манипулятор имеет 4 сервопривода SG90. Так как сервоприводам нужно отдельное питание, то было решено использовать литий-ионную батарею 18650 на 3400 мАч. Все плюсы сервоприводов спаиваем и подключаем к плюсу батареи, а минусы сервоприводов подключаем к минусу батареи и соединяем с общим минусом. Моторы и плата Arduino MEGA были запитаны от литий-полимерного аккумулятора с напряжением 7.4В и емкостью 610 мАч.
Рисунок 1. Схема сборки приемника
Драйвер двигателя постоянного тока L298n имеет 2 входа для двигателей, поэтому на левой и правой стороне соединяем плюсы и минусы двух моторов и после этого подключаем к L298n. Так же в процессе сборки выяснилось, что крепление захвата у манипулятора сделано некачественно, и болт постоянно откручивается при вращении. Поэтому пришлось изменить конструкцию крепления и установить подшипник.
Рисунок 2. Передвижной робот с манипулятором
Сборка пульта управления (передатчика)
Так как в пульте управления используется 6 аналоговых и 5 цифровых входов, было решено использовать небольшую плату Arduino NANO. Питание джойстика и потенциометров происходит от разъёма 5V расположенного на плате. Модуль беспроводной связи NRF24L01 питается от 3.3В. Однако в результате экспериментов было выявлено, что Arduino NANO не выдает данного напряжения на выходе 3.3V, и из-за этого передача информации происходит нестабильно. Для решения данной проблемы был куплен адаптер nrf24l01, который преобразовывает напряжение 5В в 3.3В, и затем подключим его к общему проводу питания для потенциометров. Питание всей этой схемы происходит от литий-полимерного аккумулятора с напряжением 7.4В и емкостью 610 мАч, плюс которого мы припаяли к двухпозиционному переключателю, для включения и выключения пульта. Подключение управляющих входов указано на рисунке 3.
Рисунок 3. Схема сборки передатчика
Для удобства использования пульта управления, он был помещен в пластиковый контейнер. При этом вывел наружу все потенциометры, джойстик и двухпозиционный переключатель, а все провода, платы и батарею оставили внутри.
Рисунок 4. Пульт дистанционного управления
Программирование передатчика
Язык программирования устройств Ардуино основан на C/C++. Он прост в освоении, и на данный момент Arduino — это, пожалуй, самый удобный способ программирования устройств на микроконтроллерах.
Рассмотрим программный код, загруженный на плату, т.к. это важная составляющая данного проекта:
#include <SPI.h>
#include "RF24.h"
RF24 radio(9,10);
const uint64_t pipe = 0xF0F0F0F000LL; int msg[3];
int pot_1 = A5; int mas_1; int pot_2 = A6; int mas_2; int pot_3 = A7; int mas_3;
int pot_4 = A4; int mas_4; int pot_5 = A3; int mas_5; int pot_6 = A2; int mas_6;
void setup(void) { radio.begin(); // запуск радио
radio.openWritingPipe(pipe); // открываем трубу на передачу
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS }
void loop() {mas_1 = analogRead(potpin_1),mas_1 = map(mas_1, 0, 1023, 0, 21),msg[0] = mas_1,radio.write(msg, 1); //Считываем аналоговое значение и переделываем в цифру
mas_4 = analogRead(potpin_4),mas_4 = map(mas_4, 0, 1023, 22, 43),msg[0] = mas_4,radio.write(msg, 1); //отправляем данные и указываем сколько байт пакет
mas_5 = analogRead(potpin_5),mas_5 = map(mas_5, 0, 1023, 44, 65),msg[0] = mas_5,radio.write(msg, 1);
mas_6 = analogRead(potpin_6),mas_6 = map(mas_6, 0, 1023, 66, 87),msg[0] = mas_6,radio.write(msg, 1);
mas_2 = analogRead(potpin_2),mas_2 = map(mas_2, 0, 1023, 128, 192),msg[0] = mas_2,radio.write(msg, 1); //джосйтик
mas_3 = analogRead(potpin_3),mas_3 = map(mas_3, 0, 1023, 193, 255),msg[0] = mas_3,radio.write(msg, 1); //джосйтик }
В данном коде каждый потенциометр и оси джойстика имеют свой цифровой диапазон. В зависимости от того, какие именно цифровые данные мы отправляем, должен поворачиваться определенный сервопривод.
Программирование приемника
Рассмотрим программный код, загруженный на плату приемника:
#include <servo.h>
#include <SPI.h>
#include "RF24.h"
Servo serprv1; Servo serprv2; Servo serprv3; Servo serprv4;//Имена Сервоприводов
RF24 radio(40,42); // Подключаем NRF24 к pin 40,42
const uint64_t pipe = 0xF0F0F0F000LL;
int msg[3]; //Переменная управления
int data; int data1; int pos;
int fspeed; int bspeed; int fspeed1; int bspeed1; // переменные управления скорости
const int in1 = 14; const int in2 = 15; const int in3 = 6; const int in4 = 5;
const int ena = 4; // PWM pin изменение скорости
const int enb = 7; // PWM pin изменение скорости
void setup() { pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(ena, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(enb, OUTPUT); // connection to L298n
serprv1.attach(8); serprv2.attach(9); serprv3.attach(10); serprv4.attach(11); // подключение сервоприводов к цифровым пинам 8,9,10,11 соответственно.
radio.begin(); //активировать модуль
radio.openReadingPipe(1,pipe); //хотим слушать трубу
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS }
void loop() { if (radio.available())radio.read(msg, 1); // проверяем что пришло в буфер // if (msg[0] <21 && msg[0] >-1)data = msg[0], pos = map(data, 0, 21, 10, 170),serprv1.write(pos); //Если мы получаем данные от 0 до 21(что соответствует первому потенциометру), то поворачивается первый сервопривод
if (msg[0] <43 && msg[0] >22)data = msg[0], pos = map(data, 22, 43, 10, 170),serprv2.write(pos); if (msg[0] <65 && msg[0] >44)data = msg[0], pos = map(data, 44, 65, 10, 170),serprv3.write(pos); if (msg[0] <87 && msg[0] >66)data = msg[0], pos = map(data, 66, 87, 10, 170),serprv4.write(pos); if (msg[0] >=128 && msg[0] <=156)data = msg[0], bspeed = map(data, 192, 164, -255, 255), backward(bspeed); //джосйтик
if (msg[0] >=164 && msg[0] <=192)data = msg[0], fspeed = map(data, 156, 128, -255, 255), forward(fspeed); //джосйтик
if (msg[0] >157 && msg[0] <163)data = msg[0], stop(); if (msg[0] >=193 && msg[0] <=221)data1 = msg[0], bspeed1 = map(data1, 255, 227, -255, 255), backward1(bspeed1); //джосйтик
if (msg[0] >=227 && msg[0] <=255)data1 = msg[0], fspeed1 = map(data1, 193, 221, -255, 255), forward1(fspeed1); //джосйтик }
void stop() { analogWrite(ena, 0); digitalWrite(in1, LOW); digitalWrite(in2, LOW); analogWrite(enb, 0); digitalWrite(in3, LOW); digitalWrite(in4, LOW); }
void forward(int fspeed) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(ena, bspeed); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enb, bspeed); }
void backward(int bspeed) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, fspeed); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enb, fspeed); }
void forward1(int fspeed1) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, fspeed1); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enb, fspeed1); }
void backward1(int bspeed1) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(ena, bspeed1); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enb, bspeed1); }
Заключение
Собранный робот-манипулятор на дистанционном управлении может передвигаться по различным типам поверхности. А также может поднимать и перевозить небольшие предметы. Для предотвращения выскальзывания из руки манипулятора, в дальнейшем предполагается наклейка шероховатой поверхности.