Arduino робот ringo скетч для танцю. Робототехнічний набір Двоколісний Robot Car

На Arduino дуже легко робити різні машинки з дистанційним керуванням, простими сенсорамита логікою. Тому ця лінійка неймовірно популярна. Продається безліч сумісних з нею сенсорів та плат розширення. Інтернет наповнений готовими програмними бібліотеками та проектами з відкритим вихідним кодом на всі випадки життя. Практично всі питання, які у тебе виникнуть у процесі освоєння Arduino, вже кимось задавалися, і ти завжди знайдеш відповідь.

Давай із чогось почнемо? Головне питання – вибір контролера. Існує безліч ревізій Arduino, також сторонніх клонів, побудованих з урахуванням цих версій. Ось, мабуть, два найцікавіші для нас класи:

  • Arduino Uno - найкращий вибір новачка, найпростіша, бюджетна та поширена плата. В основі - чіп ATmega328 з тактовою частотоюв 16 МГц, 32 Кб флеш-пам'яті, 2 Кб ОЗУ та 1 Кб EEPROM. У Uno 14 цифрових входів/виходів, які можуть використовуватися для керування сенсорами та сервоприводами та іншими пристроями;
  • Arduino Mega / Mega 2560 – плата, яка підійде у випадку, коли ти заздалегідь знаєш, що проект буде складним. Головна відмінність - більша кількість входів/виходів (48 Mega, 54 Mega 2560). Також тут набагато більше пам'яті: 8 Кб ОЗУ, 4 Кб EEPROM, а флеш-пам'яті 128 та 256 Кб (у Mega та Mega 2560 відповідно). Між собою плати також відрізняються чіпом, швидкістю USBта деякими іншими характеристиками.

Зрозуміло, ще є Arduino Pro, Arduino LilyPad та багато інших. Але зараз давай зупинимося на перших двох моделях. У нашому випадку все досить просто: Mega потрібна для робота з великою кількістю ніг.

Перший код

Для початку встановимо Arduino IDE(arduino.cc) - це крос-платформна безкоштовне середовищерозробки. Тепер, якщо ми підключимо наш Arduino, ми зможемо спробувати написати перший код на простому прикладі: програмі миготіння світлодіодом. На більшості Arduino-контролерів він є і підключений до піна 13. До речі, у світі Arduino програмиприйнято називати скетчами. Ось текст скетчу з коментарями:

// Дамо цьому піну ім'я LED: const int LED = 13; void setup() ( // Ініціалізація цифрового піна // для виведення: pinMode(LED, OUTPUT); ) void loop() ( // Подати рівень логічної одиниці // на пін 13 (запалити світлодіод): digitalWrite(LED, HIGH) // Призупинити виконання скетчу // на секунду: delay (1000) // Подати рівень логічного нуля // на пін 13 (згасити світлодіод): digitalWrite (LED, LOW); // Знову призупинити виконання // скетчу на секунду: delay(1000);

Зверни увагу на функції setupта loop. Вони повинні бути присутніми в будь-якому Arduino-скетчі. Setup викликається один раз при включенні або після перезапуску контролера. Якщо хочеш, щоб код виконувався лише один раз, його потрібно розміщувати саме тут. Найчастіше це всілякі процедури ініціалізації чогось. Наш скетч не є винятком: цифрові піни Arduino можуть працювати і як входи, і як виходи. У функції setup ми говоримо, що пін 13 працюватиме як цифровий вихід контролера.

Після того, як функція setup завершить свою роботу, автоматично запускається замкнутий цикл, всередині якого буде викликатись функція loop. Від нас треба написати, що ми хочемо там виконувати. А ми хочемо подати на пін 13 рівень логічної одиниці (5 В), тобто запалити світлодіод, потім почекати одну секунду (1000 мілісекундах), потім подати рівень логічного нуля (0 В) і знову почекати одну секунду. Наступний виклик loop все повторить.

Тепер «заливаємо» наш скетч у контролер. Ні, нам не знадобиться програматор. Контролери Arduino, окрім наших скетчів, містять спеціальну програму – bootloader, яка, зокрема, керує завантаженням коду з комп'ютера. Так що для заливання скетчу нам знадобиться лише USB-кабель і пункт меню File → Upload (Ctrl+U) у Arduino IDE.

Ключове питання

А скільки, власне, нам потрібне ніг? Визначимося у багатьох змін крокуючих роботів. За кількістю ніг:

  • biped – двоногий (прототип – людина);
  • quadruped - чотирилапий (прототип - більшість ссавців);
  • hexapod – шестиногий (прототип – більшість комах);
  • octopod - восьминогий (прототип - павуки, скорпіони, краби та інші членистоногі).

Крім кількості ніг, важлива конфігурація кожної. Головною характеристикою ноги є кількість ступенів свободи, або dimensions of freedom (DOF). Ступінь свободи - це здатність повертатися або згинатися навколо однієї осі (рідше - поступово рухатися вздовж неї). Очевидно, що якщо ступінь свободи один, то на такій нозі далеко не втечеш. Ноги з двома ступенями свободи (2DOF) вже дозволяють рухатися багатоногим роботам, хоча 2DOF дає можливість вільно переміщати кінчик ноги лише в одній площині. А 3DOF-нога переміщає «стопу» в 3D-просторі (якщо, звичайно, не всі три осі паралельні). Є 4DOF-ноги, які просто збільшують гнучкість і діапазон переміщення ноги. У комах найчастіше 4DOF-лапи.

Що це означає для нас? У дешевих аматорських роботах кожний ступінь свободи реалізує один двигун, точніше, сервопривід або серв. Конфігурація ніг однозначно визначає, скільки таких серв потрібно. Так, 3DOF-гексапод вимагатиме 18 сервів, а 4DOF-павук - вже 32. Не лякайся кількості, маленькі сервоприводи, що використовуються в аматорських радіокерованих моделях, дуже дешеві. В інтернет-магазинах їх можна знайти на запит micro servo.

Щоб програмувати сервоприводи, достатньо знати, що в них уже є контролер, який виконує основну роботу. І все, що потрібно, - подавати харчування та цифровий сигнал, Який повідомляє контролеру, в яку позицію ми хочемо повернути вал приводу. Про їх конструкцію легко знайти інформацію. Протокол у них найпростіший із усіх цифрових протоколів зв'язку: широтно-імпульсна модуляція - ШІМ (PWM англійською). У всіх простих сервів є роз'єм із трьома контактами: земля, +5 В (вольтаж може відрізнятися залежно від розміру та потужності) та сигнальний вхід. Arduino-контролери можуть двома у різний спосібгенерувати такий сигнал. Перший – апаратний PWM, який сам чіп вміє видавати на кількох зі своїх цифрових I/O-пінів. Другий – програмний. Програмний дозволяє отримати одночасно більше різних PWM сигналів, ніж апаратний. Для нього під Arduino надається зручна обгортка – бібліотека Servo. Вона дозволяє використовувати одночасно 12 сервоприводів на більшості малогабаритних контролерів (Uno, Due, Nano) та 48 сервоприводів на Arduino Mega та подібних до нього. Сигнальний контакт серва підключається до цифрового виводу Arduino. Земля і харчування - очевидно, до землі та харчування, вони можуть бути спільними для всіх сервів. У трипровідних шлейфах сервів чорний або коричневий - це земля, посередині зазвичай червоний +5 і, нарешті, білий або жовтий - сигнальний. З програмної точки зору управління гранично просте:

