[Робототехника ғажабы] Есерсоқ қолдар (robotics edition!)

«Пән ғажабы неде» жобаның барлық мақалалары
«Робототехника ғажабы» циклдың басқа мақалалары
Алуантүрлі робототехника
Футуристік болашақтың бастамасы: роботтар қалай жасалынады
Бастан-аяқ робототехника олимпиадалары туралы
Құлтемірлердің бізді құрдымға кетіруге де уақыттары жоқ
Робототехника жарымжан жандардың мәселесін қалай шешеді?


Көбiне бiр iспен хобби ретiнде айналысқанда, практикалық түрде қолданысқа жарайтын зат жасауға асықпыз. Сурет салғанды ұнатсақ, салған суреттерiмiздi қабырғаға iлiп, ағаш өңдеумен айналыссақ, әдемi мүсiнше жасап, оны жақын адамымызға ұсына аламыз. Айта берсек мысалдар өте көп. Қарапайым, бiрақ қызықты әрi пайдалы нәрсе жасауға бола ма? Жауабымыз оңай: болады, әрі соны жасау қажет!

Бұл мақалада сiз робототехниканың күнделiктi өмiрде қолданылу мүмкiндiгi қаншалықты шексiз екенiн бiлетiн боласыз. Ескерту: бұл бәрінің де қолынан келеді!

Ғаламтор

Біз ғаламтор бар дәуірде өмір сүріп жатқанымыз үшін бақыттымыз. Оның басты себебі, қазiрде кез-келген сұрағымызға жауап ала алатынымызда ғана емес. Бүкiләлемдiк желiнiң арқасында жер шарының түкпір-түкпіріндегі робототехниктер жасаған жобалары арқылы бiр-бiрiне көмектеседi. Нәтижесiнде ғаламтор өз бетiмен жасаған өнертабыстарға толып тұр. Сонымен қатар, әр жобаның басты ерекшелiгi (сызба, бағдарлама коды және т. б.) — бүкiл әлемнiң тұрғындары бұл жобаларын тегін жетiлдiредi.

Осы жобалардың бiрi — атақты француз мүсiншiсi Gael Langevin ойлап тапқан InMoov роботы. \(2011\) жылы роботехникада тәжiрибесi жоқ адам толыққанды адам тәрiздi робот жасауға бел буады. Бiз оның қолынан келгенiн мойындауымыз керек. Ол роботты сатты ма? Жоқ! Ол роботтың жобасы мен программалық кодын сатты ма? Жауап сол қалпы —жоқ. Оның орнына Гаэль жеке сайт жасап, ол жерге барлық сызбаларды, бағдарламалық код пен құрастыру нұсқауларын көпшiлiкке жариялады. Содан көбiнесе робототехника мен бағдарламашылар арасында болатын ғажайып басталды. Адамдар жобаны өз еркiмен және ақысыз жетiлдiре бастады. Уақыт өте келе сайт жаңа нұсқаулармен толықтырылып, балама сервомоторлар мен жаңа бағдарламалық кодтарды қосуға болатын бөлшектердiң сызбалары пайда болды. Кейбiр энтузиасттар роботты силикон терiмен жабу жолдарын қарастырумен жұмыс жасады!

"InMoov (My Robot Lab), robot open source (Salon Viva Technology, Paris)" by dalbera is licensed under CC BY 2.0

Осылайша, уақыт өте келе жоба әлемнiң түкпiр-түкпiрiндегi энтузиастардың өз еркiмен жасайтын әр түрлi жетiлдiрулерiмен дамып жатыр. Бұл дегенiмiз, бiрiншiден, әр адам жаһандық маңызы бар, ұлы нәрселерді жасауда ат салыса алады. Әрі InMoov қауымдастығының бүкiл әлемде \(6673\) мүшесi бар екенiн атап абзал. Екiншiден, жеткiлiктi күш-жiгер, ықылас пен сәттiлiк бүкiл әлемде сұранысқа ие дәл осындай open-source жобаларды жасап шығаруға болады.

Өзің жаса

Интернеттен алынған роботтар, керемет әрi қызықты екенi сөзсiз. Осы мақаланы оқығандардың арасынан ең болмағанда бiр адамның жасағысы келiп кеткенiне сенiмдiмiн. Бiрақ өз бетімізбен бiр нәрсе жасауға тырыссақ ше? Осы жерде оқырманның ойында «ОЛАЙ БОЛАДЫ МА?» — деген сауал туындайды. Әрине, болады, болып қана қоймай оны жасау қажет.

