Съдържание:

Масленият робот: роботът Arduino с екзистенциална криза: 6 стъпки (със снимки)
Масленият робот: роботът Arduino с екзистенциална криза: 6 стъпки (със снимки)

Видео: Масленият робот: роботът Arduino с екзистенциална криза: 6 стъпки (със снимки)

Видео: Масленият робот: роботът Arduino с екзистенциална криза: 6 стъпки (със снимки)
Видео: Makeblock Untimate Robot Kit Part 2 : Robtic Arm Explaine, Software, Code App and Having Fun demo 2024, Юли
Anonim
Image
Image

Този проект е базиран на анимационния сериал "Рик и Морти". В един от епизодите Рик прави робот, чиято единствена цел е да донесе масло. Като студенти от Bruface (Брюкселски факултет по инженерство) имаме задача за проекта по мехатроника, който трябва да изгради робот въз основа на предложена тема. Задачата за този проект е: Направете робот, който сервира само масло. Може да има екзистенциална криза. Разбира се, роботът в епизода на Рик и Морти е доста сложен робот и трябва да се направят някои опростявания:

Тъй като единствената му цел е да донесе масло, има по -ясни алтернативи. Вместо да накара робота да изглежда и да вземе маслото, преди да го донесе на правилния човек, роботът може да носи маслото през цялото време. Основната идея е по този начин да се направи количка, която да транспортира маслото до мястото, където трябва да бъде.

Освен че транспортира маслото, роботът трябва да знае къде трябва да донесе маслото. В епизода Рик използва гласа си, за да се обади и да командва робота. Това изисква скъпа система за разпознаване на глас и би било твърде сложно. Вместо това всеки на масата получава бутон: след като този бутон е активиран, роботът може да намери този бутон и да се придвижи към него.

За да обобщим, роботът трябва да отговаря на следните изисквания:

  • Тя трябва да бъде безопасна: трябва да избягва препятствията и да се предпазва от падане на масата;
  • Роботът трябва да е малък: мястото на масата е ограничено и никой не би искал робот, който сервира масло, но е наполовина по -малък от самата маса;
  • Работата на робота не може да зависи от размера или формата на масата, по този начин може да се използва на различни маси;
  • Трябва да донесе маслото на правилния човек на масата.

Стъпка 1: Основна концепция

Гореспоменатите изисквания могат да бъдат изпълнени с помощта на различни техники. В тази стъпка са обяснени решенията за основния дизайн. Подробности за това как тези идеи се прилагат могат да бъдат намерени в следващите стъпки.

За да изпълни дълга си, роботът трябва да се движи, докато достигне дестинацията. Като се има предвид приложението на робота, е ясно, че използването на колела вместо "ходещо" движение е по -добре да го накарате да се движи. Тъй като масата е с равна повърхност и роботът няма да достигне много високи скорости, две задвижвани колела и една колесна топка са най -простото и лесно за управление решение. Задействаните колела трябва да се задвижват от два двигателя. Двигателите трябва да имат голям въртящ момент, но не е необходимо да достигат висока скорост, затова ще се използват непрекъснати серво мотори. Друго предимство на серво моторите е простотата на използване с Arduino.

Откриването на препятствия може да се извърши с помощта на ултразвуков сензор, който измерва разстоянието, прикрепен към серво мотор, за да избере посоката на измерване. Ръбовете могат да бъдат открити с помощта на LDR сензори. Използването на LDR сензори ще изисква изграждането на устройство, което съдържа както LED светлина, така и LDR сензор. LDR сензор измерва отразената светлина и може да се разглежда като някакъв сензор за разстояние. Същият принцип съществува и при инфрачервената светлина. Има някои инфрачервени сензори за близост, които имат цифров изход: затворен или не близък. Точно това е необходимо на робота, за да открие ръбовете. Чрез комбиниране на 2 сензора за ръбове, поставени като две антени за насекоми и един задействан ултразвуков сензор, роботът трябва да може да избягва препятствия и ръбове.

Откриването на бутони може да се осъществи и с помощта на инфрачервени сензори и светодиоди. Предимството на IR е, че е невидим, което прави използването му без смущение за хората на масата. Могат да се използват и лазери, но тогава светлината би била видима и също опасна, когато някой насочи лазера в окото на други хора. Също така, потребителят трябва да насочи сензорите на робота само с тънък лазерен лъч, което би било доста досадно. Като оборудва робота с два IR сензора и конструира бутона с IR светодиод, роботът знае в коя посока трябва да върви, като следва интензивността на инфрачервената светлина. Когато няма бутон, роботът може да се обърне, докато един от светодиодите не улови сигнала от един от бутоните.

