Муниципальное бюджетное учреждение
дополнительного образования «Станция юных техников»
города Каменск-Шахтинский
Принята на методическом совете
Протокол №______ от «___» _________ 20___г
Самобалансирующий робот Методическая разработка
(Для учащихся 1 года обучения робототехнических объединений учреждений дополнительного образования)
Автор: Барышев Е. В.
педагог дополнительного образования.
2023 г.
Оглавление
| Пояснительная записка | 3 |
1. | Основная часть | 4 |
| Как работает балансировка? | 4 |
| Материалы и инструменты | 5 |
| Создание робота. | 5 |
| Механическая начинка модели | 5 |
| Электронная начинка модели | 7 |
| Схема робота. | 7 |
| Теория настройки | 8 |
| Программный код самобалансирующего робота. | 8 |
2. | Заключение | 11 |
3 | Источники информации | 12 |
4 | Приложение | 13 |
-
Пояснительная записка
Можно ли создать робота, используя Ардуино, который балансирует как Сигвей.
Сигвей от англ. Segway – двухколесное средство передвижения, оснащенное электроприводом. Еще их называют гироскутерами или электрическими самокатами.
Вы когда-нибудь задумывались, как работает Сигвей? В этом методической разработке рассказывается, как сделать робота, который уравновешивает себя точно так же, как Segway.
В методической разработке рассмотрены такие вопросы как:
Методическая разработка является частью приложения к образовательной программе «Робототехника», (первый год обучения, раздел 1 «Основы конструирования роботов»), рассчитана на учащихся 12 – 13 лет и направлена на достижение следующих целей и задач:
Образовательные:
Развивающие:
Воспитывающие:
-
воспитание всестороннего интереса учащихся в опытной, поисковой, исследовательской работе, побуждение к углубленному изучению различных областей науки и техники;
Указанные цели достигаются через особую организацию образовательного пространства и:
-
влияют на разные аспекты и стороны личности,
-
формируют у учащихся научные взгляды, творческое мышление, трудолюбие, высокие нравственные качества;
-
пропаганде научных знаний, достижений мировой науки и техники.
1.Основная часть
Как работает балансировка?
Чтобы сбалансировать робота, двигатели должны противодействовать падению робота. Это действие требует обратной связи и корректирующих элементов. Элемент обратной связи - гироскоп-акселерометр MPU6050, который обеспечивает как ускорение, так и вращение во всех трех осях (основы MP26050 I2C). Ардуино использует это, чтобы знать текущую ориентацию робота. Корректирующим элементом является комбинация двигателя и колеса.
Самобалансирующийся робот по существу является перевернутым маятником. Он может быть лучше сбалансирован, если центр массы выше относительно колесных осей. Высший центр масс означает более высокий момент инерции массы, что соответствует более низкому угловому ускорению (более медленное падение). Вот почему батарейный отсек расположен наверх. Однако высота робота была выбрана исходя из наличия материалов.
Рисунок 1.
MPU6050 содержит трёх-осевой акселерометр и трёх-осевой гироскоп. Акселерометр измеряет ускорение по трем осям, а гироскоп измеряет угловую скорость по трем осям. Чтобы измерить угол наклона робота, нам нужны значения ускорения по осям y и z. Функция atan2(y, z) возвращает угол в радианах между положительной осью z плоскости и точкой, заданной координатами (z, y) на этой плоскости. Функция возвращает положительное число, когда y 0 и отрицательное, когда y
Материалы и инструменты
Создание робота.
3D вид модели робота и детали находится в приложении, рисунок 8.
Для изготовления модели применялся следующий инструмент, материал и детали заводского производства:
-
Компьютер и 3D принтер.
-
Пластик для 3D принтера – 200 гр.
-
2 колеса, диаметром 40мм, шириной 20мм.
-
Редукторы заводского производства - 2шт.
-
Текстолит фольгированный размером 60х70мм.
-
Набор радиодеталей для плат (см. принципиальную схему).
-
Модуль GY-521 с MPU-6050.
-
Модуль драйвера мотора DRV8833.
-
Ультразвуковой дальномер HC-SR05.
-
18650 li-ion аккумулятор 2 шт.
-
Кассета для двух аккумуляторов 18650.
Механическая начинка модели
При разработке чертежей учитывалось, что изготовление шасси и корпуса модели робота будет на 3D принтере (рис 3). Корпус модели состоит из трех частей, верхней, средней и нижней рамы (рис. 2). Модель разрабатывалась на колесном шасси [1, 20].
Рисунок 2.
Колесное шасси, построено по стандартной схеме и состоит из двух редукторов с передачей вращения 1:200, драйвера ходовых двигателей [4],которые крепится к раме снизу.
В средней части рамы располагаются модуль GY-521 с MPU-6050, контроллер и. На верхней части рамы, кассета для аккумуляторов и выключатель.
Все детали рамы смоделированы в компьютерной программе Autodesk 3ds Max. Фотографии деталей показаны в приложении на рисунках 9 - 13.
STL файлы можно скачать по ссылке: https://disk.yandex.ru/d/PnULC2aDIibFWg .
Рисунок 3.
Электронная начинка модели
Схема робота.
Основные блоки управления моделью робота для соревнований построены на самодельных платах, всего их две. Плата контроллера марки Atmega 328 PU с драйвером двигателей на микросхеме L293D и плата датчиков линии на микросхеме марки 74HC14 [2]. Принципиальная схема электроники изображена на рисунке 4 и 5, монтажные платы на рисунке 6 и 7 показаны со стороны деталей.
Программный код (скетч) для прохождения трассы представлен в приложении, таблица 1. После загрузки скетча в контроллер необходимо отладить программную часть под данную механику. Загрузка программы в контроллер производится с помощью программатора Arduino ISP в среде Arduino 1.05 [6].
Ультразвуковой дальномер HC-SR05. Дальномер имеет четыре контакта: Vcc, Trig, Echo и Gnd. Напряжение питания 5В. Контакты триггера и эхо подключены к цифровым выводам Arduino 9 и 8 соответственно. Для получения данных о расстоянии используется библиотека NewPing. Расстояние будет считываться один раз каждые 100 миллисекунд. Если значение будет в диапазоне от 0 до 20 см, на моторы поступит команда вращения.
Рисунок 4. Принципиальная схема электроники робота.
Теория настройки
В теории управления, удерживая некоторую переменную (в данном случае позицию робота), требуется специальный контроллер, называемый ПИД (пропорциональная интегральная производная). Каждый из этих параметров имеет «прирост», обычно называемый Kp, Ki и Kd. PID обеспечивает коррекцию между желаемым значением (или входом) и фактическим значением (или выходом). Разница между входом и выходом называется «ошибкой».
ПИД-регулятор уменьшает погрешность до наименьшего возможного значения, постоянно регулируя выход. В нашем самобалансирующем роботе Arduino вход (который является желаемым наклоном в градусах) устанавливается программным обеспечением. MPU6050 считывает текущий наклон робота и подает его на алгоритм PID, который выполняет вычисления для управления двигателем и удерживает робота в вертикальном положении.
PID требует, чтобы значения Kp, Ki и Kd были настроены на оптимальные значения. Инженеры используют программное обеспечение, такое как MATLAB, для автоматического вычисления этих значений. К сожалению, мы не можем использовать MATLAB в нашем случае, потому что это еще больше усложнит проект. Вместо этого мы будем настраивать значения PID. Вот как это сделать:
-
Установить Kp, Ki и Kd равными нулю.
-
Настройка Kp. Слишком маленький Kp заставит робота упасть, потому что исправления недостаточно. Слишком много Kp заставляет робота идти дико вперед и назад. Хороший Kp сделает так, что робот будет совсем немного отклоняться назад и вперед (или немного осциллирует).
-
Настройка Kd. Хорошее значение Kd уменьшит колебания, пока робот не станет почти устойчивым. Кроме того, правильное Kd будет удерживать робота, даже если его толькать.
-
Настройка Ki. При включении робот будет колебаться, даже если Kp и Kd установлены, но будет стабилизироваться во времени. Правильное значение Ki сократит время, необходимое для стабилизации робота.
Программный код самобалансирующего робота.
Нам понадобилось четыре внешних библиотеки, для создания робота. Библиотека PID упрощает вычисление значений P, I и D. Библиотека LMotorController используется для управления двумя двигателями. Библиотека I2Cdev и библиотека MPU6050_6_Axis_MotionApps20 предназначены для чтения данных с MPU6050. Программный код взят с сайта: https://github.com/kurimawxx00/arduino-self-balancing-robot .
#include
#include
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
#define MIN_ABS_SPEED 20
MPU6050 mpu;
// MPU control/status vars
bool dmpReady = false; // set true if DMP init was successful
uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount; // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer
Quaternion q;
VectorFloat gravity;
float ypr[3];
//PID
double originalSetpoint = 173;
double setpoint = originalSetpoint;
double movingAngleOffset = 0.1;
double input, output;
//adjust these values to fit your own design
double Kp = 50;
double Kd = 1.4;
double Ki = 60;
PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
double motorSpeedFactorLeft = 0.6;
double motorSpeedFactorRight = 0.5;
//MOTOR CONTROLLER
int ENA = 5;
int IN1 = 6;
int IN2 = 7;
int IN3 = 8;
int IN4 = 9;
int ENB = 10;
LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight);
volatile bool mpuInterrupt = false;
void dmpDataReady()
{
mpuInterrupt = true;
}
void setup()
{
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
mpu.initialize();
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
if (devStatus == 0)
{
mpu.setDMPEnabled(true);
// enable Arduino interrupt detection
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
//setup PID
pid.SetMode(AUTOMATIC);
pid.SetSampleTime(10);
pid.SetOutputLimits(-255, 255);
}
else
{
// ERROR!
// 1 = initial memory load failed
// 2 = DMP configuration updates failed
// (if it's going to break, usually the code will be 1)
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
}
void loop()
{
// if programming failed, don't try to do anything
if (!dmpReady) return;
// wait for MPU interrupt or extra packet(s) available
while (!mpuInterrupt && fifoCount
{
//no mpu data - performing PID calculations and output to motors
pid.Compute();
motorController.move(output, MIN_ABS_SPEED);
}
// reset interrupt flag and get INT_STATUS byte
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
// get current FIFO count
fifoCount = mpu.getFIFOCount();
// check for overflow (this should never happen unless our code is too inefficient)
if ((mpuIntStatus & 0x10) || fifoCount == 1024)
{
// reset so we can continue cleanly
mpu.resetFIFO();
Serial.println(F("FIFO overflow!"));
// otherwise, check for DMP data ready interrupt (this should happen frequently)
}
else if (mpuIntStatus & 0x02)
{
// wait for correct available data length, should be a VERY short wait
while (fifoCount
// read a packet from FIFO
mpu.getFIFOBytes(fifoBuffer, packetSize);
// track FIFO count here in case there is 1 packet available
// (this lets us immediately read more without waiting for an interrupt)
fifoCount -= packetSize;
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
input = ypr[1] * 180/M_PI + 180;
}
}
Значения Kp, Ki, Kd могут работать или не работать. Если они этого не делают, выполните шаги, описанные выше. Обратите внимание, что наклона в коде установлен на 173 градуса. Вы можете изменить это значение, если хотите, но обратите внимание, что это угол наклона, которым должен поддерживаться роботом. Кроме того, если ваши двигатели слишком быстры, вы можете отрегулировать значения motorSpeedFactorLeft и motorSpeedFactorRight.
-
Заключение
Данная методическая разработка была апробирована в робототехническом объединении учащимися 1 года обучения.
После испытания первой модели самобалансирующего робота были созданы еще шесть моделей и проводились соревнования в объединении с учащимися 5-6 классов.
Простота в сборке модели самобалансирующего робота, в сочетании с готовыми программными кодами, позволило учащимся в конце урока увидеть собранную своими руками модель, которая после отладки выполняла поставленную ими же самими задачу.
Творческая работа над практическими заданиями способствует изучению составляющих современных спортивных роботов, а программная среда Arduino ID позволит легко и эффективно изучить алгоритмизацию и программирование.
Потратив немного больше времени на настройку ПИД, можно получить результат ещё лучше. Небольшой размер робота также ограничивает уровень стабильности. Тем не менее, я полагаю, робот неплохо справляется с задачей балансировки на различных поверхностях.
-
Источники информации
Литература:
-
Рядчиков И. В., Синица С. Г., Брагин Б. О., Шепилов В. В., Пузановский К. В. Создание робота автономного движения по линии [Текст] // Технические науки: проблемы и перспективы: материалы III Междунар. науч. конф. (г. Санкт-Петербург, июль 2015 г.). — СПб.: Свое издательство, 2015. — С. 19-25.
-
Белов А. В. Самоучитель разработчика устройств на микроконтроллерах AVR. – СПб.: Наука и Техника, 2008. – 544 с.: ил.
-
Филиппов С. А. Робототехника для детей и родителей. — СПб.: Наука, 2013. 319 с.
-
Страковский Д. А., Симаков Е. Е. Создание робота-гонщика на платформе Arduino // Юный ученый. — 2016. — №3. — С. 120-124.
-
Мобильные минироботы. Электронный ресурс. Режим доступа //http://www.railab.ru/images/begin/course/materials/course3/metod3.htm.
-
Программирование микроконтроллеров AVR с помощью Arduino на примере ATmega8. Электронный ресурс. Режим доступа //http://andreyandreich.ru/atmega8-microcontroller.
-
Приложение
Рисунок 5.
Рисунок 6.
Рисунок 7.
Рисунок 8.
Рисунок 9.