Басымнан өткен оқиғамен бөлiсейiн. Үйде күнiне бiр-екi рет тамақтандыруды қажет ететін балықтар аквариумы бар. Балықтар жемнiң соңынан қуаламай, тыныш тамақтануы үшiн аэраторды \((10 −15)\) минутқа өшiрiп тұру керек. Осы жерде келесi жағдайлар жиi кездеседi: бiз оны өшiруін өшіріп, бiрақ кейде қосуды ұмытып кетемiз, соның кесiрiнен бейшара балықтар күнi бойы ауасыз қалады, өлiп қалған кездерi де болған. Қарапайым iс сияқты көрiнер: бар болғаны бәрi үйден шыққанға дейiн аэраторды қосуды ұмытпау керек. Алайда, адам мiнсiз бола алмайды және қателiктер жiберуге бейiм. Бiз қанша тырысқанымызбен, мұндай жағдайларды толығымен жою мүмкiн емес. Әлде мүмкiн бе? Егер бiз бұл мәселенi роботқа сенiп тапсырсақ ше? Осы орайда әрбірімізде сұрақ туындайды, бұл қандай робот, оны қайдан және қаншаға сатып алуға болады? Ескерту: ақша жұмсалынады, бiрақ бiз роботты өзiмiз жасаймыз.

Бізге қажетті заттар:

· ABS/PLA/PETG пластигі

· \(3\)D-принтер (көбiнесе бөлшектердi тапсырыс бойынша басып шығаруға болады)

· Arduino Uno

· Басқару тақтасы бар \(28\)BYJ-\(48\) қадамдық қозғалтқышы

· Батырма

· \(10\) кОм-ды резистор

· Реле (\(220\)В-пен жұмыс істейтіндер үшін)

· XT60 қосқышы немесе соған ұқсасы (\(220\)В-пен жұмыс істейтіндер үшін)

· Дәнекерлегіш, қалайы, канифоль/қышқыл

·  М3 бұрандалары және М3×\(12\) сомындар

Ең алдымен, балықты тамақтандыруға жауап беретiн жобамыздың 3D-моделiн модельдеу керек. Ол үшiн мен Autodesk Fusion \(360\) бағдарламасын қолданамын, себебi \(3\)D-модельдеу үшiн ең ыңғайлы және функционалды бағдарламалардың бiрi болып табылады.

Біз келесі бөліктердің сызбасын жасауымыз керек:

1. Аквариум стаканына бекiтiлетiн сөре. Оған бiз қозғалтқышты орналастырамыз.

2. Шаң, қоқыс және жем бөлшектерiнiң қадамдық қозғалтқышқа енуiне жол бермейтiн тiректiң бетiн жауып тұратын қақпақ.

3. Азық мөлшерлегіш/ дозатор

4. Tiректi әйнекке бекiтуге арналған бұранда.

5. Тақтаны бекітуге арналған орын

Өнертабыс былай жұмыс iстейдi. Бiз сөрені жасаймыз, оның iшiне тамақ мөлшерлегішін басқаратын сатылы қозғалтқышты орналастырамыз. Сөренiң бет жағына қақпақ қойылады, ол қозғалтқышты және оның сымын шаң мен жемнiң түсiп кетуiнен қорғайды. Әрi қарай, бiз қадамдық қозғалтқышқа күнiне екi рет айналатын (сiздiң жағдайыңызда балықты тамақтандыру жиiлiгi басқаша болуы мүмкiн) жем дозаторын бекiтемiз. Әрбiр аквариумның қабырғасының қалыңдығы әртүрлi, сондықтан оны бекiту құралын жасау керек. Бiздiң жағдайда бұранда(болт) бекiткiштiң рөлiн атқарады.

Сөре

Сөрені модельдейміз. Қозғалтқышты айналу нүктесi тiреуiштiң ортасында болатындай етiп орналастыру керек. Сымдар арналған арна мен жем құйылатын тесiк жасауды ұмытпайық. Соңында, тiреуiштi әйнекке бекiту үшiн екi қабырғаны модельдеймiз. Болт қабырға мен бұранданың(резьба) арасындағы қалыңдығы әйнектiң қалыңдығына тең болғанша ойылған тесiкке бұралады, осылайша, тіреуіш мықтап бекітіледі.

