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

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

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

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

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

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

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

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

Итоги урока

Самобалансирующий робот

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

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

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

Просмотр содержимого документа
«Самобалансирующий робот»

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

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

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





Принята на методическом совете

Протокол №______ от «___» _________ 20___г





Самобалансирующий робот Методическая разработка

(Для учащихся 1 года обучения робототехнических объединений учреждений дополнительного образования)

Автор: Барышев Е. В.

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





2023 г.


Оглавление




Пояснительная записка 3
1. Основная часть 4

Как работает балансировка? 4

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

5

Создание робота.

5

Механическая начинка модели

5


Электронная начинка модели

7


Схема робота.

7


Теория настройки

8


Программный код самобалансирующего робота.

8

2.

Заключение

11

3

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

12

4

Приложение

13





  1. Пояснительная записка

Можно ли создать робота, используя Ардуино, который балансирует как Сигвей.

Сигвей от англ. Segway – двухколесное средство передвижения, оснащенное электроприводом. Еще их называют гироскутерами или электрическими самокатами.

Вы когда-нибудь задумывались, как работает Сигвей? В этом методической разработке рассказывается, как сделать робота, который уравновешивает себя точно так же, как Segway.

В методической разработке рассмотрены такие вопросы как:

  • Как работает балансировка?

  • Создание робота.

  • Схема робота.

  • Теория настройки.

  • Программный код самобалансирующего робота.

Методическая разработка является частью приложения к образовательной программе «Робототехника», (первый год обучения, раздел 1 «Основы конструирования роботов»), рассчитана на учащихся 12 – 13 лет и направлена на достижение следующих целей и задач:

Образовательные:

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

Развивающие:

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

Воспитывающие:

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

Указанные цели достигаются через особую организацию образовательного пространства и:

  • влияют на разные аспекты и стороны личности,

  • формируют у учащихся научные взгляды, творческое мышление, трудолюбие, высокие нравственные качества;

  • пропаганде научных знаний, достижений мировой науки и техники.

1.Основная часть

Как работает балансировка?

Чтобы сбалансировать робота, двигатели должны противодействовать падению робота. Это действие требует обратной связи и корректирующих элементов. Элемент обратной связи - гироскоп-акселерометр MPU6050, который обеспечивает как ускорение, так и вращение во всех трех осях (основы MP26050 I2C). Ардуино использует это, чтобы знать текущую ориентацию робота. Корректирующим элементом является комбинация двигателя и колеса.

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

Рисунок 1.

MPU6050 содержит трёх-осевой акселерометр и трёх-осевой гироскоп. Акселерометр измеряет ускорение по трем осям, а гироскоп измеряет угловую скорость по трем осям. Чтобы измерить угол наклона робота, нам нужны значения ускорения по осям y и z. Функция atan2(y, z) возвращает угол в радианах между положительной осью z плоскости и точкой, заданной координатами (z, y) на этой плоскости. Функция возвращает положительное число, когда y 0 и отрицательное, когда y





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

Создание робота.

3D вид модели робота и детали находится в приложении, рисунок 8.

Для изготовления модели применялся следующий инструмент, материал и детали заводского производства:

  1. Компьютер и 3D принтер.

  2. Пластик для 3D принтера – 200 гр.

  3. 2 колеса, диаметром 40мм, шириной 20мм.

  4. Редукторы заводского производства - 2шт.

  5. Текстолит фольгированный размером 60х70мм.

  6. Набор радиодеталей для плат (см. принципиальную схему).

  7. Модуль GY-521 с MPU-6050.

  8. Модуль драйвера мотора DRV8833.

  9. Ультразвуковой дальномер HC-SR05.

  10. 18650 li-ion аккумулятор 2 шт.

  11. Кассета для двух аккумуляторов 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. Вот как это сделать:

  1. Установить Kp, Ki и Kd равными нулю.

  2. Настройка Kp. Слишком маленький Kp заставит робота упасть, потому что исправления недостаточно. Слишком много Kp заставляет робота идти дико вперед и назад. Хороший Kp сделает так, что робот будет совсем немного отклоняться назад и вперед (или немного осциллирует).

  3. Настройка Kd. Хорошее значение Kd уменьшит колебания, пока робот не станет почти устойчивым. Кроме того, правильное Kd будет удерживать робота, даже если его толькать.

  4. Настройка 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. Заключение

Данная методическая разработка была апробирована в робототехническом объединении учащимися 1 года обучения.

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

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

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

Потратив немного больше времени на настройку ПИД, можно получить результат ещё лучше. Небольшой размер робота также ограничивает уровень стабильности. Тем не менее, я полагаю, робот неплохо справляется с задачей балансировки на различных поверхностях.



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



Литература:

  1. Рядчиков И. В., Синица С. Г., Брагин Б. О., Шепилов В. В., Пузановский К. В. Создание робота автономного движения по линии [Текст] // Технические науки: проблемы и перспективы: материалы III Междунар. науч. конф. (г. Санкт-Петербург, июль 2015 г.). — СПб.: Свое издательство, 2015. — С. 19-25.

  2. Белов А. В. Самоучитель разработчика устройств на микроконтроллерах AVR. – СПб.: Наука и Техника, 2008. – 544 с.: ил.

  3. Филиппов С. А. Робототехника для детей и родителей. — СПб.: Наука, 2013. 319 с.

  4. Страковский Д. А., Симаков Е. Е. Создание робота-гонщика на платформе Arduino // Юный ученый. — 2016. — №3. — С. 120-124.

  5. Мобильные минироботы. Электронный ресурс. Режим доступа //http://www.railab.ru/images/begin/course/materials/course3/metod3.htm.

  6. Программирование микроконтроллеров AVR с помощью Arduino на примере ATmega8. Электронный ресурс. Режим доступа //http://andreyandreich.ru/atmega8-microcontroller.

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

Рисунок 5.

Рисунок 6.

Рисунок 7.

Рисунок 8.



Рисунок 9.


Скачать

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

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

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