- Вибір деталей для самобалансуючого робота
- 3D-друк та складання нашого балансуючого робота
- Кругова діаграма
- Самобалансуючий код робота
- Робота самобалансуючого робота Arduino
Після натхнення моторами RYNO та іншими самобалансуючими скутерами від Segway, я завжди хотів побудувати щось своє власне Arduino Segway Robot. Думаючи на деякий час, я вирішив створити Самобалансуючого Робота за допомогою Arduino. Таким чином я міг би зрозуміти основну концепцію всіх цих скутерів, а також дізнатися, як працює алгоритм PID.
Почавши будувати, я зрозумів, що цього бота трохи складно будувати. Існує так багато варіантів, з яких можна вибрати, і, отже, плутанини починаються правильно від вибору двигунів і залишаються до настройки значень ПІД. І є так багато речей, які слід враховувати, такі як тип акумулятора, положення акумулятора, зчеплення з колесом, тип водія двигуна, підтримка CoG (Центр ваги) та багато іншого.
Але дозвольте мені розбити це вам, як тільки ви його побудуєте, ви погодитесь, що це не так складно, як здається. Тож погодьмось, у цьому підручнику я задокументую свій досвід побудови самобалансуючого робота. Ви можете бути абсолютно новачком, який тільки починає роботу, або, можливо, потрапив сюди після тривалого розчарування через те, що ваш бот не працює. Це місце має на меті стати вашим кінцевим пунктом призначення. Тож давайте почнемо……
Вибір деталей для самобалансуючого робота
Перш ніж я розповім вам усі варіанти побудови бота, дозвольте мені перерахувати елементи, які я використовував у цьому проекті самобалансуючого робота
- Arduino UNO
- Редукторні двигуни постійного струму (жовтий) - 2Ні
- Модуль драйвера двигуна L298N
- MPU6050
- Пара коліс
- Літій-іонний акумулятор 7,4 В
- Підключення проводів
- 3D друкований корпус
Ви можете змішувати та вибирати будь-який із вищезазначених компонентів, виходячи з доступності, щоб зробити власний набір роботів із самобалансуванням, лише переконайтесь, що компоненти відповідають наступним критеріям.
Контролер: контролером, яким я тут користувався, є Arduino UNO, чому тому, що він просто простий у використанні. Ви також можете використовувати Arduino Nano або Arduino mini, але я б рекомендував вам дотримуватися UNO, оскільки ми можемо програмувати його безпосередньо без будь-якого зовнішнього обладнання.
Двигуни: Найкращим вибором двигуна, який ви можете використовувати для самобалансуючого робота, без сумніву, буде кроковий мотор. Але щоб все було простіше, я використовував двигун постійного струму постійного струму. Так, не обов’язково мати степпер; бот чудово працює з цими дешевими загальнодоступними двигунами постійного струму жовтого кольору.
Драйвер двигуна: Якщо ви вибрали двигуни постійного струму, такі як мій, ви можете або використовувати драйверний модуль L298N, як я, або навіть L293D повинен працювати чудово. Дізнайтеся більше про управління двигуном постійного струму за допомогою L293D та Arduino.
Колеса: Не варто оцінювати цих хлопців; Мені було важко зрозуміти, що проблема в моїх колесах. Тож переконайтеся, що ваші колеса добре зчеплюються з підлогою, якою ви користуєтесь. Уважно стежте, ваш зчеплення ніколи не повинен дозволяти вашим колесам кататися на підлозі.
Акселерометр і гіроскоп: найкращим вибором акселерометра та гіроскопа для вашого бота буде MPU6050. Тому не намагайтеся побудувати такий за допомогою звичайного акселерометра, як ADXL345, або чогось подібного, він просто не спрацює. Чому ви дізнаєтесь в кінці цієї статті. Ви також можете переглянути нашу спеціальну статтю про використання MPU6050 з Arduino.
Акумулятор: нам потрібен максимально легкий акумулятор, а робоча напруга повинна бути більше 5 В, щоб ми могли живити наш Arduino безпосередньо без посилювального модуля. Отже, ідеальним вибором буде літій-полімерна батарея 7,4 В. Ось, оскільки у мене була 7,4 В літій-іонна батарея, я легко користувався нею. Але пам’ятайте, що Li-Po вигідніший, ніж Li-ion.
Шасі: Інше місце, де не слід іти на компроміси, - шасі ботів. Ви можете використовувати картон, дерево, пластик все, що вам добре. Але просто переконайтеся, що шасі міцне і не повинно хитатися, коли бот намагається збалансувати. Я розробив власне шасі на Solidworks на основі інших ботів і роздрукував його. Якщо у вас є принтер, ви також можете надрукувати дизайн, файли дизайну будуть додані до наступного заголовка.
3D-друк та складання нашого балансуючого робота
Якщо ви вирішили тривимірно надрукувати те саме шасі, яке я використовую для створення свого бота, то файли STL можна завантажити з thingiverse. Я також додав файли дизайну разом із ним, щоб ви могли також змінювати їх відповідно до своїх уподобань персоналу.
Деталі не мають звисаючих структур, тому ви можете легко їх надрукувати без будь-яких опор, і заповнення в 25% буде чудово працювати. Конструкції досить прості, і будь-який основний принтер повинен мати можливість з ним легко працювати. Я використовував програмне забезпечення Cura, щоб нарізати модель та надрукувати за допомогою мого Tevo Tarantula, налаштування показані нижче.
Вам довелося б надрукувати частину корпусу, а також чотири деталі кріплення двигуна. Збірка відбувається досить прямо вперед; за допомогою гайок і болтів 3 мм закріпіть двигун і дошки на місці. Після складання це повинно виглядати приблизно так, як показано на малюнку нижче.
Фактичний дизайн був запланований з модулем приводу L298N у нижній стійці Arduino та батареєю на ньому, як показано вище. Якщо ви дотримуєтесь того самого порядку, ви можете безпосередньо пригвинтити плату через передбачені отвори та використовувати дротяну мітку для Li-po акумулятора. Це розташування також повинно спрацювати, за винятком супер звичайних коліс, які мені довелося змінити пізніше.
У своєму боті я поміняв місце батареї та плати Arduino UNO для зручності програмування, а також повинен був ввести плату perf для завершення з'єднань. Тож мій бот не виглядав так, як я планував на початковому етапі. Після завершення тестування програмування проводки та всього іншого, мій двоколісний робот нарешті виглядає так
Кругова діаграма
Встановити зв’язки з цим самобалансуючим роботом на базі Arduino досить просто. Це самобалансуючий робот, що використовує Arduino та MPU6050, тому ми намагаємось з'єднати MPU6050 з Arduino та підключити двигуни за допомогою модуля драйвера двигуна. Вся установка живиться від літій-іонної батареї 7,4 В. Принципова схема для того ж наведена нижче.
Модуль драйвера Arduino та двигуна L298N безпосередньо живиться через штифт Vin та клему 12 В відповідно. Вбудований регулятор на платі Arduino перетворить вхідні 7,4 В на 5 В, і ATmega IC і MPU6050 будуть живитися від них. Двигуни постійного струму можуть працювати від напруги 5 В до 12 В. Але ми підключатимемо позитивний провід 7,4 В від акумулятора до вхідної клеми 12 В модуля драйвера двигуна. Це змусить двигуни працювати з напругою 7,4 В. У наступній таблиці буде перелічено, як модуль драйвера двигуна MPU6050 та L298N підключений до Arduino.
Компонентний штифт |
Pin Arduino |
MPU6050 |
|
Vcc |
+ 5В |
Земля |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 взаємодіє з Arduino через інтерфейс I2C, тому ми використовуємо шпильки SPI A4 і A5 Arduino. Двигуни постійного струму підключені до ШІМ-контактів D6, D9 D10 і D11 відповідно. Нам потрібно підключити їх до ШІМ-контактів, оскільки ми будемо контролювати швидкість двигуна постійного струму, змінюючи робочий цикл ШІМ-сигналів. Якщо ви не знайомі з цими двома компонентами, рекомендується ознайомитись із підручником MPU6050 Interfacing та підручником з драйверів двигуна L298N.
Самобалансуючий код робота
Тепер ми повинні запрограмувати нашу плату Arduino UNO, щоб збалансувати робота. Тут відбувається вся магія; концепція цього проста. Ми повинні перевірити, чи нахиляється бот вперед або назад, використовуючи MPU6050, а потім, якщо він нахиляється вперед, ми повинні повертати колеса вперед, а якщо він нахиляється назад, ми повинні повертати колеса у зворотному напрямку.
У той же час ми також повинні контролювати швидкість, з якою обертаються колеса, якщо бот трохи дезорієнтований від центрального положення, колеса обертаються повільно, і швидкість зростає, коли вона віддаляється від центрального положення. Для досягнення цієї логіки ми використовуємо алгоритм PID, який має центральне положення як задану точку та рівень дезорієнтації як вихідний результат.
Щоб знати поточне положення бота, ми використовуємо MPU6050, який є 6-осьовим акселерометром і датчиком гіроскопа в поєднанні. Для того, щоб отримати надійне значення положення від датчика, нам потрібно використовувати значення як акселерометра, так і гіроскопа, оскільки значення акселерометра мають проблеми із шумом, а значення гіроскопа мають тенденцію дрейфувати з часом. Отже, ми повинні поєднати обидва і отримати значення кроку гойдання та нахилу нашого робота, з яких ми будемо використовувати лише значення гойдалки.
Звучить трохи похитування голови, правда? Але не хвилюйтеся, завдяки спільноті Arduino у нас є доступні бібліотеки, які можуть виконувати обчислення PID, а також отримувати значення гойдалки з MPU6050. Бібліотека розроблена br3ttb та jrowberg відповідно. Перш ніж продовжувати завантажувати їхні бібліотеки, сформуйте наступне посилання та додайте їх до каталогу Arduino lib.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Тепер, коли у нас є бібліотеки, додані до нашої IDE Arduino. Почнемо програмувати нашого балансуючого робота. Як завжди, повний код балансуючого робота MPU6050 наведено в кінці цієї сторінки, тут я просто пояснюю найважливіші фрагменти коду. Описаний раніше код будується поверх прикладу коду MPU6050, ми просто збираємося оптимізувати код для нашої мети та додати ПІД та техніку управління для нашого самобалансуючого робота.
Спочатку ми включаємо бібліотеки, необхідні для роботи цієї програми. Вони включають вбудовану бібліотеку I2C, бібліотеку PID та бібліотеку MPU6050, які ми щойно завантажили.
#include "I2Cdev.h" #include
Потім ми оголошуємо змінні, необхідні для отримання даних з датчика MPU6050. Ми зчитуємо як значення сили тяжіння, так і значення кватерніону, а потім обчислюємо крок відхилення та значення боту. YPR поплавок масив буде містити кінцевий результат.
// Контроль / статус MPU змінюється bool dmpReady = false; // встановлюємо true, якщо ініціація DMP була успішною uint8_t mpuIntStatus; // містить фактичний байт стану переривання з MPU uint8_t devStatus; // повертаємо статус після кожної операції на пристрої (0 = успіх ,! 0 = помилка) uint16_t packetSize; // очікуваний розмір пакета DMP (за замовчуванням 42 байти) uint16_t fifoCount; // підрахунок усіх байт, що перебувають на даний момент у FIFO uint8_t fifoBuffer; // буфер зберігання FIFO // орієнтація / рух vars Quaternion q; // кватерніонний контейнер VectorFloat gravity; // вектор гравітації float ypr; // гойдалка / крок / рулон контейнера і вектор гравітації
Далі йде дуже важливий сегмент коду, і саме тут ви будете витрачати довгий час на налаштування правильного набору значень. Якщо ваш робот побудований з дуже хорошим центром ваги, а компоненти розташовані симетрично (що в більшості випадків не є), тоді значення заданого значення складе 180. В іншому випадку підключіть свого бота до послідовного монітора Arduino і нахиляйте його до Ви знаходите хорошу позицію балансування, читаєте значення, що відображається на послідовному моніторі, і це ваше значення заданого значення. Значення Kp, Kd та Ki має бути налаштоване відповідно до вашого бота. Жодні два однакові боти не матимуть однакових значень Kp, Kd і Ki, тому від цього не вдасться втекти. Перегляньте відео в кінці цієї сторінки, щоб отримати уявлення про те, як відрегулювати ці значення.
/ ********* Налаштуйте ці 4 значення для вашого BOT ********* / подвійне значення = 176; // встановлюємо значення, коли бот перпендикулярний землі, використовуючи послідовний монітор. // Прочитайте проектну документацію на circuitdigest.com, щоб дізнатися, як встановити ці значення вдвічі Kp = 21; // Встановити цей перший подвійний Kd = 0,8; // Встановити цей secound подвійний Ki = 140; // Нарешті встановіть це / ****** Налаштування кінця значень ********* /
У наступному рядку ми ініціалізуємо алгоритм PID, передаючи вхідні змінні вхідні, вихідні, задані значення, Kp, Ki та Kd. З них ми вже встановили значення заданих значень Kp, Ki та Kd у наведеному вище фрагменті коду. Значення введення буде поточним значенням гойдалки, яке зчитується з датчика MPU6050, а значенням виходу буде значення, яке розраховується за алгоритмом PID. Отже, в основному алгоритм PID дасть нам вихідне значення, яке слід використовувати для корекції вхідного значення наближення до заданої точки.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
Усередині функції налаштування порожнечі ми ініціалізуємо MPU6050, налаштувавши DMP (цифровий процесор руху). Це допоможе нам поєднати дані акселерометра з даними гіроскопа та забезпечить надійне значення Yaw, Pitch and Roll. Ми не будемо заглиблюватися в це глибоко, оскільки це буде далеко за межами теми. У будь-якому випадку один сегмент коду, який вам потрібно шукати у функції налаштування, є значеннями зміщення гіроскопа. Кожен датчик MPU6050 має власні значення зсувів, за допомогою цього ескізу Arduino можна розрахувати значення зсуву датчика та відповідно оновити наступні рядки у вашій програмі.
// подаємо сюди свої власні зміщення гіроскопа, масштабовані на мінімальну чутливість mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Ми також повинні ініціалізувати цифрові ШІМ-контакти, які ми використовуємо для підключення наших двигунів. У нашому випадку це D6, D9, D10 і D11. Отже, ми ініціюємо ці штифти, оскільки вихідні штифти роблять їх НИЗКИМИ за замовчуванням.
// Ініціалізація Мотор outpu штифти pinMode (6, OUTPUT); pinMode (9, ВИХІД); pinMode (10, ВИХІД); pinMode (11, ВИХІД); // За замовчуванням вимкніть обидва двигуна analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Усередині функції основного циклу ми перевіряємо, чи готові дані з MPU6050 для читання. Якщо так, то ми використовуємо його для обчислення значення ПІД, а потім відображаємо вхідне та вихідне значення ПІД на послідовному моніторі лише для того, щоб перевірити, як реагує ПІД. Потім, виходячи з величини виводу, ми вирішуємо, чи повинен бот рухатися вперед чи назад, чи стояти на місці.
Оскільки ми припускаємо, що MPU6050 поверне 180, коли бот стоїть вертикально. Ми отримаємо позитивні значення корекції, коли бот падає вперед, а отримаємо негативні значення, якщо бот падає в бік назад. Отже, ми перевіряємо наявність цього стану і викликаємо відповідні функції для переміщення бота вперед або назад.
while (! mpuInterrupt && fifoCount <packetSize) { // немає даних mpu - виконання обчислень ПІД та виведення на двигуни pid.Compute (); // Надрукуйте значення вхідних та вихідних даних на послідовному моніторі, щоб перевірити, як він працює. Serial.print (введення); Serial.print ("=>"); Serial.println (вихід); if (input> 150 && input <200) {// Якщо бот падає if (output> 0) // Падіння вперед вперед (); // Поверніть колеса вперед інакше, якщо (вихід <0) // Падіння у напрямку назад Reverse (); // Поверніть колеса назад } else // Якщо бот не падає Stop (); // Утримуйте колеса нерухомими }
Вихідна змінна PID також визначає, наскільки швидко двигун повинен обертатися. Якщо бот ось-ось впаде, тоді ми робимо незначну корекцію, повільно обертаючи колесо. Якщо ці незначні корекції відбитків спрацьовують і все ж, якщо бот падає, ми збільшуємо швидкість двигуна. Величина швидкості обертання коліс визначається алгоритмом PI. Зверніть увагу, що для функції реверсу ми помножили значення виводу на -1, щоб ми могли перетворити від'ємне значення на позитивне.
void Forward () // Код для обертання колеса вперед { analogWrite (6, вихід); analogWrite (9,0); analogWrite (10, вихід); analogWrite (11,0); Serial.print ("F"); // Інформація про налагодження } void Reverse () // Код для обертання колеса назад { analogWrite (6,0); analogWrite (9, вихід * -1); analogWrite (10,0); analogWrite (11, вихід * -1); Serial.print ("R"); } void Stop () // Код для зупинки обох коліс { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Робота самобалансуючого робота Arduino
Після того, як ви готові з апаратним забезпеченням, ви можете завантажити код на свою плату Arduino. Переконайтесь, що підключення належним чином, оскільки ми використовуємо літій-іонний акумулятор, потрібна гранична обережність. Тож перевірте наявність коротких замикань і переконайтеся, що термінали не контактують, навіть якщо ваш бот зазнає невеликих ударів. Увімкніть модуль та відкрийте послідовний монітор, якщо ваш Arduino міг успішно спілкуватися з MPU6050 і якщо все працює належним чином, ви побачите наступний екран.
Тут ми бачимо вхідні та вихідні значення алгоритму PID у форматі input => output . Якщо бот ідеально збалансований, значення виходу буде 0. Вхідне значення - це поточне значення від датчика MPU6050. Алфавіт "F" означає, що бот рухається вперед, а "R" означає, що бот рухається в зворотному напрямку.
На початкових етапах PID я рекомендую залишити ваш кабель Arduino підключеним до бота, щоб ви могли легко відстежувати значення вхідних і вихідних даних, а також було легко виправити та завантажити програму для значень Kp, Ki та Kd. На відео нижче показано повну роботу бота, а також показано, як виправити свої значення PID.
Сподіваюся, це допоможе створити власного самобалансуючого робота, якщо у вас виникнуть проблеми з налагодженням роботи, тоді залиште свої запитання в розділі коментарів нижче або скористайтесь форумами для отримання додаткових технічних питань. Якщо ви хочете отримати більше задоволення, ви також можете використовувати ту саму логіку для створення робота з балансування кулі.