Сөре

Қақпақ

Ендi қақпағын модельдеуiмiз керек. Бұны жасау әлдеқайда оңай. Алдымен 3 миллиметрлiк дискiнi жасаймыз. Әрi қарай, бiз оған сөредегiдей жемге арналған тесік жасаймыз. Қозғалтқыш осiне арналған тесiк туралы да ұмытпауымыз керек. Қақпақты сөреге бекiту үшiн, қақпақтағы жемге арналған тесікті сөредегі саңылауға жалғайтын кiшкентай қабырғалар жасаймыз.

Қақпақ. Астынан көрінісі
Сөреге бекітілген қақпақ. Астынан көрініс

Дозатор

Ендi дозаторды модельдейiк. Мен жемнiң \(3\) порциясы сыйғанын қалаймын. Жем түсетiн арнаны ескере отырып, \(4\) саңылауы бар диск жасау керек.

Дозатор

Құлақты бұранда

Аз ғана қалды! Бiз қанатты болт жасаймыз, оның көмегiмен аквариум әйнегiне кiрiктiрiлген жемсалғышты бекiтемiз. Жем салынатын астауда ойық М\(16\)х\(1\)бiр (диаметрi \(16\) миллиметр, ойық қадамы \(1\) миллиметр), демек болттың да өлшемдерi осындай болуы керек.

Құрақты болт

Тақтаны орнату модулі

Соңғы штрих. Астаудан бөлек, бiзде тақтаны орнату модулi болуы керек. Барлығы төрт тақта бар: Arduino Uno, қадамдық қозғалтқыштың драйверi, реле және батырма. Батырмадан басқа бөлшектердiң бәрi жоғарыда айтылған M\(3\) бұрандаларымен бекiтiледi. Сондай-ақ, ыңғайлы болу үшiн тақталарды орнатуға арналған модульдiң артқы жағына ойықтар жасауды ұмытпауымыз керек.

Тақтаны орнату модулі
Жинақталған жем салғыш астау

\(3\)D басып шығару

Жарайсыз! Барлық компоненттер модельдендi және астауға арналған бөлшектер жасауға көшетiн уақыт келдi. Мен басып шығарғанда PETG пластигын қолдануға кеңес беремiн, өйткенi ол едәуiр берiк, температураға төзiмдi және \(3\)D принтерге көптеген параметрлердi қажет етпейдi. Сонымен қатар, PLA пластигы балама бола алады, ол био-ыдырайды, бiрақ жазғы ыстықтан деформациялануы мүмкiн. ABS-дi қолданбауға кеңес беремiн (мүмкiн болса да), өйткенi, ол өте улы және қыздырғанда өткiр иiс шығарады.

Басып шығару параметрлерi келесiдей:

· Материал: PLA/PETG

· Қабаттың қалыңдығы: \(0.35\) мм

· Периметрлер: \(3\)

· Толтыру: \(15\)\%

· Толтыру түрі: Gyroid/Honeycomb/Cubic/Grid

Басып шығарылған компоненттер келесідей:

Әр \(3\)D принтерiннiң басып шығаруда кемшiлiктерi болуы мүмкiн. Бөлшектердi модельдеу кезiнде мұны ескеруге тырысыңыз, өйткенi, кейбiр компоненттер егеуішпен және егеуқұм қағазымен механикалық қайта өңдеудi қажет етуi мүмкiн.

Жинақтау

Барлық бөлшектер өңделiп, пайдалануға дайын болғаннан кейiн тақталар мен батырманы бiздiң арнайы модульге бекiту керек (Cурет \(1\)). Әрi қарай, бiз түйменi, сымдарды және резисторды дәнекерлеп, оны модульге бекiтемiз. Содан кейiн сымдарды Arduino тақтасына қосамыз. Толық компоненттердi қосу схемасы төменде көрсетілген.

Сурет 1

Ендi бiз жем салатын астаудың өзiн жинаймыз. Қадамдық қозғалтқышты орнатып, оны қақпақпен жабамыз және қозғалтқыш коннекторын драйверге қосамыз (Cурет \(2\)).

Сурет 2
Айнымалы кернеуде жұмыс iстеу өте қауiптi болғандықтан, мен бұған дейiн мұндай құрылымдармен жұмыс жасап көрмеген адамдарға құрастыру кезеңiн өткiзуге кеңес бермеймiн (автордың ескертпесі)