Маслото се поставя в отделение в горната част на робота. Това отделение може да се състои от кутия и задействан капак за отваряне на кутията. За да отворите капака и да преместите ултразвуковия сензор, за да сканирате и откриете препятствията, ни трябват два двигателя и за тази цел несъвместимите серво мотори са по -адаптирани, тъй като двигателите трябва да отидат в определена позиция и да поддържат тази позиция.

Допълнителна характеристика на проекта беше да взаимодейства с външната среда с глас на робот. Звуков сигнал е прост и пригоден за тази цел, но не може да се използва по всяко време, тъй като текущото теглене е голямо.

Основните трудности на проекта зависят от кодирането, тъй като механичната част е доста ясна. Много случаи трябва да бъдат взети под внимание, за да се избегне забиването на робота или да направи нещо нежелано. Основните проблеми, които трябва да решим, са загубата на IR сигнала поради препятствие и спиране, когато той стигне до бутона!

Стъпка 2: Материали

Механични части

  • 3D принтер и машина за лазерно рязане

    • PLA ще се използва за 3D печат, но можете да използвате и ABS
    • Пластина от 3 мм брезов шперплат ще се използва за лазерно рязане, тъй като дава възможност лесно да се правят модификации по -късно, може да се използва и плексиглас, но е по -трудно да се модифицира, след като се реже с лазер, без да се разрушава
  • Болтове, гайки, шайби

    Повечето компоненти се държат заедно с помощта на болтове с бутон M3, шайби и гайки, но някои от тях изискват болтове M2 или M4. Дължината на болтовете е в диапазона 8-12 мм

  • Разделители за печатни платки, 25 мм и 15 мм
  • 2 серво мотора със съвместими колела
  • Някаква дебела метална тел с диаметър около 1-2 мм

Електронни части

  • Микроконтролер

    1 дъска arduino UNO

  • Серво мотори

    • 2 големи серво мотора: Feetech непрекъснато 6 кг 360 градуса
    • 2 микро серво мотора: Feetech FS90
  • Сензори

    • 1 Ултразвуков сензор
    • 2 инфрачервени сензора за близост
    • 2 IR фотодиода
  • Батерии

    • 1 9V държач за батерия + батерия
    • 1 държач за батерии 4AA + батерии
    • 1 9V кутия за батерии + батерия
  • Допълнителни компоненти

    • Някои скачащи проводници, проводници и запояващи плочи
    • Някои резистори
    • 1 IR LED
    • 3 превключвателя
    • 1 зумер
    • 1 бутон
    • 1 конектор за батерия от Arduino към 9V

Стъпка 3: Тестване на електрониката

Тестване на електрониката
Тестване на електрониката
Тестване на електрониката
Тестване на електрониката

Създаване на бутона:

Бутонът е направен просто от превключвател, инфрачервен светодиод и 220 омов резистор последователно, захранван от 9V батерия. Това е поставено в 9V батерия за компактен и изчистен дизайн.

Създаване на инфрачервени приемни модули:

Тези модули са направени с дъски за запояване чрез отвори, които по -късно ще бъдат прикрепени с винтове към робота. Схемите за тези модули са изобразени в общите схеми. Принципът е да се измерва интензитетът на инфрачервената светлина. За да се подобрят измерванията, могат да се използват колиматори (направени със свиващи се тръби), за да се фокусират върху определена посока на интерес.

Различните изисквания на проекта трябва да бъдат изпълнени с помощта на електронни устройства. Броят на устройствата трябва да бъде ограничен, за да се поддържа относително ниска сложност. Тази стъпка съдържа схемите на окабеляване и всеки код за тестване на всички части поотделно:

  • Непрекъснати серво мотори;
  • Ултразвуков сензор;
  • Непрекъснати серво мотори;
  • Звуков сигнал;
  • IR разпознаване на посоката на бутона;
  • Откриване на ръбове чрез сензори за близост;

Тези кодове могат да помогнат за разбирането на компонентите в началото, но също така са много полезни за отстраняване на грешки на по -късни етапи. Ако възникне определен проблем, грешката може да бъде открита по -лесно чрез тестване на всички компоненти поотделно.

Стъпка 4: Дизайн на 3D отпечатани и лазерно изрязани парчета