Servo myservo; // Сервопривід на 9-му піні Arduino myservo.attach (9); // Повернути на 90º myservo.write(90);

Більшість сервів можуть обертати вал на 180°, і для них 90° - середнє положення. Для спрощення підключення сервів до плати Arduino існує низка рішень. Найканонічніше - це Sensors Shield. Встановивши його на Uno і подавши на клеми живлення для сервів, можна їх роз'єм підключати прямо в нього.

Батарея

Ще одне важливе питання – харчування. Якщо у тебе просунута плата, яка дозволяє постачати всю систему по одній лінії живлення (і двигуни сервів не дадуть перешкод працювати контролеру), то можна обійтися одним джерелом. Вибір величезний, найкраще, звичайно, Li-Ion/Li-Po брикети для радіомодель. Але їм потрібні й відповідні зарядні пристрої. Якщо у тебе контролер простіший (Uno/Due/Nano), то можна живити його окремо, наприклад 9-вольтовою «Кроною», а сервоприводи підключити до основної потужної батареї. Так сервоприводам вистачить харчування. В разі літієвих акумуляторівпотрібно ще ретельніше, ніж зазвичай, стежити за напругою, щоб не було перерозряду ( допустима напругаслід уточнити для конкретного типу батареї). Для цього на робота-Слейпніра, про який далі йтиметься, також прикручено маленький цифровий вольтметр.

Робожук своїми руками

Набір

  • Контролер Arduino Uno: 1150 грн.
  • Три серводвигуни. Я використав HXT500, 200 грн. за штуку
  • Батарейний відсік для "Крони" з вимикачем: 50 гр.
  • Батарейка «Крона»: 145 грн.
  • ІЧ-приймач: 90 грн.
  • Сталевий дріт діаметром приблизно 1,5 мм. Я, наприклад, використовував зламаний віночок для збивання яєць

Разом: 2035 нар.

DmitryDzz:Я хочу запропонувати тобі зробити невеликого дистанційно керованого шестиногого робожука на базі контролера Arduino Uno. Лапки матимуть один ступінь свободи, управління відбуватиметься за допомогою звичайного пульта.

Треба сказати, що це ціни найдорожчих московських магазинів. У китайських інтернет-магазинах все це обійдеться в два рази дешевше. Вважаючи доставку. Щоправда, чекати доведеться, на мій досвід, від двох тижнів до трьох місяців.

Простіший спосіб - взяти набір-конструктор, тому що на перших кроках одного контролера буде мало. Наразі багато магазинів пропонують такі набори. Наприклад, є чудовий інтернет-магазин «Амперка». Тут тобі запропонують кілька подібних конструкторів, що відрізняються наповненістю та, звичайно, ціною. Мені цілком вистачило найпростішого – «Матрьошка X». У нього входить контролер Arduino Uno, кабель USB для підключення до комп'ютера, дошка для прототипування ( незамінна річ!), набір перемичок, світлодіоди, резистори та інша дрібниця.

У цьому магазині є розділ «Вікі», де ти знайдеш навіть чудові короткі відеоуроки, перекладені російською мовою. Обов'язково подивися їх. І звичайно, є форум, де тобі, напевно, постараються допомогти.

Що знадобиться з інструментів:

  • паяльник і все, що потрібно для паяння. Паяти багато не доведеться, і особливої ​​майстерності не потрібно;
  • термоклейовий пістолет та стрижні до нього;
  • пасатижі для роботи із дротом.

Якщо всі зібрали, приступимо!

Управління

Перейдемо до першого кроку: нам треба навчитися взаємодіяти з пультом дистанційного керування і вивідати коди натискань на деякі його кнопки. Ці коди потім знадобляться для скетчу керування роботом.

На цьому етапі знадобиться ще ІЧ-приймач і добре мати дошку для прототипування. Переважна більшість інфрачервоних пультів працюють на несучих частотах 36 кГц, 38 кГц або 40 кГц (Panasonic, Sony). Виняток становлять пульти Sharp (56 кГц), Bang & Olufsen (455 кГц) і, можливо, хтось ще екзотичніший. Тому нам цілком підійде будь-якийІЧ-приймач на 36, 38 або 40 кГц. Частота може точно не збігатися з частотою сигналу, що несе. У такому разі чутливість приймача буде знижуватися, але на практиці я не помітив дискомфорту, використовуючи ІЧ-приймач TSOP2136 (36 кГц – останні дві цифри – частота) та пульт ДК Sony (40 кГц).

Отже, більшість пультів підійдуть ІЧ-приймачі TSOP21xx, TSOP22xx, TSOP312xx. Дві останні цифри може бути 36, 37, 38 чи 40. Перед включенням ІЧ-приймача уточни розведення його контактів - їх лише три: +5V (живлення), GND (земля), Vs (вихід). Зберемо схему, як у ілюстрації (розведення для TSOP2136).

Як бачиш, до аналогового входу контролера A0 ми підключили вихід ІЧ-приймача.

Ось як виглядає код скетчу:

#include "IRremote.h" // Аналоговий вхід контролера, // До якого підключений ІЧ-приймач: const int IR_PIN = A0; // Створюємо об'єкт ІЧ-приймач: IRrecv irrecv(IR_PIN); void setup() ( Serial.begin(9600); Serial.println("ready"); // Починаємо прослуховування ІЧ- // сигналів: irrecv.enableIRIn(); ) void loop() ( // Описуємо структуру results, / / в яку будуть розміщуватися // прийняті та декодовані // ІЧ-команди: decode_results results;// Якщо ІЧ-команда прийнята та успішно // декодована, то виводимо // отриманий код у послідовний // порт контролера: if (irrecv.decode (&results)) ( Serial.println(results.value); irrecv.resume(); ) )

У скетчі використовується спеціальна бібліотека IRremote.h, що декодує сигнали різних ІЧ-пультів. Ця бібліотека - відкритий проект, завантажити її ти можеш зі сторінки https://github.com/shirriff/Arduino-IRremote. А щоб її підключити до нашого проекту, треба виконати три дії:

  • каталог бібліотеки скопіювати в каталог libraries, який, своєю чергою, перебуває в інсталяційному каталозі Arduino IDE;
  • перезапустити IDE;
  • додати на початок нашого скетчу рядок #include «IRremote.h».