Соңғы, мiндеттi емес қадам — аэраторды релеге қосу. Аэратор сымын төменде көрсетілген сызбадағыдай кесіп, релеге төмендегідей қосамыз:

Қосудың толық схемасы

Аэраторды бөлек жуу мақсатында реледен ажырата алу үшiн мен XT60 коннекторын қостым. Розеткадан алдымен аэраторды ажырату керек, тек содан кейiн коннекторды ажыратамыз, керiсiнше емес!

Құттықтаймыз, құрастыру кезеңi аяқталды, ендi бағдарлама кодын жазу ғана қалды!

Бағдарламалау

Бiрiншiден, бiз бүтiн айнымалыларды құруымыз керек, олардың мәнi компоненттер қосылған порт нөмiрлерi болады.

int rel = 3; //Реле
int in1 = 8; //in1-4 қадамды мотордың драйвері
int in2 = 9;
int in3 = 10;
int in4 = 11;

Әрi қарай, порттардың конфигурациясын жазуымыз керек, өйткенi кез-келгенi электрлiк импульстi ала да, бере де алады.

Бiз мұны void setup() функциясында орындаймыз, ол жүйенiң бүкiл жұмыс уақытында бiр рет қана орындалады.

void setup() {
    pinMode(btn, INPUT); ///батырма тірекке 
сигнал жібереді, INPUT аргумент қоямыз
    pinMode(rel, OUTPUT); //басқа компоненттер тіректен сигнал қабылдайды, сондықтан OUTPUT аргумент қоямыз
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
}

Келесi бiз қадамдық қозғалтқыштың айналу функциясын қолмен жазуымыз керек, ол кернеудi орамалардың әрқайсысына кезекпен енгiзген кезде осьтi айналдыратын 4 орамадан тұрады.

Бiр айналу қайталамасы  келесiдей бағдарламаланады:

digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(5);
digitalWrite(in1, HIGH);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(5);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(5);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, HIGH);
delay(5);

Алайда, бiз моторды \(90\) градусқа бұруымыз керек, ал бiр итерация, әрине, жеткiлiксiз. «Теру» әдiсi арқылы мен \(90\) градусқа бұрылуы үшiн \(128\) итерация жасалуы керек екенiн бiлдiм. Ол үшiн бiз бұл кодты циклге орналастырамыз, функция \(n\) мәнiн — қайталану санын қабылдайтын болады.

void rotate(int n){
    for(int i = 0; i < n; i++){
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        delay(5);
        digitalWrite(in1, HIGH);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
        delay(5);
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        delay(5);
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, HIGH);
        delay(5);
     }
}

Бұдан әрi код, тамақтандырғыштың жұмысы тек қандай алгоритмдi iске асырғымыз келетiнiне байланысты. Жеке өзiм, тамақтандырғыштың желiге қосылған кезде ешқандай функцияны орындамай, батырма басқаннан кейiн ғана қосылғанын қалаймын. Батырма қажетті басылғаннан кейiн, қозғалтқыш дозаторды айналдырып аэраторды өшiредi бес минутқа өшiредi және жоғарыда аталған әрекеттердi \(24\) сағаттан кейiн ғана қайталайды.

Ең алдымен, void setup() функциясын өзгерту керек. Онда бiз шексiз цикл жазамыз, одан шығу батырманы басқан кезде ғана жүзеге асырылады. Нелiктен void setup()? Себебi, түйменi бiр рет қана басу керек. Жоғарыда бiлгенiмiздей, бұл функция тек бiр рет iске қосылады. Бұдан кейiн бiз Arduino тақтасының жұмысы басталғаннан берi қанша уақыт бойы iстеп тұрғанын санаймыз себебi, бұл бiз үшiн әлi керек болады. Бiздiң аэратор жұмыс iстеуi үшiн реленi ашуды ұмытпаңыз. Соңында функция осындай болады:

void setup() {
    Serial.begin(9600);
    pinMode(btn, INPUT);
    pinMode(rel, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    digitalWrite(rel, 0); //аэраторды қосамыз
    while(!digitalRead(btn)); //күту батырманы басу
    milin = millis(); //уақыт мөлшерін санау, әрбір батырманы басуға кеткен уақытты есептеу
}

Ендi ең оңайы қалды. Arduino-да жазылған кодты шексiз орындайтын void loop() циклдiк функциясы бар. Дәл сол жерде бiз күнiне бiр рет тамақтандыруды және аэраторды \(5\) минутқа өшiрудi тағайындаймыз. Алгоритм келесiдей: тамақтандырғышты \(90\) градусқа бұрыңыз, аэраторды өшiрiңiз, \(5\) минуттан кейiн қосып бiр күн күтемiз. Күту үшiн сiз delay() функциясын қолдануыңызға болады, бiрақ ол микроконтроллердiң жұмысын тоқтатып қояды. Мен күту функциясы басқа да функциялармен қатар жұмыс iстейтiндей етiп жасағым келедi, расында, бiздiң жағдайда басқа функциялар орындалмайды. Ол үшiн мәндi миллисекундта қайтаратын millis() функциясын қолданамыз. Бiзде тамақтандырғыш жұмыс iстеп бастағаннан бастап уақытты сақтап тұратын milin айнымалысы бар. Осылайша, жұмыс басталғаннан кейiнгi секундтардағы уақытты табу үшiн келесi формуланы қолданамыз: millis()-milin)/1000 Тамақтандырғыш жұмыс iстей бастағаннан берi белгiлi бiр уақыт өткен-өтпегенiн тексеру үшiн өткен уақытты секундпен берiлген қажеттi X уақытына бөлiндiсiнiң қалдығын табамыз. Формуласы мынадай: (millis()-milin)/1000) mod X. Егер қалдық нөлге тең болса, онда қажеттi уақыт өттi. Осы күту формулаларын циклдiк функциямызда қолданамыз.

void loop() {
    rotate(128); //дозатордың 90 градусқа бұрылуы
    digitalWrite(rel, 1); //аэратордың өшірілуі
    while(((millis()-milin)/1000)%300 != 0 && ((millis()-milin)>1000));//5 минутқа үзіліс
    digitalWrite(rel, 0); //аэратордың қосылуы
    while(((millis()-milin)/1000)%86400 != 0 && ((millis()-milin)>1000)); //тәуліктерге үзіліс
}

Толық код мынадай:

int btn = 2;
int rel = 3;
int in1 = 8;
int in2 = 9;
int in3 = 10;
int in4 = 11;
int milin = 0;
int milfin = 0;

void rotate(int n){
    for(int i = 0; i < n; i++){
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        delay(5);
        digitalWrite(in1, HIGH);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
        delay(5);
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        delay(5);
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, HIGH);
        delay(5);
    }
}

void setup() {
    Serial.begin(9600);
    pinMode(btn, INPUT);
    pinMode(rel, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    digitalWrite(rel, 0);
    while(!digitalRead(btn));
    milin = millis();
}

void loop() {
    rotate(128);
    digitalWrite(rel, 1);
    while(((millis()-milin)/1000)%300 != 0 && ((millis()-milin)>1000));
    digitalWrite(rel, 0);
    while(((millis()-milin)/1000)%86400 != 0 && ((millis()-milin)>1000));
}

Қорытынды

Осымен аяқтадық! Бiз өзiмiздiң болмаса да, кiшкентай бауырларымыздың өмiрiн жақсартатын жобаны сәттi ойлап таптық, модельдедiк, құрастырдық және бағдарламалап шықтық. Айта кету керек, бұл тамақтандырғышта жүздеген қателер мен түзетулер болуы ықтимал. Мысалы, мен түйменi басқанда, азықтандыру кестесiн өзгертпестен, жемнiң қосымша мөлшері берiлетiн етiп жасайтын едiм. Бiз бiрiншi бөлiмдi open-source жобаларға арнағандықтан, мен барлық сызбаларды Thingiverse-де қалдырамын.

Егер осы жобаны өзi жасап көрiп, әрі түзетулер енгiзiп жақсартса, мен қуанышты боламын.

«Beyond Curriculum» қоры «Пән ғажабы неде» циклы материалдарын «Караван знаний» жобасымен серіктестікте және «Шеврон» компаниясының қолдауымен жариялауда. «Караван знаний» – жетекші қазақстандық және халықаралық сарапшылардың қатысуымен орындалған алдыңғы қатарлы білім тәжірибелерін зерттеу мен талқылау бойынша бастама.

Аударған: Қарлығаш Хурматуллаева

Редактор: Дильназ Жемісбек