3D печат и лазерно изрязване на парчета
3D печат и лазерно изрязване на парчета
3D печат и лазерно изрязване на парчета
3D печат и лазерно изрязване на парчета
3D печат и лазерно изрязване на парчета
3D печат и лазерно изрязване на парчета

Лазерно нарязани парчета

Монтажът е направен от три основни хоризонтални плочи, държани заедно от дистанционни платки за печатни платки, за да се получи отворен дизайн, осигуряващ лесен достъп до електрониката, ако е необходимо.

Тези плочи трябва да имат нарязани необходимите отвори, за да завинтват дистанционерите и другите компоненти за крайния монтаж. Основно и трите плочи имат отвори на едно и също място за дистанционерите и специфични отвори за електрониката, фиксирани съответно на всяка плоча. Забележете, че средната плоча има отвор за преминаване на проводници в средата.

По -малките парчета се изрязват до размерите на голямото серво, за да се фиксират към монтажа.

3D отпечатани парчета

В допълнение към лазерното рязане, някои парчета ще трябва да бъдат 3D отпечатани:

  • Поддръжката за ултразвуковия сензор, който го свързва с едно рамо за микро серво мотор
  • Подпората за колелото на колелото и двата IR сензора за ръбове. Специфичният дизайн на вида на кутиите с форма на краищата на инфрачервените сензори действа като екран, за да се избегнат смущения между бутона, излъчващ IR сигнал и инфрачервените сензори, които трябва да се фокусират само върху случващото се на земята
  • Опората за микро серво мотора, отваряща капака
  • И накрая самият капак, направен от две части, за да има по -голям работен ъгъл, като се избягва сблъсък с микро серво мотора, отварящ капака:

    • Долната, която ще бъде фиксирана към горната плоча
    • А горната част, която е свързана с дъното чрез панта, и се задейства от сервото с помощта на дебел метален проводник. Решихме да добавим малко индивидуалност към робота, като му дадем глава.

След като всички части са проектирани и файловете експортирани в правилния формат за използваните машини, парчетата могат да бъдат направени. Имайте предвид, че 3D печат отнема много време, особено с размерите на горната част на капака. Може да ви трябват един или два дни, за да отпечатате всички парчета. Лазерното рязане обаче е само въпрос на минути.

Всички SOLIDWORKS-файлове могат да бъдат намерени в папка с цип.

Стъпка 5: Монтаж и окабеляване

Image
Image
Монтаж и окабеляване
Монтаж и окабеляване
Монтаж и окабеляване
Монтаж и окабеляване
Монтаж и окабеляване
Монтаж и окабеляване

Монтажът ще бъде комбинация от окабеляване и завинтване на компонентите заедно, започвайки отдолу нагоре.

Долна плоча

Долната плоча е сглобена с батерията 4AA, серво моторите, отпечатаната част (прикрепяща топката под плочата), двата сензора за ръбове и 6 дистанционни елемента от мъжки и женски пол.

Средна плоча

След това средната плоча може да бъде монтирана, като компресира серво моторите между двете плочи. След това тази плоча може да бъде фиксирана чрез поставяне на друг набор от дистанционни елементи върху нея. Някои кабели могат да бъдат прокарани през централния отвор.

Ултразвуковият модул може да бъде прикрепен към непрекъснато серво, което е фиксирано върху средната плоча с Arduino, батерията 9V (захранваща arduino) и двата инфрачервени приемника в предната част на робота. Тези модули са направени с дъски за запояване през отвори и са прикрепени с винтове към плочата. Схемите за тези модули са изобразени в общите схеми.

Горна плоча

В тази част на монтажа превключвателите не са фиксирани, но роботът вече може да прави всичко, освен действия, изискващи капака, като по този начин ни позволява да направим някакъв тест, за да коригираме прага, да адаптираме кода на движението и да имаме лесен достъп до пристанищата на arduino.

Когато всичко това се постигне, горната плоча може да бъде фиксирана с дистанционни елементи. Последните компоненти, които са двата превключвателя, бутона, серво, зумера и системата на капака, могат накрая да бъдат фиксирани към горната плоча, за да завършат монтажа.

Последното нещо, което трябва да се тества и коригира, е ъгълът на серво за правилно отваряне на капака.

Прагът на сензорите за ръбове трябва да се адаптира с включения потенциометър (с помощта на плоска отвертка) за различни повърхности на масата. Бяла маса трябва да има по -нисък праг от кафява маса например. Също така височината на сензорите ще повлияе на необходимия праг.