Тепер у скетчі будуть доступні функції декодування ІЧ-сигналів. Але щоб побачити отримані коди, ми ще будемо використовувати об'єкт Serial. З його допомогою по послідовному порту(все той же USB-кабель) ми передаватимемо коди на комп'ютер. У функції setup ми виконуємо ініціалізацію об'єкта Serial. «9600» – це 9600 бод – швидкість, яка буде використовуватися для передачі даних. Після ініціалізації ми можемо робити запис до послідовного порту за допомогою функції println. Щоб переглянути результат цього висновку на комп'ютері в Arduino IDE, виберіть пункт меню Tools → Serial Monitor (Ctrl + Shift + M). Тільки переконайся, що в ньому встановлено швидкість 9600 бод.

Отже, живлення контролер отримує USB-кабелем, дані передає по ньому ж. Завантажуємо скетч, запускаємо Serial Monitor і починаємо натискати кнопки пульта дистанційного керування. У вікні Serial Monitor мають відображатися коди. Протоколи пультів відрізняються, іноді може бути один код, іноді кілька. У будь-якому випадку ти завжди можеш виділити коди, які є унікальними для кожної кнопки пульта.

Нам потрібно 13 кнопок пульта. Я використав такі:

  • 1 – плавний поворот наліво;
  • 2 - рух уперед;
  • 3 – плавний поворот направо;
  • 4 - поворот наліво на місці;
  • 5 – стоп;
  • 6 - поворот праворуч дома;
  • 7 – рух назад з поворотом направо;
  • 8 – рух назад;
  • 9 - рух назад із поворотом наліво;
  • синя кнопка – дуже повільно;
  • жовта – повільно;
  • зелена – швидко;
  • червона – дуже швидко.

Запиши коди цих клавіш, потім вони знадобляться для скетчу управління роботом.

Алгоритм руху

Скетч керування роботом доступний на сторінці нашого проекту (bit.ly/1dEwNDC). Не забудь змінити значення констант кодів натиснутих кнопок пульта на коди свого пульта (константи IR_COMMAND_XXX_CODES у файлі ir_command_codes.h).

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

Рухи комах дуже цікаві. І хоч усім цим жукам падати до землі зовсім недалеко, вони чомусь завжди стійкі: будь-якої миті часу мінімум три ноги (дві з одного боку і одна з іншої) стоять на поверхні. І доки ці ноги тягнуть жука до одного йому веденої мети, три інші підтягуються, щоб повторити цей рух. Наше завдання – зробити щось схоже.

У нашого робожука три серводвигуни, розташовані в ряд перпендикулярно до руху. У лівого та правого серводвигунів вісь валу спрямована вгору, а у центрального – вперед. Завдання, наприклад, лівої сервомашини - качати відразу дві ноги: ліву передню і ліву задню. Вони, до речі, жорстко з'єднані між собою і приклеєні до гойдалки цієї сервомашини. Завдання центральної серви - піднімати то лівий бік жука, то правий. Тому до гойдалки цього двигуна кріпляться центральні ліва і права ноги, що являють собою єдину П-подібну деталь.

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

Синіми кружкамипозначені ноги робожука, що стоять на поверхні, а білими - що знаходяться в повітрі. Зверніть увагу, що при русі вперед або назад лівий і правий серводвигуни повинні рухатися абсолютно однаково. А при поворотах дома двигуни повинні крутитися в різних напрямках (симетрично). Ще цікаво, що рух уперед і назад відрізняється лише фазою центрального серводвигуна.

Отже, як це реалізовано? Ми пам'ятаємо, що контролер завжди викликає функцію loop. Отже, у цю функцію ми повинні помістити код, який визначає поточне положення серводвигунів і встановлює їх у цю позицію. Кожен серводвигун повинен здійснювати коливальні рухи. Розрахувати положення серводвигуна в момент часу t ми зможемо за такою формулою:

X = A sin(2πt/T),

де X - потрібне положення серводвигуна, A - амплітуда коливань, T - період коливань.

Так, залежно від часу t ми отримаємо зміна величини X в інтервалі від –A до +A. Серводвигуни можуть приймати положення від 0 до 180°. Тому коливання нам краще робити навколо «нульового» положення 90°. І якщо ми хочемо забезпечити коливання з періодом 1 навколо положення 90° з амплітудою 30°, то формула перетворюється на наступний вигляд:

X = 90 + 30 sin(2πt/1000),

де t - це час у мілісекундах, що минув від початку коливань. Для керування швидкістю руху робожука ми можемо змінювати період коливань. Чим він більший, тим нижча швидкість.

А тепер ще раз повернемось до нашої схеми, бо формула, написана вище, ще не завершена. Як забезпечити синхронний, то зустрічний рух лівого і правого серводвигуна? Як міняти фазу центрального серводвигуна? Ми повинні додати до нашої формули фазу коливань. Зсув аргументу синуса на величину π для, наприклад, правого двигуна змусить його працювати в лівому протифазу, тобто так, як нам треба для повороту на місці. Ось як тепер виглядатиме наша формула:

X = 90 + 30 sin(2πt/1000 + Φ),

де Φ - фаза коливань, значення від 0 до 2?

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

Складання

Тепер давай зберемо робота на дошці для прототипування та заллємо скетч управління.

Це дуже важливий етапперед збиранням. Спробуй відключити USB-кабель та запитай макет від батареї «Крона». Перевір всі фази руху і переконайся, що все працює. Після складання робота щось змінювати (наприклад, замінити непрацюючий серводвигун) буде вже складніше.

Тепер перейдемо до самої збирання. Основний несучий елемент – це батарейний відсік. Я раджу використовувати відсік закритого типу та обов'язково з вимикачем.

Закріплювати деталі жука найпростіше термоклеєм. Почни із серводвигунів. Видали непотрібні вушка кріплень і з'єднай машинки між собою. Потім приклей цю ​​збірку з трьох «серв» до кришки батарейного відсіку. Не забувай, що відсік батареї повинен вільно відкриватися для зміни батареї.

Контролер найпростіше приклеїти до відсіку, але мені цей варіант не дуже подобається, тому що доведеться назавжди віддати жуку Arduino Uno. Тому можна ускладнити собі життя та використовувати роз'єм Arduino для кріплення батарейного відсіку. На нижній частині відсіку приклей штирковий роз'єм з кроком між штирями 2,54 мм. Він повинен розташовуватись так, щоб входити в гніздо контролера в районі цифрових висновків 8–11. Вони поки що все одно нам не знадобляться. Якщо роз'єм під рукою не виявилося, підійде П-подібно вигнута канцелярська скріпка.

