- Кругова діаграма
- Генерація ШІМ-сигналів на штифті GPIO для управління сервомотором
- Програмування PIC16F8771A для роботизованої руки
- Моделювання коду робототехнічної зброї PIC
- Дизайн друкованої плати за допомогою EasyEDA
- Розрахунок та замовлення зразків через Інтернет
- Робота робототехнічної групи PIC
Починаючи з конвеєра автомобільних виробництв і закінчуючи телехірургічними роботами в космосі, Robotic Arms можна знайти всюди. Механізми цих роботів подібні до людських, яких можна запрограмувати на подібні функції та розширені можливості. Їх можна використовувати для повторення дій швидше і точніше, ніж людей, або в суворих умовах, не ризикуючи життям людини. Ми вже створили програму Record and Play Robotic Arm за допомогою Arduino, яку можна навчити виконувати певне завдання та повторювати назавжди.
У цьому підручнику ми будемо використовувати промисловий стандарт 8-бітний мікроконтролер PIC16F877A для управління тим самим роботизованим важелем з потенціометрами. Проблема цього проекту полягає в тому, що PIC16F877A має лише два штифти, здатні до PWN, але нам потрібно керувати приблизно 5 сервомоторами для нашого робота, для чого потрібні 5 окремих штифтів ШІМ. Отже, ми повинні використовувати штифти GPIO та генерувати ШІМ-сигнали на штифтах PIC GPIO, використовуючи таймерні переривання. Тепер, звичайно, ми могли б перейти на кращий мікроконтролер або використати демультиплексорну ІС, щоб набагато простіше тут. Але все ж варто спробувати цей проект для досвіду навчання.
Механічна структура роботизованої руки, яку я використовую в цьому проекті, була повністю роздрукована для мого попереднього проекту; Ви можете знайти повний файл дизайну та процедуру складання тут. Крім того, якщо у вас немає 3D-принтера, ви також можете створити просту робототехнічну руку, використовуючи картони, як показано в посиланні. Якщо припустити, що ви якось узяли свою робототехнічну руку, давайте переходимо до проекту.
Кругова діаграма
Повна електрична схема цього робототехнічного кронштейна на основі мікроконтролера PIC показана нижче. Схеми було намальовано за допомогою EasyEDA.
Принципова схема досить проста; повний проект розрахований на живлення від адаптера 12В. Потім ці 12 В перетворюються на + 5 В за допомогою двох регуляторів напруги 7805. Один маркується як + 5В, а інший - як + 5В (2). Причиною наявності двох регуляторів є те, що при обертанні сервоприводу він втягує багато струму, що створює падіння напруги. Це падіння напруги змушує ПІК перезапустити себе, отже, ми не можемо працювати як ПІК, так і серводвигуни на одній і тій же + 5В рейці. Отже, позначений як + 5В використовується для живлення мікроконтролера PIC, РК-дисплея та потенціометрів, а окремий вихід регулятора, який позначений як + 5В (2), використовується для живлення сервомоторів.
П'ять вихідних контактів потенціометрів, які забезпечують змінну напругу від 0 В до 5 В, підключені до аналогових контактів An0 до AN4 ПІК. Оскільки ми плануємо використовувати таймери для генерації ШІМ, сервомотори можуть бути підключені до будь-якого виводу GPIO. Я вибрав штирі від RD2 до RD6 для сервомоторів, але це може бути будь-який GPIO на ваш вибір.
Оскільки програма передбачає велику кількість налагоджень, РК-дисплей 16x2 також пов'язаний з портом B PIC. Це відобразить робочий цикл сервомоторів, якими керують. Окрім цього, я також розширив з'єднання для всіх GPIO та аналогових контактів, про всяк випадок, якщо в майбутньому будуть потрібні будь-які датчики. Нарешті, я також підключив штифт програміста H1 для безпосереднього програмування PIC за допомогою pickit3 за допомогою опції програмування ICSP.
Генерація ШІМ-сигналів на штифті GPIO для управління сервомотором
Після того, як схема готова, ми повинні з'ясувати, як генерувати сигнали ШІН на штифті GPIO PIC для управління сервомотором. Ми вже втомили щось подібне, використовуючи метод переривання таймера, і досягли успіху. Тут ми просто збираємося додати до цього, тому, якщо ви тут новачок, я настійно рекомендую вам прочитати цей попередній підручник, перш ніж продовжувати далі.
Всі сервомотори для хобі працюють з частотою 50 Гц. Це означає, що один повний імпульсний цикл для сервомотора буде 1/50 (F = 1 / T), що становить 20 мс. З цих повних 20 мс контрольний сигнал становить лише від 0 до 2 мс, тоді як решта сигналу завжди вимкнена. На малюнку нижче показано, як час включення коливається лише від 0 до 2 мс для обертання двигуна від 0 градусів до 180 градусів від загальної тривалості 20 мс.
З огляду на це, ми повинні писати програму таким чином, щоб PIC зчитував від 0 до 1204 з потенціометра і відображав його до 0 до 100, що буде робочим циклом сервомотора. Використовуючи цей робочий цикл, ми можемо розрахувати час включення сервомотора. Тоді ми можемо ініціалізувати переривання таймера до переповнення через регулярний інтервал, щоб він діяв подібно до функції millis () в Arduino. Завдяки цьому ми можемо перемкнути штифт статусу GPIO на високий на бажану тривалість і вимкнути його через 20 мс (один повний цикл), а потім повторити той самий процес. Тепер, коли ми зрозуміли логіку, давайте займемося програмою.
Програмування PIC16F8771A для роботизованої руки
Як завжди повну програму з відео можна знайти в кінці цієї сторінки, код також можна завантажити звідси з усіма необхідними файлами. У цьому розділі ми обговоримо логіку програми. У програмі використовується модуль АЦП, модуль таймера та РК-модуль для управління робототехнічною рукою. Якщо ви не знаєте, як використовувати функції АЦП або функції таймера або інтерфейси РК-дисплея з PIC, ви можете повернутися до відповідних посилань, щоб їх вивчити. Пояснення нижче подано, якщо читач знайомий з цими поняттями.
Конфігурація порту таймера 0
Найважливішим розділом коду є встановлення таймера 0 на перетікання для кожної конкретної затримки. Формули для розрахунку цієї затримки можна подати як
Затримка = ((256-REG_val) * (Prescal * 4)) / Fosc
Використовуючи регістр OPTION_REG та TMR0, ми встановили таймер 0 для роботи з прескалярним значенням 32, а значення REG встановлено на 248. Частота кристалів (Fosc), що використовується в нашому обладнанні, становить 20 МГц. За цими значеннями затримку можна обчислити як
Затримка = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 секунди (або) = 0,05 мс
Отже, ми встановили таймер переповнення через кожні 0,05 мс. Код, щоб зробити те саме, наведено нижче
/ ***** Конфігурація порту для таймера ****** / OPTION_REG = 0b00000100; // Таймер0 із зовнішнім частотним значенням і 32 як прескаляром // Також включає функцію PULL UPs TMR0 = 248; // Завантажуємо значення часу для 0,0001с; delayValue може бути в межах від 0-256 TMR0IE = 1; // Увімкнути біт переривання таймера в регістрі PIE1 GIE = 1; // Увімкнути глобальне переривання PEIE = 1; // Увімкнути периферійне переривання / *********** ______ *********** /
Із загального вікна управління від 0 мс до 2 мс сервомотора ми можемо керувати ним з роздільною здатністю 0,05 мсек, що дозволяє нам мати (2 / 0,05) 40 різних положень для двигуна від 0 градусів до 180 градусів. Ви можете додатково зменшити це значення, якщо ваш мікроконтролер може підтримувати його, щоб отримати більше позицій і точний контроль.
Процедура обслуговування переривань (ISR)
Тепер, коли у нас встановлений таймер 0, який перевищує потік для кожних 0,05 мс, ми будемо мати прапор переривання TMR0IF, встановлений для 0,05 мс. Отже, всередині функції ISR ми можемо скинути цей прапор і збільшити змінну, що називається count, на одиницю. Тож тепер ця змінна буде збільшуватися на 1 на кожні 0,05 мс.
void interrupt timer_isr () { if (TMR0IF == 1) // Прапор таймера спрацьовував через переповнення таймера -> встановлено переповнення для кожних 0,05 мс { TMR0 = 248; // Завантажуємо значення таймера TMR0IF = 0; // Очистити кількість прапорів переривання таймера ++; // Підрахувати збільшення на 1 за кожні 0,05 мс }
Розрахунок робочого циклу та часу
Далі ми повинні розрахувати робочий цикл і вчасно для всіх п’яти серводвигунів. У нас є п’ять сервомоторів, кожен з яких використовується для управління окремою секцією важеля. Тож ми маємо прочитати значення АЦП усіх п’яти та розрахувати робочий цикл та час для кожного.
Значення АЦП буде в діапазоні від 0 до 1024, яке можна перетворити на 0% до 100% робочого циклу, просто помноживши 0,0976 (100/1024 = 0,0976) на отримане значення. Потім цей робочий цикл від 0 до 100% повинен бути перетворений на час включення. Ми знаємо, що при 100% робочому циклі час включення повинен становити 2 мс (для 180 градусів), тому множення 0,02 (2/100 = 0,02) перетворить 0 на 100 робочого циклу в 0 до 2 мс. Але тоді кількість змінних нашого таймера встановлюється збільшуватися раз на кожні 0,05 мс. Це означає, що значення підрахунку буде 20 (1 / 0,05 = 20) на кожні 1 мс. Отже, нам потрібно помножити 20 на 0,02, щоб точно розрахувати час нашої програми, який дасть нам значення 0,4 (0,02 * 20 = 0,4). Код того ж наведений нижче, ви можете побачити його повторення протягом 5 разів для всіх 5 банків за допомогою циклу for. Отримані значення зберігаються в масиві T_ON.
for (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // Зчитуємо значення POT за допомогою ADC Duty_cycle = (POT_val * 0.0976); // Карта від 0 до 1024 до 0 до 100 T_ON = Обов'язок * 0,4; // 20 * 0,02
Вибір двигуна для обертання
Ми не можемо управляти всіма п’ятьма двигунами разом, оскільки це призведе до того, що код ISR важко сповільнить весь мікроконтролер. Отже, ми повинні обертати лише один сервомотор за раз. Щоб вибрати, який сервопривід обертати, мікроконтролер відстежує час увімкнення всіх п’яти сервомоторів і порівнює його з попереднім за часом. Якщо зміниться час включення, ми можемо зробити висновок, що певний сервопривід потрібно перемістити. Код для цього наведено нижче.
if (T_ON! = Pev_val) { Lcd_Clear (); серво = номер_поту; Lcd_Set_Cursor (2,11); Lcd_Print_String ("S:"); Lcd_Print_Char (серво + '0'); if (pot_num == 0) {Lcd_Set_Cursor (1,1); Lcd_Print_String ("A:");} ще якщо (номер_потоку == 1) {Lcd_Set_Cursor (1,6); Lcd_Print_String ("B:");} інакше якщо (номер_потоку == 2) {Lcd_Set_Cursor (1,11); Lcd_Print_String ("C:");} інакше якщо (номер_пуску == 3) {Lcd_Set_Cursor (2,1); Lcd_Print_String ("D:");} інакше якщо (номер_потіку == 4) {Lcd_Set_Cursor (2,6); Lcd_Print_String ("E:");} char d2 = (Duty_cycle)% 10; char d1 = (обов'язок_цикл / 10)% 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
Ми також друкуємо робочий цикл сервоприводу на РК-екрані, щоб користувач міг знати його поточне положення. На основі зміни часу включення змінний сервопривід оновлюється цифрами від 0 до 4, що представляють окремі двигуни.
Керування сервомотором всередині ISR
Усередині ISR у нас є кількість змінних, яка збільшується на кожні 0,05 мс, це означає, що на кожні 1 мс змінна буде збільшена на 20. Використовуючи це, ми повинні контролювати висновки для отримання ШІМ-сигналу. Якщо значення відліку менше, ніж час включення, GPIO цього двигуна вмикається за допомогою рядка нижче
PORTD = PORTD - серво_код;
Тут масив servo_code має детальну інформацію про всі п'ять сервомоторів, і на основі значення в змінному сервоприводі буде використаний код для цього сервомотора. Тоді це логічно АБО (-) з існуючими бітами PORTD, щоб ми не порушували значення іншого двигуна і не оновлювали лише цей конкретний двигун. Аналогічно для вимкнення штифта
PORTD = PORTD & ~ (серво_код);
Ми змінили бітове значення за допомогою оператора логічного зворотного (~), а потім виконали операцію AND (&) на PORTD, щоб вимкнути лише потрібний штифт, залишаючи інші висновки у попередньому стані. Повний фрагмент коду показано нижче.
void interrupt timer_isr () { if (TMR0IF == 1) // Прапор таймера спрацьовував через переповнення таймера -> встановлено переповнення для кожних 0,05 мс { TMR0 = 248; // Завантажуємо значення таймера TMR0IF = 0; // Очистити кількість прапорів переривання таймера ++; // Підраховуємо кроки на 1 за кожні 0,05 мс -> відлік буде 20 за кожні 1 мс (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; якщо (кол> = 20 * 20) кол = 0; if (count <= (T_ON)) PORTD = PORTD - серво_код; ще PORTD = PORTD & ~ (серво_код); }
Ми знаємо, що загальний цикл повинен тривати 20 мс, перш ніж штифт GPIO знову ввімкнеться. Отже, ми перевіряємо, чи перевищив підрахунок 20 мс, порівнюючи значення відліку з 400 (те саме обчислення, що обговорювалося вище), і якщо так, нам доведеться ініціалізувати підрахунок знову нулем.
Моделювання коду робототехнічної зброї PIC
Завжди краще імітувати код, перш ніж переносити його на справжнє обладнання. Тож я використав Proteus для моделювання мого коду та перевірив його для коректної роботи. Схема, що використовується для моделювання, показана нижче. Ми використовували осцилограф, щоб перевірити, чи генеруються сигнали ШІМ за необхідності. Також ми можемо перевірити, чи обертаються РК-дисплеї та сервомотори належним чином.
Як ви можете бачити, на РК-дисплеї робочий цикл двигуна D відображається як 07 на основі значення горщика, яке є 3 -м двигуном. Подібно, якщо інший горщик переміщений, робочий цикл цього горщика і номер його двигуна відображатиметься на РК-дисплеї. Сигнал ШІМ, який відображається на осцилографі, показаний нижче.
Загальний період циклу вимірюється як 22,2 мс, використовуючи параметр курсора на осцилографі, який дуже близький до бажаних 20 мс. Нарешті, ми впевнені, що код працює, тому, щоб продовжити роботу зі схемою, ми можемо або припаяти його до плати перф, або використовувати друковану плату. Це не буде легко працювати на макеті, оскільки POT завжди схильний створювати деякі проблеми через погані зв’язки.
Дизайн друкованої плати за допомогою EasyEDA
Для розробки цієї роботизованої руки PIC ми обрали онлайн-інструмент EDA, який називається EasyEDA. Я використовую його вже давно, і вважаю це дуже зручним через його широку доступність сліду та просту у використанні природу. Після проектування друкованої плати ми можемо замовити зразки друкованих плат завдяки їх недорогим послугам з виготовлення друкованих плат. Вони також пропонують послугу пошуку компонентів, де вони мають великий запас електронних компонентів, і користувачі можуть замовити необхідні компоненти разом із замовленням друкованих плат.
Проектуючи свої схеми та друковані плати, ви також можете зробити свої схеми та конструкції друкованих плат загальнодоступними, щоб інші користувачі могли їх копіювати або редагувати та отримувати користь від вашої роботи; ми також зробили всі наші схеми схем та друкованих плат друкованими для цієї схеми, перевірте посилання нижче:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
За цим посиланням ви можете безпосередньо замовити ту саму друковану плату, яку ми використовуємо в цьому проекті, і використовувати її. Після завершення проектування плату можна розглядати як 3D-модель, що дуже допоможе у візуалізації того, як вона виглядатиме після виготовлення. 3D-модель дошки, яку ми використовуємо, показана нижче. Окрім цього, ви також можете переглянути верхній і нижній шар дошки, щоб перевірити, чи є гладкий екран належним чином.
Розрахунок та замовлення зразків через Інтернет
Після завершення проектування цієї друкованої плати PIC Robot ви можете замовити друковану плату через JLCPCB.com. Щоб замовити друковану плату у JLCPCB, вам потрібен файл Gerber. Щоб завантажити файли Gerber з вашої друкованої плати, просто натисніть кнопку « Створити файл виготовлення » на сторінці редактора EasyEDA, а потім завантажте файл Gerber звідти або натисніть кнопку « Замовити в JLCPCB», як показано на малюнку нижче. Це перенаправить вас на JLCPCB.com, де ви зможете вибрати кількість друкованих плат, які ви хочете замовити, скільки шарів міді вам потрібно, товщину друкованої плати, масу міді і навіть колір друкованої плати, як наведений нижче знімок:
Після того, як ви вибрали всі параметри, натисніть «Зберегти в кошику», після чого ви потрапите на сторінку, де ви можете завантажити свій файл Gerber, який ми завантажили з EasyEDA. Завантажте свій файл Gerber і натисніть «Зберегти в кошику». І нарешті клацніть на Checkout Securely, щоб завершити замовлення, тоді ви отримаєте свої друковані плати через кілька днів. Вони виготовляють друковану плату за дуже низьким курсом, який становить 2 долари. Їхній час збірки також дуже менший, що становить 48 годин при доставці DHL 3-5 днів, в основному ви отримаєте свої друковані плати протягом тижня з моменту замовлення.
Після замовлення друкованої плати ви можете перевірити виробничий прогрес вашої друкованої плати з датою та часом. Ви перевіряєте це, перейшовши на сторінку облікового запису та натиснувши "Виробничий прогрес".
Через кілька днів замовлення друкованих плат я отримав зразки друкованої плати в гарній упаковці, як показано на малюнках нижче.
І після отримання цих деталей я припаяв всі необхідні компоненти до друкованої плати. Я також безпосередньо припаяв POT безпосередньо замість того, щоб використовувати з'єднувальні дроти, тому що жіночий і жіночий дроти, які я спочатку використовував, коли давав дивні аналогові вихідні напруги, ймовірно, через слабкі контакти. Як тільки всі компоненти були зібрані, моя друкована плата виглядала приблизно так.
Ви могли помітити, що на цій дошці є лише один 7805. Це тому, що спочатку я думав, що можу уникнути лише регулятора для живлення як PIC, так і сервомотора, а пізніше зрозумів, що мені потрібні два. Отже, я використав зовнішній контур для живлення сервомоторів через зелені дроти, які ви бачите тут.
Тим не менше, вам не доведеться особливо турбуватися про це, тому що; Зараз я вніс зміни в друковану плату. Ви можете використовувати модифіковану друковану плату і припаяти обидва регулятори на самому борту.
Робота робототехнічної групи PIC
Після всіх стомлювальних робіт настав час окупитися. Припаяйте всі компоненти на платі та завантажте програму на контролер PIC. Повний код наведено нижче або його можна завантажити звідси. Роз'єм для програмування, що міститься на платі, повинен допомогти вам завантажити програму безпосередньо за допомогою Pickit 3 без особливих клопотів. Після завантаження програми ви побачите на РК-дисплеї сервопривід, яким зараз керують. Щоб дізнатись більше про програмування мікроконтролера PIC, просто дотримуйтесь попереднього підручника.
Звідти ви можете просто повернути горщик і перевірити, як сервомотори реагують на кожен потенціометр. Як тільки ви зрозумієте формат, ви зможете керувати роботом-рукою, щоб виконувати будь-які дії, які вам потрібні для виконання та розваги. Ви можете знайти повну роботу проекту у відео, наведеному нижче.
Тобто, хлопці, сподіваємось, ви зрозуміли проект і дізналися щось нове з нього. Якщо у вас виникли запитання, залиште їх у розділі коментарів або використовуйте форуми для інших технічних дискусій.