В края на тази стъпка сглобяването е завършено и последната останала част са липсващите кодове.

Стъпка 6: Кодиране: Сглобяване на всичко

Целият необходим код, за да може роботът да работи, е в цип файла, който може да бъде изтеглен. Най -важният е "основният" код, който включва настройката и функционалния цикъл на робота. Повечето от другите функции са записани в под-файлове (също в папка с цип). Тези подфайлове трябва да бъдат записани в същата папка (наречена "main") като основния скрипт, преди да ги качите в Arduino

Първо се определя общата скорост на робота заедно с променливата "напомняне". Това "напомняне" е стойност, която помни в коя посока се е завъртял роботът. Ако "напомня = 1", роботът е/обръща наляво, ако "напомня = 2", роботът е/се обръща надясно.

int скорост = 9; // Обща скорост на робота

int напомня = 1; // Начална посока

При настройката на робота различните подфайлове на програмата се инициализират. В тези подфайлове са записани основните функции за управление на двигателите, сензорите … Като ги инициализирате в настройката, функциите, които са описани във всеки от тези файлове, могат да бъдат използвани в основния цикъл. Чрез активиране на функцията r2D2 (), роботът ще издава шум като робота R2D2 от франчайза на филма Star Wars, когато стартира. Тук функцията r2D2 () е деактивирана, за да попречи на зумера да изтегли твърде много ток.

// Настройка @ нулиране // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int напомня = 1; // начална посока Стартер (напомняне); }

Функцията Starter (напомняне) първо се извиква в настройката. Тази функция кара робота да се обърне и да потърси инфрачервения сигнал на един от бутоните. След като намери бутона, програмата ще излезе от функцията Starter, като промени променливата „cond“на false. По време на въртенето на робота трябва да е наясно със заобикалящата го среда: тя трябва да открива ръбове и препятствия. Това се проверява всеки път, преди да продължи да се обръща. След като роботът открие препятствие или ръб, протоколът за избягване на тези препятствия или ръбове ще бъде изпълнен. Тези протоколи ще бъдат обяснени по -късно в тази стъпка. Функцията Starter има една променлива, която е напомнящата, която беше обсъдена по -рано. Като дава напомняща стойност на функцията Starter, роботът знае в коя посока трябва да се обърне, за да потърси бутона.

// Starter Loop: Обърнете се и потърсете бутона // ------------------------------------ ----------------