Провід, що йде від батарейного відсіку, треба з'єднати з висновками Vin і сусіднім з ним GND. Чи не переплутай полярність! Плюс "Крони" на Vin, мінус на GND. Щоб забезпечити надійний контакт проводів з Arduino-роз'ємами, можна просто облудити товстіший кінчик дроту, я ж як штекер використовував короткий відрізок скріпки. А місце паяння закрив термозбіжною трубкою.

Рознімання зі шлейфів сервоприводів слід зрізати, дроти живлення (+5 В - зазвичай червоний і GND - чорний або коричневий) треба об'єднати та вивести до гнізд 5V та сусіднього з ним GND на контролері. Підключатимемо трохи пізніше. Провід керуючого сигналу (зазвичай жовтий) виводимо на цифрові висновки контролера: лівий серводвигун на пін 2, центральний на пін 4, правий на пін 7.

"+" і "-" ІЧ-приймача можна просто вставити в роз'єм Arduino (5V і сусідній GND). Щоправда, зігнувши навпіл, подвоївши їхню товщину. До цих же ніжок живлення ІЧ-приймача припаюємо раніше підведені дроти живлення серводвигунів. Вихід сигналу ІЧ-приймача до аналогового входу контролера А0 вже навряд чи дістанеться, і тобі доведеться нарощувати його дротом.

Декілька порад з виготовлення ніг. Спочатку підготуй ліву та праву «передньо-задні» ноги. Переконайся в їхній симетричності (зверни увагу і на довжини, і на кути згинів). Починай клеїти ноги, тільки переконавшись, що серводвигуни встановлені в нульове положення (90 °).

Середню пару ніг краще встановлюй в останню чергу. Раджу спочатку зробити середні ноги довшими, а потім після встановлення підрізати їх до потрібної довжини. У нульовому положенні всі шість ніг повинні стояти на поверхні. Качення середніх ніг з амплітудою 15° не повинне заважати поворотам передньо-задніх.

Що далі?

Робожук – це готова мобільна платформана базі одного з найпопулярніших та найдоступніших контролерів. Проект відкритий: https://github.com/beetle-ringo/arduino. Роби в GitHub форк (відгалуження) і додай свою функціональність. Дай волю фантазії - додай ІЧ-світлодіод, і робот готовий для робобитви. Підключи далекоміри, тактильні сенсори, гіроскоп ... Навчи робота обходити перешкоди або ходити по лінії, спробуй встановити на нього веб-камеру. Ідей може бути мільйон, і ти завжди можеш обирати найцікавішу.

Робот-Слейпнір

Набір

  • Контролер Arduino Uno Dagu Spider Robot: 2530 грн.
  • Сервоприводи SG90 9g (16 штук) 1150 грн.
  • Акумулятор LiPo battery pack, 7,4 В, 1800 мА год 490 грн.
  • Радіомодуль 4 Pin Bluetooth RF Transceiver 270 грн.
  • Індикатор напруги (опціональний) DC 3,3–30 В Red LED Panel Meter 100р.
  • Кутник алюмінієвий. У найближчому будмаркеті 135р.
  • Болтики та гайки. На найближчій барахолці 35 нар.

Разом: 4710 нар.

*Компоненти купувалися в різний час, і багато позицій можна оптимізувати

poconoco:Спробуємо зібрати нестандартну конфігурацію – восьминогого 2DOF-робота. 2DOF-ноги набагато простіше програмувати, до того ж у мене є в запасі купа невикористаних сервоприводів. А головне, можна буде назвати його на честь восьминогого коня бога Одіна Слейпніром (завжди мріяв!).

У нашого Слейпніра з кожного боку буде по чотири ноги із двома шарнірами. Кожен шарнір – сервопривід, отже, вісім сервоприводів набік. Для простоти всі вісім шарнірів однієї сторони коня будуть обертатися в одній площині. Хоча це зовсім необов'язково. Більше того, якщо ноги з одного боку пустити трохи «шахматкою», щоб дві сусідні ноги не могли зачепити один одного, це буде навіть краще, дозволить робити крок ширше і скакати галопом.

Акуратне та функціональне, але далеко не найдешевше рішення – використовувати нестандартну плату контролера, оптимізовану для підключення сервоприводів у великій кількості. Мені підвернулася Dagu Spider Robot Controller - це той же Arduino Mega, але на платі з заздалегідь розпаяними 3-піновими штирковими роз'ємами, куди відразу, без будь-яких шилдів, можна підключити ті самі 48 сервоприводів. Ідеальна для багатоногих роботів на Arduino.

Управління

Управління у нас буде відбуватися через Bluetooth. І тому є різні апаратні рішення. Це і шилди, і окремі хустки з UART послідовним інтерфейсом(як звичайний комп'ютер, тільки з рівнями сигналів 5). Мені найпрактичнішою здалася саме маленька хустка з UART-інтерфейсом. Підключається до відповідних контактів UART/Serial порту Arduino. Відзначимо два нюанси: на Uno/Due/Nano і подібних всього один такий порт, і він використовується для прошивки через USB. Тому, можливо, потрібно відключати Bluetooth-модуль під час прошивки. А другий нюанс – не забувай, що RX-контакт модуля підключається до TX-контакту Arduino, а TX – до RX. Такі справи у UART.

Програмування Bluetooth не складніше за серви, дані можна побайтово вичитувати, чим ми і будемо користуватися:

Char cmd; Serial.begin(9600); if (Serial.available()) cmd = Serial.read();

Якщо використовується Arduino Mega і Bluetooth підключений до другого порту, замість Serial пишеться Serial1. Примітно, що можна і не використовувати Bluetooth, а керувати роботом прямо USB. І в коді вище не зміниться нічого! Це просто робота з послідовним портом, а чи висить там BT-передавач чи перетворювач USB Serial – нам неважливо.

Інша сторона Bluetooth

Найзручніший спосіб підключення – це стандартні утиліти Linux. Для роботи нам знадобляться утиліти sdptool, rfcomm (входять до складу пакету bluez у репозиторіях Ubuntu), а також minicom (пакет і називається). Інструкції по роботі з цими утилітами можна знайти у Мережі.

Алгоритм руху

Для гексапода найпростішою ходою буде така: ноги діляться на дві групи по три ноги, і одна із груп повністю на землі, інша - у повітрі, переставляється вперед. Це далеко не єдина можлива хода. Можна у повітрі тримати лише дві лапи або навіть одну, а решту чотири чи п'ять – на землі. Для октапода хода теж безліч. Ми візьмемо найпростішу, також із двома групами по чотири ноги.

Отже, що нам потрібно робити для роботи з 16 сервоприводами та обраною ходою? Правильна відповідь – читати про інверсну кінематику (ІЧ). Обсяг статті не дозволяє розгорнути тему широко, але матеріалів в інтернеті достатньо. Коротко, ІЧ вирішує завдання знаходження необхідних сигналів керування для того, щоб система в просторі зайняла необхідне становище. Для ноги це означає, що за координатами точки, куди має потрапити стопа, слід визначити кути сервоприводів, які потрібно виставити. А керуючи координатами стоп, можна керувати становищем тіла. У нас 2DOF-ноги, осі паралельні, тому стопа завжди переміщається в одній площині. Завдання ІЧ в даному випадку зводиться до 2D-простору, що сильно його спрощує.

Нехай для кожної ноги локальним початком координат O буде вал верхнього серва, тобто стегна. І ми маємо координати точки A, куди потрібно потрапити стопі. Тоді легко побачити, що потрібно вирішити задачу знаходження точок перетину двох кіл (див. схему ніг однієї сторони, там на правій нозі це проілюстровано). Знайшовши точку B перетину кіл (вибравши будь-яку з них), нескладно порахувати кути, що шукаються, використовуючи переведення з декартових координат в полярні. У коді вирішення цього завдання виглядає так:

Float A = -2 * x; float B = -2*y; float C = sqr (x) + sqr (y) + sqr (hipLength) - sqr (shinLength); float X0 = -A * C / (sqr(A) + sqr(B)); float Y0 = -B * C / (sqr(A) + sqr(B)); float D = sqrt (sqr (hipLength) - (sqr (C) / (sqr (A) + sqr (B))))); float mult = sqrt (sqr (D) / (sqr (A) + sqr (B))); float ax, ay, bx, by; ax = X0 + B * mult; bx = X0 - B * mult; ay = Y0 - A * mult; by = Y0 + A * mult; // або bx для іншої точки перетину float jointLocalX = ax; // або для іншої точки перетину float jointLocalY = ay; float hipPrimaryAngle = polarAngle(jointLocalX, jointLocalY); float hipAngle = hipPrimaryAngle - hipStartAngle; float shinPrimaryAngle = polarAngle (x - jointLocalX, y - jointLocalY); float shinAngle = (shinPrimaryAngle - hipAngle) - shinStartAngle;

де x та y - координати точки, куди потрібно дотягнутися стопою; hipStartAngle - кут, на який повернуто "стегно" спочатку (при середньому положенні серва), аналогічно - shinStartAngle. До речі, у цих розрахунках кути, очевидно, у радіанах, а об'єкти Servo їх передавати потрібно вже в градусах. Повний працездатний код прошивки, що включає цей шматочок, викладений на GitHub, див. посилання наприкінці статті. Це шматок ІЧ, але крім нього потрібно ще трохи досить простого коду, щоб використовувати цю ІЧ на всіх ногах (див. функції legsReachTo(), legWrite()). Також необхідний буде код, який власне реалізує ходу - рух однієї групи ніг "назад" (щоб робот рухався вперед), тоді як інша група ніг піднімається і переставляється вперед для наступного кроку, див. функцію stepForward(). Вона робить один крок із заданими параметрами. Цими параметрами, до речі, можна зробити крок назад, незважаючи на назву функції. Якщо цю функцію викликати в циклі, то робот крокуватиме вперед.

Тепер отримання команд та їхня інтерпретація. Додамо до програми стан:

Enum State (STOP, FORWARD, BACKWARD, FORWARD_RIGHT, FORWARD_LEFT);

І в головному циклі виконання loop() будемо дивитися на поточний стан(змінна state) і смикати stepForward(), якщо рухаємося вперед (з поворотом чи без), і знову ж таки stepForward(), але з негативним аргументом xamp, якщо треба рухатися назад. Повороти будуть оброблятися в legWrite(), і для повороту направо ноги з правої сторонистоятимуть на місці (поки ліві гребуть). Ось такий кінь-танк. Брутально, проте дуже просто і працює. Плавний поворот можна зробити лише з 3DOF-ногами, приклад цього можна побачити у репозиторії buggybug.

Switch (state) ( case FORWARD: case FORWARD_RIGHT: case FORWARD_LEFT: stepForward(h, dh, xamp, xshift); break; case BACKWARD: stepForward(h, dh, - xamp, xshift); break; )

Char Command; while (Serial1.available()) command = Serial1.read(); switch (command) ( case "w": state = FORWARD; break; case "s": state = BACKWARD; break; case "d": state = FORWARD_RIGHT; break; case "a": state = FORWARD_LEFT; break; default : state = STOP;

На цьому основні моменти прошивки закінчилися, решта - всяка дрібниця. Хоча є ще один, мабуть, важливий момент- Можливість точного підстроювання сервів. Навіть за найакуратнішої збірки, якщо всім сервам подати команду повернутися на 90°, все одно деякі з них вийдуть трохи зі збитим кутом. Тому потрібна можливість його підлаштовувати. Як у мене це зроблено, можна подивитися в методах hipsWrite() та shinsWrite() і власне в масивах тонких налаштувань hipsTune і shinsTune.

Складання

Для таких конструкцій не потрібно нічого особливого: підійде листок оргскла потрібної товщини (з найближчої господарської барахолки) і лобзик або ножівка, щоб випилювати деталі. І звичайно, дриль, щоб свердлити отвори. Замість оргскла можна використовувати фанеру (тоді на фінальній конструкції можна зробити пам'ятний напис випалювачем). Можна використовувати аркуші або куточки алюмінію. Зі Слейпніром я пішов якраз шляхом використання алюмінієвого куточка з ребрами в 1 см (купив десь у будівельному супермаркеті).

Основою буде прямокутна рама. Кінцівки – 4-сантиметрові смужки. Варто також запастися безліччю маленьких болтиків, гайок. Ріжемо куточок на потрібні шматочки, вирізаємо пази для сервів, свердлимо дірочки для болтів і шурупів. Конструкцію краще раз показати, ніж описувати. Розміри можуть бути будь-які, роботи мають бути різноманітними. Але пам'ятай: що довші ноги, то більший важіль доведеться штовхати сервоприводу і тим більше буде на нього навантаження. Аж до неможливості провернутися і навіть поломки. Але 4-5 см – без проблем.

Для бюджетних легких роботів часто не морочаться на окреме шарнірне з'єднання кінцівок, і все навантаження лягає цілком на вал сервоприводу. При невеликій вазі це зовсім не критично. А при більшій вазі варто подумати про серви з металевими шестернями та кульковим підшипником валу.

У комплекті з кожним сервом, як правило, постачається пара-трійка шурупів та набір насадок, які можна закріпити шурупом на валу. різних застосувань. Нам найбільше підійде одиночний «ріг» (або horn), який дозволяє прикріпити до серву планку. Так, до однієї планки кріпляться осі двох сервів, і планка стає «стегном». При цьому один серв кріпиться на тілі, а інший стає частиною гомілки. До нього варто прикрутити ще планку, просто щоб подовжити або зробити кінцівку цікавіше. Трохи копіткої роботи - і платформа готова (зручні набори викруток, ключів, пінцети, кусачки та інше прискорюють справу).


Що далі?

Весь проект доступний на сторінці https://github.com/poconoco/sleipnir. Я описав одну з непрактичних конфігурацій - багато 2DOF-ніг, високий, вузький, легко валиться на бік. Спробуй зробити краще робота з 3DOF-ногами. З 4DOF-ногами. З клешнями чи щелепами. Як приклад 3DOF інверсної кінематикиможеш звертатися до репозиторію buggybug – там прошивка гексапода. Також можна робити не керовані, а інтелектуальні роботи, ставлячи замість Bluetooth датчики відстані, навчити робота обходити стіни та перешкоди. Якщо такий сенсор поставити на сервопривід і обертати їм, можна сканувати місцевість, практично сонаром.

Доброго вам дня! Перед вами, дорогі арт-робот, який може розмальовувати різні сферичні або яйцеподібні предмети розміром від 4 до 9 см.

Для його виготовлення знадобиться 3D-принтер, набір стандартних інструментів+ Arduino.

Примітка: Не варто ставити хрест на проектах, які використовують 3D-принтер. За бажанням завжди можна знайти місце або спосіб, де можна замовити друк необхідних для проекту деталей.

Крок 1: Трохи про роботу

Арт-робот - двоосьова саморобкаяка може наносити малюнок на більшості сферичних поверхонь. Робот налаштовується під певний типпредмета (кулі для пінг-понгу, різдвяні прикраси, лампочки та яйця (качині, гусячі, курячі...).

Для обертання сферичного предмета і переміщення маніпулятора використовуються високоточні крокові двигуни з високим моментом, що крутить, а для підйому механізму ручки - тихий і надійний сервопривід SG90.

Крок 2: Необхідні деталі

Для того, щоб зробити вироби своїми рукаминам знадобиться:

  • 2x підшипник 623;
  • Шпилька діаметром 3 мм та довжиною 80-90 мм;
  • 1x пружина (довжиною 10 мм та діаметром 4,5 мм);
  • 2x крокових двигуна NEMA 17 (крутний момент 4,4 кг/см);
  • Кабелі для двигунів (довжиною 14+70 см);
  • USB-кабель;
  • 1x сервопривід SG90;
  • Arduino Leonardo;
  • shield JJRobots;

  • 2xA4988 драйвери для крокових двигунів;
  • Блок живлення 12В/2A;
  • 11x гвинтів M3 6 мм;
  • 4x гвинта M3 16 мм;
  • 4x гайки M3;
  • 2x 20 мм присоски;
  • 1x гайка-баранчик M3;
  • 1x маркер;

Крок 3: Загальна схема

Як «шпаргалку» можете скористатися даною схемою.

Крок 4: Починайте!

Робот рухає маніпулятором із закріпленим на ньому маркером, що приводиться в дію кроковим двигуном. Інший кроковий двигун відповідає за поворот об'єкта, на який наноситься малюнок (яйце, кулька…). Для утримання предмета на місці використовуються дві присоски: одна, прикріплена до крокового двигуна, а друга на протилежному боці предмета. Маленька пружина давитиме на присоску, допомагаючи їй утримувати предмет. Для підняття/опускання маркеру використовується сервопривід SG90.

Крок 5: Маніпулятор

Встановимо гайку в отвір, підготовлений для неї і закрутимо гвинт 16 мм. Зробимо те саме для власника предметів (праворуч на зображенні вище). При створенні шарніра для маніпулятора використовувалися 216 мм гвинта. Цей шарнір повинен вільно обертатися після закручування гвинтів.

Крок 6: Присоски

Встановимо одну з присосок усередину отвору у тримачі предметів.

Крок 7: Кріплення крокових двигунів

Закріпимо обидва крокові двигуни до основної рами за допомогою 8 гвинтів.

Крок 8: Вісь обертання

Розмістимо всі елементи, як показано на зображенні вище.

  • Присоска;
  • Гайка;
  • Верхня частина;
  • Пружина;
  • Підшипник 623 (має бути вбудований у ліву чашку);
  • Ліва чашка;
  • Вільне місце для основної рами;
  • Права чашка;
  • Підшипник 623;
  • Кільце розділення;
  • Гайка-баранчик (M3).

Крок 9: Розташовуємо все на своїх місцях

Вставимо зібраний маніпулятор на вісь крокового двигуна.

Встановимо ліву опору на вісь крокового двигуна.

Маркер та яйце встановлені як приклад (зараз розміщувати їх не потрібно).

ПРИМІТКА: Сервопривід потребує коригування. Потрібно буде повторно встановити його кут під час процесу калібрування.

Крок 10: Електроніка

Закріпимо електроніку на тильній стороні основної рами за допомогою гвинтів (2-х буде достатньо).

Підключимо кабелі.

Якщо ви переплутаєте полярності при підключенні крокових двигунів, то вони будуть просто обертатися в протилежному напрямку, але з сервоприводом ситуація буде не такою вже й невинною! Тому двічі перевіряйте полярність перед підключенням!

Крок 11: Програмування Arduino Leonardo

Запрограмуємо Arduino Leonardo за допомогою програмного середовища Arduino IDE (v 1.8.1).

  • Завантажимо Arduino IDE (v 1.8.1) та встановимо програму;
  • Запустимо програмне забезпечення. Виберемо плату Arduino Leonardo та відповідний COM-ПОРТ у меню «tools->board»;
  • Відкриємо та завантажимо код Sphere-O-Bot. Розпакуємо всі файли всередину однієї папки і назвемо її "Ejjduino_ARDUINO".

Крок 12: Арт-робот готовий до створення творів мистецтва

Крок 13: Управління роботом

Програмне забезпечення Inkscape.Завантажимо та встановимо програмне забезпечення Inkscape (рекомендую стабільну версію 0.91).

Завантажимо та встановимо розширення EggBot Control (версія 2.4.0 була повністю протестована).

Розширення EggBot Control для Inkscape – це інструмент, який потрібно використовувати при тестуванні та калібруванні EggBot, а також перенесенні малюнки на яйце. Спочатку потрібно запустити Inkscape. Після запуску Inkscape з'явиться меню «Розширення», а в ньому потрібно вибрати підменю «Eggbot». Якщо не бачите підменю Eggbot, ви неправильно встановили розширення. Виконайте резервне копіюваннята уважно дотримуйтесь інструкцій щодо встановлення розширень.

На цьому все, дякую за увагу!)

У результаті вийшов досить кумедний робот, який може бачити перед собою перешкоди, аналізувати ситуацію і потім, лише обравши найкращий маршрут, їде далі. Робот вийшов дуже маневреним. Він здатний розгортатися на 180 градусів, а кут повороту становить 45 і 90 градусів. Як основний контролер автор використовував Iteaduino, який є аналогом Arduino.

Матеріали та інструменти для виготовлення робота:
- мікроконтролер (Arduino або йому подібний до Iteaduino);
- Ультразвуковий датчик;
- Утримувач для батарейок;
- китайські іграшки для створення колісної бази (можна купити готову);
- кусачки;
- Клей;
- Проводи;
- моторчики;
- ДВП;
- лобзик;
- Транзистори (D882 P).

Процес виготовлення робота:

Крок перший. Створення колісної бази
Для створення колісної бази автор прикупив дві китайські іграшкові машинки. Втім, із цього приводу можна й не турбуватися, якщо є зайві гроші, бо вже готову базу можна купити. За допомогою кусачок машинки були розрізані на дві частини, щоб утворилося дві провідні осі. Далі ці частини були склеєні. Втім, у такому разі можна попрацювати і паяльником, пластмаса чудово спайується.

Вибираючи машини, найкраще брати іграшки зі звичайними колесами, тому що, за словами автора, з такими шпильками як у нього, робот сильно скаче.

Є ще один такий момент, коли від моторчиків виводитимуться дроти, на одному з них потрібно не забути змінити полярність.


Крок другий. Виготовлення верхньої кришки
Верхня кришка робота виготовляється з ДВП, також для цього можна використовувати товстий картон. У кришці можна побачити прямокутний отвір, він повинен бути розташований так, щоб вісь сервоприводу, яка буде вставлена ​​в нього, розташовувалася симетрично. Що стосується отвору посередині, то через нього виводитимуться дроти.


Крок третій. Начинка робота
Для підключення шасі краще використовувати окреме джерело живлення, оскільки для живлення контролера потрібно 9В, а для моторчиків потрібно всього 3В. Взагалі в шасі таких машинок вже вбудовані тримачі батарейок, їх просто необхідно з'єднати паралельно.








До контролера двигуни підключаються за допомогою транзисторів типу D882 P. Вони були витягнуті зі старого пульта управління машиною. Найкраще звичайно використовувати силові транзистори типу TIP120Б, але автор вибирав просто за відповідними характеристиками. Вся електронна частина підключається за вказаною схемою.

Після прошивки робота він буде готовий до тестування. Щоб робот встигав розвернутися на певний кут, необхідно правильно вибрати час роботи моторчиків.

Що стосується датчиків, то ультразвуковий потрібно підключити до 7-го цифрового виходу мікроконтролера. Серводвигун підключається до 3-го цифрового входу, база транзистора лівого двигуна підключається до 11 контакту, а база правого до 10-го.

Якщо в якості живлення використовуватиметься Крона, то мінус підключається до GND, а плюс до VIN. Ще до GND потрібно підключити емітер транзистора та негативний контакт від джерела живлення шасі робота.

Магазин роботів та робототехніки побутові роботи квадрокоптери гіроскутери конструктори роботи іграшки новини

Я радію, коли майбутні інженери створюють свої пристрої та засмучуюсь, коли чую, як хтось говорить про використання Arduino у них.

Це не перша моя стаття на цю тему: у мене виникає бажання написати таку одразу після прочитання фрази про безмежні можливості платформи у DIY-топіці на Хабрі. У мене виникає бажання написати про справжню ціну деталей після прочитання статті про купівлю конструктора за $200 майже нічого не містить (пробачте, забув де бачив).

Справа тут зовсім не в тому, що я вважаю, що Arduino це погана ідея. Навпаки – завдяки платформі багато хто пізнав світ мікроконтролерів, дізнався, що зібрати невеликий прикольний пристрій може навіть людина без спеціальної освіти, з мінімальними знаннями у програмуванні та з відсутністю знань в електроніці.

Завдяки Arduino побачило світ безліч проектів, які припадали пилом в банках пам'яті мозку їх авторів.

Чесно зізнаюся, я іноді і сам користувався кодом, написаним для Ардуїно (наприклад, фірма InvenSense виробляє модуль MPU6050, запустити нормально який вийшло тільки у ).
Нехтую я тих людей, які, відкривши для себе світ мікроконтролерів, не потрудилися озирнутися в ньому і тих, хто нахабно наживається на подібних людях.

До нас до лабораторії заходив (і працював з нами) студент кафедри інформаційних технологій – шанувальник Arduino. Людина витрачала величезні гроші на покупку самих дуїн і модулів до них. Я не без жалю спостерігав, як майбутній (я все ж таки сподіваюся) творець роботизованих систем не міг запустити ШІМ потрібної частоти, хоча «льотного» години роботи з платформою він намотав чимало.

Так от цей студент показав мені «вимірювач рівня заряду батареї», або якось так. Я спеціально знайшов його зараз на ebay, де він називається « High Sensitivity Voltage Sensor Module - Arduino Compatible» і продається за $8.58. Ось він, на малюнку:

До речі, центральний провід, який «+» - він просто висить у повітрі – все зроблено для максимального зручного підключенняпростого дільника напруги, червона ціна якому 2 центи за резистори та 20 центів за роз'єм – це якщо в роздріб купувати.

Це не єдиний випадок обману нашого брата, нижче я наведу ще кілька. Зараз для любителів структурування я напишу основні недоліки Arduino.


На Hobbyking, де любителів різних моделей обманюють так само як і в інших магазинах любителів ардуїно, продавався якось звичайний конденсатор, під виглядом якогось фільтра. Не зміг його зараз знайти. З трипіновим роз'ємом, звичайно. Усього за 3 долари.

Arduino Compatible Mini Motor Speed ​​counter Sensor AVR PIC- Замінюється світлодіодом і фототранзистором, що підключаються до центрального контролера і двадцятьма рядками коду. Він не коштує 7.98.

2*4 Matrix Keyboard Push Buttons AVR ARM Arduino Compatible- Це просто кнопки, які можна купити за ціною 10 штук за долар.

Є один девайс у світі, який я ненавиджу більше, ніж Arduino – це mbed . Його розробники взяли контролер LPC1768 (є ще на LPC11U24), припаяли його на плату з двома стабілізаторами (про якість розведення плати я говорити не буду), вивели половину ніг назовні (друга половина нікуди не підключена, що дуже дратує), написали онлайн недо- IDE (втім трохи краще, ніж у Arduino, хоч і вимагає підключення до інтернету) і продають його за $64. Вибачте, але це вже зовсім.

Що робити, якщо ви, раптом, вирішили перестати тупцювати на місці, і почати вивчати мікроконтролери?

  1. На Хабре був цикл статей «STM32F1xx – лікуємося від ардуїнозалежності разом» – статті хороші та досить зрозумілі, шкода, що автор закинув написання нових статей.
  2. Усіх новачків посилають на easyelectronics.ru, де товариш DIHALT публікував навчальний курс з мікроконтролерів AVR.
  3. « Проектування додатків на мікроконтролерах сімейства 68HC12/HCS12 із застосуванням мови С» С. Ф. Баррет, Д. Дж. Пак - супер книга, що допомагає зрозуміти основи програмування на C для мікроконтролерів. Єдина проблема – ви навряд чи дістанете мікроконтролери Freescale, тому приклади доведеться самостійно портувати приклади на AVR, PIC, MSP430 чи будь-який інший контролер.
  4. Перед покупкою чогось не було для своїх пристроїв, почитайте про це хоча б у Вікіпедії - можливо цю ж деталь можна купити дешевше, якщо назвати її по-іншому.

Взагалі, знаєте, що дивно? Серед користувачів Arduino є навіть ті, хто зневажає Apple за їхню «спрямованість на недалекого зайнятого для таких дрібниць користувача».

Я не хочу нікого образити чи переконати. Але я буду радий, якщо хоч одна людина, яка дочитала статтю до цього моменту, поміняє Arduino на простий мікроконтролер - можливо, з нього вийде хороший розробник вбудованих систем у майбутньому.

Давайте поговоримо про те, як можна використовувати Ардуїно для створення робота, який балансує як Сігвей.

Сігвей від англ. Segway – двоколісний засіб стоячи, оснащений електроприводом. Ще їх називають гіроскутерами чи електричними самокатами.

Ви колись замислювалися, як працює Сігвей? У цьому уроці ми постараємося показати вам, як зробити робота Ардуїно, який врівноважує себе так само, як Segway.

Щоб збалансувати робота, двигуни повинні протидіяти падінню робота. Ця дія вимагає зворотного зв'язку та коригувальних елементів. Елемент зворотного зв'язку - , що забезпечує як прискорення, і обертання переважають у всіх трьох осях (). Ардуїно використовує це, щоб знати поточну орієнтацію робота. Коригуючим елементом є комбінація двигуна та колеса.

У результаті має вийти приблизно такий друг:

Схема робота

Модуль драйвера для двигуна L298N:

Мотор редуктора постійного струму з колесом:

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

Завершений варіант самостійно балансуючого робота можна подивитися на малюнку вище. У верхній частині знаходяться шість Ni-Cd-батарей для живлення друкованої плати. У проміжках між двигунами використовується 9-вольтова батарея для драйвера двигуна.

Теорія

Теоретично управління, утримуючи певну змінну (у разі позицію робота), потрібен спеціальний контролер, званий ПІД (пропорційна інтегральна похідна). Кожен із цих параметрів має «приріст», зазвичай званий Kp, Ki та Kd. PID забезпечує корекцію між бажаним значенням (або входом) та фактичним значенням (або виходом). Різниця між входом та виходом називається «помилкою».

ПІД-регулятор зменшує похибку до найменшого можливого значення, постійно регулюючи вихід. У нашому самобалансуючому роботі Arduino вхід(який є бажаним нахилом у градусах) встановлюється програмним забезпеченням. MPU6050 зчитує поточний нахил робота та подає його на алгоритм PID, який виконує обчислення для керування двигуном та утримує робота у вертикальному положенні.

PID вимагає, щоб значення Kp, Ki та Kd були налаштовані на оптимальні значення. Інженери використовують програмне забезпечення, таке як MATLAB, для автоматичного обчислення цих значень. На жаль, ми не можемо використовувати MATLAB у нашому випадку, тому що це ще більше ускладнить проект. Натомість ми будемо налаштовувати значення PID. Ось як це зробити:

  1. Зробіть Kp, Ki та Kd рівними нулю.
  2. Налаштуйте Kp. Занадто маленький Kp змусить робота впасти, тому що виправлення недостатньо. Надто багато Kp змушує робота йти дико вперед і назад. Хороший Kp зробить так, що робот зовсім трохи відхилятиметься назад і вперед (або трохи осцилює).
  3. Після встановлення Kp налаштуйте Kd. Хороше значення Kd зменшить коливання, доки робот стане майже стійким. Крім того, правильне Kd утримуватиме робота, навіть якщо його штовхати.
  4. Нарешті встановіть Ki. При включенні робот коливатиметься, навіть якщо Kp і Kd встановлені, але стабілізуватиметься у часі. Правильне значення Ki скоротить час, необхідний стабілізації робота.

Поведінку робота можна переглянути нижче на відео:

Код Ардуїно самобалансуючого робота

Нам знадобилося чотири зовнішні бібліотеки, для створення нашого робота. Бібліотека PID спрощує обчислення значень P, I та D. Бібліотека LMotorController використовується для керування двома двигунами з модулем L298N. Бібліотека I2Cdev та бібліотека MPU6050_6_Axis_MotionApps20 призначені для читання даних з MPU6050. Ви можете завантажити код, включаючи бібліотеки цього репозиторії .

#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 mp // 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; // FIFO storage buffer // orientation/motion vars Quaternion q; // quaternion container VectorFloat gravity; // Gravity vector float ypr; // yaw/pitch/roll container and gravity vector //PID double originalSetpoint = 173; double setpoint = originalSetpoint; double movingAngleOffset = 0.1; double input, output; //Adjust ці значення для 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; // Визначте, що MPU роз'єднувати pin має велику передачу dmpDataReady() ( mpuInterrupt = true; ) Void setup() ( // join I2C bus (I2Cdev library не буде цього автоматично) #if I2CDEV_IMPLEMENTATION =. ), TWBR = 24; // 400kHz I2C clock (200kHz if CPU є 8MHz) // Supply your own gyro offsets here, scaled for min sensitivity mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); chip / / Make sure it worked (returns 0 if so) if (devStatus == 0) ( // Turn on the DMP, now that it"s ready mpu.setDMPEnabled(true); , dmpDataReady, RISING); 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 / failed (code ")); Serial.print(devStatus); Serial.println(F(")")); ) return // wait for MPU interrupt or extra packet(s) available while (!mpuInterrupt &&< packetSize) { //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 < packetSize) fifoCount = mpu.getFIFOCount(); // read a packet from FIFO mpu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is >1 packet available // (Ці 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 * 180/M_PI + 180; )

Значення Kp, Ki, Kd можуть працювати чи працювати. Якщо вони цього не роблять, виконайте такі кроки. Зверніть увагу, що нахилу коду встановлено на 173 градуси. Ви можете змінити це значення, якщо хочете, але зауважте, що це кут нахилу, яким повинен підтримуватися роботом. Крім того, якщо ваші двигуни надто швидкі, ви можете відрегулювати значення motorSpeedFactorLeft та motorSpeedFactorRight.

На цьому поки що все. До зустрічі.