void Starter (int напомняне) {if (isedgeleft () || isedgeright ()) {// Откриване на ръбовете edgeDetected (напомняне); } else {bool cond = true; while (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (remember == 1) {// Завивахме наляво if (isobstacleleft ()) {stoppeed (); избегнете препятствие (напомняне); } else if (isedgeleft () || isedgeright ()) {// Откриване на ръбовете edgeDetected (напомняне); } else {turnleft (скорост); }} иначе ако (напомня == 2) {if (isobstacleright ()) {stoppeed (); избегнете препятствие (напомняне); } else if (isedgeleft () || isedgeright ()) {// Откриване на ръбовете edgeDetected (напомняне); } else {turnright (скорост); }}}}}}

Ако роботът намери бутона, тогава първият цикъл на стартиране се излиза и започва основният, функционален цикъл на робота. Този основен контур е доста сложен, тъй като всеки път роботът трябва да открие дали има препятствие или ръб пред него. Основната идея е, че роботът следва бутона, като го намира и губи всеки път. Използвайки два IR сензора, можем да разграничим три ситуации:

  • разликата между инфрачервената светлина, открита от левия и десния сензор, е по -голяма от определен праг и има бутон.
  • разликата в инфрачервената светлина е по -малка от прага и има бутон пред робота.
  • разликата в инфрачервената светлина е по -малка от прага и няма бутон пред робота.

Начинът, по който работи програмата за следене, е следният: когато бутонът бъде открит, роботът се придвижва към бутона, завъртайки в същата посока, в която се е въртял (използвайки променливата напомняне) и в същото време се придвижва малко напред. Ако роботът се обърне твърде далеч, бутонът отново ще бъде загубен и в този момент роботът си спомня, че трябва да се обърне в другата посока. Това също се прави, докато се движите малко напред. По този начин роботът непрекъснато завива наляво и завива надясно, но междувременно продължава да напредва към бутона. Всеки път, когато роботът намери бутона, той продължава да се върти, докато не го загуби и в този случай започва да се движи в друга посока. "turnleft ()" или "turnright ()", докато основният цикъл използва "moveleft ()" и "moveright ()". Функциите за движение наляво/надясно не само карат робота да се завърти, но и го кара да се движи напред едновременно.

/ * Функционален цикъл ---------------------------- Тук има само рутинната програма за проследяване */

int загубен = 0; // Ако е загубен = 0, бутонът е намерен, ако е изгубен = 1, бутонът се губи void loop () {if (isedgeleft () || isedgeright ()) {

ако (! isobstacle ()) {

преместване напред (скорост); забавяне (5); } else {избегнете препятствие (напомняне); } else {if (remember == 1 && lost == 1) {// Завивахме наляво stoppeed (); if (! isobstacleright ()) {moveright (скорост); // Обърнете се, за да намерите бутона} else {избегване_препятствие (напомняне); } напомни = 2; } иначе ако (напомня == 2 && lost == 1) {stoppeed (); if (! isobstacleleft ()) {moveleft (скорост); // Завивахме надясно} else {избегване_препятствие (напомняне); } напомни = 1; } else if (lost == 0) {if (remember == 1) {// Завивахме наляво if (! isobstacleleft ()) {moveleft (speed); // Завивахме надясно} else {StopSpeed (); избегнете препятствие (напомняне); } //} иначе if (напомняне == 2) {if (! isobstacleright ()) {moveright (скорост); // Обърнете се, за да намерите бутона} else {stoppeed (); избегнете препятствие (напомняне); }}} забавяне (10); загубен = 0; }} //}}

Сега е дадено малко обяснение на двете най -сложни процедури:

Избягвайте ръбовете

Протоколът за избягване на ръбове е дефиниран във функция, наречена "edgeDetection ()", която е записана в подфайла "move". Този протокол разчита на факта, че роботът трябва да срещне ръб само когато е достигнал дестинацията си: бутона. След като роботът открие ръба, първото нещо, което прави, е да се върне малко назад, за да бъде на безопасно разстояние от ръба. След като това стане, роботът изчаква 2 секунди. Ако някой натисне бутона в предната част на робота за тези две секунди, роботът знае, че е достигнал до човека, който иска маслото, и отваря отделението за масло и представя маслото. В този момент някой може да вземе масло от робота. След няколко секунди роботът ще се умори да чака и просто ще затвори капака на маслото. След като капакът се затвори, роботът ще стартира цикъла на стартера, за да потърси друг бутон. Ако се случи, че роботът се сблъсква с ръб, преди да достигне местоназначението си и бутонът отпред на робота не е натиснат, роботът няма да отвори капака на маслото и веднага ще изпълни цикъла за стартиране.

Избягвайте препятствията

Функцията izbe_obstacle () също се намира в подфайла "движение". Трудната част при избягването на препятствия е фактът, че роботът има доста голямо сляпо петно. Ултразвуковият сензор е поставен в предната част на робота, което означава, че може да открие препятствия, но не знае кога е преминал през него. За да се реши това, се използва следният принцип: След като роботът срещне препятствие, той използва променливата reming, за да се обърне в другата посока. По този начин роботът избягва да удря препятствието. Роботът продължава да се върти, докато ултразвуковият сензор не открие вече препятствието. По време на въртенето на робота се увеличава брояч, докато препятствието вече не бъде открито. Тогава този брояч дава приблизителна информация за дължината на препятствието. Като се движите след това напред и едновременно с това намалявате брояча, препятствието може да бъде избегнато. След като броячът достигне 0, функцията Starter може да се използва отново за преместване на бутона. Разбира се, роботът изпълнява функцията Starter, като се завърта в посоката, в която си спомня, че върви, преди да срещне препятствието (отново използвайки променливата напомняне).

Сега, когато напълно разбирате кода, можете да започнете да го използвате!

Не забравяйте да адаптирате праговете към вашата среда (IR отражението е по -високо върху белите таблици например) и да адаптирате различните параметри към вашите нужди. Също така трябва да се обърне голямо внимание на захранването на различните модули. От основно значение е сервомоторите да не се захранват от 5V порта Arduino, тъй като те поемат много ток (това може да повреди микроконтролера). Ако за сензорите се използва същия източник на захранване като този за захранване на сервомоторите, може да възникнат някои проблеми с измерването.

Препоръчано: